mns-scheduler 1.2.9.6__py3-none-any.whl → 1.4.2.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of mns-scheduler might be problematic. Click here for more details.

Files changed (135) hide show
  1. mns_scheduler/company_info/announce/__init__.py +1 -1
  2. mns_scheduler/company_info/announce/company_announce_sync_service.py +11 -6
  3. mns_scheduler/company_info/base/__init__.py +1 -1
  4. mns_scheduler/company_info/base/sync_company_base_info_api.py +164 -74
  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 +2 -2
  9. mns_scheduler/company_info/constant/__init__.py +1 -1
  10. mns_scheduler/company_info/constant/company_constant_data.py +4 -0
  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 +1 -1
  14. mns_scheduler/company_info/em_stock_info/sync_em_stock_info_sync.py +44 -33
  15. mns_scheduler/company_info/remark/__init__.py +1 -1
  16. mns_scheduler/company_info/remark/company_remark_info_sync.py +1 -1
  17. mns_scheduler/concept/clean/kpl_concept_clean_api.py +1 -1
  18. mns_scheduler/concept/clean/ths_concept_clean_api.py +3 -6
  19. mns_scheduler/db/script/__init__.py +1 -1
  20. mns_scheduler/db/script/col_move_script.py +1 -1
  21. mns_scheduler/db/script/db_move/__init__.py +1 -1
  22. mns_scheduler/db/script/db_move/col_move_one_service.py +1 -1
  23. mns_scheduler/db/script/sync/__init__.py +1 -1
  24. mns_scheduler/db/script/sync/remote_data_sync_to_local.py +39 -9
  25. mns_scheduler/db/script/sync/sync_hui_ce_test_data.py +35 -24
  26. mns_scheduler/db/script/sync/sync_hui_ce_test_data_01.py +23 -23
  27. mns_scheduler/db/script/update/__init__.py +1 -1
  28. mns_scheduler/db/script/update/update_col_field.py +1 -1
  29. mns_scheduler/finance/__init__.py +1 -1
  30. mns_scheduler/finance/{em_financial_asset_liability_sync_service_api.py → em/em_financial_asset_liability_sync_service_api.py} +2 -2
  31. mns_scheduler/finance/{em_financial_profit_sync_service_api.py → em/em_financial_profit_sync_service_api.py} +6 -4
  32. mns_scheduler/finance/{finance_common_api.py → em/finance_common_api.py} +1 -1
  33. mns_scheduler/finance/{sync_financial_report_service_api.py → sync_financial_report_service_task.py} +80 -27
  34. mns_scheduler/finance/xue_qiu/down_load_xueqiu_report_api.py +77 -0
  35. mns_scheduler/finance/xue_qiu/sync_xue_qiu_fiance_data.py +161 -0
  36. mns_scheduler/hk/__init__.py +1 -1
  37. mns_scheduler/hk/hk_company_info_sync_service_api.py +2 -1
  38. mns_scheduler/hk/hk_industry_info_sync_service_api.py +1 -1
  39. mns_scheduler/industry/__init__.py +1 -1
  40. mns_scheduler/industry/ths/__init__.py +1 -1
  41. mns_scheduler/industry/ths/ths_industry_index_service.py +1 -1
  42. mns_scheduler/industry/ths/ths_industry_sync_service.py +1 -1
  43. mns_scheduler/irm/__init__.py +1 -1
  44. mns_scheduler/irm/api/__init__.py +1 -1
  45. mns_scheduler/irm/api/sh_stock_sns_sse_info_api.py +1 -1
  46. mns_scheduler/irm/api/sz_stock_sns_sse_info_api.py +1 -1
  47. mns_scheduler/irm/stock_irm_cninfo_service.py +10 -6
  48. mns_scheduler/k_line/clean/daily/__init__.py +1 -1
  49. mns_scheduler/k_line/clean/daily/daily_k_line_clean_common_service.py +1 -1
  50. mns_scheduler/k_line/clean/daily/daily_k_line_service.py +1 -1
  51. mns_scheduler/k_line/clean/k_line_info_clean_task.py +7 -2
  52. mns_scheduler/k_line/clean/week_month/__init__.py +1 -1
  53. mns_scheduler/k_line/clean/week_month/normal_week_month_k_line_service.py +1 -1
  54. mns_scheduler/k_line/clean/week_month/sub_new_week_month_k_line_service.py +1 -1
  55. mns_scheduler/{extraIncome/one_minute → k_line}/common/__init__.py +1 -1
  56. mns_scheduler/k_line/common/k_line_common_api.py +188 -0
  57. mns_scheduler/k_line/hot_stocks/__init__.py +1 -1
  58. mns_scheduler/k_line/hot_stocks/recent_hot_stocks_clean_service.py +1 -1
  59. mns_scheduler/k_line/month_week_daily/bfq_k_line_sync.py +12 -32
  60. mns_scheduler/k_line/month_week_daily/daily_week_month_line_sync.py +6 -13
  61. mns_scheduler/k_line/sync_status/k_line_sync_status_check.py +54 -0
  62. mns_scheduler/k_line/test/__init__.py +1 -1
  63. mns_scheduler/k_line/test/k_line_info_clean_his_data.py +1 -1
  64. mns_scheduler/k_line/year_quarter/__init__.py +1 -1
  65. mns_scheduler/k_line/year_quarter/year_quarter_line_sync.py +17 -10
  66. mns_scheduler/kpl/selection/symbol/sync_best_choose_symbol.py +1 -2
  67. mns_scheduler/kpl/selection/symbol/sync_kpl_concept_symbol_choose_reason_api.py +108 -0
  68. mns_scheduler/kpl/selection/total/sync_kpl_best_total_sync_api.py +5 -0
  69. mns_scheduler/lhb/__init__.py +1 -1
  70. mns_scheduler/lhb/stock_lhb_sync_service.py +1 -1
  71. mns_scheduler/open/__init__.py +1 -1
  72. mns_scheduler/open/sync_one_day_open_data_to_db_service.py +1 -1
  73. mns_scheduler/risk/__init__.py +1 -1
  74. mns_scheduler/risk/compliance/undisclosed_annual_report_api.py +4 -2
  75. mns_scheduler/risk/financial/annual_report_audit_check_api.py +1 -1
  76. mns_scheduler/risk/financial/profit_income_check_api.py +1 -2
  77. mns_scheduler/risk/financial_report_risk_check_api.py +1 -1
  78. mns_scheduler/risk/major_violations/register_and_investigate_stock_sync_api.py +1 -1
  79. mns_scheduler/risk/self/wei_pan_stock_api.py +1 -1
  80. mns_scheduler/risk/test/__init__.py +1 -1
  81. mns_scheduler/risk/test/fix_blask_list.py +2 -2
  82. mns_scheduler/risk/transactions/transactions_check_api.py +2 -2
  83. mns_scheduler/self_choose/__init__.py +1 -1
  84. mns_scheduler/self_choose/ths_self_choose_service.py +37 -28
  85. mns_scheduler/trade/auto_login/trader_auto_service.py +6 -4
  86. mns_scheduler/trade/auto_sell_service_api.py +2 -2
  87. mns_scheduler/trade/balance/__init__.py +1 -1
  88. mns_scheduler/trade/balance/ths_account_balance_service.py +1 -1
  89. mns_scheduler/trade/sync_position_api.py +1 -1
  90. mns_scheduler/trade/task/trader_task_service.py +26 -9
  91. mns_scheduler/trade/tfp/__init__.py +1 -1
  92. mns_scheduler/trade/tfp/stock_tfp_info_sync.py +5 -2
  93. mns_scheduler/zt/script/__init__.py +1 -1
  94. mns_scheduler/zt/script/fix_error_deal_day.py +1 -1
  95. mns_scheduler/zt/script/kcx_high_chg_open_his_data_handle.py +2 -2
  96. mns_scheduler/zt/script/sync_high_chg_pool_his_data.py +2 -2
  97. mns_scheduler/zt/script/sync_now_higt_chg_zt.py +5 -4
  98. mns_scheduler/zt/zt_pool/em_zt_pool_sync_api.py +44 -17
  99. mns_scheduler/zt/zt_pool/ths_zt_pool_sync_api.py +33 -80
  100. mns_scheduler/zt/zt_pool/update_null_zt_reason_api.py +18 -5
  101. mns_scheduler/zz_task/compensation/__init__.py +0 -0
  102. mns_scheduler/zz_task/compensation/compensate_task.py +161 -0
  103. mns_scheduler/zz_task/compensation/compensate_task_one_day.py +142 -0
  104. mns_scheduler/zz_task/data_sync_task.py +64 -60
  105. {mns_scheduler-1.2.9.6.dist-info → mns_scheduler-1.4.2.5.dist-info}/METADATA +1 -1
  106. mns_scheduler-1.4.2.5.dist-info/RECORD +169 -0
  107. mns_scheduler/big_deal/__init__.py +0 -7
  108. mns_scheduler/big_deal/ths_big_deal_sync.py +0 -98
  109. mns_scheduler/debt/kzz_bond_info_sync.py +0 -33
  110. mns_scheduler/extraIncome/one_minute/common/db_create_index.py +0 -9
  111. mns_scheduler/extraIncome/one_minute/common/symbol_handle_util.py +0 -41
  112. mns_scheduler/extraIncome/one_minute/etf/__init__.py +0 -7
  113. mns_scheduler/extraIncome/one_minute/etf/etf_one_minute_sync_task.py +0 -87
  114. mns_scheduler/extraIncome/one_minute/index/__init__.py +0 -7
  115. mns_scheduler/extraIncome/one_minute/index/main_index_sync_task.py +0 -74
  116. mns_scheduler/extraIncome/one_minute/kzz/__init__.py +0 -7
  117. mns_scheduler/extraIncome/one_minute/kzz/kzz_one_minute_sync_task.py +0 -87
  118. mns_scheduler/extraIncome/one_minute/one_minute_sync_task.py +0 -34
  119. mns_scheduler/extraIncome/one_minute/stock/__init__.py +0 -7
  120. mns_scheduler/extraIncome/one_minute/stock/stock_one_minute_sync_task.py +0 -89
  121. mns_scheduler/extraIncome/temp/__init__.py +0 -7
  122. mns_scheduler/extraIncome/temp/tu_share_data_etf_sync.py +0 -103
  123. mns_scheduler/extraIncome/temp/tu_share_data_kzz_sync.py +0 -113
  124. mns_scheduler/extraIncome/temp/tu_share_data_stock_sync.py +0 -137
  125. mns_scheduler/extraIncome/temp/tu_share_zhi_shu_sync_api.py +0 -107
  126. mns_scheduler/us/__init__.py +0 -7
  127. mns_scheduler/us/baidu_yun_pan_handle_service.py +0 -131
  128. mns_scheduler/us/k_line.py +0 -91
  129. mns_scheduler/us/us_company_info_sync_service_api.py +0 -39
  130. mns_scheduler-1.2.9.6.dist-info/RECORD +0 -183
  131. /mns_scheduler/{debt → finance/em}/__init__.py +0 -0
  132. /mns_scheduler/{extraIncome → finance/xue_qiu}/__init__.py +0 -0
  133. /mns_scheduler/{extraIncome/one_minute → k_line/sync_status}/__init__.py +0 -0
  134. {mns_scheduler-1.2.9.6.dist-info → mns_scheduler-1.4.2.5.dist-info}/WHEEL +0 -0
  135. {mns_scheduler-1.2.9.6.dist-info → mns_scheduler-1.4.2.5.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,188 @@
1
+ import sys
2
+ import os
3
+
4
+ import pandas as pd
5
+
6
+ file_path = os.path.abspath(__file__)
7
+ end = file_path.index('mns') + 16
8
+ project_path = file_path[0:end]
9
+ sys.path.append(project_path)
10
+ import mns_common.api.akshare.k_line_api as k_line_api
11
+ import mns_common.utils.date_handle_util as date_handle_util
12
+ import mns_common.api.xueqiu.xue_qiu_k_line_api as xue_qiu_k_line_api
13
+ import mns_common.component.cookie.cookie_info_service as cookie_info_service
14
+ import mns_common.component.common_service_fun_api as common_service_fun_api
15
+ from datetime import datetime, timedelta
16
+ import mns_common.api.msg.push_msg_api as push_msg_api
17
+ import numpy as np
18
+ import mns_common.utils.data_frame_util as data_frame_util
19
+ from loguru import logger
20
+ import threading
21
+
22
+ # source_type = 'xue_qiu'
23
+ source_type = 'xue_qiu'
24
+ error_no = 1
25
+
26
+
27
+ # 自定义报警处理函数
28
+ def custom_alert(current: int, threshold: int):
29
+ push_msg_api.push_msg_to_wechat('获取k线数据异常', "当前次数:" + str(current) + "阈值:" + str(threshold))
30
+
31
+
32
+ # 定义一个带超时的函数调用
33
+ def call_with_timeout(func, *args, timeout=10, **kwargs):
34
+ # 用于存储函数执行结果
35
+ result = None
36
+ exception = None
37
+
38
+ # 定义一个线程目标函数
39
+ def target():
40
+ nonlocal result, exception
41
+ try:
42
+ result = func(*args, **kwargs)
43
+ except Exception as e:
44
+ exception = e
45
+
46
+ # 创建线程并启动
47
+ thread = threading.Thread(target=target)
48
+ thread.start()
49
+
50
+ # 等待线程完成,最多等待 timeout 秒
51
+ thread.join(timeout)
52
+
53
+ # 如果线程仍然存活,说明函数超时了
54
+ if thread.is_alive():
55
+ raise TimeoutError(f"Function exceeded timeout of {timeout} seconds")
56
+
57
+ # 如果函数抛出了异常,重新抛出
58
+ if exception is not None:
59
+ raise exception
60
+ return result
61
+
62
+
63
+ def get_k_line_common_adapter(symbol, period, hq, end_date):
64
+ global error_no
65
+ df = pd.DataFrame()
66
+ try:
67
+ if source_type == 'em':
68
+
69
+ df = call_with_timeout(get_em_k_line_api,
70
+ symbol,
71
+ period,
72
+ hq,
73
+ end_date,
74
+ timeout=10)
75
+ elif source_type == 'xue_qiu':
76
+ df = call_with_timeout(get_xueqiu_k_line_api,
77
+ symbol,
78
+ period,
79
+ hq,
80
+ end_date,
81
+ timeout=10)
82
+
83
+ if data_frame_util.is_empty(df):
84
+ error_no = error_no + 1
85
+ except BaseException as e:
86
+ logger.error("获取k线异常:{}", e)
87
+ error_no = error_no + 1
88
+ if error_no == 1000:
89
+ push_msg_api.push_msg_to_wechat('获取k线数据异常', "当前次数:" + str(error_no))
90
+ return df
91
+
92
+
93
+ # 应用带参数的装饰器
94
+ # @exception_counter(
95
+ # threshold=1500,
96
+ # alert_handler=custom_alert,
97
+ # auto_reset=False
98
+ # )
99
+ def get_em_k_line_api(symbol, period, hq, end_date):
100
+ # 检查symbol是否以'6'开头
101
+ if symbol.startswith('6'):
102
+ symbol_a = '1.' + symbol
103
+ else:
104
+ symbol_a = '0.' + symbol
105
+ stock_hfq_df = k_line_api.stock_zh_a_hist(symbol=symbol_a,
106
+ period=period,
107
+ start_date=date_handle_util.no_slash_date('1990-12-19'),
108
+ end_date=date_handle_util.no_slash_date(end_date),
109
+ adjust=hq)
110
+
111
+ stock_hfq_df.rename(columns={"日期": "date", "开盘": "open",
112
+ "收盘": "close", "最高": "high",
113
+ "最低": "low", "成交量": "volume",
114
+ "成交额": "amount", "振幅": "pct_chg",
115
+ "涨跌幅": "chg", "涨跌额": "change",
116
+ "换手率": "exchange"}, inplace=True)
117
+ stock_hfq_df['symbol'] = symbol
118
+ stock_hfq_df['_id'] = symbol + '-' + stock_hfq_df['date']
119
+ return stock_hfq_df
120
+
121
+
122
+ # period : year quarter month week day
123
+ # hq: qfq:before ,hfq:after, bfq:normal
124
+
125
+ def get_xueqiu_k_line_api(symbol, period, hq, end_date):
126
+ if hq == 'qfq':
127
+ adjust = 'before'
128
+ elif hq == 'hfq':
129
+ adjust = 'after'
130
+ else:
131
+ adjust = 'normal'
132
+
133
+ period_time = 'day'
134
+ if period == 'daily':
135
+ period_time = 'day'
136
+ elif period == 'weekly':
137
+ period_time = 'week'
138
+ elif period == 'monthly':
139
+ period_time = 'month'
140
+
141
+ cookie = cookie_info_service.get_xue_qiu_cookie()
142
+ symbol_pre_fix = common_service_fun_api.add_pre_prefix_one(symbol)
143
+ dt = datetime.strptime(end_date, '%Y-%m-%d')
144
+ dt += timedelta(days=1)
145
+ timestamp = str(int(dt.timestamp() * 1000)) # 转换为毫秒
146
+ stock_k_line_df = xue_qiu_k_line_api.get_xue_qiu_k_line(symbol_pre_fix, period_time,
147
+ cookie, timestamp, adjust)
148
+
149
+ stock_k_line_df['pct_chg'] = round(abs(stock_k_line_df['high'] - stock_k_line_df['low'] / stock_k_line_df['high']),
150
+ 2)
151
+ stock_k_line_df.rename(columns={"chg": "change",
152
+ "percent": "chg",
153
+ "str_day": "date",
154
+ "market_capital": "flow_mv",
155
+ "turnoverrate": "exchange"}, inplace=True)
156
+ stock_k_line_df = stock_k_line_df[[
157
+ "date",
158
+ "open",
159
+ "close",
160
+ "high",
161
+ "low",
162
+ "volume",
163
+ "amount",
164
+ "pct_chg",
165
+ "chg",
166
+ "change",
167
+ "exchange"
168
+ ]]
169
+ stock_k_line_df['symbol'] = symbol
170
+ stock_k_line_df['date'] = stock_k_line_df['date'].str.replace('-', '')
171
+ stock_k_line_df['_id'] = symbol + '-' + stock_k_line_df['date']
172
+ stock_k_line_df['last_price'] = round(((stock_k_line_df['close']) / (1 + stock_k_line_df['chg'] / 100)), 2)
173
+ stock_k_line_df['max_chg'] = round(
174
+ ((stock_k_line_df['high'] - stock_k_line_df['last_price']) / stock_k_line_df['last_price']) * 100, 2)
175
+ stock_k_line_df['amount_level'] = round((stock_k_line_df['amount'] / common_service_fun_api.HUNDRED_MILLION), 2)
176
+ stock_k_line_df['flow_mv'] = round(stock_k_line_df['amount'] * 100 / stock_k_line_df['exchange'], 2)
177
+ stock_k_line_df['flow_mv_sp'] = round(stock_k_line_df['flow_mv'] / common_service_fun_api.HUNDRED_MILLION, 2)
178
+
179
+ stock_k_line_df.replace([np.inf, -np.inf], 0, inplace=True)
180
+ stock_k_line_df.fillna(0, inplace=True)
181
+ stock_k_line_df['date'] = stock_k_line_df['date'].astype(str).str[:8]
182
+ return stock_k_line_df
183
+
184
+
185
+ if __name__ == '__main__':
186
+ while True:
187
+ test_df = get_k_line_common_adapter('000001', 'day', 'qfq', '2025-05-25')
188
+ print(test_df)
@@ -2,6 +2,6 @@ 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)
@@ -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
 
@@ -9,44 +9,24 @@ sys.path.append(project_path)
9
9
  from loguru import logger
10
10
  import mns_common.component.em.em_stock_info_api as em_stock_info_api
11
11
  from mns_common.db.MongodbUtil import MongodbUtil
12
- import mns_common.utils.date_handle_util as date_handle_util
13
12
  import mns_common.component.common_service_fun_api as common_service_fun_api
14
- import mns_common.api.akshare.k_line_api as k_line_api
13
+ import mns_scheduler.k_line.common.k_line_common_api as k_line_common_api
15
14
  import mns_common.component.company.company_common_service_new_api as company_common_service_new_api
16
15
 
16
+
17
+
17
18
  mongodb_util = MongodbUtil('27017')
18
19
 
19
20
 
20
21
  def sync_bfq_k_line_data(period='daily',
21
22
  hq='hfq',
22
23
  hq_col='stock_hfq_daily',
23
- end_date='22220101',
24
+ end_date='2222-01-01',
24
25
  symbol=None):
25
- # 检查symbol是否以'6'开头
26
- if symbol.startswith('6'):
27
- symbol_a = '1.' + symbol
28
- else:
29
- symbol_a = '0.' + symbol
30
- stock_hfq_df = k_line_api.stock_zh_a_hist(symbol=symbol_a, period=period,
31
- start_date=date_handle_util.no_slash_date('1990-12-19'),
32
- end_date=date_handle_util.no_slash_date(end_date),
33
- adjust=hq)
34
-
35
- stock_hfq_df.rename(columns={"日期": "date", "开盘": "open",
36
- "收盘": "close", "最高": "high",
37
- "最低": "low", "成交量": "volume",
38
- "成交额": "amount", "振幅": "pct_chg",
39
- "涨跌幅": "chg", "涨跌额": "change",
40
- "换手率": "exchange"}, inplace=True)
41
-
42
- stock_hfq_df['symbol'] = symbol
43
- stock_hfq_df['_id'] = stock_hfq_df['symbol'] + '-' + stock_hfq_df['date']
44
- stock_hfq_df['last_price'] = round(((stock_hfq_df['close']) / (1 + stock_hfq_df['chg'] / 100)), 2)
45
- stock_hfq_df['max_chg'] = round(
46
- ((stock_hfq_df['high'] - stock_hfq_df['last_price']) / stock_hfq_df['last_price']) * 100, 2)
47
- stock_hfq_df['amount_level'] = round((stock_hfq_df['amount'] / common_service_fun_api.HUNDRED_MILLION), 2)
48
- stock_hfq_df['flow_mv'] = round(stock_hfq_df['amount'] * 100 / stock_hfq_df['exchange'], 2)
49
- stock_hfq_df['flow_mv_sp'] = round(stock_hfq_df['flow_mv'] / common_service_fun_api.HUNDRED_MILLION, 2)
26
+
27
+ stock_hfq_df = k_line_common_api.get_k_line_common_adapter(symbol, period, hq, end_date)
28
+
29
+
50
30
 
51
31
  classification = common_service_fun_api.classify_symbol_one(symbol)
52
32
  stock_hfq_df['classification'] = classification
@@ -60,7 +40,7 @@ def sync_all_bfq_k_line(period='daily',
60
40
  hq='hfq',
61
41
  hq_col='stock_hfq_daily',
62
42
  end_date='22220101',
63
- symbol=None):
43
+ symbol='300085'):
64
44
  real_time_quotes_now_es = em_stock_info_api.get_a_stock_info()
65
45
 
66
46
  symbol_list = list(real_time_quotes_now_es['symbol'])
@@ -91,7 +71,7 @@ def insert_data(stock_hfq_df, hq_col, symbol):
91
71
 
92
72
  if __name__ == '__main__':
93
73
  sync_all_bfq_k_line('daily',
94
- '',
74
+ 'qfq',
95
75
  'stock_bfq_daily',
96
- None,
97
- None)
76
+ '2025-05-25',
77
+ '000001')
@@ -9,11 +9,9 @@ sys.path.append(project_path)
9
9
  from loguru import logger
10
10
  import mns_common.component.em.em_stock_info_api as em_stock_info_api
11
11
  from mns_common.db.MongodbUtil import MongodbUtil
12
- import mns_common.utils.date_handle_util as date_handle_util
13
12
  import mns_common.component.common_service_fun_api as common_service_fun_api
14
- import mns_common.api.akshare.k_line_api as k_line_api
15
13
  import mns_scheduler.k_line.clean.daily.daily_k_line_clean_common_service as daily_k_line_clean_common_service
16
-
14
+ import mns_scheduler.k_line.common.k_line_common_api as k_line_common_api
17
15
  mongodb_util = MongodbUtil('27017')
18
16
 
19
17
 
@@ -21,14 +19,9 @@ mongodb_util = MongodbUtil('27017')
21
19
 
22
20
  def save_one_symbol(symbol, period, end_date, hq, hq_col, real_time_quotes_now):
23
21
  # 检查symbol是否以'6'开头
24
- if symbol.startswith('6'):
25
- symbol_a = '1.' + symbol
26
- else:
27
- symbol_a = '0.' + symbol
28
- stock_hfq_df = k_line_api.stock_zh_a_hist(symbol=symbol_a, period=period,
29
- start_date=date_handle_util.no_slash_date('1990-12-19'),
30
- end_date=date_handle_util.no_slash_date(end_date),
31
- adjust=hq)
22
+
23
+ stock_hfq_df = k_line_common_api.get_k_line_common_adapter(symbol, period, hq, end_date)
24
+
32
25
  real_time_quotes_now_one = real_time_quotes_now.loc[real_time_quotes_now['symbol'] == symbol]
33
26
  stock_hfq_df.rename(columns={"日期": "date", "开盘": "open",
34
27
  "收盘": "close", "最高": "high",
@@ -110,10 +103,10 @@ def create_db_index(db_name):
110
103
 
111
104
 
112
105
  if __name__ == '__main__':
113
- sync_all_daily_data('monthly', 'qfq', 'stock_qfq_monthly', None, None)
106
+ # sync_all_daily_data('monthly', 'qfq', 'stock_qfq_monthly', None, None)
114
107
  # sync_all_daily_data('daily', 'qfq', 'stock_qfq_daily', None, None)
115
108
  # sync_all_daily_data('daily', 'qfq', 'stock_qfq_weekly', None, None)
116
- # sync_all_daily_data('weekly', 'qfq', 'stock_qfq_weekly', None, None)
109
+ sync_all_daily_data('weekly', 'qfq', 'stock_qfq_weekly', '2025-07-19', None)
117
110
  # sync_all_daily_data('monthly', 'qfq', 'stock_qfq_monthly', None, None)
118
111
 
119
112
  # sync_all_daily_data('monthly', '1990-12-19', 'qfq', 'stock_qfq_monthly', None, None)
@@ -0,0 +1,54 @@
1
+ import sys
2
+ import os
3
+
4
+ file_path = os.path.abspath(__file__)
5
+ end = file_path.index('mns') + 16
6
+ project_path = file_path[0:end]
7
+ sys.path.append(project_path)
8
+ from datetime import datetime
9
+ import mns_common.component.trade_date.trade_date_common_service_api as trade_date_common_service_api
10
+ from mns_common.db.MongodbUtil import MongodbUtil
11
+ import mns_common.constant.db_name_constant as db_name_constant
12
+ import mns_common.utils.date_handle_util as date_handle_util
13
+ import mns_common.api.msg.push_msg_api as push_msg_api
14
+
15
+ mongodb_util = MongodbUtil('27017')
16
+
17
+ min_k_line_count = 5200
18
+
19
+
20
+ # check下一个交易日k线同步状态
21
+ def check_k_line_sync_count():
22
+ now_date = datetime.now()
23
+ str_day = now_date.strftime('%Y-%m-%d')
24
+ hour = now_date.hour
25
+ # 是否是交易日
26
+ if trade_date_common_service_api.is_trade_day(str_day):
27
+ if hour > 15:
28
+ qfq_day = str_day
29
+ k_line_day = trade_date_common_service_api.get_further_trade_date(str_day, 2)
30
+ else:
31
+ qfq_day = trade_date_common_service_api.get_last_trade_day(str_day)
32
+ k_line_day = str_day
33
+ else:
34
+ qfq_day = trade_date_common_service_api.get_last_trade_day(str_day)
35
+ k_line_day = trade_date_common_service_api.get_further_trade_date(str_day, 1)
36
+
37
+ # check 当日k线同步状态
38
+ query_qfq = {'date': date_handle_util.no_slash_date(qfq_day)}
39
+ qfq_k_line_count = mongodb_util.count(query_qfq, db_name_constant.STOCK_QFQ_DAILY)
40
+ if qfq_k_line_count < min_k_line_count:
41
+ title = '当日k线同步数量不对'
42
+ msg = '当日k线同步数量不对,当前k线数量:' + str(qfq_k_line_count)
43
+ push_msg_api.push_msg_to_wechat(title, msg)
44
+
45
+ query_last_trade = {'str_day': k_line_day}
46
+ last_trade_day_k_line_count = mongodb_util.count(query_last_trade, 'k_line_info')
47
+ if last_trade_day_k_line_count < min_k_line_count:
48
+ title = '下一个交易日策略k线数量不对'
49
+ msg = '下一个交易日策略k线数量不对,当前数量:' + str(last_trade_day_k_line_count)
50
+ push_msg_api.push_msg_to_wechat(title, msg)
51
+
52
+
53
+ if __name__ == '__main__':
54
+ check_k_line_sync_count()
@@ -2,6 +2,6 @@ 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)
@@ -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
  from mns_common.db.MongodbUtil import MongodbUtil
@@ -2,6 +2,6 @@ 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)
@@ -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
 
@@ -12,27 +12,34 @@ from mns_common.db.MongodbUtil import MongodbUtil
12
12
  import mns_common.component.common_service_fun_api as common_service_fun_api
13
13
  import mns_common.constant.db_name_constant as db_name_constant
14
14
  import mns_common.api.xueqiu.xue_qiu_k_line_api as xue_qiu_k_line_api
15
+ import mns_common.component.cookie.cookie_info_service as cookie_info_service
16
+ from datetime import datetime
17
+ import mns_common.utils.data_frame_util as data_frame_util
15
18
 
16
19
  mongodb_util = MongodbUtil('27017')
17
20
 
18
21
 
19
22
  def sync_year_k_line():
20
- global symbol_prefix
23
+ timestamp = str(int(datetime.now().timestamp() * 1000))
24
+
21
25
  col_name = db_name_constant.STOCK_QFQ_YEAR
22
26
  real_time_quotes_all_stocks_df = em_stock_info_api.get_a_stock_info()
23
27
  real_time_quotes_all_stocks_df = common_service_fun_api.classify_symbol(real_time_quotes_all_stocks_df)
28
+ real_time_quotes_all_stocks_df = common_service_fun_api.add_pre_prefix(real_time_quotes_all_stocks_df)
24
29
  for stock_one in real_time_quotes_all_stocks_df.itertuples():
25
30
  symbol = stock_one.symbol
26
31
  try:
27
- classification = stock_one.classification
28
- if classification in ['H', 'K']:
29
- symbol_prefix = 'SH' + symbol
30
- elif classification in ['S', 'C']:
31
- symbol_prefix = 'SZ' + symbol
32
- elif classification in ['X']:
33
- symbol_prefix = 'BJ' + symbol
32
+ symbol_prefix = stock_one.symbol_prefix
33
+
34
+ year_k_line_df_copy = xue_qiu_k_line_api.get_xue_qiu_k_line(symbol_prefix, 'year',
35
+ cookie_info_service.get_xue_qiu_cookie(),
36
+ timestamp,
37
+ 'before')
38
+ if data_frame_util.is_empty(year_k_line_df_copy):
39
+ logger.warning("返回数据为空:{}", symbol)
40
+ continue
34
41
 
35
- year_k_line_df = xue_qiu_k_line_api.get_xue_qiu_k_line(symbol_prefix, 'year')
42
+ year_k_line_df = year_k_line_df_copy.copy()
36
43
  year_k_line_df = year_k_line_df[[
37
44
  'volume',
38
45
  'open',
@@ -3,10 +3,8 @@ import os
3
3
 
4
4
  import mns_common.api.kpl.selection.kpl_selection_plate_api as selection_plate_api
5
5
  from mns_common.db.MongodbUtil import MongodbUtil
6
- from loguru import logger
7
6
  from datetime import datetime
8
7
  import mns_common.utils.data_frame_util as data_frame_util
9
- import pandas as pd
10
8
 
11
9
  file_path = os.path.abspath(__file__)
12
10
  end = file_path.index('mns') + 17
@@ -124,6 +122,7 @@ def save_one_plate_detail_data(plate_code, plate_name, index_class, first_plate_
124
122
  new_df['grade'] = 1
125
123
  new_df['remark'] = ''
126
124
  new_df['remark_flag'] = ''
125
+ new_df['long'] = ''
127
126
  mongodb_util.insert_mongo(new_df, 'kpl_best_choose_index_detail')
128
127
 
129
128
  # 保存到当日新增概念列表
@@ -0,0 +1,108 @@
1
+ import sys
2
+ import os
3
+
4
+ file_path = os.path.abspath(__file__)
5
+ end = file_path.index('mns') + 16
6
+ project_path = file_path[0:end]
7
+ sys.path.append(project_path)
8
+
9
+ import mns_common.constant.db_name_constant as db_name_constant
10
+ from mns_common.db.MongodbUtil import MongodbUtil
11
+ import mns_common.utils.data_frame_util as data_frame_util
12
+ import mns_common.api.kpl.common.kpl_common_api as kpl_common_api
13
+ from loguru import logger
14
+ from datetime import datetime, timedelta
15
+ import pandas as pd
16
+
17
+ mongodb_util = MongodbUtil('27017')
18
+
19
+
20
+ # 更新所有概念入选原因
21
+ def update_all_kpl_symbol_choose_reason():
22
+ kpl_best_choose_index_df = mongodb_util.find_query_data(db_name_constant.KPL_BEST_CHOOSE_INDEX, {})
23
+ for concept_one in kpl_best_choose_index_df.itertuples():
24
+ try:
25
+ concept_code = concept_one.plate_code
26
+ kpl_best_choose_index_detail_df = mongodb_util.find_query_data(
27
+ db_name_constant.KPL_BEST_CHOOSE_INDEX_DETAIL, {"plate_code": concept_code})
28
+ if data_frame_util.is_not_empty(kpl_best_choose_index_detail_df):
29
+ kpl_symbol_list = list(kpl_best_choose_index_detail_df['symbol'])
30
+ symbol_str = ','.join(kpl_symbol_list)
31
+ choose_reason_df = kpl_common_api.get_kpl_concept_choose_reason(concept_code, symbol_str)
32
+ if data_frame_util.is_not_empty(choose_reason_df):
33
+ for choose_reason_one in choose_reason_df.itertuples():
34
+ symbol = choose_reason_one.symbol
35
+ try:
36
+
37
+ choose_reason = choose_reason_one.choose_reason
38
+ update_query = {'symbol': symbol, 'plate_code': concept_code}
39
+ new_values = {"$set": {"long": choose_reason}}
40
+ mongodb_util.update_many(update_query, new_values,
41
+ db_name_constant.KPL_BEST_CHOOSE_INDEX_DETAIL)
42
+ except BaseException as e:
43
+ logger.error("更新开票啦入选原因异常:{},{},{}", symbol, concept_code, e)
44
+ logger.info("更新开票啦入选原因完成:{},{}", concept_one.plate_code, concept_one.plate_name)
45
+ except BaseException as e:
46
+ logger.error("更新开票啦入选原因异常:{},{},{}", concept_one.plate_code, concept_one.plate_name, e)
47
+
48
+
49
+ # 更新入选概念原因
50
+ def update_symbol_new_concept_reason(plate_code, kpl_symbol_list):
51
+ symbol_str = ','.join(kpl_symbol_list)
52
+ choose_reason_df = kpl_common_api.get_kpl_concept_choose_reason(plate_code, symbol_str)
53
+ if data_frame_util.is_not_empty(choose_reason_df):
54
+ choose_reason_df = choose_reason_df[choose_reason_df['choose_reason'] != '']
55
+ if data_frame_util.is_empty(choose_reason_df):
56
+ return
57
+ for choose_reason_one in choose_reason_df.itertuples():
58
+ symbol = choose_reason_one.symbol
59
+ try:
60
+
61
+ choose_reason = choose_reason_one.choose_reason
62
+ update_query = {'symbol': symbol, 'plate_code': plate_code}
63
+ new_values = {"$set": {"long": choose_reason}}
64
+ mongodb_util.update_many(update_query, new_values,
65
+ db_name_constant.KPL_BEST_CHOOSE_INDEX_DETAIL)
66
+ # 更新今日新增概念列表 入选原因
67
+ mongodb_util.update_many(update_query, new_values,
68
+ db_name_constant.TODAY_NEW_CONCEPT_LIST)
69
+ except BaseException as e:
70
+ logger.error("更新开票啦入选原因异常:{},{},{}", symbol, plate_code, e)
71
+
72
+
73
+ def update_null_choose_reason():
74
+ # 获取当前日期时间
75
+ now = datetime.now()
76
+
77
+ # 计算前15天的日期时间
78
+ days_ago_15 = now - timedelta(days=30)
79
+
80
+ # 按指定格式输出
81
+ formatted_date = days_ago_15.strftime("%Y-%m-%d %H:%M:%S")
82
+ query = {"create_time": {"$gte": formatted_date}, '$or': [{"long": {"$exists": False}}, {"long": ''}]}
83
+ null_choose_reason_detail_df = mongodb_util.find_query_data(db_name_constant.KPL_BEST_CHOOSE_INDEX_DETAIL, query)
84
+ if data_frame_util.is_not_empty(null_choose_reason_detail_df):
85
+ grouped_null_reason_df = null_choose_reason_detail_df.groupby('plate_code')
86
+ grouped_null_reason_list = grouped_null_reason_df.size()
87
+ group_null_reason = pd.DataFrame(grouped_null_reason_list, columns=['number'])
88
+ group_null_reason['plate_code'] = group_null_reason.index
89
+ group_null_reason = group_null_reason.sort_values(by=['number'], ascending=False)
90
+ for null_reason_one in group_null_reason.itertuples():
91
+ plate_code = null_reason_one.plate_code
92
+ try:
93
+
94
+ null_reason_one_plate_df = null_choose_reason_detail_df.loc[
95
+ null_choose_reason_detail_df['plate_code'] == plate_code]
96
+ kpl_symbol_list = list(null_reason_one_plate_df['symbol'])
97
+ update_symbol_new_concept_reason(plate_code, kpl_symbol_list)
98
+ logger.info("更新开票啦入选原因完成:{},{}", null_reason_one.plate_code,
99
+ list(null_reason_one_plate_df['plate_name'])[0])
100
+ except BaseException as e:
101
+ logger.error("更新kpl入选原因异常:{},{}", null_reason_one.plate_code, e)
102
+
103
+ return formatted_date
104
+
105
+
106
+ if __name__ == '__main__':
107
+ update_null_choose_reason()
108
+ # update_all_kpl_symbol_choose_reason()
@@ -10,6 +10,7 @@ import mns_scheduler.kpl.selection.symbol.sync_best_choose_symbol as sync_best_c
10
10
  import threading
11
11
  import mns_common.constant.db_name_constant as db_name_constant
12
12
  import mns_common.api.kpl.constant.kpl_constant as kpl_constant
13
+ import mns_scheduler.kpl.selection.symbol.sync_kpl_concept_symbol_choose_reason_api as sync_kpl_concept_symbol_choose_reason_api
13
14
 
14
15
  file_path = os.path.abspath(__file__)
15
16
  end = file_path.index('mns') + 17
@@ -84,6 +85,10 @@ def sync_all_plate_info():
84
85
  update_null_name()
85
86
  logger.info("更新开盘啦空名字名称")
86
87
 
88
+ # 更新开盘啦入选原因
89
+ sync_kpl_concept_symbol_choose_reason_api.update_null_choose_reason()
90
+ logger.info("更新开盘啦入选原因")
91
+
87
92
 
88
93
  # 更新一二级关系
89
94
  def update_best_choose_plate_relation():
@@ -2,6 +2,6 @@ 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)
@@ -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
 
@@ -2,6 +2,6 @@ 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)
@@ -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
  # 同步当天所有开盘数据
@@ -2,6 +2,6 @@ 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)