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

@@ -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') + 17
5
+ end = file_path.index('mns') + 16
6
6
  project_path = file_path[0:end]
7
- sys.path.append(project_path)
7
+ sys.path.append(project_path)
@@ -0,0 +1,144 @@
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
+ from mns_common.component.exception.ExceptionMonitor import exception_counter
17
+ import mns_common.api.msg.push_msg_api as push_msg_api
18
+ import numpy as np
19
+ import mns_common.utils.data_frame_util as data_frame_util
20
+ from loguru import logger
21
+
22
+ source_type = 'xue_qiu'
23
+ # source_type = 'em'
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
+ def get_k_line_common_adapter(symbol, period, hq, end_date):
33
+ global error_no
34
+ df = pd.DataFrame()
35
+ try:
36
+ if source_type == 'em':
37
+ df = get_em_k_line_api(symbol, period, hq, end_date)
38
+ elif source_type == 'xue_qiu':
39
+ df = get_xueqiu_k_line_api(symbol, period, hq, end_date)
40
+ if data_frame_util.is_empty(df):
41
+ error_no = error_no + 1
42
+ except BaseException as e:
43
+ logger.error("获取k线异常:{}", e)
44
+ error_no = error_no + 1
45
+ if error_no == 1000:
46
+ push_msg_api.push_msg_to_wechat('获取k线数据异常', "当前次数:" + str(error_no))
47
+ return df
48
+
49
+
50
+ # 应用带参数的装饰器
51
+ # @exception_counter(
52
+ # threshold=1500,
53
+ # alert_handler=custom_alert,
54
+ # auto_reset=False
55
+ # )
56
+ def get_em_k_line_api(symbol, period, hq, end_date):
57
+ # 检查symbol是否以'6'开头
58
+ if symbol.startswith('6'):
59
+ symbol_a = '1.' + symbol
60
+ else:
61
+ symbol_a = '0.' + symbol
62
+ stock_hfq_df = k_line_api.stock_zh_a_hist(symbol=symbol_a,
63
+ period=period,
64
+ start_date=date_handle_util.no_slash_date('1990-12-19'),
65
+ end_date=date_handle_util.no_slash_date(end_date),
66
+ adjust=hq)
67
+
68
+ stock_hfq_df.rename(columns={"日期": "date", "开盘": "open",
69
+ "收盘": "close", "最高": "high",
70
+ "最低": "low", "成交量": "volume",
71
+ "成交额": "amount", "振幅": "pct_chg",
72
+ "涨跌幅": "chg", "涨跌额": "change",
73
+ "换手率": "exchange"}, inplace=True)
74
+ stock_hfq_df['symbol'] = symbol
75
+ stock_hfq_df['_id'] = symbol + '-' + stock_hfq_df['date']
76
+ return stock_hfq_df
77
+
78
+
79
+ # period : year quarter month week day
80
+ # hq: qfq:before ,hfq:after, bfq:normal
81
+
82
+ def get_xueqiu_k_line_api(symbol, period, hq, end_date):
83
+ if hq == 'qfq':
84
+ adjust = 'before'
85
+ elif hq == 'hfq':
86
+ adjust = 'after'
87
+ else:
88
+ adjust = 'normal'
89
+
90
+ period_time = 'day'
91
+ if period == 'daily':
92
+ period_time = 'day'
93
+ elif period == 'weekly':
94
+ period_time = 'week'
95
+ elif period == 'monthly':
96
+ period_time = 'month'
97
+
98
+ cookie = cookie_info_service.get_xue_qiu_cookie()
99
+ symbol_pre_fix = common_service_fun_api.add_pre_prefix_one(symbol)
100
+ dt = datetime.strptime(end_date, '%Y-%m-%d')
101
+ dt += timedelta(days=1)
102
+ timestamp = str(int(dt.timestamp() * 1000)) # 转换为毫秒
103
+ stock_k_line_df = xue_qiu_k_line_api.get_xue_qiu_k_line(symbol_pre_fix, period_time,
104
+ cookie, timestamp, adjust)
105
+
106
+ stock_k_line_df['pct_chg'] = round(abs(stock_k_line_df['high'] - stock_k_line_df['low'] / stock_k_line_df['high']),
107
+ 2)
108
+ stock_k_line_df.rename(columns={"chg": "change",
109
+ "percent": "chg",
110
+ "str_day": "date",
111
+ "market_capital": "flow_mv",
112
+ "turnoverrate": "exchange"}, inplace=True)
113
+ stock_k_line_df = stock_k_line_df[[
114
+ "date",
115
+ "open",
116
+ "close",
117
+ "high",
118
+ "low",
119
+ "volume",
120
+ "amount",
121
+ "pct_chg",
122
+ "chg",
123
+ "change",
124
+ "exchange"
125
+ ]]
126
+ stock_k_line_df['symbol'] = symbol
127
+ stock_k_line_df['date'] = stock_k_line_df['date'].str.replace('-', '')
128
+ stock_k_line_df['_id'] = symbol + '-' + stock_k_line_df['date']
129
+ stock_k_line_df['last_price'] = round(((stock_k_line_df['close']) / (1 + stock_k_line_df['chg'] / 100)), 2)
130
+ stock_k_line_df['max_chg'] = round(
131
+ ((stock_k_line_df['high'] - stock_k_line_df['last_price']) / stock_k_line_df['last_price']) * 100, 2)
132
+ stock_k_line_df['amount_level'] = round((stock_k_line_df['amount'] / common_service_fun_api.HUNDRED_MILLION), 2)
133
+ stock_k_line_df['flow_mv'] = round(stock_k_line_df['amount'] * 100 / stock_k_line_df['exchange'], 2)
134
+ stock_k_line_df['flow_mv_sp'] = round(stock_k_line_df['flow_mv'] / common_service_fun_api.HUNDRED_MILLION, 2)
135
+
136
+ stock_k_line_df.replace([np.inf, -np.inf], 0, inplace=True)
137
+ stock_k_line_df.fillna(0, inplace=True)
138
+ return stock_k_line_df
139
+
140
+
141
+ if __name__ == '__main__':
142
+ while True:
143
+ test_df = get_k_line_common_adapter('000001', 'day', 'qfq', '2025-05-25')
144
+ print(test_df)
@@ -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",
@@ -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',
@@ -19,13 +19,14 @@ def sync_now_day_high_chg():
19
19
  real_time_quotes_now_es = em_stock_info_api.get_a_stock_info()
20
20
  real_time_quotes_now_es_high_chg = real_time_quotes_now_es.loc[
21
21
  real_time_quotes_now_es['chg'] > common_service_fun_api.ZT_CHG]
22
+ now_date = datetime.now()
23
+
24
+ str_now_day = now_date.strftime('%Y-%m-%d')
22
25
  # 同步qfq k线
23
- daily_week_month_line_sync.sync_all_daily_data('daily', 'qfq', 'stock_qfq_daily', None,
26
+ daily_week_month_line_sync.sync_all_daily_data('daily', 'qfq', 'stock_qfq_daily', str_now_day,
24
27
  list(real_time_quotes_now_es_high_chg['symbol']))
25
28
 
26
- now_date = datetime.now()
27
29
 
28
- str_now_day = now_date.strftime('%Y-%m-%d')
29
30
  # 同步当前涨停
30
31
  em_zt_pool_sync_api.save_zt_info(str_now_day)
31
32
 
@@ -13,11 +13,12 @@ import mns_common.component.em.em_stock_info_api as em_stock_info_api
13
13
  import mns_common.component.company.company_common_service_new_api as company_common_service_new_api
14
14
  import mns_common.component.common_service_fun_api as common_service_fun_api
15
15
  from loguru import logger
16
+ import mns_scheduler.k_line.common.k_line_common_api as k_line_common_api
16
17
  import mns_common.api.akshare.k_line_api as k_line_api
17
18
  import mns_common.utils.date_handle_util as date_handle_util
18
19
  from mns_common.db.MongodbUtil import MongodbUtil
19
20
  import mns_common.constant.db_name_constant as db_name_constant
20
- import time
21
+ import mns_scheduler.k_line.common.k_line_common_api as k_line_common_api
21
22
 
22
23
  mongodb_util = MongodbUtil('27017')
23
24
 
@@ -32,56 +33,14 @@ def ths_zt_pool(str_day, real_time_quotes_all_stocks):
32
33
  now_date = datetime.now()
33
34
  now_day_str_day = now_date.strftime('%Y-%m-%d')
34
35
  ths_zt_pool_df = ths_stock_zt_pool_api.get_zt_reason(str_day)
35
- if data_frame_util.is_empty(ths_zt_pool_df):
36
+ ths_zt_pool_df_copy = ths_zt_pool_df.copy()
37
+
38
+ if data_frame_util.is_empty(ths_zt_pool_df_copy):
36
39
  return pd.DataFrame()
37
40
  if str_day == now_day_str_day:
38
- ths_zt_pool_df = merge_now_day_zt_info(ths_zt_pool_df, real_time_quotes_all_stocks)
41
+ ths_zt_pool_df = merge_his_day_zt_info(ths_zt_pool_df_copy, str_day)
39
42
  else:
40
- ths_zt_pool_df = merge_his_day_zt_info(ths_zt_pool_df, str_day)
41
-
42
- return ths_zt_pool_df
43
-
44
-
45
- def merge_now_day_zt_info(ths_zt_pool_df, real_time_quotes_all_stocks):
46
- if real_time_quotes_all_stocks is None:
47
- real_time_quotes_all_stocks = em_stock_info_api.get_a_stock_info()
48
- real_time_quotes_all_stocks = real_time_quotes_all_stocks[['symbol', 'amount',
49
- 'exchange', 'flow_mv', 'total_mv']]
50
- real_time_quotes_all_stocks_zt = real_time_quotes_all_stocks.loc[
51
- real_time_quotes_all_stocks['symbol'].isin(ths_zt_pool_df['symbol'])]
52
-
53
- query_field = {
54
- "ths_concept_name": 1,
55
- "ths_concept_code": 1,
56
- "ths_concept_sync_day": 1,
57
- "company_type": 1,
58
- "concept_create_day": 1,
59
- "first_sw_industry": 1,
60
- "third_sw_industry": 1,
61
- "industry": 1,
62
- "list_date": 1,
63
- }
64
- query_field_key = str(query_field)
65
- query_key = str({'symbol': {"$in": list(ths_zt_pool_df['symbol'])}})
66
- company_df_zt = company_common_service_new_api.get_company_info_by_field(query_key, query_field_key)
67
-
68
- company_df_zt = company_df_zt.set_index(['_id'], drop=True)
69
- real_time_quotes_all_stocks_zt = real_time_quotes_all_stocks_zt.set_index(['symbol'], drop=True)
70
- ths_zt_pool_df = ths_zt_pool_df.set_index(['symbol'], drop=False)
71
-
72
- ths_zt_pool_df = pd.merge(ths_zt_pool_df, company_df_zt, how='outer',
73
- left_index=True, right_index=True)
74
-
75
- ths_zt_pool_df = pd.merge(ths_zt_pool_df, real_time_quotes_all_stocks_zt, how='outer',
76
- left_index=True, right_index=True)
77
- ths_zt_pool_df['amount_level'] = round(ths_zt_pool_df['amount'] / common_service_fun_api.HUNDRED_MILLION, 2)
78
- ths_zt_pool_df = common_service_fun_api.classify_symbol(ths_zt_pool_df)
79
- ths_zt_pool_df = common_service_fun_api.total_mv_classification(ths_zt_pool_df)
80
- ths_zt_pool_df.fillna('', inplace=True)
81
- if 'zt_flag' in ths_zt_pool_df.columns:
82
- del ths_zt_pool_df['zt_flag']
83
- if 'zt_tag' in ths_zt_pool_df.columns:
84
- del ths_zt_pool_df['zt_tag']
43
+ ths_zt_pool_df = merge_his_day_zt_info(ths_zt_pool_df_copy, str_day)
85
44
 
86
45
  return ths_zt_pool_df
87
46
 
@@ -142,40 +101,33 @@ def merge_his_day_zt_info(ths_zt_pool_df, str_day):
142
101
  def get_bfq_daily_line(ths_zt_pool_df, str_day):
143
102
  query_k_line = {'symbol': {"$in": list(ths_zt_pool_df['symbol'])}, 'date': date_handle_util.no_slash_date(str_day)}
144
103
  bfq_daily_line_df = mongodb_util.find_query_data('stock_bfq_daily', query_k_line)
145
- if data_frame_util.is_not_empty(bfq_daily_line_df):
104
+ if bfq_daily_line_df.shape[0] < ths_zt_pool_df.shape[0]:
146
105
  bfq_daily_line_df = bfq_daily_line_df[['amount', 'chg', 'close', 'exchange',
147
106
  'symbol', 'amount_level',
148
107
  'flow_mv', 'flow_mv_sp'
149
108
  ]]
150
109
  bfq_daily_line_df = bfq_daily_line_df.rename(columns={"close": 'now_price'})
151
110
  return bfq_daily_line_df
152
-
153
- bfq_k_line_df = pd.DataFrame()
154
- for zt_one in ths_zt_pool_df.itertuples():
155
- try:
111
+ else:
112
+ bfq_k_line_df = pd.DataFrame()
113
+ for zt_one in ths_zt_pool_df.itertuples():
156
114
  symbol = zt_one.symbol
157
- # 检查symbol是否以'6'开头
158
- if symbol.startswith('6'):
159
- symbol_a = '1.' + symbol
160
- else:
161
- symbol_a = '0.' + symbol
162
- bfq_daily_line_df = k_line_api.stock_zh_a_hist(symbol_a,
163
- 'daily',
164
- date_handle_util.no_slash_date(str_day),
165
- date_handle_util.no_slash_date(str_day),
166
- '')
167
- if data_frame_util.is_empty(bfq_daily_line_df):
168
- continue
169
- bfq_daily_line_df = bfq_daily_line_df[['amount', 'chg', 'close', 'exchange',
170
- 'symbol', 'amount_level',
171
- 'flow_mv', 'flow_mv_sp'
172
- ]]
173
- bfq_daily_line_df = bfq_daily_line_df.rename(columns={"close": 'now_price'})
174
- bfq_k_line_df = pd.concat([bfq_k_line_df, bfq_daily_line_df])
175
- except BaseException as e:
176
- logger.warning("同步不复权k线异常:{},{}", symbol, e)
177
-
178
- return bfq_k_line_df
115
+ try:
116
+
117
+ bfq_daily_line_df = k_line_common_api.get_k_line_common_adapter(symbol, 'daily', '', str_day)
118
+
119
+ if data_frame_util.is_empty(bfq_daily_line_df):
120
+ continue
121
+ bfq_daily_line_df = bfq_daily_line_df[['amount', 'chg', 'close', 'exchange',
122
+ 'symbol', 'amount_level',
123
+ 'flow_mv', 'flow_mv_sp'
124
+ ]]
125
+ bfq_daily_line_df = bfq_daily_line_df.rename(columns={"close": 'now_price'})
126
+ bfq_k_line_df = pd.concat([bfq_k_line_df, bfq_daily_line_df])
127
+ except BaseException as e:
128
+ logger.warning("同步不复权k线异常:{},{}", symbol, e)
129
+ bfq_k_line_df = bfq_k_line_df.loc[bfq_k_line_df['date'] == date_handle_util.no_slash_date(str_day)]
130
+ return bfq_k_line_df
179
131
 
180
132
 
181
133
  def save_ths_zt_pool(ths_zt_pool_df, str_day):
@@ -236,5 +188,6 @@ if __name__ == '__main__':
236
188
  # zt_df = ths_zt_pool(trade_date, None)
237
189
  # save_ths_zt_pool(zt_df, trade_date)
238
190
  trade_date = '2025-04-18'
239
- ths_zt_pool_df = ths_zt_pool(trade_date, None)
240
- save_ths_zt_pool(ths_zt_pool_df, trade_date)
191
+ ths_zt_pool_df_test = ths_zt_pool(trade_date, None)
192
+ get_bfq_daily_line(ths_zt_pool_df_test, trade_date)
193
+ save_ths_zt_pool(ths_zt_pool_df_test, trade_date)
@@ -96,7 +96,7 @@ def stock_sync_qfq_weekly():
96
96
  str_now_date = now_date.strftime('%Y-%m-%d')
97
97
  if date_handle_util.last_day_of_week(now_date):
98
98
  logger.info('同步每周行情数据(前复权):' + str_now_date)
99
- daily_week_month_line_sync_api.sync_all_daily_data('weekly', 'qfq', 'stock_qfq_weekly', None)
99
+ daily_week_month_line_sync_api.sync_all_daily_data('weekly', 'qfq', 'stock_qfq_weekly', str_now_date)
100
100
 
101
101
 
102
102
  # # 定时同步每周交易行情数据(前复权)
@@ -106,7 +106,7 @@ def stock_sync_qfq_monthly():
106
106
  if date_handle_util.last_day_month(now_date):
107
107
  logger.info('同步每周行情数据(前复权):' + str_now_date)
108
108
  daily_week_month_line_sync_api.sync_all_daily_data('monthly', 'qfq', 'stock_qfq_monthly',
109
- None)
109
+ str_now_date)
110
110
 
111
111
 
112
112
  # 当天实时数据备份
@@ -138,7 +138,7 @@ def stock_daily_sync_qfq():
138
138
  str_now_date = now_date.strftime('%Y-%m-%d')
139
139
  logger.info('同步每日行情数据(前复权):' + str_now_date)
140
140
  daily_week_month_line_sync_api.sync_all_daily_data('daily',
141
- 'qfq', 'stock_qfq_daily', None)
141
+ 'qfq', 'stock_qfq_daily', str_now_date)
142
142
 
143
143
 
144
144
  # 同步当日k c x 高涨幅数据
@@ -1,4 +1,4 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mns-scheduler
3
- Version: 1.3.2.4
3
+ Version: 1.3.2.6
4
4
 
@@ -78,15 +78,17 @@ mns_scheduler/k_line/clean/daily/daily_k_line_service.py,sha256=1S-6sih0KptZEWYB
78
78
  mns_scheduler/k_line/clean/week_month/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
79
79
  mns_scheduler/k_line/clean/week_month/normal_week_month_k_line_service.py,sha256=n2osY8dozHClIlSOE7NR6S_oK_8GV-z72Az13D3fhCQ,10160
80
80
  mns_scheduler/k_line/clean/week_month/sub_new_week_month_k_line_service.py,sha256=0rc2Rz_EoqoqpVvgPe4daCe09JtHBlJsQr1bMIlBQ2o,5526
81
+ mns_scheduler/k_line/common/__init__.py,sha256=itoGlqKhsx7EVXQoD1vchDKQ5GPB16vDjofTSuQtrXg,161
82
+ mns_scheduler/k_line/common/k_line_common_api.py,sha256=GL4smDLzFljT-l8XiFKKpJEw8qhujbfZVmnsKa2VhSo,5808
81
83
  mns_scheduler/k_line/hot_stocks/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
82
84
  mns_scheduler/k_line/hot_stocks/recent_hot_stocks_clean_service.py,sha256=8woZzGVORYX9KZr6xtfiYYgApDKissnzYM6hS2k6XBA,2628
83
85
  mns_scheduler/k_line/month_week_daily/__init__.py,sha256=ffZXFCLFdIwOsbxnw__u1MbQYh9yz7Bs8UMP6VF0X2M,161
84
- mns_scheduler/k_line/month_week_daily/bfq_k_line_sync.py,sha256=nfkJj9NR2XCt1Op5FWXo_zOPA8lWkaQ0q0dxF-hMXrY,4200
85
- mns_scheduler/k_line/month_week_daily/daily_week_month_line_sync.py,sha256=WAznTr6AZOqukz_gJJ745fuWtoJulEBEAg_pJUSRryk,6008
86
+ mns_scheduler/k_line/month_week_daily/bfq_k_line_sync.py,sha256=ccHC9W3tQsZJI6BEpeH5DJ_Zvb6PZb5hYgF_OlGM-14,2668
87
+ mns_scheduler/k_line/month_week_daily/daily_week_month_line_sync.py,sha256=3wSsF026C4MyeUBdb7aQz2aqVTsvxKe1cnPqouSdXtY,5611
86
88
  mns_scheduler/k_line/test/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
87
89
  mns_scheduler/k_line/test/k_line_info_clean_his_data.py,sha256=eWtzWL1geX5rrwfrlvDCuaTvy1CI9Zgk7CC4zlsncD4,1663
88
90
  mns_scheduler/k_line/year_quarter/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
89
- mns_scheduler/k_line/year_quarter/year_quarter_line_sync.py,sha256=6d5XIy2lMaOA-pGp68IvYM8zChLi3jO0WkrGlIF-dc0,2751
91
+ mns_scheduler/k_line/year_quarter/year_quarter_line_sync.py,sha256=XjugLj0nzzp6ZHNjZW5zAWud1Sd6zgJaIwJtMCgiAko,3286
90
92
  mns_scheduler/kpl/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
91
93
  mns_scheduler/kpl/selection/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
92
94
  mns_scheduler/kpl/selection/index/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
@@ -131,10 +133,6 @@ mns_scheduler/trade/task/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImy
131
133
  mns_scheduler/trade/task/trader_task_service.py,sha256=YQst2m0MWLnQ7FceCL5EkCEN-Ry7lw_ZTZm6DJdOIQc,1560
132
134
  mns_scheduler/trade/tfp/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
133
135
  mns_scheduler/trade/tfp/stock_tfp_info_sync.py,sha256=ViAVG-1GWLkRxiSBPLIfNICZRnpNZ3mHf44R7X7O4IE,2440
134
- mns_scheduler/us/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
135
- mns_scheduler/us/baidu_yun_pan_handle_service.py,sha256=T0BHGKgQUqJcJ0p6wFFexbi7-K4YfkdDAC3NZDzdM-s,2730
136
- mns_scheduler/us/k_line.py,sha256=0F6IR1WCtREGFjLfL6Mcu5gAhNY2yaAshRlXTUE-0Sg,4100
137
- mns_scheduler/us/us_company_info_sync_service_api.py,sha256=IRmg9Qq71Zyu_0lnU7hOZ7xjg7DnFqTwecfXHEGzJp8,1227
138
136
  mns_scheduler/zb/__init__.py,sha256=Tyvi_iQlv3jz59EdH67Mycnt9CSixcWPQoJwu55bOq0,165
139
137
  mns_scheduler/zb/stock_zb_pool_sync.py,sha256=YXXmofkOsXxTQSUboy7AfEQUeszXVop5oZxLKBqQpJE,1272
140
138
  mns_scheduler/zt/__init__.py,sha256=Rzolrn2R5RZIj-eOmu9KcL6oZBY9Wjz_uBFXPlzirQc,1641
@@ -151,14 +149,14 @@ mns_scheduler/zt/script/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy
151
149
  mns_scheduler/zt/script/fix_error_deal_day.py,sha256=7GrCfI_XCq5G69_17JS5i4FE0l3pwWVkL-ZnqmH5FVA,1624
152
150
  mns_scheduler/zt/script/kcx_high_chg_open_his_data_handle.py,sha256=1pm16xy_DHgd_hAyiQwwg7A88QkemwK_TTcCIxkBP-A,5571
153
151
  mns_scheduler/zt/script/sync_high_chg_pool_his_data.py,sha256=xzfjlwNqsiDQqkTTmaLlFRG0WwkOSYDI-1mw38Z_hNc,1685
154
- mns_scheduler/zt/script/sync_now_higt_chg_zt.py,sha256=cArTHjZmnGJFEO6kAnva8rVOg9mV3vHIuwS-zg3BobM,1844
152
+ mns_scheduler/zt/script/sync_now_higt_chg_zt.py,sha256=7qUtn58ty9Vc6kY33BooCDIOojDGmSf9U5ncAtZt4cc,1853
155
153
  mns_scheduler/zt/zt_pool/__init__.py,sha256=Tyvi_iQlv3jz59EdH67Mycnt9CSixcWPQoJwu55bOq0,165
156
154
  mns_scheduler/zt/zt_pool/em_zt_pool_sync_api.py,sha256=LOEUyTA5g7N6FWxUpHWimWTeXiiMAnUdsYqhG4HpuOY,12154
157
- mns_scheduler/zt/zt_pool/ths_zt_pool_sync_api.py,sha256=u0IvwPuI2hnjTOrwwe8EhBAMv8NbQTENpRbb-_5lDlM,9803
155
+ mns_scheduler/zt/zt_pool/ths_zt_pool_sync_api.py,sha256=PLtk2BAxRudq9APPZIs4UVm8WmhXUzLlDF9_N_DYeqI,7635
158
156
  mns_scheduler/zt/zt_pool/update_null_zt_reason_api.py,sha256=caW-MuF0RFLavJZafeLDYQ29-GxwGsmr5YVrN4lost8,2135
159
157
  mns_scheduler/zz_task/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
160
- mns_scheduler/zz_task/data_sync_task.py,sha256=Obr_9PizkU4BGTq00WjZHV8xAWTXPUKpopn5yBzTAWM,23126
161
- mns_scheduler-1.3.2.4.dist-info/METADATA,sha256=LG5wTtzEITHbO6oO1TgFhtmhWP5KvbNThBb6Q0vrbl4,64
162
- mns_scheduler-1.3.2.4.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
163
- mns_scheduler-1.3.2.4.dist-info/top_level.txt,sha256=PXQDFBGR1pWmsUbH5yiLAh71P5HZODTRED0zJ8CCgOc,14
164
- mns_scheduler-1.3.2.4.dist-info/RECORD,,
158
+ mns_scheduler/zz_task/data_sync_task.py,sha256=18MI6OyWS97LvD_fj717St3gfJC4NNrA1lyKn_OteHc,23150
159
+ mns_scheduler-1.3.2.6.dist-info/METADATA,sha256=rrUk5Y2En0xQ5kYqqHIxnb6HOu8-NXABwSPlZxELpwk,64
160
+ mns_scheduler-1.3.2.6.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
161
+ mns_scheduler-1.3.2.6.dist-info/top_level.txt,sha256=PXQDFBGR1pWmsUbH5yiLAh71P5HZODTRED0zJ8CCgOc,14
162
+ mns_scheduler-1.3.2.6.dist-info/RECORD,,
@@ -1,91 +0,0 @@
1
- import sys
2
- import os
3
-
4
- file_path = os.path.abspath(__file__)
5
- end = file_path.index('mns') + 17
6
- project_path = file_path[0:end]
7
- sys.path.append(project_path)
8
- from bypy import ByPy
9
- from mns_common.db.MongodbUtil import MongodbUtil
10
- import tempfile
11
- from loguru import logger
12
- import akshare as ak
13
-
14
- mongodb_util = MongodbUtil('27017')
15
-
16
- import subprocess
17
-
18
-
19
- def get_file_list(path):
20
- """
21
- 获取百度网盘指定路径下的文件列表
22
- :param path: 百度网盘中的路径,例如 '/我的资源'
23
- :return: 文件列表
24
- """
25
- try:
26
- # 调用 bypy list 命令
27
- result = subprocess.run(['bypy', 'list', path], capture_output=True, text=True, check=True, encoding='utf-8')
28
-
29
- # 输出结果
30
- if result.returncode == 0:
31
- file_list = result.stdout.splitlines() # 按行分割结果
32
- return file_list
33
- else:
34
- logger.error("获取文件路径异常:{}", result.stderr)
35
- return []
36
- except subprocess.CalledProcessError as e:
37
- logger.error("获取文件路径异常:{}", e)
38
- return []
39
-
40
-
41
- def upload_to_baidu(file_name, folder_name, data_df):
42
- bp = ByPy()
43
- file_name = file_name + '.csv'
44
- with tempfile.NamedTemporaryFile(mode='w', suffix='.csv', delete=False) as temp_file:
45
- data_df.to_csv(temp_file, index=False)
46
- temp_file_path = temp_file.name # 获取临时文件的路径
47
-
48
- # 上传临时文件到百度云
49
- remote_path = f'/{folder_name}/{file_name}'
50
- result = bp.upload(temp_file_path, remote_path)
51
- if result == 0:
52
- logger.info("上传成功:{}", file_name)
53
- else:
54
- logger.error("上传失败:{}", file_name)
55
- return result
56
-
57
-
58
- def mkdir_baidu_new_folder(remote_path):
59
- bp = ByPy()
60
- try:
61
- # 调用 mkdir 方法创建文件夹
62
- result = bp.mkdir(remote_path)
63
-
64
- if result == 0:
65
- logger.info("成功创建文件夹:{}", remote_path)
66
- else:
67
- logger.error("创建文件夹失败:{}", result)
68
-
69
- except Exception as e:
70
- logger.error("创建文件夹失败:{}", e)
71
-
72
-
73
- def del_baidu_old_folder(remote_path):
74
- bp = ByPy()
75
- try:
76
- # 调用 mkdir 方法创建文件夹
77
- result = bp.delete(remote_path)
78
-
79
- if result == 0:
80
- logger.info("成功删除文件夹:{}", remote_path)
81
- else:
82
- logger.error("删除文件夹失败:{}", result)
83
-
84
- except Exception as e:
85
- logger.error("删除文件夹失败:{}", e)
86
-
87
-
88
- if __name__ == '__main__':
89
- folder_name1 = '/美股/不复权日线'
90
- mkdir_baidu_new_folder(folder_name1)
91
- list_df = get_file_list('/bypy/美股')
@@ -1,91 +0,0 @@
1
- import akshare as ak
2
- import pandas as pd
3
- from mns_common.db.MongodbUtil import MongodbUtil
4
-
5
- mongodb_util = MongodbUtil('27017')
6
-
7
-
8
- def us_stock():
9
- # 输入参数
10
- symbol = input("请输入股票代码(all:全量(时间很长),特定代码:106.TTE):")
11
- start_date = input("请输入开始日期(格式:YYYYMMDD):")
12
- end_date = input("请输入结束日期(格式:YYYYMMDD):")
13
- fq = input("请输入复权信息(前复权:qfq,不复权:bfq,后复权:hfq):")
14
- k_line_period = input("请输入k线周期(日线:daily,周线:weekly,月线:monthly):")
15
- db_name = "us_stock_" + fq + "_" + k_line_period
16
- if fq == 'bfq':
17
- fq = ''
18
- if symbol != 'all':
19
- # 获取股票历史数据
20
- stock_us_hist_df = ak.stock_us_hist(symbol=symbol,
21
- period=k_line_period,
22
- start_date=start_date,
23
- end_date=end_date,
24
- adjust=fq)
25
- # 保存数据到 CSV 文件
26
- stock_us_hist_df.to_csv(f"{symbol}_historical_data.csv", index=False)
27
- print(f"数据已保存到 {symbol}_historical_data.csv")
28
- else:
29
- stock_us_spot_em_df = ak.stock_us_spot_em()
30
- stock_us_spot_em_df = stock_us_spot_em_df.rename(columns={
31
- "序号": "index",
32
- "代码": "symbol",
33
- "名称": "name",
34
- "涨跌额": "change_price",
35
- "涨跌幅": "chg",
36
- "开盘价": "open",
37
- "最高价": "high",
38
- "最低价": "low",
39
- "最新价": "now_price",
40
- "昨收价": "last_price",
41
- "总市值": "total_mv",
42
- "市盈率": "pe",
43
- "成交量": "volume",
44
- "成交额": "amount",
45
- "振幅": "pct_chg",
46
- "换手率": "exchange"
47
- })
48
- stock_us_spot_em_df = stock_us_spot_em_df.sort_values(by=['amount'], ascending=False)
49
- stock_us_spot_em_df = stock_us_spot_em_df.fillna(0)
50
- stock_us_spot_em_df = stock_us_spot_em_df.loc[stock_us_spot_em_df['total_mv'] != 0]
51
-
52
- k_line_result = pd.DataFrame()
53
-
54
- for stock_us_one in stock_us_spot_em_df.itertuples():
55
- try:
56
- # 获取股票历史数据
57
- stock_us_hist_df = ak.stock_us_hist(symbol=stock_us_one.symbol,
58
- period=k_line_period,
59
- start_date=start_date,
60
- end_date=end_date,
61
- adjust=fq)
62
- stock_us_hist_df = stock_us_hist_df.rename(columns={
63
- "日期": "date",
64
- "涨跌额": "change_price",
65
- "涨跌幅": "chg",
66
- "开盘": "open",
67
- "最高": "high",
68
- "最低": "low",
69
- "收盘": "close",
70
- "成交量": "volume",
71
- "成交额": "amount",
72
- "振幅": "pct_chg",
73
- "换手率": "exchange"
74
- })
75
-
76
- k_line_result = pd.concat([stock_us_hist_df, k_line_result])
77
- stock_us_hist_df['_id'] = stock_us_one.symbol + '_' + stock_us_hist_df['date']
78
- stock_us_hist_df['symbol'] = stock_us_one.symbol
79
- stock_us_hist_df['name'] = stock_us_one.name
80
- mongodb_util.insert_mongo(stock_us_hist_df, db_name)
81
- print(f"同步k线数据到: {stock_us_one.name}")
82
- except BaseException as e:
83
- print(f"同步数据发生异常: {stock_us_one.name}, {e}")
84
-
85
- # 保存数据到 CSV 文件
86
- k_line_result.to_csv(f"{symbol}_historical_data.csv", index=False)
87
- print(f"数据已保存到 {symbol}_historical_data.csv")
88
-
89
-
90
- if __name__ == "__main__":
91
- us_stock()
@@ -1,39 +0,0 @@
1
- import sys
2
- import os
3
-
4
- file_path = os.path.abspath(__file__)
5
- end = file_path.index('mns') + 17
6
- project_path = file_path[0:end]
7
- sys.path.append(project_path)
8
- import akshare as ak
9
-
10
-
11
- def sync_us_company_info():
12
- stock_us_spot_em_df = ak.stock_us_spot_em()
13
- stock_us_spot_em_df = stock_us_spot_em_df.rename(columns={
14
- "序号": "index",
15
- "代码": "symbol",
16
- "名称": "name",
17
- "涨跌额": "change_price",
18
- "涨跌幅": "chg",
19
- "开盘价": "open",
20
- "最高价": "high",
21
- "最低价": "low",
22
- "最新价": "now_price",
23
- "昨收价": "last_price",
24
- "总市值": "total_mv",
25
- "市盈率": "pe",
26
- "成交量": "volume",
27
- "成交额": "amount",
28
- "振幅": "pct_chg",
29
- "换手率": "exchange"
30
- })
31
- stock_us_spot_em_df = stock_us_spot_em_df.sort_values(by=['amount'], ascending=False)
32
- stock_us_spot_em_df = stock_us_spot_em_df.fillna(0)
33
- stock_us_spot_em_df = stock_us_spot_em_df.loc[stock_us_spot_em_df['total_mv']!=0]
34
- stock_us_spot_em_df.to_csv('us_stock.csv', index=False)
35
- return stock_us_spot_em_df
36
-
37
-
38
- if __name__ == '__main__':
39
- sync_us_company_info()