mns-scheduler 1.1.8.4__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 (129) 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/base/__init__.py +1 -1
  4. mns_scheduler/company_info/base/sync_company_base_info_api.py +171 -79
  5. mns_scheduler/company_info/base/sync_company_hold_info_api.py +3 -6
  6. mns_scheduler/company_info/base/sync_company_product_area_industry.py +161 -0
  7. mns_scheduler/company_info/clean/__init__.py +1 -1
  8. mns_scheduler/company_info/clean/company_info_clean_api.py +29 -9
  9. mns_scheduler/company_info/constant/__init__.py +1 -1
  10. mns_scheduler/company_info/constant/company_constant_data.py +285 -184
  11. mns_scheduler/company_info/de_list_stock/__init__.py +1 -1
  12. mns_scheduler/company_info/de_list_stock/de_list_stock_service.py +1 -1
  13. mns_scheduler/company_info/em_stock_info/__init__.py +7 -0
  14. mns_scheduler/company_info/em_stock_info/sync_em_stock_info_sync.py +80 -0
  15. mns_scheduler/company_info/remark/__init__.py +1 -1
  16. mns_scheduler/company_info/remark/company_remark_info_sync.py +3 -3
  17. mns_scheduler/concept/clean/kpl_concept_clean_api.py +1 -1
  18. mns_scheduler/concept/clean/ths_concept_clean_api.py +20 -4
  19. mns_scheduler/concept/ths/common/ths_concept_sync_common_api.py +21 -16
  20. mns_scheduler/concept/ths/common/ths_concept_update_common_api.py +4 -1
  21. mns_scheduler/concept/ths/detaill/ths_concept_detail_api.py +7 -7
  22. mns_scheduler/concept/ths/sync_new_index/sync_ths_concept_new_index_api.py +9 -4
  23. mns_scheduler/concept/ths/update_concept_info/sync_one_symbol_all_concepts_api.py +3 -3
  24. mns_scheduler/db/col_move_service.py +3 -3
  25. mns_scheduler/db/script/__init__.py +1 -1
  26. mns_scheduler/db/script/col_move_script.py +1 -1
  27. mns_scheduler/db/script/db_move/__init__.py +7 -0
  28. mns_scheduler/db/script/db_move/col_move_one_service.py +34 -0
  29. mns_scheduler/db/script/sync/__init__.py +1 -1
  30. mns_scheduler/db/script/sync/remote_data_sync_to_local.py +57 -4
  31. mns_scheduler/db/script/sync/sync_hui_ce_test_data.py +80 -0
  32. mns_scheduler/db/script/sync/sync_hui_ce_test_data_01.py +69 -0
  33. mns_scheduler/db/script/update/__init__.py +7 -0
  34. mns_scheduler/db/script/update/update_col_field.py +36 -0
  35. mns_scheduler/finance/__init__.py +1 -1
  36. mns_scheduler/finance/{em_financial_asset_liability_sync_service_api.py → em/em_financial_asset_liability_sync_service_api.py} +2 -2
  37. mns_scheduler/finance/{em_financial_profit_sync_service_api.py → em/em_financial_profit_sync_service_api.py} +27 -26
  38. mns_scheduler/finance/{finance_common_api.py → em/finance_common_api.py} +3 -3
  39. mns_scheduler/finance/{sync_financial_report_service_api.py → sync_financial_report_service_task.py} +80 -27
  40. mns_scheduler/finance/xue_qiu/down_load_xueqiu_report_api.py +77 -0
  41. mns_scheduler/finance/xue_qiu/sync_xue_qiu_fiance_data.py +161 -0
  42. mns_scheduler/hk/__init__.py +1 -1
  43. mns_scheduler/hk/hk_company_info_sync_service_api.py +4 -4
  44. mns_scheduler/hk/hk_industry_info_sync_service_api.py +3 -5
  45. mns_scheduler/industry/__init__.py +7 -0
  46. mns_scheduler/industry/ths/__init__.py +7 -0
  47. mns_scheduler/industry/ths/ths_industry_index_service.py +58 -0
  48. mns_scheduler/industry/ths/ths_industry_sync_service.py +68 -0
  49. mns_scheduler/irm/__init__.py +1 -1
  50. mns_scheduler/irm/api/__init__.py +1 -1
  51. mns_scheduler/irm/api/sh_stock_sns_sse_info_api.py +1 -1
  52. mns_scheduler/irm/api/sz_stock_sns_sse_info_api.py +1 -1
  53. mns_scheduler/irm/stock_irm_cninfo_service.py +12 -8
  54. mns_scheduler/k_line/clean/daily/__init__.py +1 -1
  55. mns_scheduler/k_line/clean/daily/daily_k_line_clean_common_service.py +52 -6
  56. mns_scheduler/k_line/clean/daily/daily_k_line_service.py +7 -2
  57. mns_scheduler/k_line/clean/k_line_info_clean_impl.py +3 -2
  58. mns_scheduler/k_line/clean/k_line_info_clean_task.py +42 -15
  59. mns_scheduler/k_line/clean/week_month/__init__.py +1 -1
  60. mns_scheduler/k_line/clean/week_month/normal_week_month_k_line_service.py +124 -26
  61. mns_scheduler/k_line/clean/week_month/sub_new_week_month_k_line_service.py +2 -2
  62. mns_scheduler/k_line/common/__init__.py +7 -0
  63. mns_scheduler/k_line/common/k_line_common_api.py +188 -0
  64. mns_scheduler/k_line/hot_stocks/__init__.py +1 -1
  65. mns_scheduler/k_line/hot_stocks/recent_hot_stocks_clean_service.py +1 -1
  66. mns_scheduler/k_line/{sync → month_week_daily}/bfq_k_line_sync.py +14 -29
  67. mns_scheduler/k_line/{sync → month_week_daily}/daily_week_month_line_sync.py +11 -12
  68. mns_scheduler/k_line/sync_status/__init__.py +7 -0
  69. mns_scheduler/k_line/sync_status/k_line_sync_status_check.py +54 -0
  70. mns_scheduler/k_line/test/__init__.py +1 -1
  71. mns_scheduler/k_line/test/k_line_info_clean_his_data.py +14 -3
  72. mns_scheduler/k_line/year_quarter/__init__.py +7 -0
  73. mns_scheduler/k_line/year_quarter/year_quarter_line_sync.py +76 -0
  74. mns_scheduler/kpl/selection/symbol/sync_best_choose_symbol.py +1 -2
  75. mns_scheduler/kpl/selection/symbol/sync_kpl_concept_symbol_choose_reason_api.py +108 -0
  76. mns_scheduler/kpl/selection/total/sync_kpl_best_total_sync_api.py +5 -0
  77. mns_scheduler/lhb/__init__.py +1 -1
  78. mns_scheduler/lhb/stock_lhb_sync_service.py +1 -1
  79. mns_scheduler/open/__init__.py +1 -1
  80. mns_scheduler/open/sync_one_day_open_data_to_db_service.py +2 -3
  81. mns_scheduler/risk/__init__.py +1 -1
  82. mns_scheduler/risk/compliance/undisclosed_annual_report_api.py +8 -2
  83. mns_scheduler/risk/financial/annual_report_audit_check_api.py +13 -3
  84. mns_scheduler/risk/financial/net_assets_check_api.py +21 -18
  85. mns_scheduler/risk/financial/profit_income_check_api.py +7 -2
  86. mns_scheduler/risk/financial_report_risk_check_api.py +1 -1
  87. mns_scheduler/risk/major_violations/register_and_investigate_stock_sync_api.py +1 -1
  88. mns_scheduler/risk/self/wei_pan_stock_api.py +1 -1
  89. mns_scheduler/risk/test/__init__.py +1 -1
  90. mns_scheduler/risk/test/fix_blask_list.py +4 -6
  91. mns_scheduler/risk/transactions/transactions_check_api.py +22 -4
  92. mns_scheduler/self_choose/__init__.py +1 -1
  93. mns_scheduler/self_choose/ths_self_choose_service.py +60 -32
  94. mns_scheduler/trade/auto_login/trader_auto_service.py +6 -4
  95. mns_scheduler/trade/auto_sell_service_api.py +4 -4
  96. mns_scheduler/trade/balance/__init__.py +7 -0
  97. mns_scheduler/trade/balance/ths_account_balance_service.py +7 -0
  98. mns_scheduler/trade/sync_position_api.py +39 -6
  99. mns_scheduler/trade/task/trader_task_service.py +26 -9
  100. mns_scheduler/trade/tfp/__init__.py +7 -0
  101. mns_scheduler/trade/tfp/stock_tfp_info_sync.py +56 -0
  102. mns_scheduler/zb/stock_zb_pool_sync.py +1 -16
  103. mns_scheduler/zt/high_chg/sync_high_chg_pool_service.py +2 -2
  104. mns_scheduler/zt/high_chg/sync_high_chg_real_time_quotes_service.py +1 -1
  105. mns_scheduler/zt/script/__init__.py +1 -1
  106. mns_scheduler/zt/script/fix_error_deal_day.py +41 -0
  107. mns_scheduler/zt/script/kcx_high_chg_open_his_data_handle.py +2 -2
  108. mns_scheduler/zt/script/sync_high_chg_pool_his_data.py +2 -2
  109. mns_scheduler/zt/script/sync_now_higt_chg_zt.py +8 -7
  110. mns_scheduler/zt/zt_pool/em_zt_pool_sync_api.py +256 -55
  111. mns_scheduler/zt/zt_pool/ths_zt_pool_sync_api.py +33 -90
  112. mns_scheduler/zt/zt_pool/update_null_zt_reason_api.py +24 -13
  113. mns_scheduler/zz_task/compensation/__init__.py +0 -0
  114. mns_scheduler/zz_task/compensation/compensate_task.py +161 -0
  115. mns_scheduler/zz_task/compensation/compensate_task_one_day.py +142 -0
  116. mns_scheduler/zz_task/data_sync_task.py +177 -91
  117. {mns_scheduler-1.1.8.4.dist-info → mns_scheduler-1.4.3.2.dist-info}/METADATA +1 -1
  118. mns_scheduler-1.4.3.2.dist-info/RECORD +169 -0
  119. {mns_scheduler-1.1.8.4.dist-info → mns_scheduler-1.4.3.2.dist-info}/WHEEL +1 -1
  120. mns_scheduler/2014-2015-test/2014_2015_chg_statistics.py +0 -87
  121. mns_scheduler/big_deal/ths_big_deal_sync.py +0 -98
  122. mns_scheduler/db/real_time_task_check.py +0 -84
  123. mns_scheduler/debt/kzz_bond_info_sync.py +0 -33
  124. mns_scheduler-1.1.8.4.dist-info/RECORD +0 -142
  125. /mns_scheduler/{big_deal → company_info/announce}/__init__.py +0 -0
  126. /mns_scheduler/{2014-2015-test → finance/em}/__init__.py +0 -0
  127. /mns_scheduler/{debt → finance/xue_qiu}/__init__.py +0 -0
  128. /mns_scheduler/k_line/{sync → month_week_daily}/__init__.py +0 -0
  129. {mns_scheduler-1.1.8.4.dist-info → mns_scheduler-1.4.3.2.dist-info}/top_level.txt +0 -0
@@ -2,7 +2,7 @@ import sys
2
2
  import os
3
3
 
4
4
  file_path = os.path.abspath(__file__)
5
- end = file_path.index('mns') + 16
5
+ end = file_path.index('mns') + 17
6
6
  project_path = file_path[0:end]
7
7
  sys.path.append(project_path)
8
8
  import mns_common.utils.date_handle_util as date_handle_util
@@ -36,4 +36,4 @@ def sync_his_zt_pool_data(begin_day, end_day):
36
36
 
37
37
 
38
38
  if __name__ == '__main__':
39
- sync_high_chg_pool_service.sync_stock_high_chg_pool_list('2024-07-22', None)
39
+ sync_high_chg_pool_service.sync_stock_high_chg_pool_list('2025-05-23', None)
@@ -2,12 +2,12 @@ import sys
2
2
  import os
3
3
 
4
4
  file_path = os.path.abspath(__file__)
5
- end = file_path.index('mns') + 16
5
+ end = file_path.index('mns') + 17
6
6
  project_path = file_path[0:end]
7
7
  sys.path.append(project_path)
8
- import mns_common.api.em.east_money_stock_api as east_money_stock_api
8
+ import mns_common.component.em.em_stock_info_api as em_stock_info_api
9
9
  import mns_common.component.common_service_fun_api as common_service_fun_api
10
- import mns_scheduler.k_line.sync.daily_week_month_line_sync as daily_week_month_line_sync
10
+ import mns_scheduler.k_line.month_week_daily.daily_week_month_line_sync as daily_week_month_line_sync
11
11
  from datetime import datetime
12
12
  import mns_scheduler.zt.zt_pool.em_zt_pool_sync_api as em_zt_pool_sync_api
13
13
  import mns_scheduler.zt.high_chg.sync_high_chg_pool_service as sync_high_chg_pool_service
@@ -16,16 +16,17 @@ import mns_scheduler.zt.high_chg.sync_high_chg_real_time_quotes_service as sync_
16
16
 
17
17
 
18
18
  def sync_now_day_high_chg():
19
- real_time_quotes_now_es = east_money_stock_api.get_real_time_quotes_all_stocks()
19
+ real_time_quotes_now_es = em_stock_info_api.get_a_stock_info()
20
20
  real_time_quotes_now_es_high_chg = real_time_quotes_now_es.loc[
21
21
  real_time_quotes_now_es['chg'] > common_service_fun_api.ZT_CHG]
22
+ now_date = datetime.now()
23
+
24
+ str_now_day = now_date.strftime('%Y-%m-%d')
22
25
  # 同步qfq k线
23
- daily_week_month_line_sync.sync_all_daily_data('daily', 'qfq', 'stock_qfq_daily', None,
26
+ daily_week_month_line_sync.sync_all_daily_data('daily', 'qfq', 'stock_qfq_daily', str_now_day,
24
27
  list(real_time_quotes_now_es_high_chg['symbol']))
25
28
 
26
- now_date = datetime.now()
27
29
 
28
- str_now_day = now_date.strftime('%Y-%m-%d')
29
30
  # 同步当前涨停
30
31
  em_zt_pool_sync_api.save_zt_info(str_now_day)
31
32
 
@@ -8,7 +8,6 @@ sys.path.append(project_path)
8
8
  import pandas as pd
9
9
  import mns_common.api.akshare.stock_zt_pool_api as stock_zt_pool_api
10
10
  import mns_common.utils.date_handle_util as date_handle_util
11
- import mns_common.component.concept.ths_concept_common_service_api as ths_concept_common_service_api
12
11
  from mns_common.db.MongodbUtil import MongodbUtil
13
12
  import mns_common.component.company.company_common_service_api as company_common_service_api
14
13
  from loguru import logger
@@ -17,8 +16,12 @@ import mns_common.component.common_service_fun_api as common_service_fun_api
17
16
  import mns_common.component.trade_date.trade_date_common_service_api as trade_date_common_service_api
18
17
  import mns_common.api.ths.zt.ths_stock_zt_pool_v2_api as ths_stock_zt_pool_v2_api
19
18
  import mns_common.component.zt.zt_common_service_api as zt_common_service_api
20
- import mns_common.api.em.east_money_stock_api as east_money_stock_api
19
+ import mns_common.component.em.em_real_time_quotes_api as em_real_time_quotes_api
21
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
22
25
 
23
26
  '''
24
27
  东方财富涨停池
@@ -28,7 +31,7 @@ mongodb_util = MongodbUtil('27017')
28
31
 
29
32
  ZT_FIELD = ['_id', 'symbol', 'name', 'now_price', 'chg', 'first_closure_time',
30
33
  'last_closure_time', 'connected_boards_numbers',
31
- 'zt_reason', 'closure_funds',
34
+ 'zt_reason', 'zt_analysis', 'closure_funds',
32
35
  # 'closure_funds_per_amount', 'closure_funds_per_flow_mv',
33
36
  'frying_plates_numbers',
34
37
  # 'statistics_detail', 'zt_type', 'market_code',
@@ -39,63 +42,48 @@ ZT_FIELD = ['_id', 'symbol', 'name', 'now_price', 'chg', 'first_closure_time',
39
42
  'third_sw_industry', 'ths_concept_name',
40
43
  'ths_concept_code', 'ths_concept_sync_day', 'em_industry',
41
44
  'mv_circulation_ratio', 'ths_concept_list_info', 'kpl_plate_name',
42
- 'kpl_plate_list_info', 'company_type', 'diff_days', 'symbol', 'amount',
45
+ 'kpl_plate_list_info', 'company_type', 'diff_days', 'amount',
43
46
  'list_date',
44
47
  'exchange', 'flow_mv', 'total_mv',
45
48
  'classification', 'flow_mv_sp', 'total_mv_sp', 'flow_mv_level',
46
- 'amount_level', 'new_stock', 'list_date_01', 'index', 'str_day']
49
+ 'amount_level', 'new_stock', 'list_date_01', 'index', 'str_day', 'main_line', 'sub_main_line']
47
50
 
48
51
 
49
52
  def save_zt_info(str_day):
50
53
  if bool(1 - trade_date_common_service_api.is_trade_day(str_day)):
51
- return None
54
+ return pd.DataFrame()
52
55
 
53
56
  stock_em_zt_pool_df_data = stock_zt_pool_api.stock_em_zt_pool_df(
54
57
  date_handle_util.no_slash_date(str_day))
55
58
 
56
59
  # fix 涨停池没有的股票
57
- stock_em_zt_pool_df_data = sync_miss_zt_data(stock_em_zt_pool_df_data, str_day)
60
+ stock_em_zt_pool_df_data = handle_miss_zt_data(stock_em_zt_pool_df_data.copy(), str_day)
58
61
 
59
- stock_em_zt_pool_df_data = common_service_fun_api.total_mv_classification(stock_em_zt_pool_df_data)
60
-
61
- stock_em_zt_pool_df_data = common_service_fun_api.classify_symbol(stock_em_zt_pool_df_data)
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()
62
68
 
63
- stock_em_zt_pool_df_data = common_service_fun_api.symbol_amount_simple(stock_em_zt_pool_df_data)
69
+ stock_em_zt_pool_df_data = handle_ths_em_diff_data(ths_zt_pool_df_data, stock_em_zt_pool_df_data)
64
70
 
65
- stock_em_zt_pool_df_data = company_common_service_api.amendment_industry(stock_em_zt_pool_df_data)
71
+ stock_em_zt_pool_df_data = common_service_fun_api.total_mv_classification(stock_em_zt_pool_df_data.copy())
66
72
 
67
- # 上个交易交易日涨停股票
68
- last_trade_day_zt_df = zt_common_service_api.get_last_trade_day_zt(str_day)
73
+ stock_em_zt_pool_df_data = common_service_fun_api.classify_symbol(stock_em_zt_pool_df_data.copy())
69
74
 
70
- try:
71
- # 同花顺问财涨停池
72
- ths_zt_pool_df_data = ths_stock_zt_pool_v2_api.get_ths_stock_zt_reason_with_cache(str_day)
75
+ stock_em_zt_pool_df_data = common_service_fun_api.symbol_amount_simple(stock_em_zt_pool_df_data.copy())
73
76
 
74
- # del stock_em_zt_pool_df_data['ths_concept_name']
75
- # del stock_em_zt_pool_df_data['ths_concept_code']
77
+ stock_em_zt_pool_df_data = company_common_service_api.amendment_industry(stock_em_zt_pool_df_data.copy())
76
78
 
77
- for stock_one in stock_em_zt_pool_df_data.itertuples():
78
- try:
79
- stock_em_zt_pool_df_data = ths_concept_common_service_api.set_last_ths_concept(stock_one.symbol,
80
- stock_em_zt_pool_df_data,
81
- str_day)
82
- # 设置连板数目
83
- stock_em_zt_pool_df_data = set_connected_boards_numbers(stock_em_zt_pool_df_data,
84
- stock_one.symbol, last_trade_day_zt_df)
79
+ # 主线标记 复盘用
80
+ stock_em_zt_pool_df_data['main_line'] = '无'
81
+ stock_em_zt_pool_df_data['sub_main_line'] = '无'
85
82
 
86
- ths_zt_pool_one_df = ths_zt_pool_df_data.loc[ths_zt_pool_df_data['symbol'] == stock_one.symbol]
87
- if data_frame_util.is_empty(ths_zt_pool_one_df):
88
- stock_em_zt_pool_df_data['zt_reason'] = '0'
89
- continue
90
- stock_em_zt_pool_df_data.loc[stock_em_zt_pool_df_data['symbol'] == stock_one.symbol, 'zt_reason'] = \
91
- list(ths_zt_pool_one_df['zt_reason'])[0]
92
- except BaseException as e:
93
- stock_em_zt_pool_df_data['zt_reason'] = '0'
94
- logger.error("出现异常:{}", e)
95
- except BaseException as e:
96
- stock_em_zt_pool_df_data['zt_reason'] = '0'
97
- logger.error("出现异常:{}", e)
83
+ # 上个交易交易日涨停股票
84
+ last_trade_day_zt_df = zt_common_service_api.get_last_trade_day_zt(str_day)
98
85
 
86
+ stock_em_zt_pool_df_data['first_closure_time'] = stock_em_zt_pool_df_data['first_closure_time'].str.strip()
99
87
  stock_em_zt_pool_df_data['list_date'] = stock_em_zt_pool_df_data['list_date'].apply(
100
88
  lambda x: pd.to_numeric(x, errors="coerce"))
101
89
 
@@ -119,51 +107,135 @@ def save_zt_info(str_day):
119
107
 
120
108
  stock_em_zt_pool_df_data['str_day'] = str_day
121
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)
122
111
 
123
- stock_em_zt_pool_df_data = stock_em_zt_pool_df_data[ZT_FIELD]
124
- exist_zt_pool_today = mongodb_util.find_query_data('stock_zt_pool', {'str_day': str_day})
125
- if data_frame_util.is_empty(exist_zt_pool_today):
126
- mongodb_util.save_mongo(stock_em_zt_pool_df_data, 'stock_zt_pool')
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()
127
119
  else:
128
- exist_zt_pool_today_not_nan = exist_zt_pool_today.loc[exist_zt_pool_today['zt_reason'] != '0']
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)
129
176
 
130
- stock_em_zt_pool_df_data = stock_em_zt_pool_df_data.loc[:, ~stock_em_zt_pool_df_data.columns.duplicated()]
131
- stock_em_zt_pool_df_data_new = stock_em_zt_pool_df_data.loc[~(
132
- stock_em_zt_pool_df_data['symbol'].isin(exist_zt_pool_today_not_nan['symbol']))]
133
- if data_frame_util.is_not_empty(stock_em_zt_pool_df_data_new):
134
- mongodb_util.save_mongo(stock_em_zt_pool_df_data_new, 'stock_zt_pool')
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]
135
179
  return stock_em_zt_pool_df_data
136
180
 
137
181
 
138
182
  # 设置连板数目
139
183
  def set_connected_boards_numbers(stock_em_zt_pool_df_data, symbol, last_trade_day_zt_df):
140
- connected_boards_df = last_trade_day_zt_df.loc[
184
+ # 连板股票
185
+ connected_boards_df_copy = last_trade_day_zt_df.loc[
141
186
  last_trade_day_zt_df['symbol'].isin(stock_em_zt_pool_df_data['symbol'])]
142
187
 
188
+ connected_boards_df = connected_boards_df_copy.copy()
143
189
  connected_boards_df['connected_boards_numbers'] = connected_boards_df['connected_boards_numbers'] + 1
144
190
 
191
+ # 连板股票
145
192
  connected_boards_df_one = connected_boards_df.loc[connected_boards_df['symbol'] == symbol]
193
+
146
194
  if data_frame_util.is_not_empty(connected_boards_df_one):
147
- connected_boards_df_one.loc[connected_boards_df_one['symbol'] == symbol, 'connected_boards_numbers'] = \
195
+ stock_em_zt_pool_df_data.loc[stock_em_zt_pool_df_data['symbol'] == symbol, 'connected_boards_numbers'] = \
148
196
  list(connected_boards_df_one['connected_boards_numbers'])[0]
149
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
+
150
206
  return stock_em_zt_pool_df_data
151
207
 
152
208
 
153
- def sync_miss_zt_data(stock_em_zt_pool_df_data, str_day):
209
+ def handle_miss_zt_data(stock_em_zt_pool_df_data, str_day):
154
210
  now_date = datetime.now()
155
211
  now_day = now_date.strftime('%Y-%m-%d')
156
212
  if now_day == str_day:
157
- real_time_quotes_all_stocks_df = east_money_stock_api.get_real_time_quotes_all_stocks()
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
158
216
  real_time_quotes_all_stocks_df = real_time_quotes_all_stocks_df.loc[
159
217
  (real_time_quotes_all_stocks_df['wei_bi'] == 100) & (real_time_quotes_all_stocks_df['chg'] >= 9)]
160
- miss_zt_data_df = real_time_quotes_all_stocks_df.loc[~(
218
+ miss_zt_data_df_copy = real_time_quotes_all_stocks_df.loc[~(
161
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()
162
221
  if data_frame_util.is_not_empty(miss_zt_data_df):
163
222
  miss_zt_data_df['buy_1_num'] = miss_zt_data_df['buy_1_num'].astype(float)
164
223
  miss_zt_data_df['now_price'] = miss_zt_data_df['now_price'].astype(float)
165
224
  miss_zt_data_df['closure_funds'] = round(miss_zt_data_df['buy_1_num'] * 100 * miss_zt_data_df['now_price'],
166
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
+
167
239
  miss_zt_data_df = miss_zt_data_df[[
168
240
  'symbol',
169
241
  'name',
@@ -186,10 +258,139 @@ def sync_miss_zt_data(stock_em_zt_pool_df_data, str_day):
186
258
 
187
259
  stock_em_zt_pool_df_data = pd.concat([miss_zt_data_df, stock_em_zt_pool_df_data])
188
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
189
390
 
190
391
 
191
392
  if __name__ == '__main__':
192
- save_zt_info('2024-10-30')
393
+ save_zt_info('2025-11-17')
193
394
  # from datetime import datetime
194
395
  #
195
396
  # if __name__ == '__main__':
@@ -9,15 +9,13 @@ import mns_common.api.ths.zt.ths_stock_zt_pool_api as ths_stock_zt_pool_api
9
9
  from datetime import datetime
10
10
  import mns_common.utils.data_frame_util as data_frame_util
11
11
  import pandas as pd
12
- import mns_common.api.em.east_money_stock_api as east_money_stock_api
13
12
  import mns_common.component.company.company_common_service_new_api as company_common_service_new_api
14
13
  import mns_common.component.common_service_fun_api as common_service_fun_api
15
14
  from loguru import logger
16
- import mns_common.api.akshare.k_line_api as k_line_api
17
15
  import mns_common.utils.date_handle_util as date_handle_util
18
16
  from mns_common.db.MongodbUtil import MongodbUtil
19
17
  import mns_common.constant.db_name_constant as db_name_constant
20
- import time
18
+ import mns_scheduler.k_line.common.k_line_common_api as k_line_common_api
21
19
 
22
20
  mongodb_util = MongodbUtil('27017')
23
21
 
@@ -32,56 +30,14 @@ def ths_zt_pool(str_day, real_time_quotes_all_stocks):
32
30
  now_date = datetime.now()
33
31
  now_day_str_day = now_date.strftime('%Y-%m-%d')
34
32
  ths_zt_pool_df = ths_stock_zt_pool_api.get_zt_reason(str_day)
35
- if data_frame_util.is_empty(ths_zt_pool_df):
33
+ ths_zt_pool_df_copy = ths_zt_pool_df.copy()
34
+
35
+ if data_frame_util.is_empty(ths_zt_pool_df_copy):
36
36
  return pd.DataFrame()
37
37
  if str_day == now_day_str_day:
38
- ths_zt_pool_df = merge_now_day_zt_info(ths_zt_pool_df, real_time_quotes_all_stocks)
38
+ ths_zt_pool_df = merge_his_day_zt_info(ths_zt_pool_df_copy, str_day)
39
39
  else:
40
- ths_zt_pool_df = merge_his_day_zt_info(ths_zt_pool_df, str_day)
41
-
42
- return ths_zt_pool_df
43
-
44
-
45
- def merge_now_day_zt_info(ths_zt_pool_df, real_time_quotes_all_stocks):
46
- if real_time_quotes_all_stocks is None:
47
- real_time_quotes_all_stocks = east_money_stock_api.get_real_time_quotes_all_stocks()
48
- real_time_quotes_all_stocks = real_time_quotes_all_stocks[['symbol', 'amount',
49
- 'exchange', 'flow_mv', 'total_mv']]
50
- real_time_quotes_all_stocks_zt = real_time_quotes_all_stocks.loc[
51
- real_time_quotes_all_stocks['symbol'].isin(ths_zt_pool_df['symbol'])]
52
-
53
- query_field = {
54
- "ths_concept_name": 1,
55
- "ths_concept_code": 1,
56
- "ths_concept_sync_day": 1,
57
- "company_type": 1,
58
- "concept_create_day": 1,
59
- "first_sw_industry": 1,
60
- "third_sw_industry": 1,
61
- "industry": 1,
62
- "list_date": 1,
63
- }
64
- query_field_key = str(query_field)
65
- query_key = str({'symbol': {"$in": list(ths_zt_pool_df['symbol'])}})
66
- company_df_zt = company_common_service_new_api.get_company_info_by_field(query_key, query_field_key)
67
-
68
- company_df_zt = company_df_zt.set_index(['_id'], drop=True)
69
- real_time_quotes_all_stocks_zt = real_time_quotes_all_stocks_zt.set_index(['symbol'], drop=True)
70
- ths_zt_pool_df = ths_zt_pool_df.set_index(['symbol'], drop=False)
71
-
72
- ths_zt_pool_df = pd.merge(ths_zt_pool_df, company_df_zt, how='outer',
73
- left_index=True, right_index=True)
74
-
75
- ths_zt_pool_df = pd.merge(ths_zt_pool_df, real_time_quotes_all_stocks_zt, how='outer',
76
- left_index=True, right_index=True)
77
- ths_zt_pool_df['amount_level'] = round(ths_zt_pool_df['amount'] / common_service_fun_api.HUNDRED_MILLION, 2)
78
- ths_zt_pool_df = common_service_fun_api.classify_symbol(ths_zt_pool_df)
79
- ths_zt_pool_df = common_service_fun_api.total_mv_classification(ths_zt_pool_df)
80
- ths_zt_pool_df.fillna('', inplace=True)
81
- if 'zt_flag' in ths_zt_pool_df.columns:
82
- del ths_zt_pool_df['zt_flag']
83
- if 'zt_tag' in ths_zt_pool_df.columns:
84
- del ths_zt_pool_df['zt_tag']
40
+ ths_zt_pool_df = merge_his_day_zt_info(ths_zt_pool_df_copy, str_day)
85
41
 
86
42
  return ths_zt_pool_df
87
43
 
@@ -142,35 +98,37 @@ def merge_his_day_zt_info(ths_zt_pool_df, str_day):
142
98
  def get_bfq_daily_line(ths_zt_pool_df, str_day):
143
99
  query_k_line = {'symbol': {"$in": list(ths_zt_pool_df['symbol'])}, 'date': date_handle_util.no_slash_date(str_day)}
144
100
  bfq_daily_line_df = mongodb_util.find_query_data('stock_bfq_daily', query_k_line)
145
- if data_frame_util.is_not_empty(bfq_daily_line_df):
101
+ if bfq_daily_line_df.shape[0] >= ths_zt_pool_df.shape[0]:
146
102
  bfq_daily_line_df = bfq_daily_line_df[['amount', 'chg', 'close', 'exchange',
147
103
  'symbol', 'amount_level',
148
104
  'flow_mv', 'flow_mv_sp'
149
105
  ]]
150
106
  bfq_daily_line_df = bfq_daily_line_df.rename(columns={"close": 'now_price'})
151
107
  return bfq_daily_line_df
152
-
153
- bfq_k_line_df = pd.DataFrame()
154
- for zt_one in ths_zt_pool_df.itertuples():
155
- try:
108
+ else:
109
+ bfq_k_line_result_df = pd.DataFrame()
110
+ for zt_one in ths_zt_pool_df.itertuples():
156
111
  symbol = zt_one.symbol
157
- bfq_daily_line_df = k_line_api.stock_zh_a_hist(symbol,
158
- 'daily',
159
- date_handle_util.no_slash_date(str_day),
160
- date_handle_util.no_slash_date(str_day),
161
- '')
162
- if data_frame_util.is_empty(bfq_daily_line_df):
163
- continue
164
- bfq_daily_line_df = bfq_daily_line_df[['amount', 'chg', 'close', 'exchange',
165
- 'symbol', 'amount_level',
166
- 'flow_mv', 'flow_mv_sp'
167
- ]]
168
- bfq_daily_line_df = bfq_daily_line_df.rename(columns={"close": 'now_price'})
169
- bfq_k_line_df = pd.concat([bfq_k_line_df, bfq_daily_line_df])
170
- except BaseException as e:
171
- logger.warning("同步不复权k线异常:{},{}", symbol, e)
172
-
173
- return bfq_k_line_df
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
174
132
 
175
133
 
176
134
  def save_ths_zt_pool(ths_zt_pool_df, str_day):
@@ -230,21 +188,6 @@ if __name__ == '__main__':
230
188
  # trade_date = '2024-08-01'
231
189
  # zt_df = ths_zt_pool(trade_date, None)
232
190
  # save_ths_zt_pool(zt_df, trade_date)
233
- trade_date = '2024-09-30'
234
- zt_df = ths_zt_pool(trade_date, None)
235
-
236
- query = {"$and": [{'_id': {"$gte": '2013-07-04'}}, {'_id': {"$lte": '2015-04-30'}}]}
237
- # query = {"$and": [{'_id': {"$gte": '2024-07-24'}}, {'_id': {"$lte": '2024-08-01'}}]}
238
- trade_date_list = mongodb_util.find_query_data('trade_date_list', query)
239
- trade_date_list = trade_date_list.sort_values(by=['trade_date'], ascending=False)
240
- for trade_one in trade_date_list.itertuples():
241
- try:
242
- trade_date = trade_one.trade_date
243
- zt_df = ths_zt_pool(trade_date, None)
244
-
245
- # zt_df = mongodb_util.find_query_data(db_name_constant.THS_ZT_POOL, query={"str_day": trade_date})
246
- save_ths_zt_pool(zt_df, trade_date)
247
- logger.info("同步到日期:{}", trade_date)
248
- time.sleep(2)
249
- except BaseException as e:
250
- logger.warning("同步涨停到日期:{},{}", trade_one.trade_date, e)
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)