mns-scheduler 1.3.2.5__py3-none-any.whl → 1.3.2.8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of mns-scheduler might be problematic. Click here for more details.

@@ -5,11 +5,11 @@ file_path = os.path.abspath(__file__)
5
5
  end = file_path.index('mns') + 17
6
6
  project_path = file_path[0:end]
7
7
  sys.path.append(project_path)
8
- import datetime
8
+
9
9
  import mns_common.component.proxies.proxy_common_api as proxy_common_api
10
10
  from mns_common.db.MongodbUtil import MongodbUtil
11
11
  from loguru import logger
12
- import mns_common.api.em.real_time.east_money_stock_a_v2_api as east_money_stock_a_v2_api
12
+ import mns_common.api.em.real_time.east_money_stock_a_api as east_money_stock_a_api
13
13
  import mns_common.api.em.real_time.east_money_debt_api as east_money_debt_api
14
14
  import mns_common.api.em.real_time.east_money_etf_api as east_money_etf_api
15
15
  import mns_common.api.em.real_time.east_money_stock_hk_api as east_money_stock_hk_api
@@ -23,12 +23,10 @@ mongodb_util = MongodbUtil('27017')
23
23
 
24
24
  def sync_all_em_stock_info():
25
25
  logger.info("同步东方财富a,etf,kzz,us,hk,信息开始")
26
- now_date = datetime.datetime.now()
27
- str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
28
- proxy_ip = proxy_common_api.get_proxy_ip(str_now_date, 5)
26
+ proxy_ip = proxy_common_api.get_proxy_ip(5)
29
27
  proxies = {"https": proxy_ip}
30
28
  try:
31
- em_a_stock_info_df = east_money_stock_a_v2_api.get_all_real_time_quotes(proxies)
29
+ em_a_stock_info_df = east_money_stock_a_api.get_real_time_quotes_all_stocks(proxies)
32
30
  em_a_stock_info_df['_id'] = em_a_stock_info_df['symbol']
33
31
  mongodb_util.save_mongo(em_a_stock_info_df, extra_income_db_name.EM_A_STOCK_INFO)
34
32
  except BaseException as e:
@@ -19,8 +19,8 @@ import numpy as np
19
19
  import mns_common.utils.data_frame_util as data_frame_util
20
20
  from loguru import logger
21
21
 
22
- source_type = 'xue_qiu'
23
- # source_type = 'em'
22
+ # source_type = 'xue_qiu'
23
+ source_type = 'em'
24
24
  error_no = 1
25
25
 
26
26
 
@@ -9,16 +9,13 @@ import mns_common.api.ths.zt.ths_stock_zt_pool_api as ths_stock_zt_pool_api
9
9
  from datetime import datetime
10
10
  import mns_common.utils.data_frame_util as data_frame_util
11
11
  import pandas as pd
12
- import mns_common.component.em.em_stock_info_api as em_stock_info_api
13
12
  import mns_common.component.company.company_common_service_new_api as company_common_service_new_api
14
13
  import mns_common.component.common_service_fun_api as common_service_fun_api
15
14
  from loguru import logger
16
- import mns_scheduler.k_line.common.k_line_common_api as k_line_common_api
17
- import mns_common.api.akshare.k_line_api as k_line_api
18
15
  import mns_common.utils.date_handle_util as date_handle_util
19
16
  from mns_common.db.MongodbUtil import MongodbUtil
20
17
  import mns_common.constant.db_name_constant as db_name_constant
21
- import time
18
+ import mns_scheduler.k_line.common.k_line_common_api as k_line_common_api
22
19
 
23
20
  mongodb_util = MongodbUtil('27017')
24
21
 
@@ -33,56 +30,14 @@ def ths_zt_pool(str_day, real_time_quotes_all_stocks):
33
30
  now_date = datetime.now()
34
31
  now_day_str_day = now_date.strftime('%Y-%m-%d')
35
32
  ths_zt_pool_df = ths_stock_zt_pool_api.get_zt_reason(str_day)
36
- if data_frame_util.is_empty(ths_zt_pool_df):
33
+ ths_zt_pool_df_copy = ths_zt_pool_df.copy()
34
+
35
+ if data_frame_util.is_empty(ths_zt_pool_df_copy):
37
36
  return pd.DataFrame()
38
37
  if str_day == now_day_str_day:
39
- ths_zt_pool_df = merge_now_day_zt_info(ths_zt_pool_df, real_time_quotes_all_stocks)
38
+ ths_zt_pool_df = merge_his_day_zt_info(ths_zt_pool_df_copy, str_day)
40
39
  else:
41
- ths_zt_pool_df = merge_his_day_zt_info(ths_zt_pool_df, str_day)
42
-
43
- return ths_zt_pool_df
44
-
45
-
46
- def merge_now_day_zt_info(ths_zt_pool_df, real_time_quotes_all_stocks):
47
- if real_time_quotes_all_stocks is None:
48
- real_time_quotes_all_stocks = em_stock_info_api.get_a_stock_info()
49
- real_time_quotes_all_stocks = real_time_quotes_all_stocks[['symbol', 'amount',
50
- 'exchange', 'flow_mv', 'total_mv']]
51
- real_time_quotes_all_stocks_zt = real_time_quotes_all_stocks.loc[
52
- real_time_quotes_all_stocks['symbol'].isin(ths_zt_pool_df['symbol'])]
53
-
54
- query_field = {
55
- "ths_concept_name": 1,
56
- "ths_concept_code": 1,
57
- "ths_concept_sync_day": 1,
58
- "company_type": 1,
59
- "concept_create_day": 1,
60
- "first_sw_industry": 1,
61
- "third_sw_industry": 1,
62
- "industry": 1,
63
- "list_date": 1,
64
- }
65
- query_field_key = str(query_field)
66
- query_key = str({'symbol': {"$in": list(ths_zt_pool_df['symbol'])}})
67
- company_df_zt = company_common_service_new_api.get_company_info_by_field(query_key, query_field_key)
68
-
69
- company_df_zt = company_df_zt.set_index(['_id'], drop=True)
70
- real_time_quotes_all_stocks_zt = real_time_quotes_all_stocks_zt.set_index(['symbol'], drop=True)
71
- ths_zt_pool_df = ths_zt_pool_df.set_index(['symbol'], drop=False)
72
-
73
- ths_zt_pool_df = pd.merge(ths_zt_pool_df, company_df_zt, how='outer',
74
- left_index=True, right_index=True)
75
-
76
- ths_zt_pool_df = pd.merge(ths_zt_pool_df, real_time_quotes_all_stocks_zt, how='outer',
77
- left_index=True, right_index=True)
78
- ths_zt_pool_df['amount_level'] = round(ths_zt_pool_df['amount'] / common_service_fun_api.HUNDRED_MILLION, 2)
79
- ths_zt_pool_df = common_service_fun_api.classify_symbol(ths_zt_pool_df)
80
- ths_zt_pool_df = common_service_fun_api.total_mv_classification(ths_zt_pool_df)
81
- ths_zt_pool_df.fillna('', inplace=True)
82
- if 'zt_flag' in ths_zt_pool_df.columns:
83
- del ths_zt_pool_df['zt_flag']
84
- if 'zt_tag' in ths_zt_pool_df.columns:
85
- del ths_zt_pool_df['zt_tag']
40
+ ths_zt_pool_df = merge_his_day_zt_info(ths_zt_pool_df_copy, str_day)
86
41
 
87
42
  return ths_zt_pool_df
88
43
 
@@ -143,33 +98,37 @@ def merge_his_day_zt_info(ths_zt_pool_df, str_day):
143
98
  def get_bfq_daily_line(ths_zt_pool_df, str_day):
144
99
  query_k_line = {'symbol': {"$in": list(ths_zt_pool_df['symbol'])}, 'date': date_handle_util.no_slash_date(str_day)}
145
100
  bfq_daily_line_df = mongodb_util.find_query_data('stock_bfq_daily', query_k_line)
146
- if data_frame_util.is_not_empty(bfq_daily_line_df):
101
+ if bfq_daily_line_df.shape[0] >= ths_zt_pool_df.shape[0]:
147
102
  bfq_daily_line_df = bfq_daily_line_df[['amount', 'chg', 'close', 'exchange',
148
103
  'symbol', 'amount_level',
149
104
  'flow_mv', 'flow_mv_sp'
150
105
  ]]
151
106
  bfq_daily_line_df = bfq_daily_line_df.rename(columns={"close": 'now_price'})
152
107
  return bfq_daily_line_df
153
-
154
- bfq_k_line_df = pd.DataFrame()
155
- for zt_one in ths_zt_pool_df.itertuples():
156
- try:
108
+ else:
109
+ bfq_k_line_result_df = pd.DataFrame()
110
+ for zt_one in ths_zt_pool_df.itertuples():
157
111
  symbol = zt_one.symbol
112
+ try:
113
+
114
+ bfq_daily_line_df = k_line_common_api.get_k_line_common_adapter(symbol, 'daily', '', str_day)
115
+
116
+ if data_frame_util.is_empty(bfq_daily_line_df):
117
+ continue
158
118
 
159
- bfq_daily_line_df = k_line_common_api.get_k_line_common_adapter(symbol, 'daily', '', str_day)
119
+ bfq_daily_line_df_one = bfq_daily_line_df.loc[
120
+ bfq_daily_line_df['date'] == date_handle_util.no_slash_date(str_day)]
160
121
 
161
- if data_frame_util.is_empty(bfq_daily_line_df):
162
- continue
163
- bfq_daily_line_df = bfq_daily_line_df[['amount', 'chg', 'close', 'exchange',
164
- 'symbol', 'amount_level',
165
- 'flow_mv', 'flow_mv_sp'
166
- ]]
167
- bfq_daily_line_df = bfq_daily_line_df.rename(columns={"close": 'now_price'})
168
- bfq_k_line_df = pd.concat([bfq_k_line_df, bfq_daily_line_df])
169
- except BaseException as e:
170
- logger.warning("同步不复权k线异常:{},{}", symbol, e)
122
+ bfq_daily_line_df_one = bfq_daily_line_df_one[['amount', 'chg', 'close', 'exchange',
123
+ 'symbol', 'amount_level',
124
+ 'flow_mv', 'flow_mv_sp'
125
+ ]]
126
+ bfq_daily_line_df_one = bfq_daily_line_df_one.rename(columns={"close": 'now_price'})
127
+ bfq_k_line_result_df = pd.concat([bfq_k_line_result_df, bfq_daily_line_df_one])
128
+ except BaseException as e:
129
+ logger.warning("同步不复权k线异常:{},{}", symbol, e)
171
130
 
172
- return bfq_k_line_df
131
+ return bfq_k_line_result_df
173
132
 
174
133
 
175
134
  def save_ths_zt_pool(ths_zt_pool_df, str_day):
@@ -229,6 +188,6 @@ if __name__ == '__main__':
229
188
  # trade_date = '2024-08-01'
230
189
  # zt_df = ths_zt_pool(trade_date, None)
231
190
  # save_ths_zt_pool(zt_df, trade_date)
232
- trade_date = '2025-04-18'
233
- ths_zt_pool_df = ths_zt_pool(trade_date, None)
234
- save_ths_zt_pool(ths_zt_pool_df, trade_date)
191
+ trade_date = '2025-06-05'
192
+ ths_zt_pool_df_test = ths_zt_pool(trade_date, None)
193
+ save_ths_zt_pool(ths_zt_pool_df_test, trade_date)
@@ -1,4 +1,4 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mns-scheduler
3
- Version: 1.3.2.5
3
+ Version: 1.3.2.8
4
4
 
@@ -14,7 +14,7 @@ mns_scheduler/company_info/constant/company_constant_data.py,sha256=0qhRXLASsQlY
14
14
  mns_scheduler/company_info/de_list_stock/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
15
15
  mns_scheduler/company_info/de_list_stock/de_list_stock_service.py,sha256=QNtKc1ZI6xHjupcxbOBN7fBhi6oAGtL7X1TQZVzfpnk,1993
16
16
  mns_scheduler/company_info/em_stock_info/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
17
- mns_scheduler/company_info/em_stock_info/sync_em_stock_info_sync.py,sha256=Jx69ED0ixOIC5k8vwF4mRVJ9IYUIgGxEf6MJPFvoNH4,3880
17
+ mns_scheduler/company_info/em_stock_info/sync_em_stock_info_sync.py,sha256=xXrOJaskcfOfFFw6VFYwE_Z8ZZbU4BCoPcqTDBIazm4,3750
18
18
  mns_scheduler/company_info/remark/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
19
19
  mns_scheduler/company_info/remark/company_remark_info_sync.py,sha256=L8wC8LU7-GYZb1TyKLjODJURROOEO4izZBxnWEM7Ahc,2334
20
20
  mns_scheduler/concept/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
@@ -79,7 +79,7 @@ mns_scheduler/k_line/clean/week_month/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3
79
79
  mns_scheduler/k_line/clean/week_month/normal_week_month_k_line_service.py,sha256=n2osY8dozHClIlSOE7NR6S_oK_8GV-z72Az13D3fhCQ,10160
80
80
  mns_scheduler/k_line/clean/week_month/sub_new_week_month_k_line_service.py,sha256=0rc2Rz_EoqoqpVvgPe4daCe09JtHBlJsQr1bMIlBQ2o,5526
81
81
  mns_scheduler/k_line/common/__init__.py,sha256=itoGlqKhsx7EVXQoD1vchDKQ5GPB16vDjofTSuQtrXg,161
82
- mns_scheduler/k_line/common/k_line_common_api.py,sha256=GL4smDLzFljT-l8XiFKKpJEw8qhujbfZVmnsKa2VhSo,5808
82
+ mns_scheduler/k_line/common/k_line_common_api.py,sha256=4WpTxhh-LVUd25wYgSEGFIIY0tz9by8P_pQ-4ISrgCQ,5808
83
83
  mns_scheduler/k_line/hot_stocks/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
84
84
  mns_scheduler/k_line/hot_stocks/recent_hot_stocks_clean_service.py,sha256=8woZzGVORYX9KZr6xtfiYYgApDKissnzYM6hS2k6XBA,2628
85
85
  mns_scheduler/k_line/month_week_daily/__init__.py,sha256=ffZXFCLFdIwOsbxnw__u1MbQYh9yz7Bs8UMP6VF0X2M,161
@@ -133,10 +133,6 @@ mns_scheduler/trade/task/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImy
133
133
  mns_scheduler/trade/task/trader_task_service.py,sha256=YQst2m0MWLnQ7FceCL5EkCEN-Ry7lw_ZTZm6DJdOIQc,1560
134
134
  mns_scheduler/trade/tfp/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
135
135
  mns_scheduler/trade/tfp/stock_tfp_info_sync.py,sha256=ViAVG-1GWLkRxiSBPLIfNICZRnpNZ3mHf44R7X7O4IE,2440
136
- mns_scheduler/us/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
137
- mns_scheduler/us/baidu_yun_pan_handle_service.py,sha256=T0BHGKgQUqJcJ0p6wFFexbi7-K4YfkdDAC3NZDzdM-s,2730
138
- mns_scheduler/us/k_line.py,sha256=0F6IR1WCtREGFjLfL6Mcu5gAhNY2yaAshRlXTUE-0Sg,4100
139
- mns_scheduler/us/us_company_info_sync_service_api.py,sha256=IRmg9Qq71Zyu_0lnU7hOZ7xjg7DnFqTwecfXHEGzJp8,1227
140
136
  mns_scheduler/zb/__init__.py,sha256=Tyvi_iQlv3jz59EdH67Mycnt9CSixcWPQoJwu55bOq0,165
141
137
  mns_scheduler/zb/stock_zb_pool_sync.py,sha256=YXXmofkOsXxTQSUboy7AfEQUeszXVop5oZxLKBqQpJE,1272
142
138
  mns_scheduler/zt/__init__.py,sha256=Rzolrn2R5RZIj-eOmu9KcL6oZBY9Wjz_uBFXPlzirQc,1641
@@ -156,11 +152,11 @@ mns_scheduler/zt/script/sync_high_chg_pool_his_data.py,sha256=xzfjlwNqsiDQqkTTma
156
152
  mns_scheduler/zt/script/sync_now_higt_chg_zt.py,sha256=7qUtn58ty9Vc6kY33BooCDIOojDGmSf9U5ncAtZt4cc,1853
157
153
  mns_scheduler/zt/zt_pool/__init__.py,sha256=Tyvi_iQlv3jz59EdH67Mycnt9CSixcWPQoJwu55bOq0,165
158
154
  mns_scheduler/zt/zt_pool/em_zt_pool_sync_api.py,sha256=LOEUyTA5g7N6FWxUpHWimWTeXiiMAnUdsYqhG4HpuOY,12154
159
- mns_scheduler/zt/zt_pool/ths_zt_pool_sync_api.py,sha256=w-pyNxndQoHRGPM4i8ddvrKOWkItRahAT3G7p9QxFKw,9397
155
+ mns_scheduler/zt/zt_pool/ths_zt_pool_sync_api.py,sha256=9Sv1G88poLG3_8aLPkfr8bdwD_AzbSrwvHTGPErOtQU,7501
160
156
  mns_scheduler/zt/zt_pool/update_null_zt_reason_api.py,sha256=caW-MuF0RFLavJZafeLDYQ29-GxwGsmr5YVrN4lost8,2135
161
157
  mns_scheduler/zz_task/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
162
158
  mns_scheduler/zz_task/data_sync_task.py,sha256=18MI6OyWS97LvD_fj717St3gfJC4NNrA1lyKn_OteHc,23150
163
- mns_scheduler-1.3.2.5.dist-info/METADATA,sha256=yqU0eRvT2U-Jqb-LHl_8ib-9LU1UJ99vAurFKw0RlUU,64
164
- mns_scheduler-1.3.2.5.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
165
- mns_scheduler-1.3.2.5.dist-info/top_level.txt,sha256=PXQDFBGR1pWmsUbH5yiLAh71P5HZODTRED0zJ8CCgOc,14
166
- mns_scheduler-1.3.2.5.dist-info/RECORD,,
159
+ mns_scheduler-1.3.2.8.dist-info/METADATA,sha256=W_gpIpAQWvASuPZFDRSXJA2x3IgFK90U2pe5qHN9xeQ,64
160
+ mns_scheduler-1.3.2.8.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
161
+ mns_scheduler-1.3.2.8.dist-info/top_level.txt,sha256=PXQDFBGR1pWmsUbH5yiLAh71P5HZODTRED0zJ8CCgOc,14
162
+ mns_scheduler-1.3.2.8.dist-info/RECORD,,
@@ -1,7 +0,0 @@
1
- import sys
2
- import os
3
-
4
- file_path = os.path.abspath(__file__)
5
- end = file_path.index('mns') + 17
6
- project_path = file_path[0:end]
7
- sys.path.append(project_path)
@@ -1,91 +0,0 @@
1
- import sys
2
- import os
3
-
4
- file_path = os.path.abspath(__file__)
5
- end = file_path.index('mns') + 17
6
- project_path = file_path[0:end]
7
- sys.path.append(project_path)
8
- from bypy import ByPy
9
- from mns_common.db.MongodbUtil import MongodbUtil
10
- import tempfile
11
- from loguru import logger
12
- import akshare as ak
13
-
14
- mongodb_util = MongodbUtil('27017')
15
-
16
- import subprocess
17
-
18
-
19
- def get_file_list(path):
20
- """
21
- 获取百度网盘指定路径下的文件列表
22
- :param path: 百度网盘中的路径,例如 '/我的资源'
23
- :return: 文件列表
24
- """
25
- try:
26
- # 调用 bypy list 命令
27
- result = subprocess.run(['bypy', 'list', path], capture_output=True, text=True, check=True, encoding='utf-8')
28
-
29
- # 输出结果
30
- if result.returncode == 0:
31
- file_list = result.stdout.splitlines() # 按行分割结果
32
- return file_list
33
- else:
34
- logger.error("获取文件路径异常:{}", result.stderr)
35
- return []
36
- except subprocess.CalledProcessError as e:
37
- logger.error("获取文件路径异常:{}", e)
38
- return []
39
-
40
-
41
- def upload_to_baidu(file_name, folder_name, data_df):
42
- bp = ByPy()
43
- file_name = file_name + '.csv'
44
- with tempfile.NamedTemporaryFile(mode='w', suffix='.csv', delete=False) as temp_file:
45
- data_df.to_csv(temp_file, index=False)
46
- temp_file_path = temp_file.name # 获取临时文件的路径
47
-
48
- # 上传临时文件到百度云
49
- remote_path = f'/{folder_name}/{file_name}'
50
- result = bp.upload(temp_file_path, remote_path)
51
- if result == 0:
52
- logger.info("上传成功:{}", file_name)
53
- else:
54
- logger.error("上传失败:{}", file_name)
55
- return result
56
-
57
-
58
- def mkdir_baidu_new_folder(remote_path):
59
- bp = ByPy()
60
- try:
61
- # 调用 mkdir 方法创建文件夹
62
- result = bp.mkdir(remote_path)
63
-
64
- if result == 0:
65
- logger.info("成功创建文件夹:{}", remote_path)
66
- else:
67
- logger.error("创建文件夹失败:{}", result)
68
-
69
- except Exception as e:
70
- logger.error("创建文件夹失败:{}", e)
71
-
72
-
73
- def del_baidu_old_folder(remote_path):
74
- bp = ByPy()
75
- try:
76
- # 调用 mkdir 方法创建文件夹
77
- result = bp.delete(remote_path)
78
-
79
- if result == 0:
80
- logger.info("成功删除文件夹:{}", remote_path)
81
- else:
82
- logger.error("删除文件夹失败:{}", result)
83
-
84
- except Exception as e:
85
- logger.error("删除文件夹失败:{}", e)
86
-
87
-
88
- if __name__ == '__main__':
89
- folder_name1 = '/美股/不复权日线'
90
- mkdir_baidu_new_folder(folder_name1)
91
- list_df = get_file_list('/bypy/美股')
@@ -1,91 +0,0 @@
1
- import akshare as ak
2
- import pandas as pd
3
- from mns_common.db.MongodbUtil import MongodbUtil
4
-
5
- mongodb_util = MongodbUtil('27017')
6
-
7
-
8
- def us_stock():
9
- # 输入参数
10
- symbol = input("请输入股票代码(all:全量(时间很长),特定代码:106.TTE):")
11
- start_date = input("请输入开始日期(格式:YYYYMMDD):")
12
- end_date = input("请输入结束日期(格式:YYYYMMDD):")
13
- fq = input("请输入复权信息(前复权:qfq,不复权:bfq,后复权:hfq):")
14
- k_line_period = input("请输入k线周期(日线:daily,周线:weekly,月线:monthly):")
15
- db_name = "us_stock_" + fq + "_" + k_line_period
16
- if fq == 'bfq':
17
- fq = ''
18
- if symbol != 'all':
19
- # 获取股票历史数据
20
- stock_us_hist_df = ak.stock_us_hist(symbol=symbol,
21
- period=k_line_period,
22
- start_date=start_date,
23
- end_date=end_date,
24
- adjust=fq)
25
- # 保存数据到 CSV 文件
26
- stock_us_hist_df.to_csv(f"{symbol}_historical_data.csv", index=False)
27
- print(f"数据已保存到 {symbol}_historical_data.csv")
28
- else:
29
- stock_us_spot_em_df = ak.stock_us_spot_em()
30
- stock_us_spot_em_df = stock_us_spot_em_df.rename(columns={
31
- "序号": "index",
32
- "代码": "symbol",
33
- "名称": "name",
34
- "涨跌额": "change_price",
35
- "涨跌幅": "chg",
36
- "开盘价": "open",
37
- "最高价": "high",
38
- "最低价": "low",
39
- "最新价": "now_price",
40
- "昨收价": "last_price",
41
- "总市值": "total_mv",
42
- "市盈率": "pe",
43
- "成交量": "volume",
44
- "成交额": "amount",
45
- "振幅": "pct_chg",
46
- "换手率": "exchange"
47
- })
48
- stock_us_spot_em_df = stock_us_spot_em_df.sort_values(by=['amount'], ascending=False)
49
- stock_us_spot_em_df = stock_us_spot_em_df.fillna(0)
50
- stock_us_spot_em_df = stock_us_spot_em_df.loc[stock_us_spot_em_df['total_mv'] != 0]
51
-
52
- k_line_result = pd.DataFrame()
53
-
54
- for stock_us_one in stock_us_spot_em_df.itertuples():
55
- try:
56
- # 获取股票历史数据
57
- stock_us_hist_df = ak.stock_us_hist(symbol=stock_us_one.symbol,
58
- period=k_line_period,
59
- start_date=start_date,
60
- end_date=end_date,
61
- adjust=fq)
62
- stock_us_hist_df = stock_us_hist_df.rename(columns={
63
- "日期": "date",
64
- "涨跌额": "change_price",
65
- "涨跌幅": "chg",
66
- "开盘": "open",
67
- "最高": "high",
68
- "最低": "low",
69
- "收盘": "close",
70
- "成交量": "volume",
71
- "成交额": "amount",
72
- "振幅": "pct_chg",
73
- "换手率": "exchange"
74
- })
75
-
76
- k_line_result = pd.concat([stock_us_hist_df, k_line_result])
77
- stock_us_hist_df['_id'] = stock_us_one.symbol + '_' + stock_us_hist_df['date']
78
- stock_us_hist_df['symbol'] = stock_us_one.symbol
79
- stock_us_hist_df['name'] = stock_us_one.name
80
- mongodb_util.insert_mongo(stock_us_hist_df, db_name)
81
- print(f"同步k线数据到: {stock_us_one.name}")
82
- except BaseException as e:
83
- print(f"同步数据发生异常: {stock_us_one.name}, {e}")
84
-
85
- # 保存数据到 CSV 文件
86
- k_line_result.to_csv(f"{symbol}_historical_data.csv", index=False)
87
- print(f"数据已保存到 {symbol}_historical_data.csv")
88
-
89
-
90
- if __name__ == "__main__":
91
- us_stock()
@@ -1,39 +0,0 @@
1
- import sys
2
- import os
3
-
4
- file_path = os.path.abspath(__file__)
5
- end = file_path.index('mns') + 17
6
- project_path = file_path[0:end]
7
- sys.path.append(project_path)
8
- import akshare as ak
9
-
10
-
11
- def sync_us_company_info():
12
- stock_us_spot_em_df = ak.stock_us_spot_em()
13
- stock_us_spot_em_df = stock_us_spot_em_df.rename(columns={
14
- "序号": "index",
15
- "代码": "symbol",
16
- "名称": "name",
17
- "涨跌额": "change_price",
18
- "涨跌幅": "chg",
19
- "开盘价": "open",
20
- "最高价": "high",
21
- "最低价": "low",
22
- "最新价": "now_price",
23
- "昨收价": "last_price",
24
- "总市值": "total_mv",
25
- "市盈率": "pe",
26
- "成交量": "volume",
27
- "成交额": "amount",
28
- "振幅": "pct_chg",
29
- "换手率": "exchange"
30
- })
31
- stock_us_spot_em_df = stock_us_spot_em_df.sort_values(by=['amount'], ascending=False)
32
- stock_us_spot_em_df = stock_us_spot_em_df.fillna(0)
33
- stock_us_spot_em_df = stock_us_spot_em_df.loc[stock_us_spot_em_df['total_mv']!=0]
34
- stock_us_spot_em_df.to_csv('us_stock.csv', index=False)
35
- return stock_us_spot_em_df
36
-
37
-
38
- if __name__ == '__main__':
39
- sync_us_company_info()