mns-scheduler 1.4.4.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/auto_da_ban/auto_da_ban_service.py +19 -17
- mns_scheduler/company_info/constant/company_constant_data.py +1 -2
- 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 +99 -39
- mns_scheduler/db/script/sync/remote_data_sync_to_local.py +5 -2
- mns_scheduler/irm/stock_irm_cninfo_service.py +2 -0
- mns_scheduler/irm/stock_question_id_service.py +11 -1
- 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/tfp/stock_tfp_info_sync.py +1 -1
- mns_scheduler/zt/zt_pool/em_zt_pool_sync_api.py +26 -199
- 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 +28 -1
- {mns_scheduler-1.4.4.5.dist-info → mns_scheduler-1.4.6.4.dist-info}/METADATA +1 -1
- {mns_scheduler-1.4.4.5.dist-info → mns_scheduler-1.4.6.4.dist-info}/RECORD +21 -18
- {mns_scheduler-1.4.4.5.dist-info → mns_scheduler-1.4.6.4.dist-info}/WHEEL +0 -0
- {mns_scheduler-1.4.4.5.dist-info → mns_scheduler-1.4.6.4.dist-info}/top_level.txt +0 -0
|
@@ -17,6 +17,7 @@ import mns_common.component.trade_date.trade_date_common_service_api as trade_da
|
|
|
17
17
|
|
|
18
18
|
mongodb_util = MongodbUtil('27017')
|
|
19
19
|
|
|
20
|
+
|
|
20
21
|
# 固定的选择
|
|
21
22
|
# fixed_optional_list = ['USDCNH', 'XAUUSD',
|
|
22
23
|
# '881279',
|
|
@@ -37,17 +38,16 @@ mongodb_util = MongodbUtil('27017')
|
|
|
37
38
|
# ]
|
|
38
39
|
|
|
39
40
|
# 固定的选择
|
|
40
|
-
fixed_optional_list = ['899050', '881157']
|
|
41
|
-
|
|
41
|
+
# fixed_optional_list = ['899050', '881157']
|
|
42
42
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
#
|
|
44
|
+
# def add_fixed_optional():
|
|
45
|
+
# ths_cookie = cookie_info_service.get_ths_cookie()
|
|
46
|
+
# for symbol in fixed_optional_list:
|
|
47
|
+
# ths_self_choose_api.add_stock_to_account(symbol, ths_cookie)
|
|
47
48
|
|
|
48
|
-
|
|
49
|
-
def delete_all_self_choose_stocks():
|
|
50
|
-
ths_cookie = cookie_info_service.get_ths_cookie()
|
|
49
|
+
# 删除所有自选股票
|
|
50
|
+
def delete_all_self_choose_stocks(ths_cookie):
|
|
51
51
|
all_self_choose_stock_list = ths_self_choose_api.get_all_self_choose_stock_list(ths_cookie)
|
|
52
52
|
for stock_one in all_self_choose_stock_list.itertuples():
|
|
53
53
|
symbol = stock_one.code
|
|
@@ -55,8 +55,7 @@ def delete_all_self_choose_stocks():
|
|
|
55
55
|
|
|
56
56
|
|
|
57
57
|
# 添加固定自选股票
|
|
58
|
-
def add_self_choose_symbol():
|
|
59
|
-
ths_cookie = cookie_info_service.get_ths_cookie()
|
|
58
|
+
def add_self_choose_symbol(ths_cookie):
|
|
60
59
|
# 固定自选
|
|
61
60
|
self_choose_symbol_df = mongodb_util.find_all_data(db_name_constant.SELF_CHOOSE_STOCK)
|
|
62
61
|
if data_frame_util.is_not_empty(self_choose_symbol_df):
|
|
@@ -66,8 +65,7 @@ def add_self_choose_symbol():
|
|
|
66
65
|
|
|
67
66
|
|
|
68
67
|
# 添加今日选择股票
|
|
69
|
-
def add_today_choose_symbol():
|
|
70
|
-
ths_cookie = cookie_info_service.get_ths_cookie()
|
|
68
|
+
def add_today_choose_symbol(ths_cookie):
|
|
71
69
|
now_date = datetime.now()
|
|
72
70
|
str_day = now_date.strftime('%Y-%m-%d')
|
|
73
71
|
last_trade_day = trade_date_common_service_api.get_last_trade_day(str_day)
|
|
@@ -81,8 +79,7 @@ def add_today_choose_symbol():
|
|
|
81
79
|
|
|
82
80
|
|
|
83
81
|
# 添加同花顺概念
|
|
84
|
-
def add_self_choose_concept():
|
|
85
|
-
ths_cookie = cookie_info_service.get_ths_cookie()
|
|
82
|
+
def add_self_choose_concept(ths_cookie):
|
|
86
83
|
query_plate = {'self_type': {
|
|
87
84
|
"$in": [self_choose_constant.SELF_CHOOSE_THS_CONCEPT,
|
|
88
85
|
self_choose_constant.SELF_CHOOSE_THS_INDUSTRY]}}
|
|
@@ -95,7 +92,7 @@ def add_self_choose_concept():
|
|
|
95
92
|
|
|
96
93
|
|
|
97
94
|
# 添加最近交易股票
|
|
98
|
-
def add_trade_stocks():
|
|
95
|
+
def add_trade_stocks(ths_cookie):
|
|
99
96
|
now_date = datetime.now()
|
|
100
97
|
str_day = now_date.strftime('%Y-%m-%d')
|
|
101
98
|
last_trade_day = trade_date_common_service_api.get_last_trade_day(str_day)
|
|
@@ -109,15 +106,13 @@ def add_trade_stocks():
|
|
|
109
106
|
trade_stocks_df = mongodb_util.find_query_data(db_name_constant.BUY_STOCK_NAME, query)
|
|
110
107
|
if data_frame_util.is_not_empty(trade_stocks_df):
|
|
111
108
|
stock_list = stock_list.union(set(trade_stocks_df['symbol']))
|
|
112
|
-
ths_cookie = cookie_info_service.get_ths_cookie()
|
|
113
109
|
if len(stock_list) > 0:
|
|
114
110
|
for symbol in stock_list:
|
|
115
111
|
ths_self_choose_api.add_stock_to_account(symbol, ths_cookie)
|
|
116
112
|
|
|
117
113
|
|
|
118
114
|
# 添加连板到自选
|
|
119
|
-
def add_continue_boards_zt_stocks():
|
|
120
|
-
ths_cookie = cookie_info_service.get_ths_cookie()
|
|
115
|
+
def add_continue_boards_zt_stocks(ths_cookie):
|
|
121
116
|
now_date = datetime.now()
|
|
122
117
|
str_day = now_date.strftime('%Y-%m-%d')
|
|
123
118
|
if trade_date_common_service_api.is_trade_day(str_day):
|
|
@@ -138,19 +133,52 @@ def add_continue_boards_zt_stocks():
|
|
|
138
133
|
ths_self_choose_api.add_stock_to_account(stock_one.symbol, ths_cookie)
|
|
139
134
|
|
|
140
135
|
|
|
136
|
+
# 添加主线龙头
|
|
137
|
+
def add_main_line_leader(ths_cookie):
|
|
138
|
+
main_line_leader_df = mongodb_util.find_query_data('main_line_leader', {})
|
|
139
|
+
if data_frame_util.is_not_empty(main_line_leader_df):
|
|
140
|
+
main_line_leader_df = count_main_line_number(main_line_leader_df)
|
|
141
|
+
|
|
142
|
+
main_line_leader_df = main_line_leader_df.sort_values(
|
|
143
|
+
by=['main_line_number', 'main_line_leader_grade'],
|
|
144
|
+
ascending=[False, False,]
|
|
145
|
+
)
|
|
146
|
+
for stock_one in main_line_leader_df.itertuples():
|
|
147
|
+
ths_self_choose_api.add_stock_to_account(stock_one.symbol, ths_cookie)
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
# 统计主线的数量
|
|
151
|
+
def count_main_line_number(main_line_detail_df):
|
|
152
|
+
# 统计主线的数量
|
|
153
|
+
main_line_detail_df['main_line_number'] = main_line_detail_df.groupby('main_line')['main_line'].transform(
|
|
154
|
+
'count')
|
|
155
|
+
# 相同主线数量 数量加1
|
|
156
|
+
main_line_detail_df['main_line_number'] = (
|
|
157
|
+
main_line_detail_df.groupby('main_line_number')['main_line']
|
|
158
|
+
.transform('rank', method='dense') - 1
|
|
159
|
+
) * 0.1 + main_line_detail_df['main_line_number']
|
|
160
|
+
|
|
161
|
+
return main_line_detail_df
|
|
162
|
+
|
|
163
|
+
|
|
141
164
|
# 自选股操作 删除当天自选股 增加新的连板股票 添加固定选择自选
|
|
142
165
|
def self_choose_stock_handle():
|
|
143
|
-
|
|
166
|
+
ths_cookie = cookie_info_service.get_ths_cookie()
|
|
167
|
+
|
|
168
|
+
delete_all_self_choose_stocks(ths_cookie)
|
|
144
169
|
# 固定自选板块
|
|
145
|
-
add_fixed_optional()
|
|
170
|
+
# add_fixed_optional()
|
|
146
171
|
# 添加同花顺概念
|
|
147
|
-
add_self_choose_concept()
|
|
172
|
+
add_self_choose_concept(ths_cookie)
|
|
173
|
+
# 添加主线龙头
|
|
174
|
+
add_main_line_leader(ths_cookie)
|
|
148
175
|
# 连板股票
|
|
149
|
-
add_continue_boards_zt_stocks()
|
|
176
|
+
add_continue_boards_zt_stocks(ths_cookie)
|
|
177
|
+
|
|
150
178
|
# 自己买入的股票
|
|
151
|
-
add_trade_stocks()
|
|
179
|
+
add_trade_stocks(ths_cookie)
|
|
152
180
|
# 添加自选股票
|
|
153
|
-
add_self_choose_symbol()
|
|
181
|
+
add_self_choose_symbol(ths_cookie)
|
|
154
182
|
|
|
155
183
|
|
|
156
184
|
if __name__ == '__main__':
|
|
@@ -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
|
东方财富涨停池
|
|
@@ -70,6 +68,8 @@ def save_zt_info(str_day):
|
|
|
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,21 +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)
|
|
90
84
|
# 设置连板
|
|
91
85
|
stock_em_zt_pool_df_data = set_connected_boards_numbers(stock_em_zt_pool_df_data.copy(),
|
|
92
86
|
last_trade_day_zt_df.copy())
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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())
|
|
97
94
|
|
|
98
95
|
stock_em_zt_pool_df_data['first_closure_time'] = stock_em_zt_pool_df_data['first_closure_time'].str.strip()
|
|
99
96
|
stock_em_zt_pool_df_data['list_date'] = stock_em_zt_pool_df_data['list_date'].apply(
|
|
@@ -130,6 +127,9 @@ def save_zt_info(str_day):
|
|
|
130
127
|
|
|
131
128
|
mongodb_util.save_mongo(today_new_zt_pool_df, db_name_constant.STOCK_ZT_POOL)
|
|
132
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
|
+
|
|
133
133
|
stock_em_zt_pool_df_data.fillna('', inplace=True)
|
|
134
134
|
stock_em_zt_pool_df_data = stock_em_zt_pool_df_data[ZT_FIELD]
|
|
135
135
|
return stock_em_zt_pool_df_data
|
|
@@ -340,192 +340,19 @@ def query_company_info_with_share():
|
|
|
340
340
|
return company_info_df
|
|
341
341
|
|
|
342
342
|
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
stock_em_zt_pool_df_data
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
last_trade_day_main_line_df = mongodb_util.find_query_data(db_name_constant.MAIN_LINE_DETAIL,
|
|
353
|
-
{'str_day': last_trade_day, 'symbol': {
|
|
354
|
-
"$in": list(stock_em_zt_pool_df_data['symbol'])}})
|
|
355
|
-
if data_frame_util.is_not_empty(last_trade_day_main_line_df):
|
|
356
|
-
symbol_mapping_main_line = dict(
|
|
357
|
-
zip(last_trade_day_main_line_df['symbol'], last_trade_day_main_line_df['main_line']))
|
|
358
|
-
|
|
359
|
-
symbol_mapping_sub_main_line = dict(
|
|
360
|
-
zip(last_trade_day_main_line_df['symbol'], last_trade_day_main_line_df['sub_main_line']))
|
|
361
|
-
|
|
362
|
-
stock_em_zt_pool_df_data['main_line'] = (stock_em_zt_pool_df_data['symbol']
|
|
363
|
-
.map(symbol_mapping_main_line).fillna(
|
|
364
|
-
stock_em_zt_pool_df_data['main_line']))
|
|
365
|
-
|
|
366
|
-
stock_em_zt_pool_df_data['sub_main_line'] = stock_em_zt_pool_df_data['symbol'].map(
|
|
367
|
-
symbol_mapping_sub_main_line).fillna(
|
|
368
|
-
stock_em_zt_pool_df_data['sub_main_line'])
|
|
369
|
-
|
|
370
|
-
today_zt_reason_analysis = mongodb_util.find_query_data(db_name_constant.MAIN_REASON_ANALYSIS,
|
|
371
|
-
{'str_day': str_day, 'symbol': {
|
|
372
|
-
"$in": list(stock_em_zt_pool_df_data['symbol'])}})
|
|
373
|
-
if data_frame_util.is_not_empty(today_zt_reason_analysis):
|
|
374
|
-
# 创建一个映射字典
|
|
375
|
-
symbol_mapping_zt_reason = dict(zip(today_zt_reason_analysis['symbol'], today_zt_reason_analysis['zt_reason']))
|
|
376
|
-
|
|
377
|
-
symbol_mapping_zt_analysis = dict(
|
|
378
|
-
zip(today_zt_reason_analysis['symbol'], today_zt_reason_analysis['zt_analysis']))
|
|
379
|
-
|
|
380
|
-
symbol_mapping_main_line = dict(zip(today_zt_reason_analysis['symbol'], today_zt_reason_analysis['main_line']))
|
|
381
|
-
|
|
382
|
-
symbol_mapping_sub_main_line = dict(
|
|
383
|
-
zip(today_zt_reason_analysis['symbol'], today_zt_reason_analysis['sub_main_line']))
|
|
384
|
-
|
|
385
|
-
# 使用map进行替换,不匹配的保持原值
|
|
386
|
-
stock_em_zt_pool_df_data['zt_reason'] = stock_em_zt_pool_df_data['symbol'].map(symbol_mapping_zt_reason).fillna(
|
|
387
|
-
stock_em_zt_pool_df_data['zt_reason'])
|
|
388
|
-
|
|
389
|
-
stock_em_zt_pool_df_data['zt_analysis'] = stock_em_zt_pool_df_data['symbol'].map(
|
|
390
|
-
symbol_mapping_zt_analysis).fillna(
|
|
391
|
-
stock_em_zt_pool_df_data['zt_analysis'])
|
|
392
|
-
|
|
393
|
-
stock_em_zt_pool_df_data['main_line'] = stock_em_zt_pool_df_data['symbol'].map(symbol_mapping_main_line).fillna(
|
|
394
|
-
stock_em_zt_pool_df_data['main_line'])
|
|
395
|
-
|
|
396
|
-
stock_em_zt_pool_df_data['sub_main_line'] = stock_em_zt_pool_df_data['symbol'].map(
|
|
397
|
-
symbol_mapping_sub_main_line).fillna(
|
|
398
|
-
stock_em_zt_pool_df_data['sub_main_line'])
|
|
399
|
-
|
|
400
|
-
return stock_em_zt_pool_df_data
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
def save_today_main_line(stock_em_zt_pool_df_data, str_day):
|
|
404
|
-
for stock_one in stock_em_zt_pool_df_data.itertuples():
|
|
405
|
-
try:
|
|
406
|
-
zt_reason = stock_one.zt_reason
|
|
407
|
-
zt_analyse_detail = stock_one.zt_analysis
|
|
408
|
-
reason_tag = False
|
|
409
|
-
if data_frame_util.is_string_empty(zt_reason) or data_frame_util.is_string_empty(zt_analyse_detail):
|
|
410
|
-
|
|
411
|
-
# 问财获取
|
|
412
|
-
if bool(1 - reason_tag):
|
|
413
|
-
try:
|
|
414
|
-
# 问财获取涨停分析
|
|
415
|
-
zt_result_dict = ths_stock_zt_pool_api.zt_analyse_reason(stock_one.symbol)
|
|
416
|
-
zt_analyse_detail = zt_result_dict['zt_analyse_detail']
|
|
417
|
-
zt_reason = zt_result_dict['zt_reason']
|
|
418
|
-
time.sleep(2)
|
|
419
|
-
reason_tag = True
|
|
420
|
-
except BaseException as e:
|
|
421
|
-
time.sleep(2)
|
|
422
|
-
logger.error("问财获取涨停详情异常:{},{}", stock_one.symbol, e)
|
|
423
|
-
|
|
424
|
-
if bool(1 - reason_tag):
|
|
425
|
-
# 网页获取
|
|
426
|
-
try:
|
|
427
|
-
ths_cookie = cookie_info_service.get_ths_cookie()
|
|
428
|
-
# 问财获取涨停分析
|
|
429
|
-
zt_analyse_detail = ths_company_info_api.get_company_hot_info(stock_one.symbol, ths_cookie)
|
|
430
|
-
zt_reason = zt_analyse_detail.split("\n")[0]
|
|
431
|
-
|
|
432
|
-
time.sleep(2)
|
|
433
|
-
except BaseException as e:
|
|
434
|
-
time.sleep(2)
|
|
435
|
-
logger.error("网页获取涨停详情异常:{},{}", stock_one.symbol, e)
|
|
436
|
-
|
|
437
|
-
stock_em_zt_pool_df_data.loc[
|
|
438
|
-
stock_em_zt_pool_df_data['symbol'] == stock_one.symbol, 'zt_reason'] = zt_reason
|
|
439
|
-
|
|
440
|
-
stock_em_zt_pool_df_data.loc[
|
|
441
|
-
stock_em_zt_pool_df_data['symbol'] == stock_one.symbol, 'zt_analysis'] = zt_analyse_detail
|
|
442
|
-
|
|
443
|
-
main_line = stock_one.main_line
|
|
444
|
-
sub_main_line = stock_one.sub_main_line
|
|
445
|
-
connected_boards_numbers = stock_one.connected_boards_numbers
|
|
446
|
-
|
|
447
|
-
if data_frame_util.is_string_empty(zt_reason):
|
|
448
|
-
continue
|
|
449
|
-
|
|
450
|
-
if data_frame_util.is_string_empty(zt_analyse_detail):
|
|
451
|
-
continue
|
|
452
|
-
|
|
453
|
-
key_id = stock_one.symbol + "_" + str_day
|
|
454
|
-
# 更新临时表
|
|
455
|
-
query_zt = {"_id": key_id}
|
|
456
|
-
if mongodb_util.exist_data_query(db_name_constant.MAIN_REASON_ANALYSIS, query_zt):
|
|
457
|
-
|
|
458
|
-
if data_frame_util.is_string_not_empty(zt_reason):
|
|
459
|
-
new_values_reason = {"$set": {
|
|
460
|
-
'zt_reason': zt_reason}}
|
|
461
|
-
|
|
462
|
-
mongodb_util.update_many(query_zt, new_values_reason, db_name_constant.MAIN_REASON_ANALYSIS)
|
|
463
|
-
|
|
464
|
-
if data_frame_util.is_string_not_empty(zt_analyse_detail):
|
|
465
|
-
new_values_zt_analysis = {"$set": {
|
|
466
|
-
'zt_analysis': zt_analyse_detail}}
|
|
467
|
-
|
|
468
|
-
mongodb_util.update_many(query_zt, new_values_zt_analysis, db_name_constant.MAIN_REASON_ANALYSIS)
|
|
469
|
-
else:
|
|
470
|
-
main_dict = {'_id': key_id,
|
|
471
|
-
'symbol': stock_one.symbol,
|
|
472
|
-
'name': stock_one.name,
|
|
473
|
-
'zt_analysis': zt_analyse_detail,
|
|
474
|
-
'zt_reason': zt_reason,
|
|
475
|
-
'main_line': main_line,
|
|
476
|
-
'sub_main_line': sub_main_line,
|
|
477
|
-
'str_day': str_day,
|
|
478
|
-
'update_time': str_now_date,
|
|
479
|
-
'connected_boards_numbers': connected_boards_numbers
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
main_line_df = pd.DataFrame(main_dict, index=[1])
|
|
483
|
-
mongodb_util.insert_mongo(main_line_df, db_name_constant.MAIN_REASON_ANALYSIS)
|
|
484
|
-
|
|
485
|
-
if data_frame_util.is_string_empty(main_line):
|
|
486
|
-
continue
|
|
487
|
-
|
|
488
|
-
if data_frame_util.is_string_empty(sub_main_line):
|
|
489
|
-
continue
|
|
490
|
-
|
|
491
|
-
# 去除开头和结尾空格
|
|
492
|
-
if data_frame_util.is_string_not_empty(main_line):
|
|
493
|
-
main_line = main_line.strip()
|
|
494
|
-
if data_frame_util.is_string_not_empty(sub_main_line):
|
|
495
|
-
sub_main_line = sub_main_line.strip()
|
|
496
|
-
now_date = datetime.now()
|
|
497
|
-
str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
|
|
498
|
-
hour = now_date.hour
|
|
499
|
-
|
|
500
|
-
main_dict = {'_id': key_id,
|
|
501
|
-
'symbol': stock_one.symbol,
|
|
502
|
-
'name': stock_one.name,
|
|
503
|
-
'zt_analysis': zt_analyse_detail,
|
|
504
|
-
'zt_reason': zt_reason,
|
|
505
|
-
'main_line': main_line,
|
|
506
|
-
'sub_main_line': sub_main_line,
|
|
507
|
-
'str_day': str_day,
|
|
508
|
-
'update_time': str_now_date,
|
|
509
|
-
'connected_boards_numbers': connected_boards_numbers
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
main_line_df = pd.DataFrame(main_dict, index=[1])
|
|
513
|
-
|
|
514
|
-
# 更新主线表
|
|
515
|
-
is_no_update_main_line = trade_date_common_service_api.is_trade_day(str_day) and 8 < hour < 15
|
|
516
|
-
if is_no_update_main_line:
|
|
517
|
-
continue
|
|
518
|
-
|
|
519
|
-
if mongodb_util.exist_data_query(db_name_constant.MAIN_LINE_DETAIL, query_zt):
|
|
520
|
-
continue
|
|
521
|
-
else:
|
|
522
|
-
mongodb_util.insert_mongo(main_line_df, db_name_constant.MAIN_LINE_DETAIL)
|
|
523
|
-
|
|
524
|
-
except BaseException as e:
|
|
525
|
-
logger.error("同步涨停信息出现异常:{},{}", stock_one.symbol, e)
|
|
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
|
|
526
352
|
|
|
527
|
-
|
|
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)
|
|
528
355
|
|
|
529
356
|
|
|
530
357
|
if __name__ == '__main__':
|
|
531
|
-
save_zt_info('2025-12-
|
|
358
|
+
save_zt_info('2025-12-29')
|
|
@@ -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()
|
|
@@ -60,6 +60,9 @@ import mns_scheduler.industry.ths.ths_industry_sync_service as ths_industry_sync
|
|
|
60
60
|
import mns_scheduler.k_line.year_quarter.year_quarter_line_sync as year_quarter_line_sync
|
|
61
61
|
import mns_scheduler.k_line.sync_status.k_line_sync_status_check as k_line_sync_status_check
|
|
62
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
|
|
63
66
|
|
|
64
67
|
|
|
65
68
|
# 同步交易日期任务完成
|
|
@@ -355,7 +358,11 @@ def sync_all_interactive_questions():
|
|
|
355
358
|
# 非交易日同步
|
|
356
359
|
# tag = bool(1 - trade_date_common_service_api.is_trade_day(str_day))
|
|
357
360
|
# if tag:
|
|
361
|
+
|
|
358
362
|
logger.info('同步互动回答')
|
|
363
|
+
stock_question_id_service.sync_sz_stock_uid([])
|
|
364
|
+
stock_question_id_service.sync_sh_stock_uid()
|
|
365
|
+
|
|
359
366
|
stock_irm_cninfo_service.sync_symbols_interactive_questions([])
|
|
360
367
|
|
|
361
368
|
|
|
@@ -443,17 +450,32 @@ def check_k_line_sync_count():
|
|
|
443
450
|
k_line_sync_status_check.check_k_line_sync_count()
|
|
444
451
|
|
|
445
452
|
|
|
453
|
+
# 全量同步公司信息
|
|
446
454
|
def sync_all_company_info_task():
|
|
447
455
|
logger.info("全量同步公司信息")
|
|
448
456
|
company_total_task.sync_all_company_task()
|
|
449
457
|
|
|
450
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()
|
|
471
|
+
|
|
472
|
+
|
|
451
473
|
# # 定义BlockingScheduler
|
|
452
474
|
blockingScheduler = BlockingScheduler()
|
|
453
475
|
|
|
454
476
|
# 同步东方财富a,etf,kzz,us,hk信息
|
|
455
477
|
blockingScheduler.add_job(sync_all_em_stock_info, 'cron', hour='07', minute='31')
|
|
456
|
-
blockingScheduler.add_job(sync_all_em_stock_info, 'cron', hour='
|
|
478
|
+
blockingScheduler.add_job(sync_all_em_stock_info, 'cron', hour='16', minute='20')
|
|
457
479
|
|
|
458
480
|
# 开盘前同步当天交易需要的k线数据
|
|
459
481
|
blockingScheduler.add_job(sync_today_trade_k_line_info, 'cron', hour='07', minute='50')
|
|
@@ -565,6 +587,11 @@ blockingScheduler.add_job(check_k_line_sync_count, 'cron', hour='6,23', minute='
|
|
|
565
587
|
# 同步公司产品区域信息
|
|
566
588
|
blockingScheduler.add_job(sync_all_company_info_task, 'cron', day_of_week='sat,sun', hour='09',
|
|
567
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')
|
|
568
595
|
|
|
569
596
|
print('定时任务启动成功')
|
|
570
597
|
blockingScheduler.start()
|