mns-scheduler 1.4.3.5__py3-none-any.whl → 1.4.6.4__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.
- mns_scheduler/{company_info/announce → auto_da_ban}/__init__.py +1 -1
- mns_scheduler/auto_da_ban/auto_da_ban_service.py +89 -0
- mns_scheduler/company_info/clean/company_info_clean_api.py +37 -16
- mns_scheduler/company_info/{base → common}/__init__.py +1 -1
- mns_scheduler/company_info/common/company_common_query_service.py +45 -0
- mns_scheduler/company_info/constant/company_constant_data.py +59 -49
- mns_scheduler/company_info/em_stock_info/clean_em_us_hk_stock_info.py +30 -0
- mns_scheduler/company_info/em_stock_info/sync_em_stock_info_sync.py +100 -39
- mns_scheduler/company_info/{remark → sync}/__init__.py +1 -1
- mns_scheduler/company_info/sync/company_info_set_service.py +208 -0
- mns_scheduler/company_info/sync/sync_company_info_task.py +203 -0
- mns_scheduler/company_info/task/__init__.py +7 -0
- mns_scheduler/company_info/{announce/company_announce_sync_service.py → task/company_announce_info_task.py} +25 -13
- mns_scheduler/company_info/task/company_base_info_task.py +64 -0
- mns_scheduler/company_info/{base/sync_company_product_area_industry.py → task/company_business_info_task.py} +33 -17
- mns_scheduler/company_info/task/company_hold_info_task.py +66 -0
- mns_scheduler/company_info/task/company_industry_info_task.py +167 -0
- mns_scheduler/company_info/task/company_total_task.py +69 -0
- mns_scheduler/concept/ths/common/ths_concept_sync_common_api.py +3 -3
- mns_scheduler/concept/ths/update_concept_info/sync_one_symbol_all_concepts_api.py +1 -1
- mns_scheduler/db/script/sync/remote_data_sync_to_local.py +11 -3
- mns_scheduler/irm/api/sh_stock_sns_sse_info_api.py +7 -57
- mns_scheduler/irm/api/sz_stock_sns_sse_info_api.py +14 -25
- mns_scheduler/irm/stock_irm_cninfo_service.py +34 -26
- mns_scheduler/irm/stock_question_id_service.py +169 -0
- mns_scheduler/k_line/clean/k_line_info_clean_task.py +1 -0
- mns_scheduler/kpl/theme/__init__.py +7 -0
- mns_scheduler/kpl/theme/kpl_theme_sync_service.py +231 -0
- mns_scheduler/self_choose/ths_self_choose_service.py +53 -25
- mns_scheduler/trade/auto_login/trader_auto_service.py +2 -1
- mns_scheduler/trade/task/trader_task_service.py +13 -2
- mns_scheduler/trade/tfp/stock_tfp_info_sync.py +1 -1
- mns_scheduler/zb/stock_zb_pool_sync.py +1 -1
- mns_scheduler/zt/zt_pool/em_zt_pool_sync_api.py +45 -130
- mns_scheduler/zt/zt_pool/ths_zt_pool_sync_api.py +1 -1
- mns_scheduler/zt/zt_pool/update_null_zt_reason_api.py +49 -31
- mns_scheduler/zz_task/compensation/compensate_task.py +1 -1
- mns_scheduler/zz_task/compensation/compensate_task_one_day.py +6 -6
- mns_scheduler/zz_task/data_sync_task.py +58 -37
- {mns_scheduler-1.4.3.5.dist-info → mns_scheduler-1.4.6.4.dist-info}/METADATA +1 -1
- {mns_scheduler-1.4.3.5.dist-info → mns_scheduler-1.4.6.4.dist-info}/RECORD +43 -33
- mns_scheduler/company_info/base/sync_company_base_info_api.py +0 -531
- mns_scheduler/company_info/base/sync_company_hold_info_api.py +0 -37
- mns_scheduler/company_info/remark/company_remark_info_sync.py +0 -46
- {mns_scheduler-1.4.3.5.dist-info → mns_scheduler-1.4.6.4.dist-info}/WHEEL +0 -0
- {mns_scheduler-1.4.3.5.dist-info → mns_scheduler-1.4.6.4.dist-info}/top_level.txt +0 -0
|
@@ -18,13 +18,11 @@ import mns_common.api.ths.zt.ths_stock_zt_pool_v2_api as ths_stock_zt_pool_v2_ap
|
|
|
18
18
|
import mns_common.component.zt.zt_common_service_api as zt_common_service_api
|
|
19
19
|
import mns_common.component.em.em_real_time_quotes_api as em_real_time_quotes_api
|
|
20
20
|
from datetime import datetime
|
|
21
|
-
import mns_common.api.ths.zt.ths_stock_zt_pool_api as ths_stock_zt_pool_api
|
|
22
21
|
import mns_common.constant.db_name_constant as db_name_constant
|
|
23
22
|
import mns_common.component.deal.deal_service_api as deal_service_api
|
|
24
23
|
import mns_common.component.company.company_common_service_new_api as company_common_service_new_api
|
|
25
|
-
import mns_common.
|
|
26
|
-
|
|
27
|
-
import time
|
|
24
|
+
import mns_common.component.main_line.main_line_zt_reason_service as main_line_zt_reason_service
|
|
25
|
+
from mns_common.utils.async_fun import async_fun
|
|
28
26
|
|
|
29
27
|
'''
|
|
30
28
|
东方财富涨停池
|
|
@@ -66,10 +64,12 @@ def save_zt_info(str_day):
|
|
|
66
64
|
# 同花顺问财涨停池
|
|
67
65
|
ths_zt_pool_df_data = ths_stock_zt_pool_v2_api.get_ths_stock_zt_reason_with_cache(str_day)
|
|
68
66
|
except BaseException as e:
|
|
69
|
-
logger.error("使用问财同步ths
|
|
67
|
+
logger.error("使用问财同步ths涨停数据异常:{}", e)
|
|
70
68
|
ths_zt_pool_df_data = pd.DataFrame()
|
|
71
69
|
|
|
72
70
|
stock_em_zt_pool_df_data = handle_ths_em_diff_data(ths_zt_pool_df_data, stock_em_zt_pool_df_data)
|
|
71
|
+
# 更新涨停分析和原因数据
|
|
72
|
+
update_zt_reason_analysis(stock_em_zt_pool_df_data, str_day)
|
|
73
73
|
|
|
74
74
|
stock_em_zt_pool_df_data = common_service_fun_api.total_mv_classification(stock_em_zt_pool_df_data.copy())
|
|
75
75
|
|
|
@@ -79,14 +79,18 @@ def save_zt_info(str_day):
|
|
|
79
79
|
|
|
80
80
|
stock_em_zt_pool_df_data = company_common_service_api.amendment_industry(stock_em_zt_pool_df_data.copy())
|
|
81
81
|
|
|
82
|
-
# 主线标记 复盘用
|
|
83
|
-
stock_em_zt_pool_df_data['main_line'] = '无'
|
|
84
|
-
stock_em_zt_pool_df_data['sub_main_line'] = '无'
|
|
85
|
-
stock_em_zt_pool_df_data['zt_reason'] = ''
|
|
86
|
-
stock_em_zt_pool_df_data['zt_analysis'] = ''
|
|
87
|
-
|
|
88
82
|
# 上个交易交易日涨停股票
|
|
89
83
|
last_trade_day_zt_df = zt_common_service_api.get_last_trade_day_zt(str_day)
|
|
84
|
+
# 设置连板
|
|
85
|
+
stock_em_zt_pool_df_data = set_connected_boards_numbers(stock_em_zt_pool_df_data.copy(),
|
|
86
|
+
last_trade_day_zt_df.copy())
|
|
87
|
+
|
|
88
|
+
# 添加主线信息
|
|
89
|
+
stock_em_zt_pool_df_data = main_line_zt_reason_service.merge_main_line_info(str_day,
|
|
90
|
+
stock_em_zt_pool_df_data.copy())
|
|
91
|
+
# 添加涨停原因和分析信息
|
|
92
|
+
stock_em_zt_pool_df_data = main_line_zt_reason_service.merge_zt_reason_info(str_day,
|
|
93
|
+
stock_em_zt_pool_df_data.copy())
|
|
90
94
|
|
|
91
95
|
stock_em_zt_pool_df_data['first_closure_time'] = stock_em_zt_pool_df_data['first_closure_time'].str.strip()
|
|
92
96
|
stock_em_zt_pool_df_data['list_date'] = stock_em_zt_pool_df_data['list_date'].apply(
|
|
@@ -109,130 +113,47 @@ def save_zt_info(str_day):
|
|
|
109
113
|
stock_em_zt_pool_df_data = stock_em_zt_pool_df_data.sort_values(by=['first_closure_time'])
|
|
110
114
|
|
|
111
115
|
# 重置索引,并将排序结果保存到新的"index"列中
|
|
112
|
-
|
|
113
116
|
stock_em_zt_pool_df_data['str_day'] = str_day
|
|
114
117
|
stock_em_zt_pool_df_data['_id'] = stock_em_zt_pool_df_data['symbol'] + "_" + str_day
|
|
115
118
|
stock_em_zt_pool_df_data.drop_duplicates('symbol', keep='last', inplace=True)
|
|
116
119
|
|
|
117
120
|
query_today_zt = {'str_day': str_day}
|
|
118
|
-
|
|
119
121
|
stock_exist_zt_pool_df = mongodb_util.find_query_data(db_name_constant.STOCK_ZT_POOL, query_today_zt)
|
|
120
|
-
|
|
121
122
|
if data_frame_util.is_empty(stock_exist_zt_pool_df):
|
|
122
|
-
|
|
123
123
|
today_new_zt_pool_df = stock_em_zt_pool_df_data.copy()
|
|
124
124
|
else:
|
|
125
125
|
today_new_zt_pool_df = stock_em_zt_pool_df_data.loc[
|
|
126
126
|
~stock_em_zt_pool_df_data['symbol'].isin(stock_exist_zt_pool_df['symbol'])]
|
|
127
127
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
today_main_line_df = mongodb_util.find_query_data(db_name_constant.MAIN_LINE_DETAIL, {'str_day': str_day})
|
|
131
|
-
|
|
132
|
-
for stock_one in today_new_zt_pool_df.itertuples():
|
|
133
|
-
try:
|
|
134
|
-
zt_reason = ''
|
|
135
|
-
zt_analyse_detail = ''
|
|
136
|
-
|
|
137
|
-
# 设置连板数目
|
|
138
|
-
stock_em_zt_pool_df_data = set_connected_boards_numbers(stock_em_zt_pool_df_data.copy(),
|
|
139
|
-
stock_one.symbol,
|
|
140
|
-
last_trade_day_zt_df.copy())
|
|
141
|
-
|
|
142
|
-
reason_tag = False
|
|
143
|
-
# 网页获取
|
|
144
|
-
try:
|
|
145
|
-
ths_cookie = cookie_info_service.get_ths_cookie()
|
|
146
|
-
# 问财获取涨停分析
|
|
147
|
-
zt_analyse_detail = ths_company_info_api.get_company_hot_info(stock_one.symbol, ths_cookie)
|
|
148
|
-
|
|
149
|
-
zt_reason = zt_analyse_detail.split("\n")[0]
|
|
150
|
-
reason_tag = True
|
|
151
|
-
time.sleep(2)
|
|
152
|
-
except BaseException as e:
|
|
153
|
-
time.sleep(2)
|
|
154
|
-
logger.error("网页获取涨停详情异常:{},{}", stock_one.symbol, e)
|
|
155
|
-
|
|
156
|
-
# 问财获取
|
|
157
|
-
if bool(1 - reason_tag):
|
|
158
|
-
try:
|
|
159
|
-
# 问财获取涨停分析
|
|
160
|
-
zt_result_dict = ths_stock_zt_pool_api.zt_analyse_reason(stock_one.symbol)
|
|
161
|
-
zt_analyse_detail = zt_result_dict['zt_analyse_detail']
|
|
162
|
-
zt_reason = zt_result_dict['zt_reason']
|
|
163
|
-
time.sleep(2)
|
|
164
|
-
except BaseException as e:
|
|
165
|
-
time.sleep(2)
|
|
166
|
-
logger.error("问财获取涨停详情异常:{},{}", stock_one.symbol, e)
|
|
167
|
-
|
|
168
|
-
stock_em_zt_pool_df_data.loc[
|
|
169
|
-
stock_em_zt_pool_df_data['symbol'] == stock_one.symbol, 'zt_reason'] = zt_reason
|
|
170
|
-
|
|
171
|
-
stock_em_zt_pool_df_data.loc[
|
|
172
|
-
stock_em_zt_pool_df_data['symbol'] == stock_one.symbol, 'zt_analysis'] = zt_analyse_detail
|
|
173
|
-
|
|
174
|
-
if data_frame_util.is_not_empty(today_main_line_df):
|
|
175
|
-
today_main_line_one_df = today_main_line_df.loc[today_main_line_df['symbol'] == stock_one.symbol]
|
|
176
|
-
if data_frame_util.is_not_empty(today_main_line_one_df):
|
|
177
|
-
stock_em_zt_pool_df_data.loc[
|
|
178
|
-
stock_em_zt_pool_df_data['symbol'] == stock_one.symbol, 'main_line'] = \
|
|
179
|
-
list(today_main_line_one_df['main_line'])[0]
|
|
180
|
-
|
|
181
|
-
stock_em_zt_pool_df_data.loc[
|
|
182
|
-
stock_em_zt_pool_df_data['symbol'] == stock_one.symbol, 'sub_main_line'] = \
|
|
183
|
-
list(today_main_line_one_df['sub_main_line'])[0]
|
|
184
|
-
|
|
185
|
-
query_exist = {'symbol': stock_one.symbol, 'str_day': str_day}
|
|
186
|
-
if mongodb_util.exist_data_query(db_name_constant.STOCK_ZT_POOL, query_exist):
|
|
187
|
-
continue
|
|
188
|
-
else:
|
|
189
|
-
|
|
190
|
-
stock_em_zt_pool_df_data_one = stock_em_zt_pool_df_data.loc[
|
|
191
|
-
stock_em_zt_pool_df_data['symbol'] == stock_one.symbol]
|
|
192
|
-
stock_em_zt_pool_df_data_one = stock_em_zt_pool_df_data_one[ZT_FIELD]
|
|
193
|
-
|
|
194
|
-
chg = round(float(list(stock_em_zt_pool_df_data_one['chg'])[0]), 2)
|
|
195
|
-
stock_em_zt_pool_df_data_one['chg'] = chg
|
|
196
|
-
|
|
197
|
-
mongodb_util.save_mongo(stock_em_zt_pool_df_data_one, db_name_constant.STOCK_ZT_POOL)
|
|
198
|
-
|
|
199
|
-
except BaseException as e:
|
|
200
|
-
|
|
201
|
-
logger.error("同步涨停信息出现异常:{},{}", stock_one.symbol, e)
|
|
202
|
-
except BaseException as e:
|
|
203
|
-
stock_em_zt_pool_df_data['zt_reason'] = '0'
|
|
204
|
-
logger.error("出现异常:{}", e)
|
|
205
|
-
|
|
128
|
+
mongodb_util.save_mongo(today_new_zt_pool_df, db_name_constant.STOCK_ZT_POOL)
|
|
206
129
|
stock_em_zt_pool_df_data = pd.concat([stock_exist_zt_pool_df, today_new_zt_pool_df])
|
|
130
|
+
# 保存连板股票主线
|
|
131
|
+
main_line_zt_reason_service.save_last_trade_day_main_line(str_day, stock_em_zt_pool_df_data)
|
|
132
|
+
|
|
207
133
|
stock_em_zt_pool_df_data.fillna('', inplace=True)
|
|
208
134
|
stock_em_zt_pool_df_data = stock_em_zt_pool_df_data[ZT_FIELD]
|
|
209
135
|
return stock_em_zt_pool_df_data
|
|
210
136
|
|
|
211
137
|
|
|
212
138
|
# 设置连板数目
|
|
213
|
-
def set_connected_boards_numbers(stock_em_zt_pool_df_data,
|
|
139
|
+
def set_connected_boards_numbers(stock_em_zt_pool_df_data, last_trade_day_zt_df):
|
|
140
|
+
if data_frame_util.is_empty(stock_em_zt_pool_df_data):
|
|
141
|
+
return stock_em_zt_pool_df_data
|
|
142
|
+
if data_frame_util.is_empty(last_trade_day_zt_df):
|
|
143
|
+
return stock_em_zt_pool_df_data
|
|
214
144
|
# 连板股票
|
|
215
145
|
connected_boards_df_copy = last_trade_day_zt_df.loc[
|
|
216
146
|
last_trade_day_zt_df['symbol'].isin(stock_em_zt_pool_df_data['symbol'])]
|
|
217
147
|
|
|
218
148
|
connected_boards_df = connected_boards_df_copy.copy()
|
|
149
|
+
#
|
|
219
150
|
connected_boards_df['connected_boards_numbers'] = connected_boards_df['connected_boards_numbers'] + 1
|
|
220
151
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
list(connected_boards_df_one['connected_boards_numbers'])[0]
|
|
227
|
-
|
|
228
|
-
if 'main_line' in connected_boards_df_one.columns:
|
|
229
|
-
stock_em_zt_pool_df_data.loc[stock_em_zt_pool_df_data['symbol'] == symbol, 'main_line'] = \
|
|
230
|
-
list(connected_boards_df_one['main_line'])[0]
|
|
231
|
-
|
|
232
|
-
if 'sub_main_line' in connected_boards_df_one.columns:
|
|
233
|
-
stock_em_zt_pool_df_data.loc[stock_em_zt_pool_df_data['symbol'] == symbol, 'sub_main_line'] = \
|
|
234
|
-
list(connected_boards_df_one['sub_main_line'])[0]
|
|
235
|
-
|
|
152
|
+
symbol_mapping_connected_boards_numbers = dict(
|
|
153
|
+
zip(connected_boards_df['symbol'], connected_boards_df['connected_boards_numbers']))
|
|
154
|
+
# 使用map进行替换,不匹配的保持原值
|
|
155
|
+
stock_em_zt_pool_df_data['connected_boards_numbers'] = stock_em_zt_pool_df_data['symbol'].map(
|
|
156
|
+
symbol_mapping_connected_boards_numbers).fillna(1)
|
|
236
157
|
return stock_em_zt_pool_df_data
|
|
237
158
|
|
|
238
159
|
|
|
@@ -419,25 +340,19 @@ def query_company_info_with_share():
|
|
|
419
340
|
return company_info_df
|
|
420
341
|
|
|
421
342
|
|
|
343
|
+
# 异步更新涨停分析和数据
|
|
344
|
+
@async_fun
|
|
345
|
+
def update_zt_reason_analysis(stock_em_zt_pool_df_data, str_day):
|
|
346
|
+
if data_frame_util.is_empty(stock_em_zt_pool_df_data):
|
|
347
|
+
return
|
|
348
|
+
now_date = datetime.now()
|
|
349
|
+
now_str_day = now_date.strftime('%Y-%m-%d')
|
|
350
|
+
if now_str_day != str_day:
|
|
351
|
+
return
|
|
352
|
+
|
|
353
|
+
stock_em_zt_pool_df_data['str_day'] = str_day
|
|
354
|
+
main_line_zt_reason_service.update_symbol_list_zt_reason_analysis(stock_em_zt_pool_df_data, True)
|
|
355
|
+
|
|
356
|
+
|
|
422
357
|
if __name__ == '__main__':
|
|
423
|
-
save_zt_info('2025-
|
|
424
|
-
# from datetime import datetime
|
|
425
|
-
#
|
|
426
|
-
# if __name__ == '__main__':
|
|
427
|
-
#
|
|
428
|
-
# sync_date = date_handle_util.add_date_day('20240110', 0)
|
|
429
|
-
#
|
|
430
|
-
# now_date = datetime.now()
|
|
431
|
-
#
|
|
432
|
-
# str_now_day = sync_date.strftime('%Y-%m-%d')
|
|
433
|
-
#
|
|
434
|
-
# while now_date > sync_date:
|
|
435
|
-
# try:
|
|
436
|
-
# save_zt_info(str_now_day)
|
|
437
|
-
# sync_date = date_handle_util.add_date_day(date_handle_util.no_slash_date(str_now_day), 1)
|
|
438
|
-
# print(str_now_day)
|
|
439
|
-
# str_now_day = sync_date.strftime('%Y-%m-%d')
|
|
440
|
-
#
|
|
441
|
-
# except BaseException as e:
|
|
442
|
-
# sync_date = date_handle_util.add_date_day(date_handle_util.no_slash_date(str_now_day), 1)
|
|
443
|
-
# str_now_day = sync_date.strftime('%Y-%m-%d')
|
|
358
|
+
save_zt_info('2025-12-29')
|
|
@@ -188,6 +188,6 @@ if __name__ == '__main__':
|
|
|
188
188
|
# trade_date = '2024-08-01'
|
|
189
189
|
# zt_df = ths_zt_pool(trade_date, None)
|
|
190
190
|
# save_ths_zt_pool(zt_df, trade_date)
|
|
191
|
-
trade_date = '2025-
|
|
191
|
+
trade_date = '2025-11-04'
|
|
192
192
|
ths_zt_pool_df_test = ths_zt_pool(trade_date, None)
|
|
193
193
|
save_ths_zt_pool(ths_zt_pool_df_test, trade_date)
|
|
@@ -8,10 +8,10 @@ sys.path.append(project_path)
|
|
|
8
8
|
from mns_common.db.MongodbUtil import MongodbUtil
|
|
9
9
|
|
|
10
10
|
mongodb_util = MongodbUtil('27017')
|
|
11
|
-
import mns_common.api.ths.zt.ths_stock_zt_pool_api as ths_stock_zt_pool_api
|
|
12
11
|
import mns_common.utils.data_frame_util as data_frame_util
|
|
13
12
|
from loguru import logger
|
|
14
13
|
import time
|
|
14
|
+
import mns_common.component.main_line.main_line_zt_reason_service as main_line_zt_reason_service
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
def update_null_zt_reason(str_day):
|
|
@@ -25,37 +25,55 @@ def update_null_zt_reason(str_day):
|
|
|
25
25
|
|
|
26
26
|
]}
|
|
27
27
|
stock_zt_pool_df_null_zt_reason = mongodb_util.find_query_data('stock_zt_pool', query)
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
#
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
28
|
+
no_reason_list = []
|
|
29
|
+
if data_frame_util.is_not_empty(stock_zt_pool_df_null_zt_reason):
|
|
30
|
+
no_reason_list = list(stock_zt_pool_df_null_zt_reason['symbol'])
|
|
31
|
+
|
|
32
|
+
# 比较两个表
|
|
33
|
+
query_zt_reason_analysis = {"str_day": str_day}
|
|
34
|
+
stock_zt_pool_df_exist = mongodb_util.find_query_data('stock_zt_pool', query_zt_reason_analysis)
|
|
35
|
+
stock_zt_reason_df = mongodb_util.find_query_data('zt_reason_analysis', query_zt_reason_analysis)
|
|
36
|
+
if data_frame_util.is_not_empty(stock_zt_pool_df_exist):
|
|
37
|
+
if data_frame_util.is_empty(stock_zt_reason_df):
|
|
38
|
+
no_reason_list.extend(list(stock_zt_pool_df_exist['symbol']))
|
|
39
|
+
else:
|
|
40
|
+
not_in_zt_reason_zf = stock_zt_pool_df_exist.loc[~stock_zt_pool_df_exist['symbol']
|
|
41
|
+
.isin(stock_zt_reason_df['symbol'])]
|
|
42
|
+
if data_frame_util.is_not_empty(not_in_zt_reason_zf):
|
|
43
|
+
no_reason_list.extend(list(not_in_zt_reason_zf['symbol']))
|
|
44
|
+
|
|
45
|
+
null_zt_reason_df = stock_zt_reason_df.loc[(stock_zt_reason_df['zt_reason'] == '')
|
|
46
|
+
| (stock_zt_reason_df['zt_analysis'] == '')]
|
|
47
|
+
if data_frame_util.is_empty(null_zt_reason_df):
|
|
48
|
+
no_reason_list.extend(list(null_zt_reason_df['symbol']))
|
|
49
|
+
|
|
50
|
+
for symbol in no_reason_list:
|
|
51
|
+
try:
|
|
52
|
+
|
|
53
|
+
need_update_zt_pool_df = stock_zt_pool_df_exist.loc[
|
|
54
|
+
stock_zt_pool_df_exist['symbol'].isin([symbol])]
|
|
55
|
+
main_line_zt_reason_service.update_symbol_list_zt_reason_analysis(need_update_zt_pool_df, True)
|
|
56
|
+
time.sleep(2)
|
|
57
|
+
|
|
58
|
+
query_zt = {'symbol': symbol, 'str_day': str_day}
|
|
59
|
+
zt_reason_analysis_one_df = mongodb_util.find_query_data('zt_reason_analysis', query_zt)
|
|
60
|
+
if data_frame_util.is_empty(zt_reason_analysis_one_df):
|
|
55
61
|
continue
|
|
56
|
-
|
|
57
|
-
|
|
62
|
+
zt_analysis = list(zt_reason_analysis_one_df['zt_analysis'])[0]
|
|
63
|
+
zt_reason = list(zt_reason_analysis_one_df['zt_reason'])[0]
|
|
64
|
+
new_values = {'$set': {
|
|
65
|
+
'zt_analysis': zt_analysis,
|
|
66
|
+
'zt_reason': zt_reason
|
|
67
|
+
}}
|
|
68
|
+
mongodb_util.update_many(query_zt, new_values, 'stock_zt_pool')
|
|
69
|
+
mongodb_util.update_many(query_zt, new_values, 'main_line_detail')
|
|
70
|
+
|
|
71
|
+
if symbol in no_reason_list:
|
|
72
|
+
no_reason_list.remove(symbol)
|
|
73
|
+
except BaseException as e:
|
|
74
|
+
logger.error("出现异常:{},{}", symbol, e)
|
|
75
|
+
continue
|
|
58
76
|
|
|
59
77
|
|
|
60
78
|
if __name__ == '__main__':
|
|
61
|
-
update_null_zt_reason('
|
|
79
|
+
update_null_zt_reason('2026-01-07')
|
|
@@ -20,7 +20,7 @@ import mns_scheduler.zt.high_chg.sync_high_chg_pool_service as sync_high_chg_poo
|
|
|
20
20
|
import mns_scheduler.zt.high_chg.sync_high_chg_real_time_quotes_service as sync_high_chg_real_time_quotes_service
|
|
21
21
|
import mns_scheduler.zt.zt_pool.ths_zt_pool_sync_api as ths_zt_pool_sync_api
|
|
22
22
|
import mns_scheduler.trade.tfp.stock_tfp_info_sync as stock_tfp_info_sync
|
|
23
|
-
|
|
23
|
+
from datetime import datetime
|
|
24
24
|
|
|
25
25
|
# 定时同步每日交易行情数据(前复权)
|
|
26
26
|
def stock_daily_sync_qfq():
|
|
@@ -18,7 +18,7 @@ import mns_scheduler.zt.high_chg.sync_high_chg_pool_service as sync_high_chg_poo
|
|
|
18
18
|
import mns_scheduler.zt.high_chg.sync_high_chg_real_time_quotes_service as sync_high_chg_real_time_quotes_service
|
|
19
19
|
import mns_scheduler.zt.zt_pool.ths_zt_pool_sync_api as ths_zt_pool_sync_api
|
|
20
20
|
import mns_scheduler.trade.tfp.stock_tfp_info_sync as stock_tfp_info_sync
|
|
21
|
-
|
|
21
|
+
from datetime import datetime
|
|
22
22
|
|
|
23
23
|
# 定时同步每日交易行情数据(前复权)
|
|
24
24
|
def stock_daily_sync_qfq():
|
|
@@ -134,9 +134,9 @@ def col_data_move():
|
|
|
134
134
|
|
|
135
135
|
if __name__ == '__main__':
|
|
136
136
|
# todo 修改日期
|
|
137
|
-
str_day = '
|
|
137
|
+
str_day = '2026-01-05'
|
|
138
138
|
# col_data_move()
|
|
139
|
-
|
|
140
|
-
sync_stock_zt_pool()
|
|
141
|
-
sync_stock_dt_pool()
|
|
142
|
-
sync_stock_zb_pool()
|
|
139
|
+
generate_new_day_k_line_info()
|
|
140
|
+
# sync_stock_zt_pool()
|
|
141
|
+
# sync_stock_dt_pool()
|
|
142
|
+
# sync_stock_zb_pool()
|
|
@@ -21,7 +21,6 @@ import mns_scheduler.zb.stock_zb_pool_sync as stock_zb_pool_sync_api
|
|
|
21
21
|
import mns_common.component.trade_date.trade_date_common_service_api as trade_date_common_service_api
|
|
22
22
|
import mns_common.utils.date_handle_util as date_handle_util
|
|
23
23
|
import mns_scheduler.k_line.month_week_daily.daily_week_month_line_sync as daily_week_month_line_sync_api
|
|
24
|
-
import mns_scheduler.company_info.announce.company_announce_sync_service as company_announce_sync_service
|
|
25
24
|
import mns_scheduler.db.col_move_service as col_move_service
|
|
26
25
|
import mns_scheduler.db.db_status as db_status_api
|
|
27
26
|
import mns_scheduler.zt.open_data.kcx_high_chg_open_data_sync as kcx_high_chg_open_data_sync
|
|
@@ -36,7 +35,7 @@ import \
|
|
|
36
35
|
import \
|
|
37
36
|
mns_scheduler.concept.ths.update_concept_info.sync_one_symbol_all_concepts_api as sync_one_symbol_all_concepts_api
|
|
38
37
|
import mns_scheduler.kpl.selection.total.sync_kpl_best_total_sync_api as sync_kpl_best_total_sync_api
|
|
39
|
-
import mns_scheduler.company_info.
|
|
38
|
+
import mns_scheduler.company_info.sync.sync_company_info_task as sync_company_info_task
|
|
40
39
|
import mns_scheduler.trade.auto_ipo_buy_api as auto_ipo_buy_api
|
|
41
40
|
import mns_scheduler.kpl.selection.index.sync_best_choose_his_index as sync_best_choose_his_index
|
|
42
41
|
import mns_scheduler.concept.ths.common.ths_concept_update_common_api as ths_concept_update_common_api
|
|
@@ -52,7 +51,6 @@ import mns_scheduler.concept.ths.sync_new_index.sync_ths_concept_new_index_api a
|
|
|
52
51
|
import mns_scheduler.company_info.clean.company_info_clean_api as company_info_clean_api
|
|
53
52
|
import mns_scheduler.zt.zt_pool.ths_zt_pool_sync_api as ths_zt_pool_sync_api
|
|
54
53
|
import mns_scheduler.trade.task.trader_task_service as trader_task_service
|
|
55
|
-
import mns_scheduler.company_info.remark.company_remark_info_sync as company_remark_info_sync
|
|
56
54
|
import mns_scheduler.finance.sync_financial_report_service_task as sync_financial_report_service_task
|
|
57
55
|
import mns_scheduler.hk.hk_industry_info_sync_service_api as hk_industry_info_sync_service_api
|
|
58
56
|
import mns_scheduler.hk.hk_company_info_sync_service_api as hk_company_info_sync_service_api
|
|
@@ -61,7 +59,10 @@ import mns_scheduler.trade.tfp.stock_tfp_info_sync as stock_tfp_info_sync
|
|
|
61
59
|
import mns_scheduler.industry.ths.ths_industry_sync_service as ths_industry_sync_service
|
|
62
60
|
import mns_scheduler.k_line.year_quarter.year_quarter_line_sync as year_quarter_line_sync
|
|
63
61
|
import mns_scheduler.k_line.sync_status.k_line_sync_status_check as k_line_sync_status_check
|
|
64
|
-
import mns_scheduler.company_info.
|
|
62
|
+
import mns_scheduler.company_info.task.company_total_task as company_total_task
|
|
63
|
+
import mns_scheduler.irm.stock_question_id_service as stock_question_id_service
|
|
64
|
+
import mns_scheduler.auto_da_ban.auto_da_ban_service as auto_da_ban_service
|
|
65
|
+
import mns_scheduler.kpl.theme.kpl_theme_sync_service as kpl_theme_sync_service
|
|
65
66
|
|
|
66
67
|
|
|
67
68
|
# 同步交易日期任务完成
|
|
@@ -298,9 +299,13 @@ def sync_new_concept_index_task():
|
|
|
298
299
|
|
|
299
300
|
|
|
300
301
|
# 清洗公司基本信息
|
|
301
|
-
def
|
|
302
|
-
|
|
303
|
-
|
|
302
|
+
def clean_company_base_info():
|
|
303
|
+
# 同步新股信息
|
|
304
|
+
company_total_task.sync_new_stock_company_task()
|
|
305
|
+
# 放到临时表
|
|
306
|
+
sync_company_info_task.sync_company_base_info([])
|
|
307
|
+
# 放到正式表
|
|
308
|
+
company_info_clean_api.clean_company_info([])
|
|
304
309
|
# 退市股票同步
|
|
305
310
|
de_list_stock_service.sync_de_list_stock()
|
|
306
311
|
logger.info('同步公司基本信息任务完成')
|
|
@@ -348,13 +353,17 @@ def sync_high_risk_stocks():
|
|
|
348
353
|
|
|
349
354
|
# 同步互动回答
|
|
350
355
|
def sync_all_interactive_questions():
|
|
351
|
-
now_date = datetime.now()
|
|
352
|
-
str_day = now_date.strftime('%Y-%m-%d')
|
|
356
|
+
# now_date = datetime.now()
|
|
357
|
+
# str_day = now_date.strftime('%Y-%m-%d')
|
|
353
358
|
# 非交易日同步
|
|
354
|
-
tag = bool(1 - trade_date_common_service_api.is_trade_day(str_day))
|
|
355
|
-
if tag:
|
|
356
|
-
|
|
357
|
-
|
|
359
|
+
# tag = bool(1 - trade_date_common_service_api.is_trade_day(str_day))
|
|
360
|
+
# if tag:
|
|
361
|
+
|
|
362
|
+
logger.info('同步互动回答')
|
|
363
|
+
stock_question_id_service.sync_sz_stock_uid([])
|
|
364
|
+
stock_question_id_service.sync_sh_stock_uid()
|
|
365
|
+
|
|
366
|
+
stock_irm_cninfo_service.sync_symbols_interactive_questions([])
|
|
358
367
|
|
|
359
368
|
|
|
360
369
|
# # 重开定时任务同步
|
|
@@ -375,10 +384,10 @@ def trader_client_auto_login():
|
|
|
375
384
|
trader_task_service.open_trader_terminal()
|
|
376
385
|
|
|
377
386
|
|
|
378
|
-
#
|
|
379
|
-
def
|
|
380
|
-
logger.info('
|
|
381
|
-
|
|
387
|
+
# 打开qmt交易端
|
|
388
|
+
def open_qmt_terminal():
|
|
389
|
+
logger.info('打开qmt交易客户端')
|
|
390
|
+
trader_task_service.open_qmt_terminal()
|
|
382
391
|
|
|
383
392
|
|
|
384
393
|
# 自选股操作任务
|
|
@@ -409,11 +418,6 @@ def update_null_zt_reason():
|
|
|
409
418
|
logger.info("更新空涨停原因信息:{}", str_now_day)
|
|
410
419
|
|
|
411
420
|
|
|
412
|
-
# 同步公告信息
|
|
413
|
-
def sync_company_announce():
|
|
414
|
-
company_announce_sync_service.sync_company_announce(None)
|
|
415
|
-
|
|
416
|
-
|
|
417
421
|
# 同步停复牌信息
|
|
418
422
|
def sync_stock_tfp():
|
|
419
423
|
now_date = datetime.now()
|
|
@@ -446,9 +450,24 @@ def check_k_line_sync_count():
|
|
|
446
450
|
k_line_sync_status_check.check_k_line_sync_count()
|
|
447
451
|
|
|
448
452
|
|
|
449
|
-
#
|
|
450
|
-
def
|
|
451
|
-
|
|
453
|
+
# 全量同步公司信息
|
|
454
|
+
def sync_all_company_info_task():
|
|
455
|
+
logger.info("全量同步公司信息")
|
|
456
|
+
company_total_task.sync_all_company_task()
|
|
457
|
+
|
|
458
|
+
|
|
459
|
+
# 自动打板
|
|
460
|
+
def auto_da_ban_task():
|
|
461
|
+
auto_da_ban_service.auto_da_ban_task()
|
|
462
|
+
|
|
463
|
+
|
|
464
|
+
# 同步开盘啦题材
|
|
465
|
+
def sync_kpl_theme():
|
|
466
|
+
logger.info("同步开盘啦题材")
|
|
467
|
+
# 同步新的开盘啦题材
|
|
468
|
+
kpl_theme_sync_service.sync_new_kpl_theme_info()
|
|
469
|
+
# 更新所有开盘啦题材
|
|
470
|
+
kpl_theme_sync_service.update_all_kpl_theme_info()
|
|
452
471
|
|
|
453
472
|
|
|
454
473
|
# # 定义BlockingScheduler
|
|
@@ -456,22 +475,25 @@ blockingScheduler = BlockingScheduler()
|
|
|
456
475
|
|
|
457
476
|
# 同步东方财富a,etf,kzz,us,hk信息
|
|
458
477
|
blockingScheduler.add_job(sync_all_em_stock_info, 'cron', hour='07', minute='31')
|
|
459
|
-
blockingScheduler.add_job(sync_all_em_stock_info, 'cron', hour='
|
|
478
|
+
blockingScheduler.add_job(sync_all_em_stock_info, 'cron', hour='16', minute='20')
|
|
460
479
|
|
|
461
480
|
# 开盘前同步当天交易需要的k线数据
|
|
462
481
|
blockingScheduler.add_job(sync_today_trade_k_line_info, 'cron', hour='07', minute='50')
|
|
463
482
|
|
|
464
483
|
# 同步单只股票下所有概念 by 股票代码
|
|
465
|
-
blockingScheduler.add_job(update_one_symbol_all_concepts, 'cron', hour='
|
|
484
|
+
blockingScheduler.add_job(update_one_symbol_all_concepts, 'cron', hour='06,08,18', minute='45')
|
|
485
|
+
|
|
486
|
+
# 同步单只股票下所有概念 by 股票代码 中午任务执行
|
|
487
|
+
blockingScheduler.add_job(update_one_symbol_all_concepts, 'cron', hour='12', minute='15,40')
|
|
466
488
|
|
|
467
489
|
# 打开交易客户端
|
|
468
|
-
blockingScheduler.add_job(
|
|
490
|
+
blockingScheduler.add_job(open_qmt_terminal, 'cron', hour='07,08,09', minute='04')
|
|
469
491
|
|
|
470
492
|
# 获取当前持仓
|
|
471
|
-
blockingScheduler.add_job(sync_position, 'cron', hour='0,08,
|
|
493
|
+
blockingScheduler.add_job(sync_position, 'cron', hour='0,08,16', minute='14')
|
|
472
494
|
|
|
473
495
|
# 同步公司基本信息
|
|
474
|
-
blockingScheduler.add_job(
|
|
496
|
+
blockingScheduler.add_job(clean_company_base_info, 'cron', hour='07,18', minute='05')
|
|
475
497
|
|
|
476
498
|
# 同步互动回答
|
|
477
499
|
blockingScheduler.add_job(sync_all_interactive_questions, 'cron', hour='06,17', minute='30')
|
|
@@ -500,9 +522,6 @@ blockingScheduler.add_job(update_best_choose_plate_relation, 'cron', hour='09,18
|
|
|
500
522
|
# 自动打新 打新中签高时间段 10:30-11:30
|
|
501
523
|
blockingScheduler.add_job(auto_ipo_buy, 'cron', hour='09', minute='40,50')
|
|
502
524
|
|
|
503
|
-
# 同步单只股票下所有概念 by 股票代码 中午任务执行
|
|
504
|
-
blockingScheduler.add_job(update_one_symbol_all_concepts, 'cron', hour='12', minute='15,40')
|
|
505
|
-
|
|
506
525
|
# 数据备份
|
|
507
526
|
blockingScheduler.add_job(col_data_move, 'cron', hour='15', minute='06')
|
|
508
527
|
|
|
@@ -544,9 +563,6 @@ blockingScheduler.add_job(sync_year_k_line, 'cron', hour='18,23', minute='55')
|
|
|
544
563
|
# 同步交易日期
|
|
545
564
|
blockingScheduler.add_job(sync_trade_date, 'cron', hour='20', minute='43')
|
|
546
565
|
|
|
547
|
-
# 同步公司备注信息
|
|
548
|
-
blockingScheduler.add_job(sync_company_remark_info, 'cron', hour='22', minute='30')
|
|
549
|
-
|
|
550
566
|
# 同步高风险股票
|
|
551
567
|
blockingScheduler.add_job(sync_high_risk_stocks, 'cron', hour='0,12,16', minute='20')
|
|
552
568
|
|
|
@@ -569,8 +585,13 @@ blockingScheduler.add_job(sync_all_kpl_plate_info, 'interval', minutes=5, max_in
|
|
|
569
585
|
blockingScheduler.add_job(check_k_line_sync_count, 'cron', hour='6,23', minute='10')
|
|
570
586
|
|
|
571
587
|
# 同步公司产品区域信息
|
|
572
|
-
blockingScheduler.add_job(
|
|
588
|
+
blockingScheduler.add_job(sync_all_company_info_task, 'cron', day_of_week='sat,sun', hour='09',
|
|
573
589
|
minute='10')
|
|
590
|
+
# 自动打板任务
|
|
591
|
+
blockingScheduler.add_job(auto_da_ban_task, 'cron', hour='19', minute='29')
|
|
592
|
+
|
|
593
|
+
# # 同步开盘啦题材
|
|
594
|
+
blockingScheduler.add_job(sync_kpl_theme, 'cron', hour='08,09,12,16', minute='20')
|
|
574
595
|
|
|
575
596
|
print('定时任务启动成功')
|
|
576
597
|
blockingScheduler.start()
|