mns-scheduler 1.0.8.7__py3-none-any.whl → 1.4.3.2__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.
Files changed (156) hide show
  1. mns_scheduler/__init__.py +1 -3
  2. mns_scheduler/company_info/announce/company_announce_sync_service.py +65 -0
  3. mns_scheduler/company_info/{company_info_sync_api.py → base/sync_company_base_info_api.py} +239 -227
  4. mns_scheduler/company_info/base/sync_company_hold_info_api.py +37 -0
  5. mns_scheduler/company_info/base/sync_company_product_area_industry.py +161 -0
  6. mns_scheduler/company_info/clean/company_info_clean_api.py +133 -0
  7. mns_scheduler/company_info/constant/company_constant_data.py +497 -0
  8. mns_scheduler/company_info/{de_list_stock_service.py → de_list_stock/de_list_stock_service.py} +1 -1
  9. mns_scheduler/company_info/em_stock_info/__init__.py +7 -0
  10. mns_scheduler/company_info/em_stock_info/sync_em_stock_info_sync.py +80 -0
  11. mns_scheduler/company_info/remark/__init__.py +7 -0
  12. mns_scheduler/company_info/remark/company_remark_info_sync.py +46 -0
  13. mns_scheduler/concept/clean/kpl_concept_clean_api.py +1 -1
  14. mns_scheduler/concept/clean/ths_concept_clean_api.py +74 -51
  15. mns_scheduler/concept/ths/common/ths_concept_sync_common_api.py +112 -56
  16. mns_scheduler/concept/ths/common/ths_concept_update_common_api.py +6 -6
  17. mns_scheduler/concept/ths/detaill/__init__.py +0 -0
  18. mns_scheduler/concept/ths/detaill/ths_concept_detail_api.py +226 -0
  19. mns_scheduler/concept/ths/sync_new_index/sync_ths_concept_new_index_api.py +169 -0
  20. mns_scheduler/concept/ths/update_concept_info/sync_one_concept_all_symbols_api.py +11 -23
  21. mns_scheduler/concept/ths/update_concept_info/sync_one_symbol_all_concepts_api.py +19 -15
  22. mns_scheduler/db/col_move_service.py +10 -7
  23. mns_scheduler/db/db_status.py +1 -1
  24. mns_scheduler/db/script/__init__.py +7 -0
  25. mns_scheduler/db/script/col_move_script.py +45 -0
  26. mns_scheduler/db/script/db_move/__init__.py +7 -0
  27. mns_scheduler/db/script/db_move/col_move_one_service.py +34 -0
  28. mns_scheduler/db/script/sync/__init__.py +7 -0
  29. mns_scheduler/db/script/sync/local_mongo_util.py +231 -0
  30. mns_scheduler/db/script/sync/remote_data_sync_to_local.py +105 -0
  31. mns_scheduler/db/script/sync/remote_mongo_util.py +306 -0
  32. mns_scheduler/db/script/sync/sync_hui_ce_test_data.py +80 -0
  33. mns_scheduler/db/script/sync/sync_hui_ce_test_data_01.py +69 -0
  34. mns_scheduler/db/script/update/__init__.py +7 -0
  35. mns_scheduler/db/script/update/update_col_field.py +36 -0
  36. mns_scheduler/finance/__init__.py +1 -1
  37. mns_scheduler/finance/{em_financial_asset_liability_sync_service_api.py → em/em_financial_asset_liability_sync_service_api.py} +3 -3
  38. mns_scheduler/finance/{em_financial_profit_sync_service_api.py → em/em_financial_profit_sync_service_api.py} +30 -25
  39. mns_scheduler/finance/{finance_common_api.py → em/finance_common_api.py} +4 -4
  40. mns_scheduler/finance/sync_financial_report_service_task.py +202 -0
  41. mns_scheduler/finance/xue_qiu/down_load_xueqiu_report_api.py +77 -0
  42. mns_scheduler/finance/xue_qiu/sync_xue_qiu_fiance_data.py +161 -0
  43. mns_scheduler/hk/__init__.py +1 -1
  44. mns_scheduler/hk/hk_company_info_sync_service_api.py +49 -5
  45. mns_scheduler/hk/hk_industry_info_sync_service_api.py +68 -0
  46. mns_scheduler/industry/__init__.py +7 -0
  47. mns_scheduler/industry/ths/__init__.py +7 -0
  48. mns_scheduler/industry/ths/ths_industry_index_service.py +58 -0
  49. mns_scheduler/industry/ths/ths_industry_sync_service.py +68 -0
  50. mns_scheduler/irm/__init__.py +1 -1
  51. mns_scheduler/irm/api/__init__.py +1 -1
  52. mns_scheduler/irm/api/sh_stock_sns_sse_info_api.py +1 -1
  53. mns_scheduler/irm/api/sz_stock_sns_sse_info_api.py +1 -1
  54. mns_scheduler/irm/stock_irm_cninfo_service.py +15 -13
  55. mns_scheduler/k_line/clean/daily/__init__.py +1 -1
  56. mns_scheduler/k_line/clean/daily/daily_k_line_clean_common_service.py +57 -7
  57. mns_scheduler/k_line/clean/daily/daily_k_line_service.py +16 -3
  58. mns_scheduler/k_line/clean/k_line_info_clean_impl.py +3 -2
  59. mns_scheduler/k_line/clean/k_line_info_clean_task.py +42 -31
  60. mns_scheduler/k_line/clean/week_month/__init__.py +1 -1
  61. mns_scheduler/k_line/clean/week_month/normal_week_month_k_line_service.py +125 -27
  62. mns_scheduler/k_line/clean/week_month/sub_new_week_month_k_line_service.py +72 -17
  63. mns_scheduler/k_line/common/__init__.py +7 -0
  64. mns_scheduler/k_line/common/k_line_common_api.py +188 -0
  65. mns_scheduler/k_line/hot_stocks/__init__.py +1 -1
  66. mns_scheduler/k_line/hot_stocks/recent_hot_stocks_clean_service.py +1 -1
  67. mns_scheduler/k_line/month_week_daily/bfq_k_line_sync.py +77 -0
  68. mns_scheduler/k_line/{sync → month_week_daily}/daily_week_month_line_sync.py +14 -14
  69. mns_scheduler/k_line/sync_status/__init__.py +7 -0
  70. mns_scheduler/k_line/sync_status/k_line_sync_status_check.py +54 -0
  71. mns_scheduler/k_line/test/__init__.py +7 -0
  72. mns_scheduler/k_line/test/k_line_info_clean_his_data.py +41 -0
  73. mns_scheduler/k_line/year_quarter/__init__.py +7 -0
  74. mns_scheduler/k_line/year_quarter/year_quarter_line_sync.py +76 -0
  75. mns_scheduler/kpl/selection/symbol/sync_best_choose_symbol.py +4 -2
  76. mns_scheduler/kpl/selection/symbol/sync_kpl_concept_symbol_choose_reason_api.py +108 -0
  77. mns_scheduler/kpl/selection/total/sync_kpl_best_total_sync_api.py +12 -7
  78. mns_scheduler/lhb/__init__.py +1 -1
  79. mns_scheduler/lhb/stock_lhb_sync_service.py +1 -1
  80. mns_scheduler/open/__init__.py +1 -1
  81. mns_scheduler/open/sync_one_day_open_data_to_db_service.py +6 -22
  82. mns_scheduler/risk/__init__.py +1 -1
  83. mns_scheduler/risk/compliance/__init__.py +0 -0
  84. mns_scheduler/risk/compliance/undisclosed_annual_report_api.py +71 -0
  85. mns_scheduler/risk/financial/__init__.py +0 -0
  86. mns_scheduler/risk/financial/annual_report_audit_check_api.py +54 -0
  87. mns_scheduler/risk/financial/net_assets_check_api.py +75 -0
  88. mns_scheduler/risk/financial/profit_income_check_api.py +80 -0
  89. mns_scheduler/risk/financial/stock_equity_mortgage_check_api.py +1 -0
  90. mns_scheduler/risk/financial_report_risk_check_api.py +42 -0
  91. mns_scheduler/risk/major_violations/__init__.py +0 -0
  92. mns_scheduler/risk/{register_and_investigate_stock_sync_api.py → major_violations/register_and_investigate_stock_sync_api.py} +17 -8
  93. mns_scheduler/risk/self/__init__.py +0 -0
  94. mns_scheduler/risk/{wei_pan_stock_api.py → self/wei_pan_stock_api.py} +10 -4
  95. mns_scheduler/risk/test/__init__.py +7 -0
  96. mns_scheduler/{finance → risk}/test/fix_blask_list.py +6 -10
  97. mns_scheduler/risk/transactions/__init__.py +0 -0
  98. mns_scheduler/risk/transactions/transactions_check_api.py +183 -0
  99. mns_scheduler/self_choose/__init__.py +7 -0
  100. mns_scheduler/self_choose/ths_self_choose_service.py +158 -0
  101. mns_scheduler/trade/auto_ipo_buy_api.py +2 -2
  102. mns_scheduler/trade/auto_login/__init__.py +7 -0
  103. mns_scheduler/trade/auto_login/trader_auto_service.py +32 -0
  104. mns_scheduler/trade/auto_sell_service_api.py +10 -8
  105. mns_scheduler/trade/balance/__init__.py +7 -0
  106. mns_scheduler/trade/balance/ths_account_balance_service.py +7 -0
  107. mns_scheduler/trade/sync_position_api.py +41 -8
  108. mns_scheduler/trade/task/__init__.py +7 -0
  109. mns_scheduler/trade/task/trader_task_service.py +65 -0
  110. mns_scheduler/trade/tfp/__init__.py +7 -0
  111. mns_scheduler/trade/tfp/stock_tfp_info_sync.py +56 -0
  112. mns_scheduler/zb/stock_zb_pool_sync.py +1 -15
  113. mns_scheduler/zt/high_chg/sync_high_chg_pool_service.py +2 -3
  114. mns_scheduler/zt/high_chg/sync_high_chg_real_time_quotes_service.py +12 -8
  115. mns_scheduler/zt/open_data/kcx_high_chg_open_data_sync.py +10 -25
  116. mns_scheduler/zt/script/__init__.py +1 -1
  117. mns_scheduler/zt/script/fix_error_deal_day.py +41 -0
  118. mns_scheduler/zt/script/kcx_high_chg_open_his_data_handle.py +2 -11
  119. mns_scheduler/zt/script/sync_high_chg_pool_his_data.py +2 -2
  120. mns_scheduler/zt/script/sync_now_higt_chg_zt.py +43 -0
  121. mns_scheduler/zt/zt_pool/em_zt_pool_sync_api.py +413 -0
  122. mns_scheduler/zt/zt_pool/ths_zt_pool_sync_api.py +193 -0
  123. mns_scheduler/zt/zt_pool/update_null_zt_reason_api.py +58 -0
  124. mns_scheduler/zz_task/compensation/__init__.py +0 -0
  125. mns_scheduler/zz_task/compensation/compensate_task.py +161 -0
  126. mns_scheduler/zz_task/compensation/compensate_task_one_day.py +142 -0
  127. mns_scheduler/zz_task/data_sync_task.py +271 -121
  128. {mns_scheduler-1.0.8.7.dist-info → mns_scheduler-1.4.3.2.dist-info}/METADATA +1 -1
  129. mns_scheduler-1.4.3.2.dist-info/RECORD +169 -0
  130. {mns_scheduler-1.0.8.7.dist-info → mns_scheduler-1.4.3.2.dist-info}/WHEEL +1 -1
  131. mns_scheduler/backup/app/ths_new_concept_sync_app.py +0 -122
  132. mns_scheduler/backup/em/em_new_concept_his_sync.py +0 -99
  133. mns_scheduler/backup/em/em_new_concept_sync_common_api.py +0 -139
  134. mns_scheduler/backup/em/em_new_concept_sync_web.py +0 -55
  135. mns_scheduler/backup/wen_cai/wen_cai_concept_sync.py +0 -51
  136. mns_scheduler/big_deal/ths_big_deal_sync.py +0 -98
  137. mns_scheduler/company_info/company_constant_data.py +0 -322
  138. mns_scheduler/concept/ths/sync_new_index/sync_ths_concept_by_ak_api.py +0 -103
  139. mns_scheduler/concept/ths/sync_new_index/sync_ths_new_concept_by_web_api.py +0 -89
  140. mns_scheduler/finance/financial_high_risk_stock_clean_service_api.py +0 -202
  141. mns_scheduler/finance/sync_financial_report_service_api.py +0 -113
  142. mns_scheduler/real_time/realtime_quotes_now_create_db_index.py +0 -27
  143. mns_scheduler/real_time/realtime_quotes_now_sync.py +0 -232
  144. mns_scheduler/risk/stock_equity_mortgage_sync_api.py +0 -32
  145. mns_scheduler/zt/zt_pool/zt_pool_sync_api.py +0 -151
  146. mns_scheduler/zz_task/sync_realtime_quotes_task.py +0 -28
  147. mns_scheduler-1.0.8.7.dist-info/RECORD +0 -112
  148. /mns_scheduler/{backup/app → company_info/announce}/__init__.py +0 -0
  149. /mns_scheduler/{backup/em → company_info/base}/__init__.py +0 -0
  150. /mns_scheduler/{backup/wen_cai → company_info/clean}/__init__.py +0 -0
  151. /mns_scheduler/{big_deal → company_info/constant}/__init__.py +0 -0
  152. /mns_scheduler/{real_time → company_info/de_list_stock}/__init__.py +0 -0
  153. /mns_scheduler/{backup → finance/em}/__init__.py +0 -0
  154. /mns_scheduler/finance/{test → xue_qiu}/__init__.py +0 -0
  155. /mns_scheduler/k_line/{sync → month_week_daily}/__init__.py +0 -0
  156. {mns_scheduler-1.0.8.7.dist-info → mns_scheduler-1.4.3.2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,413 @@
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 pandas as pd
9
+ import mns_common.api.akshare.stock_zt_pool_api as stock_zt_pool_api
10
+ import mns_common.utils.date_handle_util as date_handle_util
11
+ from mns_common.db.MongodbUtil import MongodbUtil
12
+ import mns_common.component.company.company_common_service_api as company_common_service_api
13
+ from loguru import logger
14
+ import mns_common.utils.data_frame_util as data_frame_util
15
+ import mns_common.component.common_service_fun_api as common_service_fun_api
16
+ import mns_common.component.trade_date.trade_date_common_service_api as trade_date_common_service_api
17
+ import mns_common.api.ths.zt.ths_stock_zt_pool_v2_api as ths_stock_zt_pool_v2_api
18
+ import mns_common.component.zt.zt_common_service_api as zt_common_service_api
19
+ import mns_common.component.em.em_real_time_quotes_api as em_real_time_quotes_api
20
+ from datetime import datetime
21
+ import mns_common.api.ths.zt.ths_stock_zt_pool_api as ths_stock_zt_pool_api
22
+ import mns_common.constant.db_name_constant as db_name_constant
23
+ import mns_common.component.deal.deal_service_api as deal_service_api
24
+ import mns_common.component.company.company_common_service_new_api as company_common_service_new_api
25
+
26
+ '''
27
+ 东方财富涨停池
28
+ '''
29
+
30
+ mongodb_util = MongodbUtil('27017')
31
+
32
+ ZT_FIELD = ['_id', 'symbol', 'name', 'now_price', 'chg', 'first_closure_time',
33
+ 'last_closure_time', 'connected_boards_numbers',
34
+ 'zt_reason', 'zt_analysis', 'closure_funds',
35
+ # 'closure_funds_per_amount', 'closure_funds_per_flow_mv',
36
+ 'frying_plates_numbers',
37
+ # 'statistics_detail', 'zt_type', 'market_code',
38
+ 'statistics',
39
+ # 'zt_flag',
40
+ 'industry', 'first_sw_industry',
41
+ 'second_sw_industry',
42
+ 'third_sw_industry', 'ths_concept_name',
43
+ 'ths_concept_code', 'ths_concept_sync_day', 'em_industry',
44
+ 'mv_circulation_ratio', 'ths_concept_list_info', 'kpl_plate_name',
45
+ 'kpl_plate_list_info', 'company_type', 'diff_days', 'amount',
46
+ 'list_date',
47
+ 'exchange', 'flow_mv', 'total_mv',
48
+ 'classification', 'flow_mv_sp', 'total_mv_sp', 'flow_mv_level',
49
+ 'amount_level', 'new_stock', 'list_date_01', 'index', 'str_day', 'main_line', 'sub_main_line']
50
+
51
+
52
+ def save_zt_info(str_day):
53
+ if bool(1 - trade_date_common_service_api.is_trade_day(str_day)):
54
+ return pd.DataFrame()
55
+
56
+ stock_em_zt_pool_df_data = stock_zt_pool_api.stock_em_zt_pool_df(
57
+ date_handle_util.no_slash_date(str_day))
58
+
59
+ # fix 涨停池没有的股票
60
+ stock_em_zt_pool_df_data = handle_miss_zt_data(stock_em_zt_pool_df_data.copy(), str_day)
61
+
62
+ try:
63
+ # 同花顺问财涨停池
64
+ ths_zt_pool_df_data = ths_stock_zt_pool_v2_api.get_ths_stock_zt_reason_with_cache(str_day)
65
+ except BaseException as e:
66
+ logger.error("同步ths涨停数据异常")
67
+ ths_zt_pool_df_data = pd.DataFrame()
68
+
69
+ stock_em_zt_pool_df_data = handle_ths_em_diff_data(ths_zt_pool_df_data, stock_em_zt_pool_df_data)
70
+
71
+ stock_em_zt_pool_df_data = common_service_fun_api.total_mv_classification(stock_em_zt_pool_df_data.copy())
72
+
73
+ stock_em_zt_pool_df_data = common_service_fun_api.classify_symbol(stock_em_zt_pool_df_data.copy())
74
+
75
+ stock_em_zt_pool_df_data = common_service_fun_api.symbol_amount_simple(stock_em_zt_pool_df_data.copy())
76
+
77
+ stock_em_zt_pool_df_data = company_common_service_api.amendment_industry(stock_em_zt_pool_df_data.copy())
78
+
79
+ # 主线标记 复盘用
80
+ stock_em_zt_pool_df_data['main_line'] = '无'
81
+ stock_em_zt_pool_df_data['sub_main_line'] = '无'
82
+
83
+ # 上个交易交易日涨停股票
84
+ last_trade_day_zt_df = zt_common_service_api.get_last_trade_day_zt(str_day)
85
+
86
+ stock_em_zt_pool_df_data['first_closure_time'] = stock_em_zt_pool_df_data['first_closure_time'].str.strip()
87
+ stock_em_zt_pool_df_data['list_date'] = stock_em_zt_pool_df_data['list_date'].apply(
88
+ lambda x: pd.to_numeric(x, errors="coerce"))
89
+
90
+ stock_em_zt_pool_df_data['new_stock'] = False
91
+ # 将日期数值转换为日期时间格式
92
+ stock_em_zt_pool_df_data['list_date_01'] = pd.to_datetime(stock_em_zt_pool_df_data['list_date'], format='%Y%m%d')
93
+ str_day_date = date_handle_util.str_to_date(str_day, '%Y-%m-%d')
94
+ # 计算日期差值 距离现在上市时间
95
+ stock_em_zt_pool_df_data['diff_days'] = stock_em_zt_pool_df_data.apply(
96
+ lambda row: (str_day_date - row['list_date_01']).days, axis=1)
97
+ # 上市时间小于100天为新股
98
+ stock_em_zt_pool_df_data.loc[
99
+ stock_em_zt_pool_df_data["diff_days"] < 100, ['new_stock']] \
100
+ = True
101
+ stock_em_zt_pool_df_data = stock_em_zt_pool_df_data.dropna(subset=['diff_days'], axis=0, inplace=False)
102
+
103
+ # 按照"time"列进行排序,同时将值为0的数据排到最末尾
104
+ stock_em_zt_pool_df_data = stock_em_zt_pool_df_data.sort_values(by=['first_closure_time'])
105
+
106
+ # 重置索引,并将排序结果保存到新的"index"列中
107
+
108
+ stock_em_zt_pool_df_data['str_day'] = str_day
109
+ stock_em_zt_pool_df_data['_id'] = stock_em_zt_pool_df_data['symbol'] + "_" + str_day
110
+ stock_em_zt_pool_df_data.drop_duplicates('symbol', keep='last', inplace=True)
111
+
112
+ query_today_zt = {'str_day': str_day}
113
+
114
+ stock_today_zt_pool_df = mongodb_util.find_query_data(db_name_constant.STOCK_ZT_POOL, query_today_zt)
115
+
116
+ if data_frame_util.is_empty(stock_today_zt_pool_df):
117
+
118
+ today_new_zt_pool_df = stock_em_zt_pool_df_data.copy()
119
+ else:
120
+ today_new_zt_pool_df = stock_em_zt_pool_df_data.loc[
121
+ ~stock_em_zt_pool_df_data['symbol'].isin(stock_today_zt_pool_df['symbol'])]
122
+
123
+ try:
124
+
125
+ today_main_line_df = mongodb_util.find_query_data(db_name_constant.MAIN_LINE_DETAIL, {'str_day': str_day})
126
+
127
+ for stock_one in today_new_zt_pool_df.itertuples():
128
+ try:
129
+
130
+ # 设置连板数目
131
+ stock_em_zt_pool_df_data = set_connected_boards_numbers(stock_em_zt_pool_df_data.copy(),
132
+ stock_one.symbol,
133
+ last_trade_day_zt_df.copy())
134
+
135
+ # 涨停分析
136
+ zt_result_dict = ths_stock_zt_pool_api.zt_analyse_reason(stock_one.symbol)
137
+ zt_analysis = zt_result_dict['zt_analyse_detail']
138
+ zt_reason = zt_result_dict['zt_reason']
139
+
140
+ stock_em_zt_pool_df_data.loc[
141
+ stock_em_zt_pool_df_data['symbol'] == stock_one.symbol, 'zt_reason'] = zt_reason
142
+
143
+ stock_em_zt_pool_df_data.loc[
144
+ stock_em_zt_pool_df_data['symbol'] == stock_one.symbol, 'zt_analysis'] = zt_analysis
145
+
146
+ today_main_line_one_df = today_main_line_df.loc[today_main_line_df['symbol'] == stock_one.symbol]
147
+ if data_frame_util.is_not_empty(today_main_line_one_df):
148
+ stock_em_zt_pool_df_data.loc[
149
+ stock_em_zt_pool_df_data['symbol'] == stock_one.symbol, 'main_line'] = \
150
+ list(today_main_line_one_df['main_line'])[0]
151
+
152
+ stock_em_zt_pool_df_data.loc[
153
+ stock_em_zt_pool_df_data['symbol'] == stock_one.symbol, 'sub_main_line'] = \
154
+ list(today_main_line_one_df['sub_main_line'])[0]
155
+
156
+ query_exist = {'symbol': stock_one.symbol, 'str_day': str_day}
157
+ if mongodb_util.exist_data_query(db_name_constant.STOCK_ZT_POOL, query_exist):
158
+ continue
159
+ else:
160
+
161
+ stock_em_zt_pool_df_data_one = stock_em_zt_pool_df_data.loc[
162
+ stock_em_zt_pool_df_data['symbol'] == stock_one.symbol]
163
+ stock_em_zt_pool_df_data_one = stock_em_zt_pool_df_data_one[ZT_FIELD]
164
+
165
+ chg = round(float(list(stock_em_zt_pool_df_data_one['chg'])[0]), 2)
166
+ stock_em_zt_pool_df_data_one['chg'] = chg
167
+
168
+ mongodb_util.save_mongo(stock_em_zt_pool_df_data_one, db_name_constant.STOCK_ZT_POOL)
169
+
170
+ except BaseException as e:
171
+ stock_em_zt_pool_df_data['zt_reason'] = '0'
172
+ logger.error("同步涨停信息出现异常:{},{}", stock_one.symbol, e)
173
+ except BaseException as e:
174
+ stock_em_zt_pool_df_data['zt_reason'] = '0'
175
+ logger.error("出现异常:{}", e)
176
+
177
+ stock_em_zt_pool_df_data = pd.concat([stock_today_zt_pool_df, today_new_zt_pool_df])
178
+ stock_em_zt_pool_df_data = stock_em_zt_pool_df_data[ZT_FIELD]
179
+ return stock_em_zt_pool_df_data
180
+
181
+
182
+ # 设置连板数目
183
+ def set_connected_boards_numbers(stock_em_zt_pool_df_data, symbol, last_trade_day_zt_df):
184
+ # 连板股票
185
+ connected_boards_df_copy = last_trade_day_zt_df.loc[
186
+ last_trade_day_zt_df['symbol'].isin(stock_em_zt_pool_df_data['symbol'])]
187
+
188
+ connected_boards_df = connected_boards_df_copy.copy()
189
+ connected_boards_df['connected_boards_numbers'] = connected_boards_df['connected_boards_numbers'] + 1
190
+
191
+ # 连板股票
192
+ connected_boards_df_one = connected_boards_df.loc[connected_boards_df['symbol'] == symbol]
193
+
194
+ if data_frame_util.is_not_empty(connected_boards_df_one):
195
+ stock_em_zt_pool_df_data.loc[stock_em_zt_pool_df_data['symbol'] == symbol, 'connected_boards_numbers'] = \
196
+ list(connected_boards_df_one['connected_boards_numbers'])[0]
197
+
198
+ if 'main_line' in connected_boards_df_one.columns:
199
+ stock_em_zt_pool_df_data.loc[stock_em_zt_pool_df_data['symbol'] == symbol, 'main_line'] = \
200
+ list(connected_boards_df_one['main_line'])[0]
201
+
202
+ if 'sub_main_line' in connected_boards_df_one.columns:
203
+ stock_em_zt_pool_df_data.loc[stock_em_zt_pool_df_data['symbol'] == symbol, 'sub_main_line'] = \
204
+ list(connected_boards_df_one['sub_main_line'])[0]
205
+
206
+ return stock_em_zt_pool_df_data
207
+
208
+
209
+ def handle_miss_zt_data(stock_em_zt_pool_df_data, str_day):
210
+ now_date = datetime.now()
211
+ now_day = now_date.strftime('%Y-%m-%d')
212
+ if now_day == str_day:
213
+ real_time_quotes_all_stocks_df = em_real_time_quotes_api.get_real_time_quotes_now(None, None)
214
+ if data_frame_util.is_empty(real_time_quotes_all_stocks_df):
215
+ return stock_em_zt_pool_df_data
216
+ real_time_quotes_all_stocks_df = real_time_quotes_all_stocks_df.loc[
217
+ (real_time_quotes_all_stocks_df['wei_bi'] == 100) & (real_time_quotes_all_stocks_df['chg'] >= 9)]
218
+ miss_zt_data_df_copy = real_time_quotes_all_stocks_df.loc[~(
219
+ real_time_quotes_all_stocks_df['symbol'].isin(stock_em_zt_pool_df_data['symbol']))]
220
+ miss_zt_data_df = miss_zt_data_df_copy.copy()
221
+ if data_frame_util.is_not_empty(miss_zt_data_df):
222
+ miss_zt_data_df['buy_1_num'] = miss_zt_data_df['buy_1_num'].astype(float)
223
+ miss_zt_data_df['now_price'] = miss_zt_data_df['now_price'].astype(float)
224
+ miss_zt_data_df['closure_funds'] = round(miss_zt_data_df['buy_1_num'] * 100 * miss_zt_data_df['now_price'],
225
+ 2)
226
+
227
+ company_info_industry_df = company_common_service_api.get_company_info_name()
228
+ company_info_industry_df = company_info_industry_df.loc[
229
+ company_info_industry_df['_id'].isin(miss_zt_data_df['symbol'])]
230
+
231
+ company_info_industry_df = company_info_industry_df[['_id', 'industry', 'name']]
232
+
233
+ company_info_industry_df = company_info_industry_df.set_index(['_id'], drop=True)
234
+ miss_zt_data_df = miss_zt_data_df.set_index(['symbol'], drop=False)
235
+
236
+ miss_zt_data_df = pd.merge(miss_zt_data_df, company_info_industry_df, how='outer',
237
+ left_index=True, right_index=True)
238
+
239
+ miss_zt_data_df = miss_zt_data_df[[
240
+ 'symbol',
241
+ 'name',
242
+ 'chg',
243
+ 'now_price',
244
+ 'amount',
245
+ 'flow_mv',
246
+ 'total_mv',
247
+ 'exchange',
248
+ 'industry',
249
+ 'closure_funds'
250
+
251
+ ]]
252
+ miss_zt_data_df['index'] = 10000
253
+ miss_zt_data_df['first_closure_time'] = '150000'
254
+ miss_zt_data_df['last_closure_time'] = '150000'
255
+ miss_zt_data_df['statistics'] = '1/1'
256
+ miss_zt_data_df['frying_plates_numbers'] = 0
257
+ miss_zt_data_df['connected_boards_numbers'] = 0
258
+
259
+ stock_em_zt_pool_df_data = pd.concat([miss_zt_data_df, stock_em_zt_pool_df_data])
260
+ return stock_em_zt_pool_df_data
261
+ else:
262
+ return stock_em_zt_pool_df_data
263
+
264
+
265
+ def handle_ths_em_diff_data(ths_zt_pool_df_data, stock_em_zt_pool_df_data):
266
+ if data_frame_util.is_empty(ths_zt_pool_df_data):
267
+ return stock_em_zt_pool_df_data
268
+ else:
269
+ diff_ths_zt_df = ths_zt_pool_df_data.loc[
270
+ ~(ths_zt_pool_df_data['symbol'].isin(stock_em_zt_pool_df_data['symbol']))]
271
+ if data_frame_util.is_empty(diff_ths_zt_df):
272
+ return stock_em_zt_pool_df_data
273
+ else:
274
+ diff_ths_zt_df = diff_ths_zt_df[[
275
+ 'symbol',
276
+ 'name',
277
+ 'chg',
278
+ 'now_price',
279
+ # 'amount',
280
+ # 'flow_mv',
281
+ # 'total_mv',
282
+ # 'exchange',
283
+ 'closure_funds',
284
+ 'first_closure_time',
285
+ 'last_closure_time',
286
+ 'frying_plates_numbers',
287
+ 'statistics',
288
+ 'connected_boards_numbers'
289
+
290
+ ]]
291
+
292
+ company_info_df = query_company_info_with_share()
293
+ company_info_df['symbol'] = company_info_df['_id']
294
+ company_info_df = company_info_df.loc[company_info_df['symbol'].isin(list(diff_ths_zt_df['symbol']))]
295
+
296
+ company_info_df = common_service_fun_api.add_after_prefix(company_info_df)
297
+
298
+ symbol_prefix_list = list(company_info_df['symbol_prefix'])
299
+ real_time_quotes_list = deal_service_api.get_qmt_real_time_quotes_detail('qmt',
300
+ symbol_prefix_list)
301
+
302
+ real_time_quotes_df = pd.DataFrame(real_time_quotes_list)
303
+
304
+ real_time_quotes_df['symbol'] = real_time_quotes_df['symbol'].str.slice(0, 6)
305
+ company_info_df = company_info_df.set_index(['symbol'], drop=True)
306
+ real_time_quotes_df = real_time_quotes_df.set_index(['symbol'], drop=False)
307
+
308
+ real_time_quotes_df = pd.merge(company_info_df, real_time_quotes_df, how='outer',
309
+ left_index=True, right_index=True)
310
+
311
+ real_time_quotes_df['amount'] = round(real_time_quotes_df['amount'], 1)
312
+
313
+ real_time_quotes_df['total_mv'] = round(
314
+ real_time_quotes_df['lastPrice'] * real_time_quotes_df['total_share'], 1)
315
+ real_time_quotes_df['flow_mv'] = round(real_time_quotes_df['lastPrice'] * real_time_quotes_df['flow_share'],
316
+ 1)
317
+ real_time_quotes_df['exchange'] = round(
318
+ real_time_quotes_df['amount'] * 100 / real_time_quotes_df['flow_mv'], 1)
319
+
320
+ real_time_quotes_df = real_time_quotes_df[
321
+ ['symbol', 'amount', 'total_mv', 'flow_mv', 'exchange', 'industry']]
322
+
323
+ real_time_quotes_df = real_time_quotes_df.set_index(['symbol'], drop=True)
324
+ diff_ths_zt_df = diff_ths_zt_df.set_index(['symbol'], drop=False)
325
+ diff_ths_zt_df = pd.merge(real_time_quotes_df, diff_ths_zt_df, how='outer',
326
+ left_index=True, right_index=True)
327
+
328
+ diff_ths_zt_df = diff_ths_zt_df[[
329
+ 'symbol',
330
+ 'name',
331
+ 'chg',
332
+ 'now_price',
333
+ 'amount',
334
+ 'flow_mv',
335
+ 'total_mv',
336
+ 'exchange',
337
+ 'closure_funds',
338
+ 'first_closure_time',
339
+ 'last_closure_time',
340
+ 'frying_plates_numbers',
341
+ 'statistics',
342
+ 'connected_boards_numbers',
343
+ 'industry'
344
+
345
+ ]]
346
+
347
+ exist_number = stock_em_zt_pool_df_data.shape[0] + 1
348
+
349
+ diff_ths_zt_df.index = range(exist_number, exist_number + len(diff_ths_zt_df))
350
+ diff_ths_zt_df['index'] = diff_ths_zt_df.index
351
+
352
+ stock_em_zt_pool_df_data = pd.concat([stock_em_zt_pool_df_data, diff_ths_zt_df])
353
+ return stock_em_zt_pool_df_data
354
+
355
+
356
+ def query_company_info_with_share():
357
+ query_field = {"_id": 1,
358
+ "industry": 1,
359
+ "company_type": 1,
360
+ "ths_industry_code": 1,
361
+ "ths_concept_name": 1,
362
+ "ths_concept_code": 1,
363
+ "ths_concept_sync_day": 1,
364
+ "first_sw_industry": 1,
365
+ "second_sw_industry": 1,
366
+ "second_industry_code": 1,
367
+ "third_sw_industry": 1,
368
+ "mv_circulation_ratio": 1,
369
+ "list_date": 1,
370
+ "diff_days": 1,
371
+ 'em_industry': 1,
372
+ 'operate_profit': 1,
373
+ 'total_operate_income': 1,
374
+ "name": 1,
375
+ 'pb': 1,
376
+ 'pe_ttm': 1,
377
+ 'ROE': 1,
378
+ 'ths_industry_name': 1,
379
+ 'total_share': 1,
380
+ 'flow_share': 1
381
+ }
382
+ de_list_company_symbols = company_common_service_new_api.get_de_list_company()
383
+ query_field_key = str(query_field)
384
+ query = {"_id": {"$regex": "^[^48]"},
385
+ 'symbol': {"$nin": de_list_company_symbols}, }
386
+ query_key = str(query)
387
+ company_info_df = company_common_service_new_api.get_company_info_by_field(query_key, query_field_key)
388
+
389
+ return company_info_df
390
+
391
+
392
+ if __name__ == '__main__':
393
+ save_zt_info('2025-11-17')
394
+ # from datetime import datetime
395
+ #
396
+ # if __name__ == '__main__':
397
+ #
398
+ # sync_date = date_handle_util.add_date_day('20240110', 0)
399
+ #
400
+ # now_date = datetime.now()
401
+ #
402
+ # str_now_day = sync_date.strftime('%Y-%m-%d')
403
+ #
404
+ # while now_date > sync_date:
405
+ # try:
406
+ # save_zt_info(str_now_day)
407
+ # sync_date = date_handle_util.add_date_day(date_handle_util.no_slash_date(str_now_day), 1)
408
+ # print(str_now_day)
409
+ # str_now_day = sync_date.strftime('%Y-%m-%d')
410
+ #
411
+ # except BaseException as e:
412
+ # sync_date = date_handle_util.add_date_day(date_handle_util.no_slash_date(str_now_day), 1)
413
+ # str_now_day = sync_date.strftime('%Y-%m-%d')
@@ -0,0 +1,193 @@
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 mns_common.api.ths.zt.ths_stock_zt_pool_api as ths_stock_zt_pool_api
9
+ from datetime import datetime
10
+ import mns_common.utils.data_frame_util as data_frame_util
11
+ import pandas as pd
12
+ import mns_common.component.company.company_common_service_new_api as company_common_service_new_api
13
+ import mns_common.component.common_service_fun_api as common_service_fun_api
14
+ from loguru import logger
15
+ import mns_common.utils.date_handle_util as date_handle_util
16
+ from mns_common.db.MongodbUtil import MongodbUtil
17
+ import mns_common.constant.db_name_constant as db_name_constant
18
+ import mns_scheduler.k_line.common.k_line_common_api as k_line_common_api
19
+
20
+ mongodb_util = MongodbUtil('27017')
21
+
22
+
23
+ def ths_zt_pool(str_day, real_time_quotes_all_stocks):
24
+ '''
25
+ 获取请求头
26
+ :param str_day: 日期
27
+ :param real_time_quotes_all_stocks: 实时行情
28
+ :return:
29
+ '''
30
+ now_date = datetime.now()
31
+ now_day_str_day = now_date.strftime('%Y-%m-%d')
32
+ ths_zt_pool_df = ths_stock_zt_pool_api.get_zt_reason(str_day)
33
+ ths_zt_pool_df_copy = ths_zt_pool_df.copy()
34
+
35
+ if data_frame_util.is_empty(ths_zt_pool_df_copy):
36
+ return pd.DataFrame()
37
+ if str_day == now_day_str_day:
38
+ ths_zt_pool_df = merge_his_day_zt_info(ths_zt_pool_df_copy, str_day)
39
+ else:
40
+ ths_zt_pool_df = merge_his_day_zt_info(ths_zt_pool_df_copy, str_day)
41
+
42
+ return ths_zt_pool_df
43
+
44
+
45
+ # 历史数据merge
46
+ def merge_his_day_zt_info(ths_zt_pool_df, str_day):
47
+ '''
48
+ 获取请求头
49
+ :param ths_zt_pool_df: 涨停df
50
+ :param str_day: 日期
51
+ :return:
52
+ '''
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
+ bfq_k_line_df = get_bfq_daily_line(ths_zt_pool_df, str_day)
70
+ bfq_k_line_df['total_mv'] = bfq_k_line_df['flow_mv']
71
+
72
+ company_df_zt = company_df_zt.set_index(['_id'], drop=True)
73
+ bfq_k_line_df = bfq_k_line_df.set_index(['symbol'], drop=True)
74
+ ths_zt_pool_df = ths_zt_pool_df.set_index(['symbol'], drop=False)
75
+
76
+ if 'chg' in ths_zt_pool_df.columns:
77
+ del ths_zt_pool_df['chg']
78
+ if 'now_price' in ths_zt_pool_df.columns:
79
+ del ths_zt_pool_df['now_price']
80
+
81
+ ths_zt_pool_df = pd.merge(ths_zt_pool_df, company_df_zt, how='outer',
82
+ left_index=True, right_index=True)
83
+
84
+ ths_zt_pool_df = pd.merge(ths_zt_pool_df, bfq_k_line_df, how='outer',
85
+ left_index=True, right_index=True)
86
+ ths_zt_pool_df = common_service_fun_api.classify_symbol(ths_zt_pool_df)
87
+ ths_zt_pool_df = common_service_fun_api.total_mv_classification(ths_zt_pool_df)
88
+ ths_zt_pool_df.fillna('', inplace=True)
89
+ if 'zt_flag' in ths_zt_pool_df.columns:
90
+ del ths_zt_pool_df['zt_flag']
91
+ if 'zt_tag' in ths_zt_pool_df.columns:
92
+ del ths_zt_pool_df['zt_tag']
93
+
94
+ return ths_zt_pool_df
95
+
96
+
97
+ # 获取不复权k线信息
98
+ def get_bfq_daily_line(ths_zt_pool_df, str_day):
99
+ query_k_line = {'symbol': {"$in": list(ths_zt_pool_df['symbol'])}, 'date': date_handle_util.no_slash_date(str_day)}
100
+ bfq_daily_line_df = mongodb_util.find_query_data('stock_bfq_daily', query_k_line)
101
+ if bfq_daily_line_df.shape[0] >= ths_zt_pool_df.shape[0]:
102
+ bfq_daily_line_df = bfq_daily_line_df[['amount', 'chg', 'close', 'exchange',
103
+ 'symbol', 'amount_level',
104
+ 'flow_mv', 'flow_mv_sp'
105
+ ]]
106
+ bfq_daily_line_df = bfq_daily_line_df.rename(columns={"close": 'now_price'})
107
+ return bfq_daily_line_df
108
+ else:
109
+ bfq_k_line_result_df = pd.DataFrame()
110
+ for zt_one in ths_zt_pool_df.itertuples():
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
118
+
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)]
121
+
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)
130
+
131
+ return bfq_k_line_result_df
132
+
133
+
134
+ def save_ths_zt_pool(ths_zt_pool_df, str_day):
135
+ ths_zt_pool_df = ths_zt_pool_df[[
136
+ "symbol",
137
+ "name",
138
+ "chg",
139
+ "connected_boards_numbers",
140
+ "statistics",
141
+ "statistics_detail",
142
+ "first_closure_time",
143
+ "last_closure_time",
144
+ "zt_detail",
145
+ "zt_reason",
146
+ "closure_volume",
147
+ "closure_funds",
148
+ "closure_funds_per_amount",
149
+ "closure_funds_per_flow_mv",
150
+ "frying_plates_numbers",
151
+ "zt_type",
152
+ "market_code",
153
+ "str_day",
154
+ "industry",
155
+ "first_sw_industry",
156
+ "third_sw_industry",
157
+ "ths_concept_name",
158
+ "ths_concept_code",
159
+ "ths_concept_sync_day",
160
+ "list_date",
161
+ "company_type",
162
+ "amount",
163
+ "now_price",
164
+ "exchange",
165
+ "amount_level",
166
+ "flow_mv",
167
+ "flow_mv_sp",
168
+ "total_mv",
169
+ "classification",
170
+ "total_mv_sp",
171
+ "flow_mv_level"
172
+ ]]
173
+ ths_zt_pool_df['_id'] = ths_zt_pool_df['symbol'] + '_' + ths_zt_pool_df['str_day']
174
+ ths_zt_pool_df = ths_zt_pool_df.sort_values(by=['connected_boards_numbers'], ascending=False)
175
+
176
+ # 将日期数值转换为日期时间格式
177
+ ths_zt_pool_df['list_date_01'] = pd.to_datetime(ths_zt_pool_df['list_date'], format='%Y%m%d')
178
+ str_day_date = date_handle_util.str_to_date(str_day, '%Y-%m-%d')
179
+ # 计算日期差值 距离现在上市时间
180
+ ths_zt_pool_df['diff_days'] = ths_zt_pool_df.apply(
181
+ lambda row: (str_day_date - row['list_date_01']).days, axis=1)
182
+ del ths_zt_pool_df['list_date_01']
183
+
184
+ mongodb_util.save_mongo(ths_zt_pool_df, db_name_constant.THS_ZT_POOL)
185
+
186
+
187
+ if __name__ == '__main__':
188
+ # trade_date = '2024-08-01'
189
+ # zt_df = ths_zt_pool(trade_date, None)
190
+ # save_ths_zt_pool(zt_df, trade_date)
191
+ trade_date = '2025-09-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)
@@ -0,0 +1,58 @@
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 mns_common.db.MongodbUtil import MongodbUtil
9
+
10
+ mongodb_util = MongodbUtil('27017')
11
+ import mns_common.api.ths.zt.ths_stock_zt_pool_api as ths_stock_zt_pool_api
12
+ import mns_common.utils.data_frame_util as data_frame_util
13
+ from loguru import logger
14
+
15
+
16
+ def update_null_zt_reason(str_day):
17
+ query = {"str_day": str_day, "$or": [{"zt_reason": "0"},
18
+ {"zt_reason": ""},
19
+ {"zt_reason": float('nan')},
20
+
21
+ {"zt_analysis": "0"},
22
+ {"zt_analysis": ""},
23
+ {"zt_analysis": float('nan')},
24
+
25
+ ]}
26
+ stock_zt_pool_df_null_zt_reason = mongodb_util.find_query_data('stock_zt_pool', query)
27
+ if data_frame_util.is_empty(stock_zt_pool_df_null_zt_reason):
28
+ return None
29
+ no_reason_list = list(stock_zt_pool_df_null_zt_reason['symbol'])
30
+ repeat_number = 0
31
+ # 循环10次
32
+ while len(no_reason_list) > 0 and repeat_number < 10:
33
+
34
+ for stock_zt_one in stock_zt_pool_df_null_zt_reason.itertuples():
35
+ try:
36
+ # 涨停原因
37
+ stock_zt_pool_df_one_df = stock_zt_pool_df_null_zt_reason.loc[
38
+ stock_zt_pool_df_null_zt_reason['symbol'] == stock_zt_one.symbol]
39
+ # 涨停分析
40
+ zt_result_dict = ths_stock_zt_pool_api.zt_analyse_reason(stock_zt_one.symbol)
41
+ zt_analysis = zt_result_dict['zt_analyse_detail']
42
+ zt_reason = zt_result_dict['zt_reason']
43
+
44
+ stock_zt_pool_df_one_df['zt_analysis'] = zt_analysis
45
+ stock_zt_pool_df_one_df['zt_reason'] = zt_reason
46
+
47
+ mongodb_util.save_mongo(stock_zt_pool_df_one_df, 'stock_zt_pool')
48
+ if stock_zt_one.symbol in no_reason_list:
49
+ no_reason_list.remove(stock_zt_one.symbol)
50
+ except BaseException as e:
51
+ logger.error("出现异常:{},{}", stock_zt_one.symbol, e)
52
+ continue
53
+ repeat_number = repeat_number + 1
54
+ return stock_zt_pool_df_null_zt_reason
55
+
56
+
57
+ if __name__ == '__main__':
58
+ update_null_zt_reason('2025-11-14')
File without changes