mns-scheduler 1.3.5.1__py3-none-any.whl → 1.3.5.3__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.

@@ -0,0 +1,7 @@
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)
@@ -7,7 +7,7 @@ project_path = file_path[0:end]
7
7
  sys.path.append(project_path)
8
8
  import akshare as ak
9
9
  from mns_common.db.MongodbUtil import MongodbUtil
10
- import mns_scheduler.finance.finance_common_api as finance_common_api
10
+ import mns_scheduler.finance.em.finance_common_api as finance_common_api
11
11
  import mns_common.constant.db_name_constant as db_name_constant
12
12
 
13
13
  mongodb_util = MongodbUtil('27017')
@@ -1,6 +1,8 @@
1
1
  import sys
2
2
  import os
3
3
 
4
+ import pandas as pd
5
+
4
6
  file_path = os.path.abspath(__file__)
5
7
  end = file_path.index('mns') + 17
6
8
  project_path = file_path[0:end]
@@ -12,7 +14,7 @@ import mns_common.utils.data_frame_util as data_frame_util
12
14
 
13
15
  mongodb_util = MongodbUtil('27017')
14
16
  import mns_common.constant.db_name_constant as db_name_constant
15
- import mns_scheduler.finance.finance_common_api as finance_common_api
17
+ import mns_scheduler.finance.em.finance_common_api as finance_common_api
16
18
  from loguru import logger
17
19
 
18
20
 
@@ -293,7 +295,7 @@ def get_em_profit_api(symbol):
293
295
  else:
294
296
  new_profit_df = stock_profit_sheet_by_report_em
295
297
  if data_frame_util.is_empty(new_profit_df):
296
- return None
298
+ return pd.DataFrame()
297
299
  new_profit_df = new_profit_df.fillna(0)
298
300
  return new_profit_df
299
301
 
@@ -341,7 +343,7 @@ def check_columns(profit_df):
341
343
  import mns_common.component.em.em_stock_info_api as em_stock_info_api
342
344
 
343
345
  if __name__ == '__main__':
344
- get_em_profit_api('002193')
346
+ get_em_profit_api('688302')
345
347
  em_df = em_stock_info_api.get_a_stock_info()
346
348
  for em_one in em_df.itertuples():
347
349
  try:
@@ -8,15 +8,16 @@ sys.path.append(project_path)
8
8
  from datetime import datetime
9
9
 
10
10
  import mns_common.constant.db_name_constant as db_name_constant
11
- import mns_scheduler.finance.em_financial_profit_sync_service_api as em_financial_profit_sync_service_api
11
+ import mns_scheduler.finance.em.em_financial_profit_sync_service_api as em_financial_profit_sync_service_api
12
12
  from mns_common.db.MongodbUtil import MongodbUtil
13
13
  from loguru import logger
14
14
  import \
15
- mns_scheduler.finance.em_financial_asset_liability_sync_service_api as em_financial_asset_liability_sync_service_api
15
+ mns_scheduler.finance.em.em_financial_asset_liability_sync_service_api as em_financial_asset_liability_sync_service_api
16
16
  import mns_scheduler.risk.financial_report_risk_check_api as financial_report_risk_check_api
17
17
  import mns_common.utils.data_frame_util as data_frame_util
18
- import mns_scheduler.finance.finance_common_api as finance_common_api
18
+ import mns_scheduler.finance.em.finance_common_api as finance_common_api
19
19
  import mns_scheduler.risk.compliance.undisclosed_annual_report_api as undisclosed_annual_report_api
20
+ import mns_scheduler.finance.xue_qiu.sync_xue_qiu_fiance_data as sync_xue_qiu_fiance_data
20
21
 
21
22
  mongodb_util = MongodbUtil('27017')
22
23
 
@@ -26,39 +27,90 @@ mongodb_util = MongodbUtil('27017')
26
27
  # 3、上市公司季报披露时间:
27
28
  # 1季报:每年4月1日-- -4月30日。
28
29
  # 2季报(中报) :每年7月1日--8月30日。
29
- # 3季报:每年10月1日--10月31日4季报(年报) :每年1月1日--4月30日
30
+ # 3季报:每年10月1日--10月31日
31
+ # 4季报(年报) :每年1月1日--4月30日
30
32
 
31
33
  def sync_financial_report():
32
34
  now_date = datetime.now()
33
35
  now_year = now_date.year
34
36
  now_month = now_date.month
35
37
  sync_time = now_date.strftime('%Y-%m-%d %H:%M:%S')
36
- # 年报
37
- if 1 <= now_month <= 5:
38
+
39
+ if now_month in [1, 2, 3, 4]:
40
+ sync_xue_qiu_fiance_data.sync_xue_qiu_very_period_report(str(now_year - 1) + '年报')
41
+
42
+ # 年报
38
43
  period = 4
39
44
  period_time = str(now_year - 1) + "-12-31 00:00:00"
40
- sync_profit_report(period_time, sync_time, period)
41
- sync_asset_liability_report(period_time, sync_time, period)
45
+ sync_em_profit_report(period_time, sync_time, period)
46
+ sync_em_asset_liability_report(period_time, sync_time, period)
47
+
48
+ # 一季报
49
+ if now_month == 4:
50
+ sync_xue_qiu_fiance_data.sync_xue_qiu_very_period_report(str(now_year) + '一季报')
51
+
52
+ period = 1
53
+ period_time = str(now_year) + "-03-31 00:00:00"
54
+ sync_em_profit_report(period_time, sync_time, period)
55
+ sync_em_asset_liability_report(period_time, sync_time, period)
56
+
42
57
 
43
- # 一季报
44
- elif now_month == 5:
45
- period = 1
46
- period_time = str(now_year) + "-03-31 00:00:00"
47
- sync_profit_report(period_time, sync_time, period)
48
- sync_asset_liability_report(period_time, sync_time, period)
49
58
 
50
59
  # 二季报
51
- elif 7 <= now_month <= 8:
60
+ elif now_month in [7, 8]:
61
+ sync_xue_qiu_fiance_data.sync_xue_qiu_very_period_report(str(now_year) + '中报')
62
+
52
63
  period = 2
53
64
  period_time = str(now_year) + "-06-30 00:00:00"
54
- sync_profit_report(period_time, sync_time, period)
55
- sync_asset_liability_report(period_time, sync_time, period)
65
+ sync_em_profit_report(period_time, sync_time, period)
66
+ sync_em_asset_liability_report(period_time, sync_time, period)
67
+
68
+
69
+
56
70
  # 三季报
57
71
  elif now_month == 10:
72
+ sync_xue_qiu_fiance_data.sync_xue_qiu_very_period_report(str(now_year) + '三季报')
73
+
58
74
  period = 3
59
75
  period_time = str(now_year) + "-09-30 00:00:00"
60
- sync_profit_report(period_time, sync_time, period)
61
- sync_asset_liability_report(period_time, sync_time, period)
76
+ sync_em_profit_report(period_time, sync_time, period)
77
+ sync_em_asset_liability_report(period_time, sync_time, period)
78
+
79
+ elif now_month == 5:
80
+
81
+ sync_xue_qiu_fiance_data.sync_xue_qiu_very_period_report(str(now_year - 1) + '年报')
82
+ sync_xue_qiu_fiance_data.sync_xue_qiu_very_period_report(str(now_year) + '一季报')
83
+
84
+ # 补偿年报和一季度,出不了报告的
85
+ miss_period_04 = 4
86
+ miss_period_time_04 = str(now_year - 1) + "-12-31 00:00:00"
87
+
88
+ sync_em_profit_report(miss_period_time_04, sync_time, miss_period_04)
89
+ sync_em_asset_liability_report(miss_period_time_04, sync_time, miss_period_04)
90
+
91
+ period_01 = 1
92
+ period_time_01 = str(now_year) + "-03-31 00:00:00"
93
+ sync_em_profit_report(period_time_01, sync_time, period_01)
94
+ sync_em_asset_liability_report(period_time_01, sync_time, period_01)
95
+
96
+ elif now_month == 9:
97
+ sync_xue_qiu_fiance_data.sync_xue_qiu_very_period_report(str(now_year) + '中报')
98
+
99
+ # 补偿二季度
100
+ period_02 = 2
101
+ period_time_02 = str(now_year) + "-06-30 00:00:00"
102
+ sync_em_profit_report(period_time_02, sync_time, period_02)
103
+ sync_em_asset_liability_report(period_time_02, sync_time, period_02)
104
+
105
+ elif now_month in [11, 12]:
106
+ sync_xue_qiu_fiance_data.sync_xue_qiu_very_period_report(str(now_year) + '三季报')
107
+
108
+ # 补偿三季度
109
+ period_03 = 3
110
+ period_time_03 = str(now_year) + "-09-30 00:00:00"
111
+ sync_em_profit_report(period_time_03, sync_time, period_03)
112
+ sync_em_asset_liability_report(period_time_03, sync_time, period_03)
113
+
62
114
  # 未出报告check
63
115
  undisclosed_annual_report_api.un_disclosed_report_check(sync_time, now_year, period, period_time)
64
116
  # 新股或者未出报告的
@@ -66,7 +118,7 @@ def sync_financial_report():
66
118
 
67
119
 
68
120
  # 同步资产表
69
- def sync_asset_liability_report(period_time, sync_time, period):
121
+ def sync_em_asset_liability_report(period_time, sync_time, period):
70
122
  un_report_asset_df = finance_common_api.find_un_report_symbol(period_time,
71
123
  db_name_constant.EM_STOCK_ASSET_LIABILITY)
72
124
  for un_report_asset_one in un_report_asset_df.itertuples():
@@ -91,8 +143,8 @@ def sync_asset_liability_report(period_time, sync_time, period):
91
143
  logger.error("同步资产表异常:{},{},{}", symbol, period_time, e)
92
144
 
93
145
 
94
- # 同步利润表
95
- def sync_profit_report(period_time, sync_time, period):
146
+ # 同步em利润表
147
+ def sync_em_profit_report(period_time, sync_time, period):
96
148
  un_report_profit_df = finance_common_api.find_un_report_symbol(period_time, db_name_constant.EM_STOCK_PROFIT)
97
149
  for un_report_profit_one in un_report_profit_df.itertuples():
98
150
  try:
@@ -146,4 +198,5 @@ if __name__ == '__main__':
146
198
  now_year_test = now_date_test.year
147
199
  now_month_test = now_date_test.month
148
200
  sync_time_test = now_date_test.strftime('%Y-%m-%d %H:%M:%S')
201
+ sync_miss_report(sync_time_test)
149
202
  sync_financial_report()
@@ -0,0 +1,7 @@
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)
@@ -0,0 +1,77 @@
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
+ import requests
9
+ import pandas as pd
10
+ from loguru import logger
11
+
12
+
13
+ # report_type income 利润表
14
+ # cash_flow 现金流量
15
+ # balance 资产负债
16
+
17
+
18
+ def get_xue_qiu_report(symbol, report_type, cookie, count, period_type):
19
+ # 请求 URL
20
+ url = (f"https://stock.xueqiu.com/v5/stock/finance/cn/{report_type}.json?symbol={symbol}&type={period_type}"
21
+ f"&is_detail=true&count={count}")
22
+
23
+ # 请求头(关键是 cookies)
24
+ headers = {
25
+ "accept": "application/json, text/plain, */*",
26
+ "accept-language": "zh-CN,zh;q=0.9",
27
+ "origin": "https://xueqiu.com",
28
+ "referer": f"https://xueqiu.com/snowman/S/{symbol}/detail",
29
+ "sec-fetch-mode": "cors",
30
+ "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
31
+ # ⚠ 替换为你浏览器访问雪球后的 Cookie(需含 xq_a_token)
32
+ "cookie": cookie,
33
+ }
34
+
35
+ # 发送请求
36
+ response = requests.get(url, headers=headers)
37
+
38
+ # 检查结果
39
+ if response.status_code == 200:
40
+ data = response.json()
41
+
42
+ # 提取财报数据列表
43
+ raw_list = data['data']['list']
44
+ processed_list = []
45
+
46
+ for entry in raw_list:
47
+ flat_entry = {}
48
+ for key, value in entry.items():
49
+ if isinstance(value, list) and len(value) == 2:
50
+ # 处理列表字段:提取两个值,空则填 0
51
+ v0 = value[0] if value[0] is not None else 0
52
+ v1 = value[1] if value[1] is not None else 0
53
+ flat_entry[key] = v0
54
+ flat_entry[key + "_chg"] = round(v1 * 100, 2)
55
+ elif value is None:
56
+ # 整个字段为空,设置为 0 和 0(变化量)
57
+ flat_entry[key] = 0
58
+ else:
59
+ flat_entry[key] = value
60
+ processed_list.append(flat_entry)
61
+
62
+ # 转换为 DataFrame
63
+ df = pd.DataFrame(processed_list)
64
+ return df
65
+
66
+ else:
67
+ logger.error("请求失败,状态码:{}", response.status_code)
68
+ return pd.DataFrame()
69
+
70
+
71
+ import mns_common.component.cookie.cookie_info_service as cookie_info_service
72
+
73
+ if __name__ == '__main__':
74
+ cash_flow_df = get_xue_qiu_report('SZ301662', 'cash_flow', cookie_info_service.get_xue_qiu_cookie(), 1, 'all')
75
+ income_df = get_xue_qiu_report('SZ301662', 'income', cookie_info_service.get_xue_qiu_cookie(), 1, 'all')
76
+ balance_df = get_xue_qiu_report('SZ301662', 'balance', cookie_info_service.get_xue_qiu_cookie(), 1, 'all')
77
+ pass
@@ -0,0 +1,154 @@
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
+ from mns_common.db.MongodbUtil import MongodbUtil
10
+ import mns_common.constant.extra_income_db_name as extra_income_db_name
11
+ import mns_scheduler.finance.xue_qiu.down_load_xueqiu_report_api as down_load_xueqiu_report_api
12
+ import mns_common.component.common_service_fun_api as common_service_fun_api
13
+ import pandas as pd
14
+ from loguru import logger
15
+ import time
16
+ import mns_common.utils.data_frame_util as data_frame_util
17
+ import mns_common.component.cookie.cookie_info_service as cookie_info_service
18
+ from datetime import datetime
19
+
20
+ mongodb_util_27017 = MongodbUtil('27017')
21
+
22
+
23
+ # report_type income 利润表
24
+ # cash_flow 现金流量
25
+ # balance 资产负债
26
+ # 同步所有股票 报表
27
+ def sync_all_stocks_report():
28
+ em_a_stock_info_df = mongodb_util_27017.find_all_data('em_a_stock_info')
29
+ em_a_stock_info_df = common_service_fun_api.add_pre_prefix(em_a_stock_info_df)
30
+ # 或等效写法 df['A'].str[0:6]
31
+
32
+ fail_list = []
33
+
34
+ xue_qiu_cookie = cookie_info_service.get_xue_qiu_cookie()
35
+ report_type_list = ['income', 'balance', 'cash_flow']
36
+ for stock_one in em_a_stock_info_df.itertuples():
37
+ fail_list = save_one_symbol_data(stock_one, report_type_list, xue_qiu_cookie, True, fail_list, '', False)
38
+
39
+ handle_number = 0
40
+ # 处理失败的
41
+ while len(fail_list) > 0:
42
+ fail_df = em_a_stock_info_df.loc[em_a_stock_info_df['symbol'].isin(fail_list)]
43
+ for fail_one in fail_df.itertuples():
44
+ fail_list = save_one_symbol_data(fail_one, report_type_list, xue_qiu_cookie, True, fail_list, '', False)
45
+ handle_number = handle_number + 1
46
+ if handle_number > 10:
47
+ break
48
+
49
+
50
+ def save_one_symbol_data(stock_one, report_type_list, xue_qiu_cookie, save_tag, fail_list, report_name, check_exist):
51
+ try:
52
+ symbol_prefix = stock_one.symbol_prefix
53
+ name = stock_one.name
54
+ symbol = stock_one.symbol
55
+ for report_type in report_type_list:
56
+ if report_type == 'income':
57
+ col_name = extra_income_db_name.XUE_QIU_LRB_INCOME
58
+ elif report_type == 'balance':
59
+ col_name = extra_income_db_name.XUE_QIU_ASSET_DEBT
60
+ elif report_type == 'cash_flow':
61
+ col_name = extra_income_db_name.XUE_QIU_CASH_FLOW
62
+ if check_exist:
63
+ query_exist = {'symbol': symbol, 'report_name': report_name}
64
+ # 存在数据 不在同步
65
+ if mongodb_util_27017.exist_data_query(col_name, query_exist):
66
+ continue
67
+
68
+ index_create = [('symbol', 1), ('report_date', 1)]
69
+ mongodb_util_27017.create_index(col_name, index_create)
70
+
71
+ index_create_01 = [('symbol', 1), ('sync_time', 1)]
72
+ mongodb_util_27017.create_index(col_name, index_create_01)
73
+
74
+ if check_exist:
75
+ # 季度同步只同步一条数据
76
+ result_df = down_load_xueqiu_report_api.get_xue_qiu_report(symbol_prefix, report_type, xue_qiu_cookie,
77
+ 1,
78
+ 'all')
79
+ else:
80
+ result_df = down_load_xueqiu_report_api.get_xue_qiu_report(symbol_prefix, report_type, xue_qiu_cookie,
81
+ 200,
82
+ 'all')
83
+
84
+ now_date = datetime.now()
85
+ sync_time = now_date.strftime('%Y-%m-%d %H:%M:%S')
86
+
87
+ if data_frame_util.is_empty(result_df):
88
+ logger.error("财务信息为空,代码:{}:{}", symbol, name)
89
+ continue
90
+ else:
91
+ # 季度同步check
92
+ if check_exist:
93
+ result_df = result_df.loc[result_df['report_name'] == report_name]
94
+ if data_frame_util.is_empty(result_df):
95
+ continue
96
+
97
+ result_df['sync_time'] = sync_time
98
+ time.sleep(0.5)
99
+ # 1. 将毫秒时间戳转为 datetime
100
+ result_df['report_date'] = pd.to_datetime(result_df['report_date'], unit='ms')
101
+
102
+ # 2. 格式化为 '%Y-%m-%d' 字符串
103
+ result_df['report_date'] = result_df['report_date'].dt.strftime('%Y-%m-%d')
104
+
105
+ result_df['_id'] = symbol + '_' + result_df['report_date']
106
+ result_df['symbol'] = symbol
107
+
108
+ # 1. 将毫秒时间戳转为 datetime
109
+ result_df['ctime'] = pd.to_datetime(result_df['ctime'], unit='ms')
110
+
111
+ # 2. 格式化为 '%Y-%m-%d' 字符串
112
+ result_df['ctime'] = result_df['ctime'].dt.strftime('%Y-%m-%d')
113
+
114
+ if save_tag:
115
+ mongodb_util_27017.save_mongo(result_df, col_name)
116
+ else:
117
+ mongodb_util_27017.insert_mongo(result_df, col_name)
118
+
119
+ if symbol in fail_list:
120
+ fail_list.remove(symbol)
121
+ logger.info("同步完成数据:{}:{}", symbol, name)
122
+ except BaseException as e:
123
+ logger.error("同步错误:{},异常信息:{}", symbol, e)
124
+ fail_list.append(symbol)
125
+ return fail_list
126
+
127
+
128
+ def sync_xue_qiu_very_period_report(report_name):
129
+ em_a_stock_info_df = mongodb_util_27017.find_all_data('em_a_stock_info')
130
+ em_a_stock_info_df = common_service_fun_api.add_pre_prefix(em_a_stock_info_df)
131
+ # 或等效写法 df['A'].str[0:6]
132
+
133
+ fail_list = []
134
+
135
+ xue_qiu_cookie = cookie_info_service.get_xue_qiu_cookie()
136
+ report_type_list = ['income', 'balance', 'cash_flow']
137
+ for stock_one in em_a_stock_info_df.itertuples():
138
+ fail_list = save_one_symbol_data(stock_one, report_type_list, xue_qiu_cookie, False, fail_list, report_name,
139
+ True)
140
+
141
+ handle_number = 0
142
+ # 处理失败的
143
+ while len(fail_list) > 0:
144
+ fail_df = em_a_stock_info_df.loc[em_a_stock_info_df['symbol'].isin(fail_list)]
145
+ for fail_one in fail_df.itertuples():
146
+ fail_list = save_one_symbol_data(fail_one, report_type_list, xue_qiu_cookie, False, fail_list, report_name,
147
+ True)
148
+ handle_number = handle_number + 1
149
+ if handle_number > 10:
150
+ break
151
+
152
+
153
+ if __name__ == '__main__':
154
+ sync_all_stocks_report()
@@ -0,0 +1,7 @@
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)
@@ -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()
@@ -51,6 +51,9 @@ def update_symbol_new_concept_reason(plate_code, kpl_symbol_list):
51
51
  symbol_str = ','.join(kpl_symbol_list)
52
52
  choose_reason_df = kpl_common_api.get_kpl_concept_choose_reason(plate_code, symbol_str)
53
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
54
57
  for choose_reason_one in choose_reason_df.itertuples():
55
58
  symbol = choose_reason_one.symbol
56
59
  try:
@@ -1,6 +1,6 @@
1
1
  from datetime import datetime
2
2
  import mns_common.component.self_choose.black_list_service_api as black_list_service_api
3
- import mns_scheduler.finance.finance_common_api as finance_common_api
3
+ import mns_scheduler.finance.em.finance_common_api as finance_common_api
4
4
  from loguru import logger
5
5
  import mns_common.constant.db_name_constant as db_name_constant
6
6
  import mns_common.component.trade_date.trade_date_common_service_api as trade_date_common_service_api
@@ -53,13 +53,14 @@ import mns_scheduler.company_info.clean.company_info_clean_api as company_info_c
53
53
  import mns_scheduler.zt.zt_pool.ths_zt_pool_sync_api as ths_zt_pool_sync_api
54
54
  import mns_scheduler.trade.task.trader_task_service as trader_task_service
55
55
  import mns_scheduler.company_info.remark.company_remark_info_sync as company_remark_info_sync
56
- import mns_scheduler.finance.sync_financial_report_service_api as sync_financial_report_service_api
56
+ import mns_scheduler.finance.sync_financial_report_service_task as sync_financial_report_service_task
57
57
  import mns_scheduler.hk.hk_industry_info_sync_service_api as hk_industry_info_sync_service_api
58
58
  import mns_scheduler.hk.hk_company_info_sync_service_api as hk_company_info_sync_service_api
59
59
  import mns_scheduler.zt.zt_pool.update_null_zt_reason_api as update_null_zt_reason_api
60
60
  import mns_scheduler.trade.tfp.stock_tfp_info_sync as stock_tfp_info_sync
61
61
  import mns_scheduler.industry.ths.ths_industry_sync_service as ths_industry_sync_service
62
62
  import mns_scheduler.k_line.year_quarter.year_quarter_line_sync as year_quarter_line_sync
63
+ import mns_scheduler.k_line.sync_status.k_line_sync_status_check as k_line_sync_status_check
63
64
 
64
65
 
65
66
  # 同步交易日期任务完成
@@ -387,7 +388,7 @@ def self_choose_stock_task():
387
388
  # 同步财务报表
388
389
  def sync_financial_report_task():
389
390
  logger.info('同步财务报表任务')
390
- sync_financial_report_service_api.sync_financial_report()
391
+ sync_financial_report_service_task.sync_financial_report()
391
392
 
392
393
 
393
394
  # 同步hk公司信息
@@ -438,6 +439,12 @@ def sync_all_em_stock_info():
438
439
  sync_em_stock_info_sync.sync_all_em_stock_info()
439
440
 
440
441
 
442
+ # check 前复权k线和下一个交易日策略k线数据同步状态
443
+ def check_k_line_sync_count():
444
+ logger.info("check前复权k线和下一个交易日策略k线数据同步状态")
445
+ k_line_sync_status_check.check_k_line_sync_count()
446
+
447
+
441
448
  # # 定义BlockingScheduler
442
449
  blockingScheduler = BlockingScheduler()
443
450
 
@@ -552,6 +559,9 @@ blockingScheduler.add_job(sync_all_kpl_plate_info, 'interval', minutes=5, max_in
552
559
  # 同步新公告信息 感觉没有必要同步 直接连接过去查看
553
560
  # blockingScheduler.add_job(sync_company_announce, 'cron', hour='07,18,23', minute='33')
554
561
 
562
+ # check 前复权k线和下一个交易日策略k线数据同步状态
563
+ blockingScheduler.add_job(check_k_line_sync_count, 'cron', hour='0,23', minute='10')
564
+
555
565
  print('定时任务启动成功')
556
566
  blockingScheduler.start()
557
567
  #
@@ -1,4 +1,4 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mns-scheduler
3
- Version: 1.3.5.1
3
+ Version: 1.3.5.3
4
4
 
@@ -50,10 +50,14 @@ mns_scheduler/debt/kzz_bond_info_sync.py,sha256=FOefhRDqSN1YRqY6drCN3p6PgzVD_isW
50
50
  mns_scheduler/dt/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
51
51
  mns_scheduler/dt/stock_dt_pool_sync.py,sha256=5ivRUOnFtOapZniwTbujf1lVq3y4btm2Cmd5R6JJAVo,3466
52
52
  mns_scheduler/finance/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
53
- mns_scheduler/finance/em_financial_asset_liability_sync_service_api.py,sha256=xcThdnFD5hGRkUsYpIgCi3GR_54_otQnurz-9pzHo9Y,19417
54
- mns_scheduler/finance/em_financial_profit_sync_service_api.py,sha256=KWUfpDs_OuUPToEeoUScQuvYFQvszh5nQu3DVDONfHc,14514
55
- mns_scheduler/finance/finance_common_api.py,sha256=rqsVJZEklJjvM9ogl-9GQaWxyh1LE6IKoTkQkN5cBvE,2453
56
- mns_scheduler/finance/sync_financial_report_service_api.py,sha256=R6Zd3PJRb2LgQCBYdysZwx5IK6fGIVS3i1WU-yNIfxQ,6662
53
+ mns_scheduler/finance/sync_financial_report_service_task.py,sha256=q2J6pKEzDCa8aHqQXqFNvJeFnkfX6_0SQj50VEjp2Yw,8819
54
+ mns_scheduler/finance/em/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
55
+ mns_scheduler/finance/em/em_financial_asset_liability_sync_service_api.py,sha256=1e5VIdQV4U19CBJP0Ow_fp3WvfUF8sPQQQXG8zv5qjo,19420
56
+ mns_scheduler/finance/em/em_financial_profit_sync_service_api.py,sha256=j5xnzcSthy6qc5dYr52DnxqN2T4zf_rldlRWbLyz90I,14550
57
+ mns_scheduler/finance/em/finance_common_api.py,sha256=rqsVJZEklJjvM9ogl-9GQaWxyh1LE6IKoTkQkN5cBvE,2453
58
+ mns_scheduler/finance/xue_qiu/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
59
+ mns_scheduler/finance/xue_qiu/down_load_xueqiu_report_api.py,sha256=r_RtfM2SBzQcvO1MH8Dt8mOXg2tbZOLz0sNwqne9jFs,2769
60
+ mns_scheduler/finance/xue_qiu/sync_xue_qiu_fiance_data.py,sha256=tY9xsvNrXsUzV-fj7hea8TkaU74d46_0w_QgYZetz_4,6599
57
61
  mns_scheduler/hk/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
58
62
  mns_scheduler/hk/hk_company_info_sync_service_api.py,sha256=MGIKodN9oXaY0iwtdsrg4wwHXkMglFvY8eyeTpbas6k,3724
59
63
  mns_scheduler/hk/hk_industry_info_sync_service_api.py,sha256=WdCTaBi4GDicWfmiYbI-byBCXZwknkYZHk6y2IloMys,2275
@@ -83,6 +87,8 @@ mns_scheduler/k_line/hot_stocks/recent_hot_stocks_clean_service.py,sha256=8woZzG
83
87
  mns_scheduler/k_line/month_week_daily/__init__.py,sha256=ffZXFCLFdIwOsbxnw__u1MbQYh9yz7Bs8UMP6VF0X2M,161
84
88
  mns_scheduler/k_line/month_week_daily/bfq_k_line_sync.py,sha256=ccHC9W3tQsZJI6BEpeH5DJ_Zvb6PZb5hYgF_OlGM-14,2668
85
89
  mns_scheduler/k_line/month_week_daily/daily_week_month_line_sync.py,sha256=xhPgLUhb-pGg-nYXvsiJzsPAnIzQuQ46es6oWsDiiqg,5619
90
+ mns_scheduler/k_line/sync_status/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
91
+ mns_scheduler/k_line/sync_status/k_line_sync_status_check.py,sha256=GXKUiRggwk9phisd_QzPgC8gVezEpPbjitUJYxYjAXs,2218
86
92
  mns_scheduler/k_line/test/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
87
93
  mns_scheduler/k_line/test/k_line_info_clean_his_data.py,sha256=eWtzWL1geX5rrwfrlvDCuaTvy1CI9Zgk7CC4zlsncD4,1663
88
94
  mns_scheduler/k_line/year_quarter/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
@@ -94,7 +100,7 @@ mns_scheduler/kpl/selection/index/sync_best_choose_his_index.py,sha256=Cle5cU90H
94
100
  mns_scheduler/kpl/selection/index/sync_best_choose_index.py,sha256=-34drqAMsx792DxR8P1A8DrGCM5yIVGsop3UzDNzsPw,8016
95
101
  mns_scheduler/kpl/selection/symbol/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
96
102
  mns_scheduler/kpl/selection/symbol/sync_best_choose_symbol.py,sha256=Z0p3r-JWpxlEK2u00HIzVqEEg64r5AE72KQ2Bivwv_k,4756
97
- mns_scheduler/kpl/selection/symbol/sync_kpl_concept_symbol_choose_reason_api.py,sha256=IVYWQQY7jy5I3jOQipWNTSyWDnryuAwtSoChlxt-0ww,5246
103
+ mns_scheduler/kpl/selection/symbol/sync_kpl_concept_symbol_choose_reason_api.py,sha256=brKDcCqCULPwLT9lnlNQZVSa6mi8lsYrmm3x8R2BwdE,5408
98
104
  mns_scheduler/kpl/selection/total/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
99
105
  mns_scheduler/kpl/selection/total/sync_kpl_best_total_sync_api.py,sha256=ljacoCP2gGtiwOT89FywE38vGGwZv1FmHNxS0PSx6-A,10755
100
106
  mns_scheduler/lhb/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
@@ -104,7 +110,7 @@ mns_scheduler/open/sync_one_day_open_data_to_db_service.py,sha256=4ghPSJaeSZB974
104
110
  mns_scheduler/risk/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
105
111
  mns_scheduler/risk/financial_report_risk_check_api.py,sha256=cOW_zh0bGn432cjj_kLlXW1Yp66Ne17aPwwg77yzOmE,1648
106
112
  mns_scheduler/risk/compliance/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
- mns_scheduler/risk/compliance/undisclosed_annual_report_api.py,sha256=sRU6cbvIpICZbTUJIUIobwoV02HG5lINUeTL0LSrZNE,3870
113
+ mns_scheduler/risk/compliance/undisclosed_annual_report_api.py,sha256=nlA4Mc6rhuCt_cveaVpKtbSTN1JJtzJcXudUAzJyCkE,3873
108
114
  mns_scheduler/risk/financial/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
109
115
  mns_scheduler/risk/financial/annual_report_audit_check_api.py,sha256=bNiMXDNt88XEsk0W8oUOQ4OdBvJzwRGjN9SNAygYlhI,2580
110
116
  mns_scheduler/risk/financial/net_assets_check_api.py,sha256=glhBAyixc4mNfFUCRyT22wsAQC20R67jthyg8uvsOS4,4737
@@ -154,11 +160,11 @@ mns_scheduler/zt/zt_pool/em_zt_pool_sync_api.py,sha256=LOEUyTA5g7N6FWxUpHWimWTeX
154
160
  mns_scheduler/zt/zt_pool/ths_zt_pool_sync_api.py,sha256=LI4o4_sovmLj1tMROPRQRCj5gaITKLGoYH-nUCuysbU,7501
155
161
  mns_scheduler/zt/zt_pool/update_null_zt_reason_api.py,sha256=caW-MuF0RFLavJZafeLDYQ29-GxwGsmr5YVrN4lost8,2135
156
162
  mns_scheduler/zz_task/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
157
- mns_scheduler/zz_task/data_sync_task.py,sha256=20od9BFyK2CI8F9DlgcZhc4n-cCJWo2HtYxyd4jIyls,22554
163
+ mns_scheduler/zz_task/data_sync_task.py,sha256=ar3l9eBe3z5WmdAMNqiaQJrIPUpUR1KbwbtXRFqlYjs,23064
158
164
  mns_scheduler/zz_task/compensation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
159
165
  mns_scheduler/zz_task/compensation/compensate_task.py,sha256=Dyo66NcSnXZ-Cne4_v77BBb27SemAiuGXRLnvQ26X0E,6464
160
166
  mns_scheduler/zz_task/compensation/compensate_task_one_day.py,sha256=qbub3S5fLKVyorhEzBppgVIizqdkcAeGQMgr9iAAf2I,5751
161
- mns_scheduler-1.3.5.1.dist-info/METADATA,sha256=yIBWI1uTAZU0SoUFsBKZvLgnjjEaiUwyzeJocsJhgdU,64
162
- mns_scheduler-1.3.5.1.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
163
- mns_scheduler-1.3.5.1.dist-info/top_level.txt,sha256=PXQDFBGR1pWmsUbH5yiLAh71P5HZODTRED0zJ8CCgOc,14
164
- mns_scheduler-1.3.5.1.dist-info/RECORD,,
167
+ mns_scheduler-1.3.5.3.dist-info/METADATA,sha256=k2EJxKJ2dFlyNnAJh9Qe2NZ5Vy4MVJ5TNuhtd5sA7nk,64
168
+ mns_scheduler-1.3.5.3.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
169
+ mns_scheduler-1.3.5.3.dist-info/top_level.txt,sha256=PXQDFBGR1pWmsUbH5yiLAh71P5HZODTRED0zJ8CCgOc,14
170
+ mns_scheduler-1.3.5.3.dist-info/RECORD,,