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

@@ -38,8 +38,8 @@ def create_index():
38
38
  def sync_new_concept_to_ths_detail(symbol_add_new_concept_df, str_day, str_now_time):
39
39
  for new_concept_one in symbol_add_new_concept_df.itertuples():
40
40
  try:
41
- concept_code = new_concept_one.concept_code
42
- query = {'web_concept_code': int(concept_code)}
41
+ web_concept_code = new_concept_one.concept_code
42
+ query = {'web_concept_code': int(web_concept_code)}
43
43
  ths_concept_list = mongodb_util.find_query_data('ths_concept_list', query)
44
44
  if data_frame_util.is_empty(ths_concept_list):
45
45
  logger.error("无此同花顺概念:{}", new_concept_one.title)
@@ -95,7 +95,8 @@ def update_symbol_new_concept(symbol_df, page_number):
95
95
  now_date = datetime.now()
96
96
  # 开盘交易前不同步 资源开销过大
97
97
  if date_handle_util.is_close_time(now_date):
98
- ths_concept_update_common_api.update_ths_concept_choose_reason(symbol_ths_concept_all_df, stock_one.symbol)
98
+ ths_concept_update_common_api.update_ths_concept_choose_reason(symbol_ths_concept_all_df,
99
+ stock_one.symbol)
99
100
 
100
101
  str_day = now_date.strftime('%Y-%m-%d')
101
102
  str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
@@ -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,434 @@
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 pandas as pd
9
+ import mns_common.component.k_line.patterns.k_line_patterns_service_api as k_line_patterns_service
10
+
11
+ # 计算五日线之和交易天数最小值
12
+ MIN_DEAL_DAYS = 6
13
+
14
+
15
+ # 初始化数据
16
+ def init_day_line_data(k_line_info, stock_qfq_daily):
17
+ daily_num = stock_qfq_daily.shape[0]
18
+ if daily_num == 0:
19
+ k_line_info['max_chg_daily01'] = 0
20
+ k_line_info['daily01'] = 0
21
+ k_line_info['daily02'] = 0
22
+ k_line_info['daily03'] = 0
23
+ k_line_info['daily04'] = 0
24
+ k_line_info['daily05'] = 0
25
+ elif daily_num == 1:
26
+ k_line_info['max_chg_daily01'] = stock_qfq_daily.iloc[0].max_chg
27
+ k_line_info['daily01'] = stock_qfq_daily.iloc[0].chg
28
+ k_line_info['daily02'] = 0
29
+ k_line_info['daily03'] = 0
30
+ k_line_info['daily04'] = 0
31
+ k_line_info['daily05'] = 0
32
+ elif daily_num == 2:
33
+ k_line_info['max_chg_daily01'] = stock_qfq_daily.iloc[0].max_chg
34
+ k_line_info['daily01'] = stock_qfq_daily.iloc[0].chg
35
+ k_line_info['daily02'] = stock_qfq_daily.iloc[1].chg
36
+ k_line_info['daily03'] = 0
37
+ k_line_info['daily04'] = 0
38
+ k_line_info['daily05'] = 0
39
+ elif daily_num == 3:
40
+ k_line_info['max_chg_daily01'] = stock_qfq_daily.iloc[0].max_chg
41
+ k_line_info['daily01'] = stock_qfq_daily.iloc[0].chg
42
+ k_line_info['daily02'] = stock_qfq_daily.iloc[1].chg
43
+ k_line_info['daily03'] = stock_qfq_daily.iloc[2].chg
44
+ k_line_info['daily04'] = 0
45
+ k_line_info['daily05'] = 0
46
+ elif daily_num == 4:
47
+ k_line_info['max_chg_daily01'] = stock_qfq_daily.iloc[0].max_chg
48
+ k_line_info['daily01'] = stock_qfq_daily.iloc[0].chg
49
+ k_line_info['daily02'] = stock_qfq_daily.iloc[1].chg
50
+ k_line_info['daily03'] = stock_qfq_daily.iloc[2].chg
51
+ k_line_info['daily04'] = stock_qfq_daily.iloc[3].chg
52
+ k_line_info['daily05'] = 0
53
+ elif daily_num >= 5:
54
+ k_line_info['max_chg_daily01'] = stock_qfq_daily.iloc[0].max_chg
55
+ k_line_info['daily01'] = stock_qfq_daily.iloc[0].chg
56
+ k_line_info['daily02'] = stock_qfq_daily.iloc[1].chg
57
+ k_line_info['daily03'] = stock_qfq_daily.iloc[2].chg
58
+ k_line_info['daily04'] = stock_qfq_daily.iloc[3].chg
59
+ k_line_info['daily05'] = stock_qfq_daily.iloc[4].chg
60
+ k_line_info.loc[:, 'exclude'] = False
61
+ # 30日最大涨幅
62
+ k_line_info.loc[:, 'amount_level_last'] = 0
63
+ k_line_info.loc[:, 'exchange_last'] = 0
64
+ k_line_info.loc[:, 'exchange_mean_last'] = 0
65
+ k_line_info.loc[:, 'exchange_mean_last_02'] = 0
66
+ k_line_info.loc[:, 'exchange_difference_last'] = 0
67
+ k_line_info.loc[:, 'exchange_chg_percent_last'] = 0
68
+ k_line_info.loc[:, 'pct_chg_mean_last'] = 0
69
+ k_line_info.loc[:, 'pct_chg_difference_last'] = 0
70
+ k_line_info.loc[:, 'close_difference_five_last'] = 0
71
+ k_line_info.loc[:, 'close_difference_ten_last'] = 0
72
+ k_line_info.loc[:, 'close_difference_twenty_last'] = 0
73
+ k_line_info.loc[:, 'close_difference_thirty_last'] = 0
74
+ k_line_info.loc[:, 'close_difference_sixty_last'] = 0
75
+ k_line_info.loc[:, 'pct_chg_last'] = 0
76
+ k_line_info.loc[:, 'max_chg_last'] = 0
77
+ k_line_info.loc[:, 'chg_last'] = 0
78
+ k_line_info.loc[:, 'close_last'] = 0
79
+ k_line_info.loc[:, 'high_last'] = 0
80
+ k_line_info.loc[:, 'low_last'] = 0
81
+
82
+ k_line_info.loc[:, 'avg_five_last'] = 0
83
+ k_line_info.loc[:, 'avg_ten_last'] = 0
84
+ k_line_info.loc[:, 'avg_twenty_last'] = 0
85
+ k_line_info.loc[:, 'avg_thirty_last'] = 0
86
+ k_line_info.loc[:, 'avg_sixty_last'] = 0
87
+
88
+ k_line_info.loc[:, 'std_amount_ten'] = 0
89
+ k_line_info.loc[:, 'mean_amount_ten'] = 0
90
+ k_line_info.loc[:, 'std_amount_thirty'] = 0
91
+ k_line_info.loc[:, 'mean_amount_thirty'] = 0
92
+
93
+ k_line_info.loc[:, 'std_amount_sixty'] = 0
94
+ k_line_info.loc[:, 'mean_amount_sixty'] = 0
95
+
96
+ k_line_info.loc[:, 'sum_five_chg'] = 0
97
+
98
+ k_line_info.loc[:, 'open_chg_last'] = 0
99
+
100
+ k_line_info.loc[:, 'before_close'] = 0
101
+
102
+ k_line_info.loc[:, 'diff_max_chg_from_open_last'] = 0
103
+
104
+ k_line_info.loc[:, 'diff_max_chg_from_close_last'] = 0
105
+
106
+ k_line_info.loc[:, 'diff_close_from_open_last'] = 0
107
+
108
+ return k_line_info
109
+
110
+
111
+ # 计算30天最大涨幅
112
+ def calculate_30_day_max_chg(stock_qfq_daily, k_line_info):
113
+ # 取30天的交易k线
114
+ stock_qfq_daily_30 = stock_qfq_daily.iloc[0:29]
115
+
116
+ deal_days = stock_qfq_daily_30.shape[0]
117
+
118
+ if deal_days < 30:
119
+ stock_qfq_daily_30 = stock_qfq_daily_30[0: deal_days - 1]
120
+ if deal_days == 0:
121
+ return k_line_info
122
+
123
+ stock_qfq_daily_30['date_time'] = pd.to_datetime(stock_qfq_daily_30['date'])
124
+ # 找出最高点和最低点的行
125
+ max_row = stock_qfq_daily_30[stock_qfq_daily_30['high'] == stock_qfq_daily_30['high'].max()]
126
+ min_row = stock_qfq_daily_30[stock_qfq_daily_30['low'] == stock_qfq_daily_30['low'].min()]
127
+
128
+ # 获取最高点和最低点的值以及对应的日期
129
+ max_high = max_row['high'].values[0]
130
+ min_low = min_row['low'].values[0]
131
+ date_of_max_high = max_row['date_time'].values[0]
132
+ date_of_min_low = min_row['date_time'].values[0]
133
+ max_chg_30 = round((max_high - min_low) * 100 / min_low, 2)
134
+ if date_of_max_high < date_of_min_low:
135
+ max_chg_30 = -max_chg_30
136
+ k_line_info['max_chg_30'] = max_chg_30
137
+ return k_line_info
138
+
139
+
140
+ # 计算换手平均值 k线 5 10 20 30 60均线
141
+ def calculate_exchange_and_k_line_avg_param(stock_qfq_daily):
142
+ stock_qfq_daily = stock_qfq_daily.sort_values(by=['date'], ascending=True)
143
+
144
+ # 计算每个日期前10天的换手均值
145
+ stock_qfq_daily['exchange_mean'] = round(
146
+ stock_qfq_daily['exchange'].rolling(window=10, min_periods=1).mean(), 2)
147
+
148
+ # stock_qfq_daily['exchange_mean_ewm'] = round(
149
+ # stock_qfq_daily['exchange'].ewm(span=10).mean(), 2)
150
+
151
+ stock_qfq_daily['exchange_mean_yesterday'] = stock_qfq_daily['exchange_mean']
152
+
153
+ # 昨日平均值 向当前移位
154
+ stock_qfq_daily['exchange_mean_yesterday'] = stock_qfq_daily['exchange_mean_yesterday'].shift(1)
155
+
156
+ # 今天换手相对于[昨日平均十日换手]的差值
157
+ stock_qfq_daily['exchange_difference'] = round(
158
+ stock_qfq_daily['exchange'] - stock_qfq_daily['exchange_mean_yesterday'], 2)
159
+
160
+ # 今天换手相对于[昨日平均十日换手]的倍数
161
+ stock_qfq_daily['exchange_chg_percent'] = round(
162
+ stock_qfq_daily['exchange'] / stock_qfq_daily['exchange_mean_yesterday'], 2)
163
+
164
+ # pct_chg
165
+
166
+ # 计算每个日期的前10天的均值
167
+ stock_qfq_daily['pct_chg_mean'] = round(stock_qfq_daily['pct_chg'].rolling(window=10, min_periods=1).mean(),
168
+ 2)
169
+
170
+ stock_qfq_daily['pct_chg_mean_yesterday'] = stock_qfq_daily['pct_chg_mean']
171
+
172
+ stock_qfq_daily['pct_chg_mean_yesterday'] = stock_qfq_daily['pct_chg_mean_yesterday'].shift(1)
173
+
174
+ stock_qfq_daily['pct_chg_difference'] = round(
175
+ stock_qfq_daily['pct_chg'] - stock_qfq_daily['pct_chg_mean_yesterday'],
176
+ 2)
177
+
178
+ # 计算五日均线
179
+
180
+ stock_qfq_daily['avg_five'] = round(stock_qfq_daily['close'].rolling(window=5, min_periods=1).mean(),
181
+ 2)
182
+ # 计算十日均线
183
+ stock_qfq_daily['avg_ten'] = round(stock_qfq_daily['close'].rolling(window=10, min_periods=1).mean(),
184
+ 2)
185
+ # 计算二十日均线
186
+ stock_qfq_daily['avg_twenty'] = round(stock_qfq_daily['close'].rolling(window=20, min_periods=1).mean(),
187
+ 2)
188
+
189
+ # 计算三十日均线
190
+ stock_qfq_daily['avg_thirty'] = round(stock_qfq_daily['close'].rolling(window=30, min_periods=1).mean(),
191
+ 2)
192
+
193
+ # 计算六十日均线
194
+ stock_qfq_daily['avg_sixty'] = round(stock_qfq_daily['close'].rolling(window=60, min_periods=1).mean(),
195
+ 2)
196
+
197
+ # 收盘价格与均线差值
198
+ stock_qfq_daily['close_difference_five'] = round(
199
+ 100 * (stock_qfq_daily['close'] - stock_qfq_daily['avg_five']) / stock_qfq_daily['close'],
200
+ 2)
201
+
202
+ stock_qfq_daily['close_difference_ten'] = round(
203
+ 100 * (stock_qfq_daily['close'] - stock_qfq_daily['avg_ten']) / stock_qfq_daily['close'],
204
+ 2)
205
+
206
+ stock_qfq_daily['close_difference_twenty'] = round(
207
+ 100 * (stock_qfq_daily['close'] - stock_qfq_daily['avg_twenty']) / stock_qfq_daily['close'],
208
+ 2)
209
+
210
+ stock_qfq_daily['close_difference_thirty'] = round(
211
+ 100 * (stock_qfq_daily['close'] - stock_qfq_daily['avg_thirty']) / stock_qfq_daily['close'],
212
+ 2)
213
+
214
+ stock_qfq_daily['close_difference_sixty'] = round(
215
+ 100 * (stock_qfq_daily['close'] - stock_qfq_daily['avg_sixty']) / stock_qfq_daily['close'],
216
+ 2)
217
+
218
+ stock_qfq_daily = stock_qfq_daily[[
219
+ "symbol",
220
+ "name",
221
+ "industry",
222
+ "chg",
223
+ "max_chg",
224
+ "pct_chg",
225
+ "pct_chg_mean",
226
+ "exchange",
227
+ "exchange_mean",
228
+ "exchange_mean_yesterday",
229
+ "exchange_difference",
230
+ 'exchange_chg_percent',
231
+ "pct_chg_mean_yesterday",
232
+ "pct_chg_difference",
233
+ "close_difference_five",
234
+ "close_difference_ten",
235
+ "close_difference_twenty",
236
+ "close_difference_thirty",
237
+ "close_difference_sixty",
238
+ "amount_level",
239
+ "flow_mv",
240
+ "flow_mv_sp",
241
+ "volume",
242
+ "amount",
243
+ "change",
244
+ "last_price",
245
+ "open",
246
+ "close",
247
+ "high",
248
+ "low",
249
+ "avg_five",
250
+ "avg_ten",
251
+ "avg_twenty",
252
+ 'avg_thirty',
253
+ 'avg_sixty',
254
+ "classification",
255
+ "_id",
256
+ "date"
257
+ ]]
258
+ stock_qfq_daily = stock_qfq_daily.sort_values(by=['date'], ascending=False)
259
+ stock_qfq_daily = stock_qfq_daily.fillna(0)
260
+
261
+ return stock_qfq_daily
262
+
263
+
264
+ # 设置当天k线形态 下一个交易日判断当前交易日k线形态
265
+ def set_k_line_patterns(stock_qfq_daily_one):
266
+ open = list(stock_qfq_daily_one['open'])[0]
267
+ close = list(stock_qfq_daily_one['close'])[0]
268
+ high = list(stock_qfq_daily_one['high'])[0]
269
+ low = list(stock_qfq_daily_one['low'])[0]
270
+ max_chg = list(stock_qfq_daily_one['max_chg'])[0]
271
+ chg = list(stock_qfq_daily_one['chg'])[0]
272
+
273
+ k_line_pattern = k_line_patterns_service.k_line_patterns_classify(open, close, high, low, max_chg, chg)
274
+ stock_qfq_daily_one.loc[:, 'k_line_pattern'] = k_line_pattern.value
275
+ return stock_qfq_daily_one
276
+
277
+
278
+ # 设置历史k线列表
279
+ def set_history_list(stock_qfq_daily_one, stock_qfq_daily):
280
+ stock_qfq_daily = stock_qfq_daily[[
281
+ "date",
282
+ "exchange",
283
+ "exchange_mean",
284
+ "exchange_mean_yesterday",
285
+ "exchange_difference",
286
+ "exchange_chg_percent",
287
+ "pct_chg_mean_yesterday",
288
+ "pct_chg_difference",
289
+ "pct_chg",
290
+ "pct_chg_mean",
291
+ "max_chg",
292
+ "chg",
293
+ "amount_level",
294
+ "close_difference_five",
295
+ "close_difference_ten",
296
+ "close_difference_twenty",
297
+ "close_difference_thirty",
298
+ 'open',
299
+ 'close',
300
+ 'high',
301
+ 'low'
302
+ ]]
303
+ # 删除index 转str
304
+ stock_qfq_daily_one.loc[:, 'history_data'] = stock_qfq_daily.to_string(index=False)
305
+
306
+ daily_num = stock_qfq_daily.shape[0]
307
+ std_amount_ten = 0
308
+ mean_amount_ten = 0
309
+ std_amount_thirty = 0
310
+ mean_amount_thirty = 0
311
+ std_amount_sixty = 0
312
+ mean_amount_sixty = 0
313
+
314
+ if daily_num >= 10:
315
+ stock_qfq_daily_ten = stock_qfq_daily.iloc[0:10]
316
+ # 计算 10日 amount 的标准差
317
+ std_amount_ten = round(stock_qfq_daily_ten['amount_level'].std(), 2)
318
+ # 计算 10日amount 的平均值
319
+ mean_amount_ten = round(stock_qfq_daily_ten['amount_level'].mean(), 2)
320
+
321
+ if daily_num >= 30:
322
+ stock_qfq_daily_thirty = stock_qfq_daily.iloc[0:30]
323
+ # 计算 amount 的标准差
324
+ std_amount_thirty = round(stock_qfq_daily_thirty['amount_level'].std(), 2)
325
+ # 计算 amount 的平均值
326
+ mean_amount_thirty = round(stock_qfq_daily_thirty['amount_level'].mean(), 2)
327
+ if daily_num >= 60:
328
+ std_amount_sixty = round(stock_qfq_daily['amount_level'].std(), 2)
329
+ # 计算 amount 的平均值
330
+ mean_amount_sixty = round(stock_qfq_daily['amount_level'].mean(), 2)
331
+
332
+ # text = list(stock_qfq_daily_one['history_data'])[0]
333
+ # history_data_df = pd.read_csv(StringIO(text), delim_whitespace=True)
334
+
335
+ stock_qfq_daily_one.loc[:, 'std_amount_ten'] = std_amount_ten
336
+ stock_qfq_daily_one.loc[:, 'mean_amount_ten'] = mean_amount_ten
337
+ stock_qfq_daily_one.loc[:, 'std_amount_thirty'] = std_amount_thirty
338
+ stock_qfq_daily_one.loc[:, 'mean_amount_thirty'] = mean_amount_thirty
339
+ stock_qfq_daily_one.loc[:, 'std_amount_sixty'] = std_amount_sixty
340
+ stock_qfq_daily_one.loc[:, 'mean_amount_sixty'] = mean_amount_sixty
341
+
342
+ return stock_qfq_daily_one
343
+
344
+
345
+ # 修改字段名称
346
+ def k_line_field_fix_name(k_line_info, stock_qfq_daily_one):
347
+ k_line_info['classification'] = stock_qfq_daily_one['classification']
348
+ k_line_info['amount_level_last'] = stock_qfq_daily_one['amount_level']
349
+ k_line_info['name'] = stock_qfq_daily_one['name']
350
+ k_line_info['exchange_last'] = stock_qfq_daily_one['exchange']
351
+ k_line_info['exchange_mean_last'] = stock_qfq_daily_one['exchange_mean']
352
+ k_line_info['exchange_mean_last_02'] = stock_qfq_daily_one['exchange_mean_yesterday']
353
+ k_line_info['exchange_difference_last'] = stock_qfq_daily_one['exchange_difference']
354
+ k_line_info['exchange_chg_percent_last'] = stock_qfq_daily_one['exchange_chg_percent']
355
+ k_line_info['pct_chg_mean_last'] = stock_qfq_daily_one['pct_chg_mean_yesterday']
356
+ k_line_info['pct_chg_difference_last'] = stock_qfq_daily_one['pct_chg_difference']
357
+
358
+ k_line_info['close_difference_five_last'] = stock_qfq_daily_one['close_difference_five']
359
+ k_line_info['close_difference_ten_last'] = stock_qfq_daily_one['close_difference_ten']
360
+ k_line_info['close_difference_twenty_last'] = stock_qfq_daily_one['close_difference_twenty']
361
+ k_line_info['close_difference_thirty_last'] = stock_qfq_daily_one['close_difference_thirty']
362
+ k_line_info['close_difference_sixty_last'] = stock_qfq_daily_one['close_difference_sixty']
363
+
364
+ k_line_info['pct_chg_last'] = stock_qfq_daily_one['pct_chg']
365
+ k_line_info['pct_chg_mean_last'] = stock_qfq_daily_one['pct_chg_mean']
366
+ k_line_info['max_chg_last'] = stock_qfq_daily_one['max_chg']
367
+ k_line_info['chg_last'] = stock_qfq_daily_one['chg']
368
+ k_line_info['open_last'] = stock_qfq_daily_one['open']
369
+ k_line_info['close_last'] = stock_qfq_daily_one['close']
370
+ k_line_info['high_last'] = stock_qfq_daily_one['high']
371
+ k_line_info['low_last'] = stock_qfq_daily_one['low']
372
+ k_line_info['avg_five_last'] = stock_qfq_daily_one['avg_five']
373
+ k_line_info['avg_ten_last'] = stock_qfq_daily_one['avg_ten']
374
+ k_line_info['avg_twenty_last'] = stock_qfq_daily_one['avg_twenty']
375
+ k_line_info['avg_thirty_last'] = stock_qfq_daily_one['avg_thirty']
376
+ k_line_info['avg_sixty_last'] = stock_qfq_daily_one['avg_sixty']
377
+
378
+ k_line_info['std_amount_ten'] = stock_qfq_daily_one['std_amount_ten']
379
+ k_line_info['mean_amount_ten'] = stock_qfq_daily_one['mean_amount_ten']
380
+ k_line_info['std_amount_thirty'] = stock_qfq_daily_one['std_amount_thirty']
381
+ k_line_info['mean_amount_thirty'] = stock_qfq_daily_one['mean_amount_thirty']
382
+ k_line_info['std_amount_sixty'] = stock_qfq_daily_one['std_amount_sixty']
383
+ k_line_info['mean_amount_sixty'] = stock_qfq_daily_one['mean_amount_sixty']
384
+ k_line_info['k_line_pattern'] = stock_qfq_daily_one['k_line_pattern']
385
+ k_line_info['history_data'] = stock_qfq_daily_one['history_data']
386
+
387
+ return k_line_info
388
+
389
+
390
+ # 设置五日k线和
391
+ def set_sum_five_chg(k_line_info, deal_days):
392
+ k_line_info.loc[:, 'deal_days'] = deal_days
393
+ # 排除上市第一天的k线
394
+ k_line_info.loc[k_line_info['deal_days'] >= MIN_DEAL_DAYS, 'sum_five_chg'] = k_line_info['daily01'] \
395
+ + k_line_info['daily02'] \
396
+ + k_line_info['daily03'] \
397
+ + k_line_info['daily04'] \
398
+ + k_line_info['daily05']
399
+ k_line_info.loc[k_line_info['deal_days'] < MIN_DEAL_DAYS, 'sum_five_chg'] = 0
400
+
401
+ return k_line_info
402
+
403
+
404
+ # 计算当前交易日开盘时的涨幅
405
+ def calculate_open_chg(stock_qfq_daily, k_line_info):
406
+ # 新股
407
+ if stock_qfq_daily.shape[0] == 1:
408
+ k_line_info['open_chg_last'] = k_line_info['daily01']
409
+ else:
410
+ # 获取前一个交易日的收盘价格
411
+ k_line_info['before_close'] = round(
412
+ k_line_info['close_last'] / (1 + k_line_info['daily01'] * 0.01), 2)
413
+ k_line_info['open_chg_last'] = round((k_line_info['open_last'] / k_line_info['before_close'] - 1) * 100, 2)
414
+ return k_line_info
415
+
416
+
417
+ # 计算涨幅差值
418
+ # 昨日最高点到开盘涨幅差值
419
+ # 昨日最高点到当日收盘涨幅之间的差值
420
+ # 昨日收盘到当日开盘涨幅之间的差值
421
+ def calculate_chg_diff_value(result):
422
+ # 昨日最高点到开盘涨幅差值
423
+ result['diff_max_chg_from_open_last'] = round(
424
+ result['max_chg_last'] - result['open_chg_last'], 2)
425
+
426
+ # 昨日最高点到当日收盘涨幅之间的差值
427
+ result['diff_max_chg_from_close_last'] = round(
428
+ result['max_chg_last'] - result['chg_last'], 2)
429
+
430
+ # 昨日最高点到当日收盘涨幅之间的差值
431
+ result['diff_close_from_open_last'] = round(
432
+ result['chg_last'] - result['open_chg_last'], 2)
433
+
434
+ return result
@@ -0,0 +1,109 @@
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 mns_common.db.MongodbUtil import MongodbUtil
9
+ import mns_common.utils.date_handle_util as date_handle_util
10
+ import mns_scheduler.k_line.hot_stocks.recent_hot_stocks_clean_service as recent_hot_stocks_clean_service
11
+ import mns_scheduler.k_line.clean.daily.daily_k_line_clean_common_service as daily_k_line_clean_common_service
12
+ from mns_common.component.classify.symbol_classify_param import stock_type_classify_param
13
+
14
+ mongodb_util = MongodbUtil('27017')
15
+ # 普通股日线查询数据 60
16
+ NORMAL_DAILY_K_LINE_NUMBER = 60
17
+
18
+
19
+ def handle_day_line(k_line_info, str_day, symbol, deal_days):
20
+ sub_stock_new_max_deal_days = stock_type_classify_param['sub_stock_new_max_deal_days']
21
+ if deal_days > sub_stock_new_max_deal_days:
22
+ return handle_day_line_normal(k_line_info, str_day, symbol, deal_days)
23
+
24
+ else:
25
+ # 交易日小于100天的
26
+ return handle_day_line_sub_new(k_line_info, str_day, symbol, deal_days)
27
+
28
+ # 处理日线
29
+
30
+
31
+ def handle_day_line_sub_new(k_line_info, str_day, symbol, deal_days):
32
+ k_line_info['deal_days'] = deal_days
33
+ query = {"symbol": symbol, 'date': {"$lt": date_handle_util.no_slash_date(str_day)}}
34
+ stock_qfq_daily = mongodb_util.descend_query(query, 'stock_qfq_daily', 'date', deal_days)
35
+ # 初始化数据
36
+ k_line_info = daily_k_line_clean_common_service.init_day_line_data(k_line_info, stock_qfq_daily)
37
+ if stock_qfq_daily.shape[0] == 0:
38
+ return k_line_info
39
+
40
+ # 当前交易日k线信息
41
+ stock_qfq_daily_one = stock_qfq_daily.iloc[0:1]
42
+ # 设置当天k线形态 下一个交易日判断当前交易日k线形态
43
+ stock_qfq_daily_one = daily_k_line_clean_common_service.set_k_line_patterns(stock_qfq_daily_one.copy())
44
+ # 设置历史k线列表
45
+ stock_qfq_daily_one = daily_k_line_clean_common_service.set_history_list(stock_qfq_daily_one.copy(),
46
+ stock_qfq_daily.copy())
47
+ # 修改字段名称
48
+ k_line_info = daily_k_line_clean_common_service.k_line_field_fix_name(k_line_info.copy(),
49
+ stock_qfq_daily_one.copy())
50
+ if stock_qfq_daily.shape[0] == 1:
51
+ # 上市第二天的股票
52
+ return k_line_info
53
+ # 排除上市第一天的股票
54
+ stock_qfq_daily = stock_qfq_daily.iloc[0:deal_days - 1]
55
+ # 计算换手平均值 k线 5 10 20 30 60均线
56
+ stock_qfq_daily = daily_k_line_clean_common_service.calculate_exchange_and_k_line_avg_param(stock_qfq_daily)
57
+ # 设置五日k线和
58
+ k_line_info = daily_k_line_clean_common_service.set_sum_five_chg(k_line_info, deal_days)
59
+ # 计算当前交易日开盘时的涨幅
60
+ k_line_info = daily_k_line_clean_common_service.calculate_open_chg(stock_qfq_daily, k_line_info)
61
+ # 计算 昨日最高点到开盘涨幅差值 and # 昨日最高点到当日收盘涨幅之间的差值 and # 昨日收盘到当日开盘涨幅之间的差值
62
+ k_line_info = daily_k_line_clean_common_service.calculate_chg_diff_value(k_line_info)
63
+ # 排除最近有三板以上的股票 todo
64
+ # 计算最近热门大涨的股票
65
+ recent_hot_stocks_clean_service.calculate_recent_hot_stocks(stock_qfq_daily, symbol, str_day)
66
+ return k_line_info
67
+
68
+
69
+ def handle_day_line_normal(k_line_info, str_day, symbol, deal_days):
70
+ # 取五天刚好包含一周 todo 选择60天的历史记录
71
+
72
+ query = {"symbol": symbol, 'date': {"$lt": date_handle_util.no_slash_date(str_day)}}
73
+ stock_qfq_daily = mongodb_util.descend_query(query, 'stock_qfq_daily', 'date', NORMAL_DAILY_K_LINE_NUMBER)
74
+ if stock_qfq_daily.shape[0] == 0:
75
+ return k_line_info
76
+ # 初始化数据
77
+ k_line_info = daily_k_line_clean_common_service.init_day_line_data(k_line_info, stock_qfq_daily)
78
+ # 计算30天最大涨幅
79
+ k_line_info = daily_k_line_clean_common_service.calculate_30_day_max_chg(stock_qfq_daily, k_line_info)
80
+ # 计算换手平均值 k线 5 10 20 30 60均线
81
+ stock_qfq_daily = daily_k_line_clean_common_service.calculate_exchange_and_k_line_avg_param(stock_qfq_daily)
82
+ # 当前交易日k线信息
83
+ stock_qfq_daily_one = stock_qfq_daily.iloc[0:1]
84
+ # 设置当天k线形态 下一个交易日判断当前交易日k线形态
85
+ stock_qfq_daily_one = daily_k_line_clean_common_service.set_k_line_patterns(stock_qfq_daily_one.copy())
86
+ # 设置历史k线列表
87
+ stock_qfq_daily_one = daily_k_line_clean_common_service.set_history_list(stock_qfq_daily_one.copy(),
88
+ stock_qfq_daily.copy())
89
+ # 修改字段名称
90
+ k_line_info = daily_k_line_clean_common_service.k_line_field_fix_name(k_line_info.copy(),
91
+ stock_qfq_daily_one.copy())
92
+ # 设置五日k线和
93
+ k_line_info = daily_k_line_clean_common_service.set_sum_five_chg(k_line_info, deal_days)
94
+ # 计算当前交易日开盘时的涨幅
95
+ k_line_info = daily_k_line_clean_common_service.calculate_open_chg(stock_qfq_daily, k_line_info)
96
+ # 计算 昨日最高点到开盘涨幅差值 and # 昨日最高点到当日收盘涨幅之间的差值 and # 昨日收盘到当日开盘涨幅之间的差值
97
+ k_line_info = daily_k_line_clean_common_service.calculate_chg_diff_value(k_line_info)
98
+
99
+ # 排除最近有三板以上的股票 todo
100
+ # 计算最近热门大涨的股票
101
+ recent_hot_stocks_clean_service.calculate_recent_hot_stocks(stock_qfq_daily, symbol, str_day)
102
+
103
+ return k_line_info
104
+
105
+ # if __name__ == '__main__':
106
+ # query1 = {"symbol": '301596', 'date': {"$lte": date_handle_util.no_slash_date('2024-05-31')}}
107
+ # stock_qfq_daily_301596 = mongodb_util.descend_query(query1, 'stock_qfq_daily', 'date', 15)
108
+ # stock_qfq_daily_301596.shape[0]
109
+ # stock_qfq_daily1 = stock_qfq_daily_301596.iloc[0:14]