mns-scheduler 1.1.8.4__py3-none-any.whl → 1.4.5.7__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 (139) hide show
  1. mns_scheduler/__init__.py +1 -3
  2. mns_scheduler/auto_da_ban/auto_da_ban_service.py +89 -0
  3. mns_scheduler/company_info/clean/__init__.py +1 -1
  4. mns_scheduler/company_info/clean/company_info_clean_api.py +62 -21
  5. mns_scheduler/company_info/common/company_common_query_service.py +45 -0
  6. mns_scheduler/company_info/constant/__init__.py +1 -1
  7. mns_scheduler/company_info/constant/company_constant_data.py +335 -224
  8. mns_scheduler/company_info/de_list_stock/__init__.py +1 -1
  9. mns_scheduler/company_info/de_list_stock/de_list_stock_service.py +1 -1
  10. mns_scheduler/company_info/em_stock_info/sync_em_stock_info_sync.py +134 -0
  11. mns_scheduler/company_info/sync/company_info_set_service.py +208 -0
  12. mns_scheduler/company_info/sync/sync_company_info_task.py +203 -0
  13. mns_scheduler/company_info/task/company_announce_info_task.py +77 -0
  14. mns_scheduler/company_info/task/company_base_info_task.py +64 -0
  15. mns_scheduler/company_info/task/company_business_info_task.py +177 -0
  16. mns_scheduler/company_info/task/company_hold_info_task.py +66 -0
  17. mns_scheduler/company_info/task/company_industry_info_task.py +167 -0
  18. mns_scheduler/company_info/task/company_total_task.py +69 -0
  19. mns_scheduler/concept/clean/kpl_concept_clean_api.py +1 -1
  20. mns_scheduler/concept/clean/ths_concept_clean_api.py +20 -4
  21. mns_scheduler/concept/ths/common/ths_concept_sync_common_api.py +23 -18
  22. mns_scheduler/concept/ths/common/ths_concept_update_common_api.py +4 -1
  23. mns_scheduler/concept/ths/detaill/ths_concept_detail_api.py +7 -7
  24. mns_scheduler/concept/ths/sync_new_index/sync_ths_concept_new_index_api.py +9 -4
  25. mns_scheduler/concept/ths/update_concept_info/sync_one_symbol_all_concepts_api.py +2 -2
  26. mns_scheduler/db/col_move_service.py +3 -3
  27. mns_scheduler/db/script/__init__.py +1 -1
  28. mns_scheduler/db/script/col_move_script.py +1 -1
  29. mns_scheduler/db/script/db_move/__init__.py +7 -0
  30. mns_scheduler/db/script/db_move/col_move_one_service.py +34 -0
  31. mns_scheduler/db/script/sync/__init__.py +1 -1
  32. mns_scheduler/db/script/sync/remote_data_sync_to_local.py +65 -4
  33. mns_scheduler/db/script/sync/sync_hui_ce_test_data.py +80 -0
  34. mns_scheduler/db/script/sync/sync_hui_ce_test_data_01.py +69 -0
  35. mns_scheduler/db/script/update/__init__.py +7 -0
  36. mns_scheduler/db/script/update/update_col_field.py +36 -0
  37. mns_scheduler/finance/__init__.py +1 -1
  38. mns_scheduler/finance/em/__init__.py +7 -0
  39. mns_scheduler/finance/{em_financial_asset_liability_sync_service_api.py → em/em_financial_asset_liability_sync_service_api.py} +2 -2
  40. mns_scheduler/finance/{em_financial_profit_sync_service_api.py → em/em_financial_profit_sync_service_api.py} +27 -26
  41. mns_scheduler/finance/{finance_common_api.py → em/finance_common_api.py} +3 -3
  42. mns_scheduler/finance/{sync_financial_report_service_api.py → sync_financial_report_service_task.py} +80 -27
  43. mns_scheduler/finance/xue_qiu/__init__.py +7 -0
  44. mns_scheduler/finance/xue_qiu/down_load_xueqiu_report_api.py +77 -0
  45. mns_scheduler/finance/xue_qiu/sync_xue_qiu_fiance_data.py +161 -0
  46. mns_scheduler/hk/__init__.py +1 -1
  47. mns_scheduler/hk/hk_company_info_sync_service_api.py +4 -4
  48. mns_scheduler/hk/hk_industry_info_sync_service_api.py +3 -5
  49. mns_scheduler/industry/__init__.py +7 -0
  50. mns_scheduler/industry/ths/__init__.py +7 -0
  51. mns_scheduler/industry/ths/ths_industry_index_service.py +58 -0
  52. mns_scheduler/industry/ths/ths_industry_sync_service.py +68 -0
  53. mns_scheduler/irm/__init__.py +1 -1
  54. mns_scheduler/irm/api/__init__.py +1 -1
  55. mns_scheduler/irm/api/sh_stock_sns_sse_info_api.py +8 -58
  56. mns_scheduler/irm/api/sz_stock_sns_sse_info_api.py +15 -26
  57. mns_scheduler/irm/stock_irm_cninfo_service.py +43 -31
  58. mns_scheduler/irm/stock_question_id_service.py +169 -0
  59. mns_scheduler/k_line/clean/daily/__init__.py +1 -1
  60. mns_scheduler/k_line/clean/daily/daily_k_line_clean_common_service.py +52 -6
  61. mns_scheduler/k_line/clean/daily/daily_k_line_service.py +7 -2
  62. mns_scheduler/k_line/clean/k_line_info_clean_impl.py +3 -2
  63. mns_scheduler/k_line/clean/k_line_info_clean_task.py +42 -15
  64. mns_scheduler/k_line/clean/week_month/__init__.py +1 -1
  65. mns_scheduler/k_line/clean/week_month/normal_week_month_k_line_service.py +124 -26
  66. mns_scheduler/k_line/clean/week_month/sub_new_week_month_k_line_service.py +2 -2
  67. mns_scheduler/k_line/common/__init__.py +7 -0
  68. mns_scheduler/k_line/common/k_line_common_api.py +188 -0
  69. mns_scheduler/k_line/hot_stocks/__init__.py +1 -1
  70. mns_scheduler/k_line/hot_stocks/recent_hot_stocks_clean_service.py +1 -1
  71. mns_scheduler/k_line/{sync → month_week_daily}/bfq_k_line_sync.py +14 -29
  72. mns_scheduler/k_line/{sync → month_week_daily}/daily_week_month_line_sync.py +11 -12
  73. mns_scheduler/k_line/sync_status/__init__.py +7 -0
  74. mns_scheduler/k_line/sync_status/k_line_sync_status_check.py +54 -0
  75. mns_scheduler/k_line/test/__init__.py +1 -1
  76. mns_scheduler/k_line/test/k_line_info_clean_his_data.py +14 -3
  77. mns_scheduler/k_line/year_quarter/__init__.py +7 -0
  78. mns_scheduler/k_line/year_quarter/year_quarter_line_sync.py +76 -0
  79. mns_scheduler/kpl/selection/symbol/sync_best_choose_symbol.py +1 -2
  80. mns_scheduler/kpl/selection/symbol/sync_kpl_concept_symbol_choose_reason_api.py +108 -0
  81. mns_scheduler/kpl/selection/total/sync_kpl_best_total_sync_api.py +5 -0
  82. mns_scheduler/lhb/__init__.py +1 -1
  83. mns_scheduler/lhb/stock_lhb_sync_service.py +1 -1
  84. mns_scheduler/open/__init__.py +1 -1
  85. mns_scheduler/open/sync_one_day_open_data_to_db_service.py +2 -3
  86. mns_scheduler/risk/__init__.py +1 -1
  87. mns_scheduler/risk/compliance/undisclosed_annual_report_api.py +8 -2
  88. mns_scheduler/risk/financial/annual_report_audit_check_api.py +13 -3
  89. mns_scheduler/risk/financial/net_assets_check_api.py +21 -18
  90. mns_scheduler/risk/financial/profit_income_check_api.py +7 -2
  91. mns_scheduler/risk/financial_report_risk_check_api.py +1 -1
  92. mns_scheduler/risk/major_violations/register_and_investigate_stock_sync_api.py +1 -1
  93. mns_scheduler/risk/self/wei_pan_stock_api.py +1 -1
  94. mns_scheduler/risk/test/__init__.py +1 -1
  95. mns_scheduler/risk/test/fix_blask_list.py +4 -6
  96. mns_scheduler/risk/transactions/transactions_check_api.py +22 -4
  97. mns_scheduler/self_choose/__init__.py +1 -1
  98. mns_scheduler/self_choose/ths_self_choose_service.py +99 -43
  99. mns_scheduler/trade/auto_login/trader_auto_service.py +7 -4
  100. mns_scheduler/trade/auto_sell_service_api.py +4 -4
  101. mns_scheduler/trade/balance/__init__.py +7 -0
  102. mns_scheduler/trade/balance/ths_account_balance_service.py +7 -0
  103. mns_scheduler/trade/sync_position_api.py +39 -6
  104. mns_scheduler/trade/task/trader_task_service.py +38 -10
  105. mns_scheduler/trade/tfp/__init__.py +7 -0
  106. mns_scheduler/trade/tfp/stock_tfp_info_sync.py +56 -0
  107. mns_scheduler/zb/stock_zb_pool_sync.py +1 -16
  108. mns_scheduler/zt/high_chg/sync_high_chg_pool_service.py +2 -2
  109. mns_scheduler/zt/high_chg/sync_high_chg_real_time_quotes_service.py +1 -1
  110. mns_scheduler/zt/script/__init__.py +1 -1
  111. mns_scheduler/zt/script/fix_error_deal_day.py +41 -0
  112. mns_scheduler/zt/script/kcx_high_chg_open_his_data_handle.py +2 -2
  113. mns_scheduler/zt/script/sync_high_chg_pool_his_data.py +2 -2
  114. mns_scheduler/zt/script/sync_now_higt_chg_zt.py +8 -7
  115. mns_scheduler/zt/zt_pool/em_zt_pool_sync_api.py +260 -83
  116. mns_scheduler/zt/zt_pool/ths_zt_pool_sync_api.py +33 -90
  117. mns_scheduler/zt/zt_pool/update_null_zt_reason_api.py +27 -13
  118. mns_scheduler/zz_task/compensation/__init__.py +0 -0
  119. mns_scheduler/zz_task/compensation/compensate_task.py +161 -0
  120. mns_scheduler/zz_task/compensation/compensate_task_one_day.py +142 -0
  121. mns_scheduler/zz_task/data_sync_task.py +197 -103
  122. {mns_scheduler-1.1.8.4.dist-info → mns_scheduler-1.4.5.7.dist-info}/METADATA +1 -1
  123. mns_scheduler-1.4.5.7.dist-info/RECORD +176 -0
  124. {mns_scheduler-1.1.8.4.dist-info → mns_scheduler-1.4.5.7.dist-info}/WHEEL +1 -1
  125. mns_scheduler/2014-2015-test/2014_2015_chg_statistics.py +0 -87
  126. mns_scheduler/big_deal/ths_big_deal_sync.py +0 -98
  127. mns_scheduler/company_info/base/sync_company_base_info_api.py +0 -439
  128. mns_scheduler/company_info/base/sync_company_hold_info_api.py +0 -40
  129. mns_scheduler/company_info/remark/company_remark_info_sync.py +0 -46
  130. mns_scheduler/db/real_time_task_check.py +0 -84
  131. mns_scheduler/debt/kzz_bond_info_sync.py +0 -33
  132. mns_scheduler-1.1.8.4.dist-info/RECORD +0 -142
  133. /mns_scheduler/{2014-2015-test → auto_da_ban}/__init__.py +0 -0
  134. /mns_scheduler/company_info/{base → common}/__init__.py +0 -0
  135. /mns_scheduler/{big_deal → company_info/em_stock_info}/__init__.py +0 -0
  136. /mns_scheduler/company_info/{remark → sync}/__init__.py +0 -0
  137. /mns_scheduler/{debt → company_info/task}/__init__.py +0 -0
  138. /mns_scheduler/k_line/{sync → month_week_daily}/__init__.py +0 -0
  139. {mns_scheduler-1.1.8.4.dist-info → mns_scheduler-1.4.5.7.dist-info}/top_level.txt +0 -0
@@ -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,13 @@ 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.constant.db_name_constant as db_name_constant
22
+ import mns_common.component.deal.deal_service_api as deal_service_api
23
+ import mns_common.component.company.company_common_service_new_api as company_common_service_new_api
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
22
26
 
23
27
  '''
24
28
  东方财富涨停池
@@ -28,7 +32,7 @@ mongodb_util = MongodbUtil('27017')
28
32
 
29
33
  ZT_FIELD = ['_id', 'symbol', 'name', 'now_price', 'chg', 'first_closure_time',
30
34
  'last_closure_time', 'connected_boards_numbers',
31
- 'zt_reason', 'closure_funds',
35
+ 'zt_reason', 'zt_analysis', 'closure_funds',
32
36
  # 'closure_funds_per_amount', 'closure_funds_per_flow_mv',
33
37
  'frying_plates_numbers',
34
38
  # 'statistics_detail', 'zt_type', 'market_code',
@@ -39,63 +43,56 @@ ZT_FIELD = ['_id', 'symbol', 'name', 'now_price', 'chg', 'first_closure_time',
39
43
  'third_sw_industry', 'ths_concept_name',
40
44
  'ths_concept_code', 'ths_concept_sync_day', 'em_industry',
41
45
  'mv_circulation_ratio', 'ths_concept_list_info', 'kpl_plate_name',
42
- 'kpl_plate_list_info', 'company_type', 'diff_days', 'symbol', 'amount',
46
+ 'kpl_plate_list_info', 'company_type', 'diff_days', 'amount',
43
47
  'list_date',
44
48
  'exchange', 'flow_mv', 'total_mv',
45
49
  'classification', 'flow_mv_sp', 'total_mv_sp', 'flow_mv_level',
46
- 'amount_level', 'new_stock', 'list_date_01', 'index', 'str_day']
50
+ 'amount_level', 'new_stock', 'list_date_01', 'index', 'str_day', 'main_line', 'sub_main_line']
47
51
 
48
52
 
49
53
  def save_zt_info(str_day):
50
54
  if bool(1 - trade_date_common_service_api.is_trade_day(str_day)):
51
- return None
55
+ return pd.DataFrame()
52
56
 
53
57
  stock_em_zt_pool_df_data = stock_zt_pool_api.stock_em_zt_pool_df(
54
58
  date_handle_util.no_slash_date(str_day))
55
59
 
56
60
  # fix 涨停池没有的股票
57
- stock_em_zt_pool_df_data = sync_miss_zt_data(stock_em_zt_pool_df_data, str_day)
61
+ stock_em_zt_pool_df_data = handle_miss_zt_data(stock_em_zt_pool_df_data.copy(), str_day)
58
62
 
59
- stock_em_zt_pool_df_data = common_service_fun_api.total_mv_classification(stock_em_zt_pool_df_data)
63
+ try:
64
+ # 同花顺问财涨停池
65
+ ths_zt_pool_df_data = ths_stock_zt_pool_v2_api.get_ths_stock_zt_reason_with_cache(str_day)
66
+ except BaseException as e:
67
+ logger.error("使用问财同步ths涨停数据异常:{}", e)
68
+ ths_zt_pool_df_data = pd.DataFrame()
60
69
 
61
- stock_em_zt_pool_df_data = common_service_fun_api.classify_symbol(stock_em_zt_pool_df_data)
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)
62
73
 
63
- stock_em_zt_pool_df_data = common_service_fun_api.symbol_amount_simple(stock_em_zt_pool_df_data)
74
+ stock_em_zt_pool_df_data = common_service_fun_api.total_mv_classification(stock_em_zt_pool_df_data.copy())
64
75
 
65
- stock_em_zt_pool_df_data = company_common_service_api.amendment_industry(stock_em_zt_pool_df_data)
76
+ stock_em_zt_pool_df_data = common_service_fun_api.classify_symbol(stock_em_zt_pool_df_data.copy())
66
77
 
67
- # 上个交易交易日涨停股票
68
- last_trade_day_zt_df = zt_common_service_api.get_last_trade_day_zt(str_day)
78
+ stock_em_zt_pool_df_data = common_service_fun_api.symbol_amount_simple(stock_em_zt_pool_df_data.copy())
69
79
 
70
- try:
71
- # 同花顺问财涨停池
72
- ths_zt_pool_df_data = ths_stock_zt_pool_v2_api.get_ths_stock_zt_reason_with_cache(str_day)
73
-
74
- # del stock_em_zt_pool_df_data['ths_concept_name']
75
- # del stock_em_zt_pool_df_data['ths_concept_code']
76
-
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)
85
-
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)
80
+ stock_em_zt_pool_df_data = company_common_service_api.amendment_industry(stock_em_zt_pool_df_data.copy())
98
81
 
82
+ # 上个交易交易日涨停股票
83
+ last_trade_day_zt_df = zt_common_service_api.get_last_trade_day_zt(str_day)
84
+ # 设置连板
85
+ stock_em_zt_pool_df_data = set_connected_boards_numbers(stock_em_zt_pool_df_data.copy(),
86
+ last_trade_day_zt_df.copy())
87
+
88
+ # 添加主线信息
89
+ stock_em_zt_pool_df_data = main_line_zt_reason_service.merge_main_line_info(str_day,
90
+ stock_em_zt_pool_df_data.copy())
91
+ # 添加涨停原因和分析信息
92
+ stock_em_zt_pool_df_data = main_line_zt_reason_service.merge_zt_reason_info(str_day,
93
+ stock_em_zt_pool_df_data.copy())
94
+
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(
100
97
  lambda x: pd.to_numeric(x, errors="coerce"))
101
98
 
@@ -116,54 +113,80 @@ def save_zt_info(str_day):
116
113
  stock_em_zt_pool_df_data = stock_em_zt_pool_df_data.sort_values(by=['first_closure_time'])
117
114
 
118
115
  # 重置索引,并将排序结果保存到新的"index"列中
119
-
120
116
  stock_em_zt_pool_df_data['str_day'] = str_day
121
117
  stock_em_zt_pool_df_data['_id'] = stock_em_zt_pool_df_data['symbol'] + "_" + str_day
118
+ stock_em_zt_pool_df_data.drop_duplicates('symbol', keep='last', inplace=True)
122
119
 
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')
120
+ query_today_zt = {'str_day': str_day}
121
+ stock_exist_zt_pool_df = mongodb_util.find_query_data(db_name_constant.STOCK_ZT_POOL, query_today_zt)
122
+ if data_frame_util.is_empty(stock_exist_zt_pool_df):
123
+ today_new_zt_pool_df = stock_em_zt_pool_df_data.copy()
127
124
  else:
128
- exist_zt_pool_today_not_nan = exist_zt_pool_today.loc[exist_zt_pool_today['zt_reason'] != '0']
125
+ today_new_zt_pool_df = stock_em_zt_pool_df_data.loc[
126
+ ~stock_em_zt_pool_df_data['symbol'].isin(stock_exist_zt_pool_df['symbol'])]
129
127
 
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')
128
+ mongodb_util.save_mongo(today_new_zt_pool_df, db_name_constant.STOCK_ZT_POOL)
129
+ stock_em_zt_pool_df_data = pd.concat([stock_exist_zt_pool_df, today_new_zt_pool_df])
130
+ # 保存连板股票主线
131
+ save_last_trade_day_main_line(str_day, stock_em_zt_pool_df_data)
132
+
133
+ stock_em_zt_pool_df_data.fillna('', inplace=True)
134
+ stock_em_zt_pool_df_data = stock_em_zt_pool_df_data[ZT_FIELD]
135
135
  return stock_em_zt_pool_df_data
136
136
 
137
137
 
138
138
  # 设置连板数目
139
- 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[
139
+ def set_connected_boards_numbers(stock_em_zt_pool_df_data, last_trade_day_zt_df):
140
+ if data_frame_util.is_empty(stock_em_zt_pool_df_data):
141
+ return stock_em_zt_pool_df_data
142
+ if data_frame_util.is_empty(last_trade_day_zt_df):
143
+ return stock_em_zt_pool_df_data
144
+ # 连板股票
145
+ connected_boards_df_copy = last_trade_day_zt_df.loc[
141
146
  last_trade_day_zt_df['symbol'].isin(stock_em_zt_pool_df_data['symbol'])]
142
147
 
148
+ connected_boards_df = connected_boards_df_copy.copy()
149
+ #
143
150
  connected_boards_df['connected_boards_numbers'] = connected_boards_df['connected_boards_numbers'] + 1
144
151
 
145
- connected_boards_df_one = connected_boards_df.loc[connected_boards_df['symbol'] == symbol]
146
- 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'] = \
148
- list(connected_boards_df_one['connected_boards_numbers'])[0]
149
-
152
+ symbol_mapping_connected_boards_numbers = dict(
153
+ zip(connected_boards_df['symbol'], connected_boards_df['connected_boards_numbers']))
154
+ # 使用map进行替换,不匹配的保持原值
155
+ stock_em_zt_pool_df_data['connected_boards_numbers'] = stock_em_zt_pool_df_data['symbol'].map(
156
+ symbol_mapping_connected_boards_numbers).fillna(1)
150
157
  return stock_em_zt_pool_df_data
151
158
 
152
159
 
153
- def sync_miss_zt_data(stock_em_zt_pool_df_data, str_day):
160
+ def handle_miss_zt_data(stock_em_zt_pool_df_data, str_day):
154
161
  now_date = datetime.now()
155
162
  now_day = now_date.strftime('%Y-%m-%d')
156
163
  if now_day == str_day:
157
- real_time_quotes_all_stocks_df = east_money_stock_api.get_real_time_quotes_all_stocks()
164
+ real_time_quotes_all_stocks_df = em_real_time_quotes_api.get_real_time_quotes_now(None, None)
165
+ if data_frame_util.is_empty(real_time_quotes_all_stocks_df):
166
+ return stock_em_zt_pool_df_data
158
167
  real_time_quotes_all_stocks_df = real_time_quotes_all_stocks_df.loc[
159
168
  (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[~(
169
+ miss_zt_data_df_copy = real_time_quotes_all_stocks_df.loc[~(
161
170
  real_time_quotes_all_stocks_df['symbol'].isin(stock_em_zt_pool_df_data['symbol']))]
171
+ miss_zt_data_df = miss_zt_data_df_copy.copy()
162
172
  if data_frame_util.is_not_empty(miss_zt_data_df):
163
173
  miss_zt_data_df['buy_1_num'] = miss_zt_data_df['buy_1_num'].astype(float)
164
174
  miss_zt_data_df['now_price'] = miss_zt_data_df['now_price'].astype(float)
165
175
  miss_zt_data_df['closure_funds'] = round(miss_zt_data_df['buy_1_num'] * 100 * miss_zt_data_df['now_price'],
166
176
  2)
177
+
178
+ company_info_industry_df = company_common_service_api.get_company_info_name()
179
+ company_info_industry_df = company_info_industry_df.loc[
180
+ company_info_industry_df['_id'].isin(miss_zt_data_df['symbol'])]
181
+
182
+ company_info_industry_df = company_info_industry_df[['_id', 'industry', 'name']]
183
+
184
+ company_info_industry_df = company_info_industry_df.set_index(['_id'], drop=True)
185
+ miss_zt_data_df = miss_zt_data_df.set_index(['symbol'], drop=False)
186
+
187
+ miss_zt_data_df = pd.merge(miss_zt_data_df, company_info_industry_df, how='outer',
188
+ left_index=True, right_index=True)
189
+
167
190
  miss_zt_data_df = miss_zt_data_df[[
168
191
  'symbol',
169
192
  'name',
@@ -186,27 +209,181 @@ def sync_miss_zt_data(stock_em_zt_pool_df_data, str_day):
186
209
 
187
210
  stock_em_zt_pool_df_data = pd.concat([miss_zt_data_df, stock_em_zt_pool_df_data])
188
211
  return stock_em_zt_pool_df_data
212
+ else:
213
+ return stock_em_zt_pool_df_data
214
+
215
+
216
+ def handle_ths_em_diff_data(ths_zt_pool_df_data, stock_em_zt_pool_df_data):
217
+ if data_frame_util.is_empty(ths_zt_pool_df_data):
218
+ return stock_em_zt_pool_df_data
219
+ else:
220
+ diff_ths_zt_df = ths_zt_pool_df_data.loc[
221
+ ~(ths_zt_pool_df_data['symbol'].isin(stock_em_zt_pool_df_data['symbol']))]
222
+ if data_frame_util.is_empty(diff_ths_zt_df):
223
+ return stock_em_zt_pool_df_data
224
+ else:
225
+ diff_ths_zt_df = diff_ths_zt_df[[
226
+ 'symbol',
227
+ 'name',
228
+ 'chg',
229
+ 'now_price',
230
+ # 'amount',
231
+ # 'flow_mv',
232
+ # 'total_mv',
233
+ # 'exchange',
234
+ 'closure_funds',
235
+ 'first_closure_time',
236
+ 'last_closure_time',
237
+ 'frying_plates_numbers',
238
+ 'statistics',
239
+ 'connected_boards_numbers'
240
+
241
+ ]]
242
+
243
+ company_info_df = query_company_info_with_share()
244
+ company_info_df['symbol'] = company_info_df['_id']
245
+ company_info_df = company_info_df.loc[company_info_df['symbol'].isin(list(diff_ths_zt_df['symbol']))]
246
+
247
+ company_info_df = common_service_fun_api.add_after_prefix(company_info_df)
248
+
249
+ symbol_prefix_list = list(company_info_df['symbol_prefix'])
250
+ real_time_quotes_list = deal_service_api.get_qmt_real_time_quotes_detail('qmt',
251
+ symbol_prefix_list)
252
+
253
+ real_time_quotes_df = pd.DataFrame(real_time_quotes_list)
254
+
255
+ real_time_quotes_df['symbol'] = real_time_quotes_df['symbol'].str.slice(0, 6)
256
+ company_info_df = company_info_df.set_index(['symbol'], drop=True)
257
+ real_time_quotes_df = real_time_quotes_df.set_index(['symbol'], drop=False)
258
+
259
+ real_time_quotes_df = pd.merge(company_info_df, real_time_quotes_df, how='outer',
260
+ left_index=True, right_index=True)
261
+
262
+ real_time_quotes_df['amount'] = round(real_time_quotes_df['amount'], 1)
263
+
264
+ real_time_quotes_df['total_mv'] = round(
265
+ real_time_quotes_df['lastPrice'] * real_time_quotes_df['total_share'], 1)
266
+ real_time_quotes_df['flow_mv'] = round(real_time_quotes_df['lastPrice'] * real_time_quotes_df['flow_share'],
267
+ 1)
268
+ real_time_quotes_df['exchange'] = round(
269
+ real_time_quotes_df['amount'] * 100 / real_time_quotes_df['flow_mv'], 1)
270
+
271
+ real_time_quotes_df = real_time_quotes_df[
272
+ ['symbol', 'amount', 'total_mv', 'flow_mv', 'exchange', 'industry']]
273
+
274
+ real_time_quotes_df = real_time_quotes_df.set_index(['symbol'], drop=True)
275
+ diff_ths_zt_df = diff_ths_zt_df.set_index(['symbol'], drop=False)
276
+ diff_ths_zt_df = pd.merge(real_time_quotes_df, diff_ths_zt_df, how='outer',
277
+ left_index=True, right_index=True)
278
+
279
+ diff_ths_zt_df = diff_ths_zt_df[[
280
+ 'symbol',
281
+ 'name',
282
+ 'chg',
283
+ 'now_price',
284
+ 'amount',
285
+ 'flow_mv',
286
+ 'total_mv',
287
+ 'exchange',
288
+ 'closure_funds',
289
+ 'first_closure_time',
290
+ 'last_closure_time',
291
+ 'frying_plates_numbers',
292
+ 'statistics',
293
+ 'connected_boards_numbers',
294
+ 'industry'
295
+
296
+ ]]
297
+
298
+ exist_number = stock_em_zt_pool_df_data.shape[0] + 1
299
+
300
+ diff_ths_zt_df.index = range(exist_number, exist_number + len(diff_ths_zt_df))
301
+ diff_ths_zt_df['index'] = diff_ths_zt_df.index
302
+
303
+ stock_em_zt_pool_df_data = pd.concat([stock_em_zt_pool_df_data, diff_ths_zt_df])
304
+ return stock_em_zt_pool_df_data
305
+
306
+
307
+ def query_company_info_with_share():
308
+ query_field = {"_id": 1,
309
+ "industry": 1,
310
+ "company_type": 1,
311
+ "ths_industry_code": 1,
312
+ "ths_concept_name": 1,
313
+ "ths_concept_code": 1,
314
+ "ths_concept_sync_day": 1,
315
+ "first_sw_industry": 1,
316
+ "second_sw_industry": 1,
317
+ "second_industry_code": 1,
318
+ "third_sw_industry": 1,
319
+ "mv_circulation_ratio": 1,
320
+ "list_date": 1,
321
+ "diff_days": 1,
322
+ 'em_industry': 1,
323
+ 'operate_profit': 1,
324
+ 'total_operate_income': 1,
325
+ "name": 1,
326
+ 'pb': 1,
327
+ 'pe_ttm': 1,
328
+ 'ROE': 1,
329
+ 'ths_industry_name': 1,
330
+ 'total_share': 1,
331
+ 'flow_share': 1
332
+ }
333
+ de_list_company_symbols = company_common_service_new_api.get_de_list_company()
334
+ query_field_key = str(query_field)
335
+ query = {"_id": {"$regex": "^[^48]"},
336
+ 'symbol': {"$nin": de_list_company_symbols}, }
337
+ query_key = str(query)
338
+ company_info_df = company_common_service_new_api.get_company_info_by_field(query_key, query_field_key)
339
+
340
+ return company_info_df
341
+
342
+
343
+ # 异步更新涨停分析和数据
344
+ @async_fun
345
+ def update_zt_reason_analysis(stock_em_zt_pool_df_data, str_day):
346
+ if data_frame_util.is_empty(stock_em_zt_pool_df_data):
347
+ return
348
+ now_date = datetime.now()
349
+ now_str_day = now_date.strftime('%Y-%m-%d')
350
+ if now_str_day != str_day:
351
+ return
352
+
353
+ stock_em_zt_pool_df_data['str_day'] = str_day
354
+ main_line_zt_reason_service.update_symbol_list_zt_reason_analysis(stock_em_zt_pool_df_data, True)
355
+
356
+
357
+ # 保存连板股票主线
358
+ @async_fun
359
+ def save_last_trade_day_main_line(str_day, stock_em_zt_pool_df_data):
360
+ last_trade_day = trade_date_common_service_api.get_last_trade_day(str_day)
361
+ stock_em_zt_pool_connected_df = stock_em_zt_pool_df_data.loc[
362
+ stock_em_zt_pool_df_data['connected_boards_numbers'] > 1]
363
+ if data_frame_util.is_empty(stock_em_zt_pool_connected_df):
364
+ return
365
+ else:
366
+ query = {'str_day': last_trade_day, 'symbol': {"$in": list(stock_em_zt_pool_connected_df['symbol'])}}
367
+ last_trade_day_main_line_detail_df = mongodb_util.find_query_data(db_name_constant.MAIN_LINE_DETAIL, query)
368
+ if data_frame_util.is_empty(last_trade_day_main_line_detail_df):
369
+ return
370
+ else:
371
+ last_trade_day_main_line_detail_df['_id'] = last_trade_day_main_line_detail_df['symbol'] + '_' + str_day
372
+ last_trade_day_main_line_detail_df['str_day'] = str_day
373
+ last_trade_day_main_line_detail_df['connected_boards_numbers'] = last_trade_day_main_line_detail_df[
374
+ 'connected_boards_numbers'] + 1
375
+ now_date = datetime.now()
376
+ str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
377
+ last_trade_day_main_line_detail_df['update_time'] = str_now_date
378
+ today_exist_main_line_df = mongodb_util.find_query_data(db_name_constant.MAIN_LINE_DETAIL,
379
+ {'str_day': str_day})
380
+ if data_frame_util.is_not_empty(today_exist_main_line_df):
381
+ today_new_main_line_df = last_trade_day_main_line_detail_df.loc[
382
+ last_trade_day_main_line_detail_df['symbol'].isin(list(today_exist_main_line_df['symbol']))]
383
+ else:
384
+ today_new_main_line_df = last_trade_day_main_line_detail_df.copy()
385
+ mongodb_util.save_mongo(today_new_main_line_df, db_name_constant.MAIN_LINE_DETAIL)
189
386
 
190
387
 
191
388
  if __name__ == '__main__':
192
- save_zt_info('2024-10-30')
193
- # from datetime import datetime
194
- #
195
- # if __name__ == '__main__':
196
- #
197
- # sync_date = date_handle_util.add_date_day('20240110', 0)
198
- #
199
- # now_date = datetime.now()
200
- #
201
- # str_now_day = sync_date.strftime('%Y-%m-%d')
202
- #
203
- # while now_date > sync_date:
204
- # try:
205
- # save_zt_info(str_now_day)
206
- # sync_date = date_handle_util.add_date_day(date_handle_util.no_slash_date(str_now_day), 1)
207
- # print(str_now_day)
208
- # str_now_day = sync_date.strftime('%Y-%m-%d')
209
- #
210
- # except BaseException as e:
211
- # sync_date = date_handle_util.add_date_day(date_handle_util.no_slash_date(str_now_day), 1)
212
- # str_now_day = sync_date.strftime('%Y-%m-%d')
389
+ save_zt_info('2025-12-26')
@@ -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-11-04'
192
+ ths_zt_pool_df_test = ths_zt_pool(trade_date, None)
193
+ save_ths_zt_pool(ths_zt_pool_df_test, trade_date)