mns-scheduler 1.2.7.2__py3-none-any.whl → 1.2.7.4__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 (25) hide show
  1. mns_scheduler/db/real_time_task_check.py +2 -2
  2. mns_scheduler/db/task_handle_service.py +61 -0
  3. mns_scheduler/extraIncome/one_minute/common/db_create_index.py +9 -0
  4. mns_scheduler/extraIncome/one_minute/common/symbol_handle_util.py +41 -0
  5. mns_scheduler/extraIncome/one_minute/etf/etf_one_minute_sync_task.py +87 -0
  6. mns_scheduler/extraIncome/one_minute/index/main_index_sync_task.py +74 -0
  7. mns_scheduler/extraIncome/one_minute/kzz/__init__.py +7 -0
  8. mns_scheduler/extraIncome/one_minute/kzz/kzz_one_minute_sync_task.py +87 -0
  9. mns_scheduler/extraIncome/one_minute/one_minute_sync_task.py +34 -0
  10. mns_scheduler/extraIncome/one_minute/stock/__init__.py +7 -0
  11. mns_scheduler/extraIncome/one_minute/stock/stock_one_minute_sync_task.py +89 -0
  12. mns_scheduler/extraIncome/temp/__init__.py +7 -0
  13. mns_scheduler/extraIncome/temp/tu_share_data_etf_sync.py +103 -0
  14. mns_scheduler/extraIncome/temp/tu_share_data_kzz_sync.py +113 -0
  15. mns_scheduler/extraIncome/{stock/sync_stock_one_minute_now_api.py → temp/tu_share_data_stock_sync.py} +27 -56
  16. mns_scheduler/extraIncome/temp/tu_share_zhi_shu_sync_api.py +107 -0
  17. mns_scheduler/zz_task/data_sync_task.py +31 -7
  18. {mns_scheduler-1.2.7.2.dist-info → mns_scheduler-1.2.7.4.dist-info}/METADATA +1 -1
  19. {mns_scheduler-1.2.7.2.dist-info → mns_scheduler-1.2.7.4.dist-info}/RECORD +25 -11
  20. /mns_scheduler/extraIncome/{etf → one_minute}/__init__.py +0 -0
  21. /mns_scheduler/extraIncome/{kzz → one_minute/common}/__init__.py +0 -0
  22. /mns_scheduler/extraIncome/{stock → one_minute/etf}/__init__.py +0 -0
  23. /mns_scheduler/extraIncome/{stock/one_minute_k_line_sync.py → one_minute/index/__init__.py} +0 -0
  24. {mns_scheduler-1.2.7.2.dist-info → mns_scheduler-1.2.7.4.dist-info}/WHEEL +0 -0
  25. {mns_scheduler-1.2.7.2.dist-info → mns_scheduler-1.2.7.4.dist-info}/top_level.txt +0 -0
@@ -63,7 +63,7 @@ def run_check_real_time_data_sync_status():
63
63
  if bool(1 - trade_date_common_service_api.is_trade_day(str_day)):
64
64
  return False
65
65
 
66
- # 关闭上午定时同步
66
+ # 关闭定时同步
67
67
  if (hour == 11 and minute == 31) or (hour == 9 and minute == 27):
68
68
  all_cmd_processes = cmd_util.get_all_process()
69
69
  if data_frame_util.is_empty(all_cmd_processes):
@@ -79,7 +79,7 @@ def run_check_real_time_data_sync_status():
79
79
  except BaseException as e:
80
80
  logger.error("关闭实时行情任务异常:{}", e)
81
81
 
82
- # 重开下午定时同步
82
+ # 重开定时同步
83
83
  if (hour == 12 and minute == 59) or (hour == 9 and minute == 29):
84
84
  all_cmd_processes = cmd_util.get_all_process()
85
85
  if data_frame_util.is_empty(all_cmd_processes):
@@ -0,0 +1,61 @@
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.utils.cmd_util as cmd_util
10
+ import mns_common.utils.data_frame_util as data_frame_util
11
+ from loguru import logger
12
+ from mns_common.db.MongodbUtil import MongodbUtil
13
+ import time
14
+
15
+ mongodb_util = MongodbUtil('27017')
16
+
17
+ MAX_NUMBER_KEY = 'max_number_key'
18
+ # 定时任务 python名称
19
+ REAL_TIME_SCHEDULER_NAME = "sync_realtime_quotes_task"
20
+ # 实时同步 python名称
21
+ REAL_TIME_TASK_NAME = "realtime_quotes_now_sync"
22
+ # 实时同步 bat
23
+ REAL_TIME_TASK_NAME_PATH = 'H:\\real_time_task.bat'
24
+ # 定时任务 bat
25
+ REAL_TIME_SCHEDULER_NAME_PATH = 'H:\\real_time_scheduler.bat'
26
+
27
+
28
+ # 关闭实时行情任务
29
+ def real_time_sync_task_close():
30
+ all_cmd_processes = cmd_util.get_all_process()
31
+ if data_frame_util.is_empty(all_cmd_processes):
32
+ return False
33
+ all_cmd_processes_real_time_task = get_real_time_quotes_task(all_cmd_processes)
34
+ if data_frame_util.is_empty(all_cmd_processes_real_time_task):
35
+ return False
36
+ for match_task_one in all_cmd_processes_real_time_task.itertuples():
37
+ try:
38
+ processes_pid = match_task_one.process_pid
39
+ # 关闭当前进程
40
+ cmd_util.kill_process_by_pid(processes_pid)
41
+ except BaseException as e:
42
+ logger.error("关闭实时行情任务异常:{}", e)
43
+
44
+
45
+ # 重开定时任务同步
46
+ def real_time_sync_task_open():
47
+ all_cmd_processes = cmd_util.get_all_process()
48
+ if data_frame_util.is_empty(all_cmd_processes):
49
+ return False
50
+ all_cmd_processes_real_time_task = get_real_time_quotes_task(all_cmd_processes)
51
+ if data_frame_util.is_empty(all_cmd_processes_real_time_task):
52
+ # 重开定时任务
53
+ cmd_util.open_bat_file(REAL_TIME_SCHEDULER_NAME_PATH)
54
+ # 防止太快重开多个
55
+ time.sleep(3)
56
+
57
+
58
+ def get_real_time_quotes_task(all_cmd_processes):
59
+ return all_cmd_processes[
60
+ (all_cmd_processes['total_info'].str.contains(REAL_TIME_SCHEDULER_NAME, case=False, na=False))
61
+ | (all_cmd_processes['total_info'].str.contains(REAL_TIME_TASK_NAME, case=False, na=False))]
@@ -0,0 +1,9 @@
1
+ def create_index(db_util, col_name):
2
+ index_create = [('symbol', 1), ('time', 1)]
3
+ db_util.create_index(col_name, index_create)
4
+ index_create_01 = [('time', 1)]
5
+ db_util.create_index(col_name, index_create_01)
6
+ index_create_02 = [('symbol', 1)]
7
+ db_util.create_index(col_name, index_create_02)
8
+
9
+
@@ -0,0 +1,41 @@
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 mns_common.constant.extra_income_db_name as extra_income_db_name
9
+ import pandas as pd
10
+ from mns_common.db.v2.MongodbUtilV2 import MongodbUtilV2
11
+
12
+ mongodbUtilV2_27019 = MongodbUtilV2('27019', extra_income_db_name.EXTRA_INCOME)
13
+
14
+
15
+ def symbol_add_prefix(symbol):
16
+ symbol_simple = symbol[0:6]
17
+ suffix = symbol[7:9]
18
+ if suffix in ['SH']:
19
+ return '1.' + symbol_simple
20
+ elif suffix in ['SZ']:
21
+ return '0.' + symbol_simple
22
+ elif suffix in ['BJ']:
23
+ return '0.' + symbol_simple
24
+
25
+
26
+ # col_name 保存数据的结婚
27
+ def save_fail_data(now_day, symbol_prefix, col_name):
28
+ fail_dict = {'begin_date': now_day,
29
+ 'end_date': now_day,
30
+ 'symbol': symbol_prefix,
31
+ 'col_name': col_name,
32
+ 'type': 'kzz',
33
+ 'sync_day': now_day,
34
+ 'valid': True,
35
+ }
36
+ fail_df = pd.DataFrame(fail_dict, index=[1])
37
+ mongodbUtilV2_27019.insert_mongo(fail_df, extra_income_db_name.ONE_MINUTE_SYNC_FAIL)
38
+
39
+
40
+ if __name__ == '__main__':
41
+ symbol_add_prefix('000001.SZ')
@@ -0,0 +1,87 @@
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.api.em.east_money_etf_api as east_money_etf_api
10
+ from loguru import logger
11
+ import time
12
+ import mns_common.utils.data_frame_util as data_frame_util
13
+ from mns_common.db.MongodbUtil import MongodbUtil
14
+ import mns_scheduler.extraIncome.one_minute.common.symbol_handle_util as symbol_handle_util
15
+ from mns_common.db.v2.MongodbUtilV2 import MongodbUtilV2
16
+ import mns_scheduler.extraIncome.one_minute.common.db_create_index as db_create_index
17
+ import mns_common.constant.extra_income_db_name as extra_income_db_name
18
+ import mns_common.api.k_line.stock_minute_data_api as stock_minute_data_api
19
+ from datetime import datetime
20
+
21
+ mongodb_util_27017 = MongodbUtil('27017')
22
+ mongodbUtilV2_27019 = MongodbUtilV2('27019', extra_income_db_name.EXTRA_INCOME)
23
+
24
+
25
+ def sync_etf_one_minute(data_tag):
26
+ etf_real_time_quotes = east_money_etf_api.get_etf_real_time_quotes()
27
+ etf_real_time_quotes = classify_symbol(etf_real_time_quotes)
28
+ etf_real_time_quotes['symbol'] = etf_real_time_quotes.apply(
29
+ lambda row: row['symbol'] + '.SZ' if row['classification'] in ['S', 'C']
30
+ else row['symbol'] + '.BJ' if row['classification'] in ['X']
31
+ else row['symbol'] + '.SH',
32
+ axis=1
33
+ )
34
+ # 假设数字格式为 YYYYMMDD
35
+ # debt_real_time_quotes['list_date'] = pd.to_datetime(debt_real_time_quotes['list_date'],
36
+ # format='%Y%m%d').dt.strftime('%Y-%m-%d')
37
+
38
+ etf_real_time_quotes = etf_real_time_quotes.loc[etf_real_time_quotes['amount'] != 0]
39
+
40
+ now_date = datetime.now()
41
+ now_day = now_date.strftime('%Y-%m-%d')
42
+ year = now_date.strftime('%Y')
43
+ col_name = extra_income_db_name.ONE_MINUTE_K_LINE_BFQ_ETF + '_' + str(year)
44
+ # 创建索引
45
+ db_create_index.create_index(mongodbUtilV2_27019, col_name)
46
+
47
+ for stock_one in etf_real_time_quotes.itertuples():
48
+
49
+ symbol = stock_one.symbol
50
+ symbol_prefix = symbol_handle_util.symbol_add_prefix(symbol)
51
+ try:
52
+ one_min_df = stock_minute_data_api.get_minute_data(symbol_prefix, now_day, now_day, '1', '')
53
+ one_min_df['symbol'] = symbol
54
+ one_min_df['_id'] = one_min_df['symbol'] + '_' + one_min_df['time']
55
+ if data_frame_util.is_empty(one_min_df) or one_min_df.shape[0] < 241:
56
+ symbol_handle_util.save_fail_data(now_day, symbol_prefix, col_name)
57
+ logger.error("当前ETF数据同步异常:{}", symbol)
58
+ continue
59
+ else:
60
+ del one_min_df['ava_price']
61
+ if data_tag:
62
+ mongodbUtilV2_27019.insert_mongo(one_min_df, col_name)
63
+ else:
64
+ mongodbUtilV2_27019.save_mongo(one_min_df, col_name)
65
+ except BaseException as e:
66
+ time.sleep(2)
67
+ symbol_handle_util.save_fail_data(now_day, symbol_prefix, col_name)
68
+ logger.error("同步ETF数据出现异常:{},{},{}", e, symbol, now_day)
69
+ logger.info("同步完ETF数据:{},{}", stock_one.symbol, stock_one.name)
70
+
71
+
72
+ def classify_symbol(etf_real_time_quotes):
73
+ etf_real_time_quotes['classification'] = etf_real_time_quotes['market'].apply(
74
+ lambda market: classify_symbol_one(market))
75
+ return etf_real_time_quotes
76
+
77
+
78
+ # 单个股票分类
79
+ def classify_symbol_one(market):
80
+ if market == 0:
81
+ return 'S'
82
+ else:
83
+ return 'H'
84
+
85
+
86
+ if __name__ == '__main__':
87
+ sync_etf_one_minute("2025-03-17", "2025-03-17")
@@ -0,0 +1,74 @@
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 loguru import logger
10
+ import mns_common.utils.data_frame_util as data_frame_util
11
+ from mns_common.db.MongodbUtil import MongodbUtil
12
+ from mns_common.db.v2.MongodbUtilV2 import MongodbUtilV2
13
+ import mns_scheduler.extraIncome.one_minute.common.db_create_index as db_create_index
14
+ import mns_common.constant.extra_income_db_name as extra_income_db_name
15
+ from datetime import datetime
16
+ import mns_common.api.k_line.stock_minute_data_api as stock_minute_data_api
17
+ import mns_scheduler.extraIncome.one_minute.common.symbol_handle_util as symbol_handle_util
18
+
19
+ mongodb_util_27017 = MongodbUtil('27017')
20
+ mongodbUtilV2_27019 = MongodbUtilV2('27019', extra_income_db_name.EXTRA_INCOME)
21
+
22
+ main_index_list = [
23
+ "000001.SH",
24
+ "000016.SH",
25
+ "000010.SH",
26
+ "000009.SH",
27
+ "000015.SH",
28
+ "399001.SZ",
29
+ "399004.SZ",
30
+ "399005.SZ",
31
+ "399006.SZ",
32
+ "000300.SH",
33
+ "000905.SH",
34
+ "000688.SH",
35
+ "000903.SH",
36
+ "000906.SH",
37
+ "000852.SH",
38
+ "000932.SH",
39
+ "000933.SH",
40
+ "980017.SZ",
41
+ "399808.SZ",
42
+ "399997.SZ",
43
+ ]
44
+
45
+
46
+ def sync_main_index_one_minute(data_tag):
47
+ now_date = datetime.now()
48
+ now_day = now_date.strftime('%Y-%m-%d')
49
+ year = now_date.strftime('%Y')
50
+ col_name = extra_income_db_name.ONE_MINUTE_K_LINE_BFQ_MAIN_INDEX + '_' + str(year)
51
+ # 创建索引
52
+ db_create_index.create_index(mongodbUtilV2_27019, col_name)
53
+ for symbol in main_index_list:
54
+ try:
55
+ symbol_prefix = symbol_handle_util.symbol_add_prefix(symbol)
56
+ one_min_df = stock_minute_data_api.get_minute_data(symbol_prefix, now_day, now_day, '1', '')
57
+ one_min_df['symbol'] = symbol
58
+ one_min_df['_id'] = one_min_df['symbol'] + '_' + one_min_df['time']
59
+ if data_frame_util.is_empty(one_min_df) or one_min_df.shape[0] < 241:
60
+ logger.error("当前沪深指数数据同步异常:{}", symbol)
61
+ continue
62
+ else:
63
+ del one_min_df['ava_price']
64
+ if data_tag:
65
+ mongodbUtilV2_27019.insert_mongo(one_min_df, col_name)
66
+ else:
67
+ mongodbUtilV2_27019.save_mongo(one_min_df, col_name)
68
+ except BaseException as e:
69
+ logger.error("沪深指数数据同步异常:{},{}", symbol, e)
70
+ logger.info("沪深指数数据同步完成:{}", symbol)
71
+
72
+
73
+ if __name__ == '__main__':
74
+ sync_main_index_one_minute(False)
@@ -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,87 @@
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.api.em.east_money_debt_api as east_money_debt_api
10
+ from loguru import logger
11
+ import time
12
+ import mns_common.utils.data_frame_util as data_frame_util
13
+ from mns_common.db.MongodbUtil import MongodbUtil
14
+ import mns_scheduler.extraIncome.one_minute.common.symbol_handle_util as symbol_handle_util
15
+ from mns_common.db.v2.MongodbUtilV2 import MongodbUtilV2
16
+ import mns_scheduler.extraIncome.one_minute.common.db_create_index as db_create_index
17
+ import mns_common.constant.extra_income_db_name as extra_income_db_name
18
+ import mns_common.api.k_line.stock_minute_data_api as stock_minute_data_api
19
+ from datetime import datetime
20
+
21
+ mongodb_util_27017 = MongodbUtil('27017')
22
+ mongodbUtilV2_27019 = MongodbUtilV2('27019', extra_income_db_name.EXTRA_INCOME)
23
+
24
+
25
+ def sync_kzz_one_minute(data_tag):
26
+ debt_real_time_quotes = east_money_debt_api.get_debt_real_time_quotes()
27
+ debt_real_time_quotes = classify_symbol(debt_real_time_quotes)
28
+ debt_real_time_quotes['symbol'] = debt_real_time_quotes.apply(
29
+ lambda row: row['symbol'] + '.SZ' if row['classification'] in ['S', 'C']
30
+ else row['symbol'] + '.BJ' if row['classification'] in ['X']
31
+ else row['symbol'] + '.SH',
32
+ axis=1
33
+ )
34
+ # 假设数字格式为 YYYYMMDD
35
+ # debt_real_time_quotes['list_date'] = pd.to_datetime(debt_real_time_quotes['list_date'],
36
+ # format='%Y%m%d').dt.strftime('%Y-%m-%d')
37
+
38
+ debt_real_time_quotes = debt_real_time_quotes.loc[debt_real_time_quotes['amount'] != 0]
39
+
40
+ now_date = datetime.now()
41
+ now_day = now_date.strftime('%Y-%m-%d')
42
+ year = now_date.strftime('%Y')
43
+ col_name = extra_income_db_name.ONE_MINUTE_K_LINE_BFQ_KZZ + '_' + str(year)
44
+ # 创建索引
45
+ db_create_index.create_index(mongodbUtilV2_27019, col_name)
46
+
47
+ for stock_one in debt_real_time_quotes.itertuples():
48
+
49
+ symbol = stock_one.symbol
50
+ symbol_prefix = symbol_handle_util.symbol_add_prefix(symbol)
51
+ try:
52
+ one_min_df = stock_minute_data_api.get_minute_data(symbol_prefix, now_day, now_day, '1', '')
53
+ one_min_df['symbol'] = symbol
54
+ one_min_df['_id'] = one_min_df['symbol'] + '_' + one_min_df['time']
55
+ if data_frame_util.is_empty(one_min_df) or one_min_df.shape[0] < 241:
56
+ symbol_handle_util.save_fail_data(now_day, symbol_prefix, col_name)
57
+ logger.error("当前可转债数据同步异常:{}", symbol)
58
+ continue
59
+ else:
60
+ del one_min_df['ava_price']
61
+ if data_tag:
62
+ mongodbUtilV2_27019.insert_mongo(one_min_df, col_name)
63
+ else:
64
+ mongodbUtilV2_27019.save_mongo(one_min_df, col_name)
65
+ except BaseException as e:
66
+ time.sleep(2)
67
+ symbol_handle_util.save_fail_data(now_day, symbol_prefix, col_name)
68
+ logger.error("同步可转债数据出现异常:,{},{},{}", e, symbol, now_day)
69
+ logger.info("同步完数据:{},{}", stock_one.symbol, stock_one.name)
70
+
71
+
72
+ def classify_symbol(debt_real_time_quotes_df):
73
+ debt_real_time_quotes_df['classification'] = debt_real_time_quotes_df['market'].apply(
74
+ lambda market: classify_symbol_one(market))
75
+ return debt_real_time_quotes_df
76
+
77
+
78
+ # 单个股票分类
79
+ def classify_symbol_one(market):
80
+ if market == 0:
81
+ return 'S'
82
+ else:
83
+ return 'H'
84
+
85
+
86
+ if __name__ == '__main__':
87
+ sync_kzz_one_minute()
@@ -0,0 +1,34 @@
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 mns_scheduler.extraIncome.one_minute.index.main_index_sync_task as main_index_sync_task
9
+ import mns_scheduler.extraIncome.one_minute.etf.etf_one_minute_sync_task as etf_one_minute_sync_task
10
+ import mns_scheduler.extraIncome.one_minute.kzz.kzz_one_minute_sync_task as kzz_one_minute_sync_task
11
+ import mns_scheduler.extraIncome.one_minute.stock.stock_one_minute_sync_task as stock_one_minute_sync_task
12
+ from datetime import datetime
13
+ import mns_common.component.trade_date.trade_date_common_service_api as trade_date_common_service_api
14
+
15
+
16
+ def sync_one_minute_data():
17
+ now_date = datetime.now()
18
+ hour = now_date.hour
19
+ now_day = now_date.strftime('%Y-%m-%d')
20
+ if trade_date_common_service_api.is_trade_day(now_day):
21
+ if 15 < hour < 20:
22
+ main_index_sync_task.sync_main_index_one_minute(True)
23
+ etf_one_minute_sync_task.sync_etf_one_minute(True)
24
+ kzz_one_minute_sync_task.sync_kzz_one_minute(True)
25
+ stock_one_minute_sync_task.sync_stock_one_minute(True)
26
+ elif hour < 9 or hour >= 20:
27
+ main_index_sync_task.sync_main_index_one_minute(False)
28
+ etf_one_minute_sync_task.sync_etf_one_minute(False)
29
+ kzz_one_minute_sync_task.sync_kzz_one_minute(False)
30
+ stock_one_minute_sync_task.sync_stock_one_minute(False)
31
+
32
+
33
+ if __name__ == '__main__':
34
+ sync_one_minute_data()
@@ -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,89 @@
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 mns_common.component.common_service_fun_api as common_service_fun_api
9
+ import mns_common.api.em.east_money_stock_api as east_money_stock_api
10
+ from loguru import logger
11
+ import time
12
+ import mns_common.utils.data_frame_util as data_frame_util
13
+ from mns_common.db.MongodbUtil import MongodbUtil
14
+ import mns_scheduler.extraIncome.one_minute.common.symbol_handle_util as symbol_handle_util
15
+ from mns_common.db.v2.MongodbUtilV2 import MongodbUtilV2
16
+ import mns_scheduler.extraIncome.one_minute.common.db_create_index as db_create_index
17
+ import mns_common.constant.extra_income_db_name as extra_income_db_name
18
+ import mns_common.api.k_line.stock_minute_data_api as stock_minute_data_api
19
+ from datetime import datetime
20
+
21
+ mongodb_util_27017 = MongodbUtil('27017')
22
+ mongodbUtilV2_27019 = MongodbUtilV2('27019', extra_income_db_name.EXTRA_INCOME)
23
+
24
+
25
+ def sync_stock_one_minute(data_tag):
26
+ real_time_quotes_all_stocks = east_money_stock_api.get_real_time_quotes_all_stocks()
27
+ real_time_quotes_all_stocks = common_service_fun_api.classify_symbol(real_time_quotes_all_stocks)
28
+ real_time_quotes_all_stocks['symbol'] = real_time_quotes_all_stocks.apply(
29
+ lambda row: row['symbol'] + '.SZ' if row['classification'] in ['S', 'C']
30
+ else row['symbol'] + '.BJ' if row['classification'] in ['X']
31
+ else row['symbol'] + '.SH',
32
+ axis=1)
33
+ # 假设数字格式为 YYYYMMDD
34
+ # debt_real_time_quotes['list_date'] = pd.to_datetime(debt_real_time_quotes['list_date'],
35
+ # format='%Y%m%d').dt.strftime('%Y-%m-%d')
36
+
37
+ real_time_quotes_all_stocks = real_time_quotes_all_stocks.loc[real_time_quotes_all_stocks['amount'] != 0]
38
+
39
+ now_date = datetime.now()
40
+ now_day = now_date.strftime('%Y-%m-%d')
41
+ year = now_date.strftime('%Y')
42
+
43
+ # 创建索引
44
+ db_create_index.create_index(mongodbUtilV2_27019, extra_income_db_name.ONE_MINUTE_K_LINE_BFQ_C + '_' + str(year))
45
+ db_create_index.create_index(mongodbUtilV2_27019, extra_income_db_name.ONE_MINUTE_K_LINE_BFQ_BJ + '_' + str(year))
46
+ db_create_index.create_index(mongodbUtilV2_27019, extra_income_db_name.ONE_MINUTE_K_LINE_BFQ_H + '_' + str(year))
47
+ db_create_index.create_index(mongodbUtilV2_27019, extra_income_db_name.ONE_MINUTE_K_LINE_BFQ_K + '_' + str(year))
48
+ db_create_index.create_index(mongodbUtilV2_27019, extra_income_db_name.ONE_MINUTE_K_LINE_BFQ_S + '_' + str(year))
49
+
50
+ for stock_one in real_time_quotes_all_stocks.itertuples():
51
+ classification = stock_one.classification
52
+
53
+ if classification == 'X':
54
+ col_name = extra_income_db_name.ONE_MINUTE_K_LINE_BFQ_BJ
55
+ elif classification == 'S':
56
+ col_name = extra_income_db_name.ONE_MINUTE_K_LINE_BFQ_S
57
+ elif classification == 'H':
58
+ col_name = extra_income_db_name.ONE_MINUTE_K_LINE_BFQ_H
59
+ elif classification == 'K':
60
+ col_name = extra_income_db_name.ONE_MINUTE_K_LINE_BFQ_K
61
+ elif classification == 'C':
62
+ col_name = extra_income_db_name.ONE_MINUTE_K_LINE_BFQ_C
63
+ col_name = col_name + '_' + str(year)
64
+
65
+ symbol = stock_one.symbol
66
+ symbol_prefix = symbol_handle_util.symbol_add_prefix(symbol)
67
+ try:
68
+ one_min_df = stock_minute_data_api.get_minute_data(symbol_prefix, now_day, now_day, '1', '')
69
+ one_min_df['symbol'] = symbol
70
+ one_min_df['_id'] = one_min_df['symbol'] + '_' + one_min_df['time']
71
+ if data_frame_util.is_empty(one_min_df) or one_min_df.shape[0] < 241:
72
+ symbol_handle_util.save_fail_data(now_day, symbol_prefix, col_name)
73
+ logger.error("当前股票数据同步异常:{}", symbol)
74
+ continue
75
+ else:
76
+ del one_min_df['ava_price']
77
+ if data_tag:
78
+ mongodbUtilV2_27019.insert_mongo(one_min_df, col_name)
79
+ else:
80
+ mongodbUtilV2_27019.save_mongo(one_min_df, col_name)
81
+ except BaseException as e:
82
+ time.sleep(2)
83
+ symbol_handle_util.save_fail_data(now_day, symbol_prefix, col_name)
84
+ logger.error("同步股票数据出现异常:,{},{},{}", e, symbol, now_day)
85
+ logger.info("同步股票数据完数据:{},{}", stock_one.symbol, stock_one.name)
86
+
87
+
88
+ if __name__ == '__main__':
89
+ sync_stock_one_minute()
@@ -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,103 @@
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 mns_common.api.em.east_money_etf_api as east_money_etf_api
9
+ import pandas as pd
10
+ from loguru import logger
11
+ import time
12
+ import mns_common.utils.data_frame_util as data_frame_util
13
+ from mns_common.db.MongodbUtil import MongodbUtil
14
+ import tushare as ts
15
+ from mns_common.db.v2.MongodbUtilV2 import MongodbUtilV2
16
+ import mns_scheduler.extraIncome.one_minute.common.db_create_index as db_create_index
17
+ import mns_common.constant.extra_income_db_name as extra_income_db_name
18
+
19
+ mongodb_util_27017 = MongodbUtil('27017')
20
+ mongodbUtilV2_27019 = MongodbUtilV2('27019', extra_income_db_name.EXTRA_INCOME)
21
+ pro = ts.pro_api('782213d20640249f1dbae50a7f56b22684b8e915a61e435e015579a1')
22
+
23
+
24
+ def get_minute_data(symbol, freq, start_date, end_date):
25
+ # 获取浦发银行60000.SH的历史分钟数据
26
+ df = pro.stk_mins(ts_code=symbol, freq=freq, start_date=start_date, end_date=end_date)
27
+ return df
28
+
29
+
30
+ def sync_etf_one_minute(trade_date_list_df):
31
+ etf_real_time_quotes_df = east_money_etf_api.get_etf_real_time_quotes()
32
+ etf_real_time_quotes_df = classify_symbol(etf_real_time_quotes_df)
33
+ etf_real_time_quotes_df['symbol'] = etf_real_time_quotes_df.apply(
34
+ lambda row: row['symbol'] + '.SZ' if row['classification'] in ['S', 'C']
35
+ else row['symbol'] + '.BJ' if row['classification'] in ['X']
36
+ else row['symbol'] + '.SH',
37
+ axis=1
38
+ )
39
+
40
+ db_name = extra_income_db_name.ONE_MINUTE_K_LINE_BFQ_ETF
41
+ db_create_index.create_index(mongodbUtilV2_27019, db_name)
42
+ for stock_one in etf_real_time_quotes_df.itertuples():
43
+ trade_date_list_df_copy = trade_date_list_df.copy()
44
+ symbol = stock_one.symbol
45
+ for i in range(0, len(trade_date_list_df_copy), 28):
46
+ try:
47
+ new_df = trade_date_list_df_copy.iloc[i:i + 28]
48
+ first_df = new_df.iloc[0] # 第一个 DataFrame
49
+ last_df = new_df.iloc[-1] # 最后一个 DataFrame
50
+ begin_date = first_df.trade_date + ' 09:20:00'
51
+ end_date = last_df.trade_date + ' 15:00:00'
52
+
53
+ df = get_minute_data(symbol, '1min', begin_date, end_date)
54
+ if data_frame_util.is_not_empty(df):
55
+ df = df.rename(columns={
56
+ "trade_time": "time",
57
+ "ts_code": "symbol",
58
+ "vol": "volume",
59
+ })
60
+ df['time_tick'] = df['time'].str[11:19]
61
+ df = df.loc[df['time_tick'] <= '15:00:00']
62
+ del df['time_tick']
63
+ df['_id'] = df['symbol'] + '_' + df['time']
64
+ mongodbUtilV2_27019.insert_mongo(df, db_name)
65
+ except BaseException as e:
66
+ time.sleep(2)
67
+ first_df = new_df.iloc[0] # 第一个 DataFrame
68
+ last_df = new_df.iloc[-1] # 最后一个 DataFrame
69
+ begin_date = first_df.trade_date + ' 09:20:00'
70
+ end_date = last_df.trade_date + ' 15:00:00'
71
+ fail_dict = {'begin_date': begin_date,
72
+ 'end_date': end_date,
73
+ 'symbol': symbol,
74
+ 'db_name': db_name
75
+ }
76
+ fail_df = pd.DataFrame(fail_dict, index=[1])
77
+ mongodbUtilV2_27019.insert_mongo(fail_df, db_name + '_fail')
78
+
79
+ logger.error("同步数据出现异常:{},{},{},{}", e, symbol, begin_date, end_date)
80
+ logger.info("同步完数据:{},{}", stock_one.symbol, stock_one.name)
81
+
82
+ return etf_real_time_quotes_df
83
+
84
+
85
+ def classify_symbol(debt_real_time_quotes_df):
86
+ debt_real_time_quotes_df['classification'] = debt_real_time_quotes_df['market'].apply(
87
+ lambda market: classify_symbol_one(market))
88
+ return debt_real_time_quotes_df
89
+
90
+
91
+ # 单个股票分类
92
+ def classify_symbol_one(market):
93
+ if market == 0:
94
+ return 'S'
95
+ else:
96
+ return 'H'
97
+
98
+
99
+ if __name__ == '__main__':
100
+ query_trade = {"$and": [{"trade_date": {"$gte": "2025-03-08"}}, {"trade_date": {"$lte": "2025-03-16"}}]}
101
+ trade_date_list_df_all = mongodb_util_27017.find_query_data('trade_date_list', query_trade)
102
+
103
+ sync_etf_one_minute(trade_date_list_df_all)
@@ -0,0 +1,113 @@
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.api.em.east_money_debt_api as east_money_debt_api
10
+ import pandas as pd
11
+ from loguru import logger
12
+ import time
13
+ import mns_common.utils.data_frame_util as data_frame_util
14
+ from mns_common.db.MongodbUtil import MongodbUtil
15
+ import tushare as ts
16
+ from mns_common.db.v2.MongodbUtilV2 import MongodbUtilV2
17
+ import mns_scheduler.extraIncome.one_minute.common.db_create_index as db_create_index
18
+ import mns_common.constant.extra_income_db_name as extra_income_db_name
19
+ mongodb_util_27017 = MongodbUtil('27017')
20
+ mongodbUtilV2_27019 = MongodbUtilV2('27019', extra_income_db_name.EXTRA_INCOME)
21
+ pro = ts.pro_api('782213d20640249f1dbae50a7f56b22684b8e915a61e435e015579a1')
22
+
23
+
24
+ def get_minute_data(symbol, freq, start_date, end_date):
25
+ # 获取浦发银行60000.SH的历史分钟数据
26
+ df = pro.stk_mins(ts_code=symbol, freq=freq, start_date=start_date, end_date=end_date)
27
+ return df
28
+
29
+
30
+ def sync_kzz_one_minute(trade_date_list_df):
31
+ debt_real_time_quotes = east_money_debt_api.get_debt_real_time_quotes()
32
+ debt_real_time_quotes = classify_symbol(debt_real_time_quotes)
33
+ debt_real_time_quotes['symbol'] = debt_real_time_quotes.apply(
34
+ lambda row: row['symbol'] + '.SZ' if row['classification'] in ['S', 'C']
35
+ else row['symbol'] + '.BJ' if row['classification'] in ['X']
36
+ else row['symbol'] + '.SH',
37
+ axis=1
38
+ )
39
+ # 假设数字格式为 YYYYMMDD
40
+ # debt_real_time_quotes['list_date'] = pd.to_datetime(debt_real_time_quotes['list_date'],
41
+ # format='%Y%m%d').dt.strftime('%Y-%m-%d')
42
+
43
+ db_name = extra_income_db_name.ONE_MINUTE_K_LINE_BFQ_KZZ
44
+ db_create_index.create_index(mongodbUtilV2_27019, db_name)
45
+
46
+ for stock_one in debt_real_time_quotes.itertuples():
47
+
48
+ trade_date_list_df_copy = trade_date_list_df.copy()
49
+
50
+ # list_date = stock_one.list_date
51
+ # trade_date_list_df_copy = trade_date_list_df_copy.loc[trade_date_list_df_copy['_id'] >= list_date]
52
+
53
+ symbol = stock_one.symbol
54
+
55
+ for i in range(0, len(trade_date_list_df_copy), 28):
56
+ try:
57
+ new_df = trade_date_list_df_copy.iloc[i:i + 28]
58
+ first_df = new_df.iloc[0] # 第一个 DataFrame
59
+ last_df = new_df.iloc[-1] # 最后一个 DataFrame
60
+ begin_date = first_df.trade_date + ' 09:20:00'
61
+ end_date = last_df.trade_date + ' 15:00:00'
62
+
63
+ df = get_minute_data(symbol, '1min', begin_date, end_date)
64
+ if data_frame_util.is_not_empty(df):
65
+ df = df.rename(columns={
66
+ "trade_time": "time",
67
+ "ts_code": "symbol",
68
+ "vol": "volume",
69
+ })
70
+ df['time_tick'] = df['time'].str[11:19]
71
+ df = df.loc[df['time_tick'] <= '15:00:00']
72
+ del df['time_tick']
73
+ df['_id'] = df['symbol'] + '_' + df['time']
74
+ mongodbUtilV2_27019.insert_mongo(df, db_name)
75
+ except BaseException as e:
76
+ time.sleep(2)
77
+ first_df = new_df.iloc[0] # 第一个 DataFrame
78
+ last_df = new_df.iloc[-1] # 最后一个 DataFrame
79
+ begin_date = first_df.trade_date + ' 09:20:00'
80
+ end_date = last_df.trade_date + ' 15:00:00'
81
+ fail_dict = {'begin_date': begin_date,
82
+ 'end_date': end_date,
83
+ 'symbol': symbol,
84
+ 'db_name': db_name
85
+ }
86
+ fail_df = pd.DataFrame(fail_dict, index=[1])
87
+ mongodbUtilV2_27019.insert_mongo(fail_df, db_name + '_fail')
88
+
89
+ logger.error("同步数据出现异常:{},{},{},{}", e, symbol, begin_date, end_date)
90
+ logger.info("同步完数据:{},{}", stock_one.symbol, stock_one.name)
91
+
92
+ return debt_real_time_quotes
93
+
94
+
95
+ def classify_symbol(debt_real_time_quotes_df):
96
+ debt_real_time_quotes_df['classification'] = debt_real_time_quotes_df['market'].apply(
97
+ lambda market: classify_symbol_one(market))
98
+ return debt_real_time_quotes_df
99
+
100
+
101
+ # 单个股票分类
102
+ def classify_symbol_one(market):
103
+ if market == 0:
104
+ return 'S'
105
+ else:
106
+ return 'H'
107
+
108
+
109
+ if __name__ == '__main__':
110
+ query_trade = {"$and": [{"trade_date": {"$gte": "2025-03-08"}}, {"trade_date": {"$lte": "2025-03-16"}}]}
111
+ trade_date_list_df_all = mongodb_util_27017.find_query_data('trade_date_list', query_trade)
112
+
113
+ sync_kzz_one_minute(trade_date_list_df_all)
@@ -5,40 +5,30 @@ file_path = os.path.abspath(__file__)
5
5
  end = file_path.index('mns') + 16
6
6
  project_path = file_path[0:end]
7
7
  sys.path.append(project_path)
8
- from mns_common.db.MongodbUtil import MongodbUtil
8
+
9
+ import tushare as ts
9
10
  from mns_common.db.v2.MongodbUtilV2 import MongodbUtilV2
10
- import mns_common.api.em.east_money_stock_api as east_money_stock_api
11
+ from mns_common.db.MongodbUtil import MongodbUtil
12
+ import mns_common.component.common_service_fun_api as common_service_fun_api
13
+
11
14
  import pandas as pd
12
15
  from loguru import logger
13
- import mns_common.component.common_service_fun_api as common_service_fun_api
14
16
  import mns_common.utils.data_frame_util as data_frame_util
17
+ import mns_common.api.em.east_money_stock_api as east_money_stock_api
15
18
  import time
16
- import mns_common.api.k_line.stock_minute_data_api as stock_minute_data_api
17
- import mns_common.constant.db_name_constant as db_name_constant
18
19
 
19
20
  mongodb_util_27017 = MongodbUtil('27017')
20
- mongodb_util_27019 = MongodbUtil('27019')
21
- mongodbUtilV2 = MongodbUtilV2('27017', 'extraIncome')
21
+ mongodbUtilV2 = MongodbUtilV2('27019', 'extraIncome')
22
22
 
23
-
24
- def create_index(db_util, db_name):
25
- index_create = [('symbol', 1), ('time', 1)]
26
- db_util.create_index(db_name, index_create)
27
- index_create_01 = [('time', 1)]
28
- db_util.create_index(db_name, index_create_01)
29
- index_create_02 = [('symbol', 1)]
30
- db_util.create_index(db_name, index_create_02)
23
+ pro = ts.pro_api('782213d20640249f1dbae50a7f56b22684b8e915a61e435e015579a1')
31
24
 
32
25
 
33
26
  def get_minute_data(symbol, freq, start_date, end_date):
34
27
  # 获取浦发银行60000.SH的历史分钟数据
35
- df = stock_minute_data_api.get_minute_data(symbol, start_date, end_date, freq,
36
- '')
28
+ df = pro.stk_mins(ts_code=symbol, freq=freq, start_date=start_date, end_date=end_date)
37
29
  return df
38
30
 
39
31
 
40
- # 287
41
-
42
32
  def sync_all_stock(trade_date_list_df):
43
33
  de_list_stock_df = mongodb_util_27017.find_all_data('de_list_stock')
44
34
  de_list_stock_df = common_service_fun_api.classify_symbol(de_list_stock_df)
@@ -60,7 +50,6 @@ def sync_all_stock(trade_date_list_df):
60
50
 
61
51
  # 将日期格式化为字符串(YYYY-MM-DD)
62
52
  real_time_quotes_all_stocks_df['list_date'] = real_time_quotes_all_stocks_df['list_date'].dt.strftime('%Y-%m-%d')
63
-
64
53
  real_time_quotes_all_stocks_df = common_service_fun_api.classify_symbol(real_time_quotes_all_stocks_df)
65
54
 
66
55
  # 对 classification 为 S 或 K 的数据,symbol 列加上 '.SH',其他加上 '.SZ'
@@ -71,24 +60,22 @@ def sync_all_stock(trade_date_list_df):
71
60
  axis=1
72
61
  )
73
62
 
74
- real_time_quotes_all_stocks_df = real_time_quotes_all_stocks_df.sort_values(by=['chg'], ascending=True)
75
-
76
63
  real_time_quotes_all_stocks_df['number'] = real_time_quotes_all_stocks_df['chg'].rank(method='first').astype(int)
77
64
 
78
65
  for stock_one in real_time_quotes_all_stocks_df.itertuples():
79
66
  classification = stock_one.classification
80
67
  if classification == 'X':
81
- db_name = db_name_constant.ONE_MINUTE_K_LINE_BFQ_BJ
68
+ db_name = 'one_minute_k_line_bfq_bj'
82
69
  elif classification == 'S':
83
- db_name = db_name_constant.ONE_MINUTE_K_LINE_BFQ_S
70
+ db_name = 'one_minute_k_line_bfq_s'
71
+
84
72
  elif classification == 'H':
85
73
  db_name = 'one_minute_k_line_bfq_h'
86
74
  elif classification == 'K':
87
75
  db_name = 'one_minute_k_line_bfq_k'
88
76
  elif classification == 'C':
89
77
  db_name = 'one_minute_k_line_bfq_c'
90
- db_name = db_name + '_2025'
91
- create_index(mongodbUtilV2, db_name)
78
+
92
79
  trade_date_list_df_copy = trade_date_list_df.copy()
93
80
 
94
81
  list_date = stock_one.list_date
@@ -107,37 +94,21 @@ def sync_all_stock(trade_date_list_df):
107
94
  new_df = trade_date_list_df_copy.iloc[i:i + 28]
108
95
  first_df = new_df.iloc[0] # 第一个 DataFrame
109
96
  last_df = new_df.iloc[-1] # 最后一个 DataFrame
110
- begin_date = first_df.trade_date + ' 09:30:00'
97
+ begin_date = first_df.trade_date + ' 09:20:00'
111
98
  end_date = last_df.trade_date + ' 15:00:00'
112
99
 
113
- trade_date_list = list(new_df['trade_date'])
114
- if classification in ['K', 'H']:
115
- symbol_quest = '1.' + symbol[0:6]
116
- else:
117
- symbol_quest = '0.' + symbol[0:6]
118
-
119
- df = get_minute_data(symbol_quest, '1', begin_date, end_date)
100
+ df = get_minute_data(symbol, '1min', begin_date, end_date)
120
101
  if data_frame_util.is_not_empty(df):
121
- df['symbol'] = symbol
122
- df = df[[
123
- 'symbol',
124
- "time",
125
- "open",
126
- "close",
127
- "high",
128
- "low",
129
- "amount",
130
- "volume",
131
- ]]
132
- df['str_day'] = df['time'].str[:10] #
133
- df = df.loc[df['str_day'].isin(trade_date_list)]
134
- if data_frame_util.is_not_empty(df):
135
- df['time_tick'] = df['time'].str[11:19]
136
- df = df.loc[df['time_tick'] <= '15:00:00']
137
- del df['time_tick']
138
- del df['str_day']
139
- df['_id'] = df['symbol'] + '_' + df['time']
140
- mongodbUtilV2.insert_mongo(df, db_name)
102
+ df = df.rename(columns={
103
+ "trade_time": "time",
104
+ "ts_code": "symbol",
105
+ "vol": "volume",
106
+ })
107
+ df['time_tick'] = df['time'].str[11:19]
108
+ df = df.loc[df['time_tick'] <= '15:00:00']
109
+ del df['time_tick']
110
+ df['_id'] = df['symbol'] + '_' + df['time']
111
+ mongodbUtilV2.insert_mongo(df, db_name)
141
112
  except BaseException as e:
142
113
  time.sleep(2)
143
114
  first_df = new_df.iloc[0] # 第一个 DataFrame
@@ -150,7 +121,7 @@ def sync_all_stock(trade_date_list_df):
150
121
  'db_name': db_name
151
122
  }
152
123
  fail_df = pd.DataFrame(fail_dict, index=[1])
153
- mongodbUtilV2.insert_mongo(fail_df, 'one_minute_k_line_bfq_fail_2025_03')
124
+ mongodbUtilV2.insert_mongo(fail_df, 'one_minute_k_line_bfq_fail')
154
125
 
155
126
  logger.error("同步数据出现异常:{},{},{},{}", e, symbol, begin_date, end_date)
156
127
  logger.info("同步完数据:{},{}", stock_one.symbol, stock_one.name)
@@ -159,7 +130,7 @@ def sync_all_stock(trade_date_list_df):
159
130
  if __name__ == '__main__':
160
131
  # get_minute_data('833284.BJ', '1min', '2025-02-28 09:30:00', '2025-02-28 15:00:00')
161
132
 
162
- query_trade = {"$and": [{"trade_date": {"$gte": "2025-03-01"}}, {"trade_date": {"$lte": "2025-03-07"}}]}
133
+ query_trade = {"$and": [{"trade_date": {"$gte": "2025-03-08"}}, {"trade_date": {"$lte": "2025-03-16"}}]}
163
134
  trade_date_list_df_all = mongodb_util_27017.find_query_data('trade_date_list', query_trade)
164
135
 
165
136
  sync_all_stock(trade_date_list_df_all)
@@ -0,0 +1,107 @@
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 sys
10
+ import os
11
+
12
+ file_path = os.path.abspath(__file__)
13
+ end = file_path.index('mns') + 16
14
+ project_path = file_path[0:end]
15
+ sys.path.append(project_path)
16
+ import pandas as pd
17
+ from loguru import logger
18
+ import time
19
+ import mns_common.utils.data_frame_util as data_frame_util
20
+ from mns_common.db.MongodbUtil import MongodbUtil
21
+ import tushare as ts
22
+ from mns_common.db.v2.MongodbUtilV2 import MongodbUtilV2
23
+ import mns_scheduler.extraIncome.one_minute.common.db_create_index as db_create_index
24
+
25
+ mongodb_util_27017 = MongodbUtil('27017')
26
+ mongodbUtilV2_27019 = MongodbUtilV2('27019', 'extraIncome')
27
+
28
+ pro = ts.pro_api('782213d20640249f1dbae50a7f56b22684b8e915a61e435e015579a1')
29
+
30
+
31
+ def get_minute_data(symbol, freq, start_date, end_date):
32
+ # 获取浦发银行60000.SH的历史分钟数据
33
+ df = pro.stk_mins(ts_code=symbol, freq=freq, start_date=start_date, end_date=end_date)
34
+ return df
35
+
36
+
37
+ def sync_zhi_shu_one_minute(symbol_list_param, trade_date_list_df):
38
+ db_name = 'one_minute_k_line_bfq_main_index'
39
+ db_create_index.create_index(mongodbUtilV2_27019, db_name)
40
+ for symbol in symbol_list_param:
41
+
42
+ trade_date_list_df_copy = trade_date_list_df.copy()
43
+
44
+ for i in range(0, len(trade_date_list_df_copy), 28):
45
+ try:
46
+ new_df = trade_date_list_df_copy.iloc[i:i + 28]
47
+ first_df = new_df.iloc[0] # 第一个 DataFrame
48
+ last_df = new_df.iloc[-1] # 最后一个 DataFrame
49
+ begin_date = first_df.trade_date + ' 09:20:00'
50
+ end_date = last_df.trade_date + ' 15:00:00'
51
+
52
+ df = get_minute_data(symbol, '1min', begin_date, end_date)
53
+ if data_frame_util.is_not_empty(df):
54
+ df = df.rename(columns={
55
+ "trade_time": "time",
56
+ "ts_code": "symbol",
57
+ "vol": "volume",
58
+ })
59
+ df['time_tick'] = df['time'].str[11:19]
60
+ df = df.loc[df['time_tick'] <= '15:00:00']
61
+ del df['time_tick']
62
+ df['_id'] = df['symbol'] + '_' + df['time']
63
+ mongodbUtilV2_27019.insert_mongo(df, db_name)
64
+ except BaseException as e:
65
+ time.sleep(2)
66
+ first_df = new_df.iloc[0] # 第一个 DataFrame
67
+ last_df = new_df.iloc[-1] # 最后一个 DataFrame
68
+ begin_date = first_df.trade_date + ' 09:20:00'
69
+ end_date = last_df.trade_date + ' 15:00:00'
70
+ fail_dict = {'begin_date': begin_date,
71
+ 'end_date': end_date,
72
+ 'symbol': symbol,
73
+ 'db_name': db_name
74
+ }
75
+ fail_df = pd.DataFrame(fail_dict, index=[1])
76
+ mongodbUtilV2_27019.insert_mongo(fail_df, db_name + '_fail')
77
+
78
+ logger.error("同步数据出现异常:{},{},{},{}", e, symbol, begin_date, end_date)
79
+ logger.info("同步完数据:{}", symbol)
80
+
81
+
82
+ def classify_symbol(debt_real_time_quotes_df):
83
+ debt_real_time_quotes_df['classification'] = debt_real_time_quotes_df['market'].apply(
84
+ lambda market: classify_symbol_one(market))
85
+ return debt_real_time_quotes_df
86
+
87
+
88
+ # 单个股票分类
89
+ def classify_symbol_one(market):
90
+ if market == 0:
91
+ return 'S'
92
+ else:
93
+ return 'H'
94
+
95
+
96
+ if __name__ == '__main__':
97
+ # 文件路径
98
+ file_path = r"H:\data\1min\指数\指数列表.xlsx"
99
+
100
+ df = pd.read_excel(file_path)
101
+ df = df.rename(columns={
102
+ "指数代码": "symbol"
103
+ })
104
+ new_symbol_list = df['symbol']
105
+ query_trade = {"$and": [{"trade_date": {"$gte": "2025-03-08"}}, {"trade_date": {"$lte": "2025-03-16"}}]}
106
+ trade_date_list_df_all = mongodb_util_27017.find_query_data('trade_date_list', query_trade)
107
+ sync_zhi_shu_one_minute(new_symbol_list, trade_date_list_df_all)
@@ -43,12 +43,10 @@ import mns_scheduler.irm.stock_irm_cninfo_service as stock_irm_cninfo_service
43
43
  import mns_scheduler.open.sync_one_day_open_data_to_db_service as sync_one_day_open_data_to_db_service
44
44
  import mns_scheduler.zt.high_chg.sync_high_chg_pool_service as sync_high_chg_pool_service
45
45
  import mns_scheduler.zt.high_chg.sync_high_chg_real_time_quotes_service as sync_high_chg_real_time_quotes_service
46
- import mns_scheduler.risk.self.wei_pan_stock_api as wei_pan_stock_api
47
46
  import mns_scheduler.risk.transactions.transactions_check_api as transactions_check_api
48
47
  import mns_scheduler.concept.ths.sync_new_index.sync_ths_concept_new_index_api as sync_ths_concept_new_index_api
49
48
  import mns_scheduler.company_info.clean.company_info_clean_api as company_info_clean_api
50
49
  import mns_scheduler.zt.zt_pool.ths_zt_pool_sync_api as ths_zt_pool_sync_api
51
- import mns_scheduler.db.real_time_task_check as real_time_task_check_api
52
50
  import mns_scheduler.trade.task.trader_task_service as trader_task_service
53
51
  import mns_scheduler.company_info.remark.company_remark_info_sync as company_remark_info_sync
54
52
  import mns_scheduler.finance.sync_financial_report_service_api as sync_financial_report_service_api
@@ -57,6 +55,8 @@ import mns_scheduler.hk.hk_company_info_sync_service_api as hk_company_info_sync
57
55
  import mns_scheduler.zt.zt_pool.update_null_zt_reason_api as update_null_zt_reason_api
58
56
  import mns_scheduler.trade.tfp.stock_tfp_info_sync as stock_tfp_info_sync
59
57
  import mns_scheduler.industry.ths.ths_industry_sync_service as ths_industry_sync_service
58
+ import mns_scheduler.db.task_handle_service as task_handle_service
59
+ import mns_scheduler.extraIncome.one_minute.one_minute_sync_task as one_minute_sync_task
60
60
 
61
61
 
62
62
  # 同步交易日期任务完成
@@ -348,9 +348,16 @@ def sync_all_interactive_questions():
348
348
  stock_irm_cninfo_service.sync_all_interactive_questions(None)
349
349
 
350
350
 
351
- # 数据同步状态check
352
- def real_time_task_check_status():
353
- real_time_task_check_api.run_check_real_time_data_sync_status()
351
+ # 重开定时任务同步
352
+ def real_time_sync_task_open():
353
+ logger.info("开启实时行情同步任务")
354
+ task_handle_service.real_time_sync_task_open()
355
+
356
+
357
+ # 关闭实时行情任务
358
+ def real_time_sync_task_close():
359
+ logger.info("关闭实时行情同步任务")
360
+ task_handle_service.real_time_sync_task_close()
354
361
 
355
362
 
356
363
  # 打开交易客户端
@@ -412,6 +419,11 @@ def sync_ths_industry_info():
412
419
  logger.info("同步同花顺行业信息完成")
413
420
 
414
421
 
422
+ def sync_one_minute_data():
423
+ logger.info("同步1分钟交易数据")
424
+ one_minute_sync_task.sync_one_minute_data()
425
+
426
+
415
427
  # # 定义BlockingScheduler
416
428
  blockingScheduler = BlockingScheduler()
417
429
  # sync_trade_date 同步交易日期
@@ -525,8 +537,17 @@ blockingScheduler.add_job(sync_all_interactive_questions, 'cron', hour='08,12,17
525
537
  # max_instances=4
526
538
  # )
527
539
 
528
- # 实时数据状态同步check,使用 'cron' 触发器来限制任务在 9 点到 15 点之间执行 1分钟check一次
529
- blockingScheduler.add_job(real_time_task_check_status, 'cron', hour='9-15', minute='*/2', max_instances=4)
540
+ # 重开定时任务同步
541
+
542
+ blockingScheduler.add_job(real_time_sync_task_open, 'cron', hour='09', minute='25')
543
+ blockingScheduler.add_job(real_time_sync_task_open, 'cron', hour='09', minute='29')
544
+ blockingScheduler.add_job(real_time_sync_task_open, 'cron', hour='12', minute='59')
545
+ # 关闭实时行情任务
546
+
547
+ blockingScheduler.add_job(real_time_sync_task_close, 'cron', hour='09', minute='27')
548
+ blockingScheduler.add_job(real_time_sync_task_close, 'cron', hour='11', minute='31')
549
+ blockingScheduler.add_job(real_time_sync_task_close, 'cron', hour='15', minute='01')
550
+
530
551
  # 打开交易客户端
531
552
  blockingScheduler.add_job(trader_client_auto_login, 'cron', hour='08,12', minute='30')
532
553
  # 同步公司备注信息
@@ -544,6 +565,9 @@ blockingScheduler.add_job(update_null_zt_reason, 'cron', hour='16,17,18,19,20,21
544
565
  # 同步同花顺行业信息
545
566
  blockingScheduler.add_job(sync_ths_industry_info, 'cron', hour='17,22', minute='38')
546
567
 
568
+ # 同步一分钟交易数据
569
+ blockingScheduler.add_job(sync_one_minute_data, 'cron', hour='17,22', minute='55')
570
+
547
571
  # 同步新公告信息 感觉没有必要同步 直接连接过去查看
548
572
  # blockingScheduler.add_job(sync_company_announce, 'cron', hour='07,18,23', minute='33')
549
573
 
@@ -1,4 +1,4 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mns-scheduler
3
- Version: 1.2.7.2
3
+ Version: 1.2.7.4
4
4
 
@@ -33,7 +33,8 @@ mns_scheduler/concept/ths/update_concept_info/sync_one_symbol_all_concepts_api.p
33
33
  mns_scheduler/db/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
34
34
  mns_scheduler/db/col_move_service.py,sha256=9pOrHJ6rQuMPQdGFho1IJMEy2xvpQ20iku3p20MuAhg,4238
35
35
  mns_scheduler/db/db_status.py,sha256=e5eW5ZSm5J7tHvmxxhFmFdbZb2_oB_SAcdcFqc4KDmw,733
36
- mns_scheduler/db/real_time_task_check.py,sha256=PpcMzxeN6SHLFue49sYcZXy_1Qv45U2pbzzsHpmz9h8,5048
36
+ mns_scheduler/db/real_time_task_check.py,sha256=OrzDWPgzC40-Hbw5hUlcrwNRHNmI0uNS6ZHlFcz9e_g,5036
37
+ mns_scheduler/db/task_handle_service.py,sha256=BUDMyCjQ7Rggta_ockmd1bfF16flPZO8voTyRyeDIUE,2252
37
38
  mns_scheduler/db/script/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
38
39
  mns_scheduler/db/script/col_move_script.py,sha256=0WNv0xbnPPKTME2_WMEPSGNT0DUWC7hS4mJ2VeNgc08,1163
39
40
  mns_scheduler/db/script/db_move/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
@@ -51,11 +52,24 @@ mns_scheduler/debt/kzz_bond_info_sync.py,sha256=3o0Y4FBxP3AOXwf7Z7jVO1N_DcqxeOVq
51
52
  mns_scheduler/dt/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
52
53
  mns_scheduler/dt/stock_dt_pool_sync.py,sha256=5ivRUOnFtOapZniwTbujf1lVq3y4btm2Cmd5R6JJAVo,3466
53
54
  mns_scheduler/extraIncome/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
54
- mns_scheduler/extraIncome/etf/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
55
- mns_scheduler/extraIncome/kzz/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
56
- mns_scheduler/extraIncome/stock/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
57
- mns_scheduler/extraIncome/stock/one_minute_k_line_sync.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
58
- mns_scheduler/extraIncome/stock/sync_stock_one_minute_now_api.py,sha256=yb8Ox4WMGdxDPnLrE4y_rpq19pj_sdZ3Nw8XwUGsvdk,7593
55
+ mns_scheduler/extraIncome/one_minute/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
56
+ mns_scheduler/extraIncome/one_minute/one_minute_sync_task.py,sha256=qw09DyhYRqWO4U48T3CiIikhCBTOEZ7Y1nkAoBKWgKw,1557
57
+ mns_scheduler/extraIncome/one_minute/common/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
58
+ mns_scheduler/extraIncome/one_minute/common/db_create_index.py,sha256=WhCAaLNrrc4nuGpa_GW6qrWyml6I-Fk4E2jJRSbUUZw,323
59
+ mns_scheduler/extraIncome/one_minute/common/symbol_handle_util.py,sha256=W5BbmAghEXag7yv6Cwdi0augJww2uMbHn0Z7mUW7O9Y,1275
60
+ mns_scheduler/extraIncome/one_minute/etf/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
61
+ mns_scheduler/extraIncome/one_minute/etf/etf_one_minute_sync_task.py,sha256=Gd13DHmUagvxC8dJ5vfh4R98QwO2kRrrjj76iw18Yuc,3682
62
+ mns_scheduler/extraIncome/one_minute/index/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
63
+ mns_scheduler/extraIncome/one_minute/index/main_index_sync_task.py,sha256=xWrTLDrP93S6EkTaCDtymrc65eAwOsKb1fuWAKd7EMA,2631
64
+ mns_scheduler/extraIncome/one_minute/kzz/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
65
+ mns_scheduler/extraIncome/one_minute/kzz/kzz_one_minute_sync_task.py,sha256=dEb8k1_7rqd14xO45agALHz1nmTrPj-NzOlif9NHmeQ,3691
66
+ mns_scheduler/extraIncome/one_minute/stock/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
67
+ mns_scheduler/extraIncome/one_minute/stock/stock_one_minute_sync_task.py,sha256=xP6KHUR0LLjU8-Hs00UiyWuPnnJgwvY0SKYKewdlzyc,4576
68
+ mns_scheduler/extraIncome/temp/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
69
+ mns_scheduler/extraIncome/temp/tu_share_data_etf_sync.py,sha256=XBsLl4o1Ras1zUQBkJ2BAgWtPebqAf9VUu_kLEisGmQ,4464
70
+ mns_scheduler/extraIncome/temp/tu_share_data_kzz_sync.py,sha256=A2Aa4TB2mgTHiDlW9_UpB0mdRCR_1sOTaPZKs-IBbXc,4850
71
+ mns_scheduler/extraIncome/temp/tu_share_data_stock_sync.py,sha256=s3KufWFevrnoCRfAWfOgLCqbBAbhueQelG-2Dy016cY,6248
72
+ mns_scheduler/extraIncome/temp/tu_share_zhi_shu_sync_api.py,sha256=sAvfsIObHWsapgJP8o2YTL4D1XZiWa2tGguM6B6bgyQ,4169
59
73
  mns_scheduler/finance/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
60
74
  mns_scheduler/finance/em_financial_asset_liability_sync_service_api.py,sha256=kEZQZkxB7RF7UPH4DmHoRWfEKgI61ZN8BcNOzmBUoV0,19417
61
75
  mns_scheduler/finance/em_financial_profit_sync_service_api.py,sha256=A_ONxC-1giGUWUhMJG1fE6jem52uJYtzlewzxPZtdd0,14270
@@ -160,8 +174,8 @@ mns_scheduler/zt/zt_pool/em_zt_pool_sync_api.py,sha256=A5YiAWYdbAxhlTTJ8pOStZrBb
160
174
  mns_scheduler/zt/zt_pool/ths_zt_pool_sync_api.py,sha256=3OGBmWEX6G-fTuONgoB6Lu5xX0JNaWiP5FWMHIlIf-Y,10647
161
175
  mns_scheduler/zt/zt_pool/update_null_zt_reason_api.py,sha256=1uoiR2Uw46kDfjkvNg2US5rd_4OIkYO3872gIJOufUY,2135
162
176
  mns_scheduler/zz_task/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
163
- mns_scheduler/zz_task/data_sync_task.py,sha256=Mrpa6gCwJBXLfvM8YT1pCovI5Va_KPjyMoRuCcQ01pw,22705
164
- mns_scheduler-1.2.7.2.dist-info/METADATA,sha256=xLPy1-TcDlunOmLMc7IqSbqNcy9gC1KTmGI2s6j-k1Y,64
165
- mns_scheduler-1.2.7.2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
166
- mns_scheduler-1.2.7.2.dist-info/top_level.txt,sha256=PXQDFBGR1pWmsUbH5yiLAh71P5HZODTRED0zJ8CCgOc,14
167
- mns_scheduler-1.2.7.2.dist-info/RECORD,,
177
+ mns_scheduler/zz_task/data_sync_task.py,sha256=MA2RfrM_neT3ElejjF34XXq3fUA8B01lVyJBuOHOYrc,23507
178
+ mns_scheduler-1.2.7.4.dist-info/METADATA,sha256=xh4o3ZVd_CCVuMkMfOA8ZFma3D-xa4L4m7Tq2MrKMrk,64
179
+ mns_scheduler-1.2.7.4.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
180
+ mns_scheduler-1.2.7.4.dist-info/top_level.txt,sha256=PXQDFBGR1pWmsUbH5yiLAh71P5HZODTRED0zJ8CCgOc,14
181
+ mns_scheduler-1.2.7.4.dist-info/RECORD,,