ezKit 1.9.10__tar.gz → 1.9.12__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ezKit
3
- Version: 1.9.10
3
+ Version: 1.9.12
4
4
  Summary: Easy Kit
5
5
  Author: septvean
6
6
  Author-email: septvean@gmail.com
@@ -94,16 +94,17 @@ def kdj_vector(
94
94
  # 有采用 ewm 使用 com=2 的, 但是如果使用 com=2 在默认值的情况下KDJ值是正确的.
95
95
  # 但是非默认值, 比如调整参数, 尝试慢速 KDJ 时就不对了, 最终采用 alpha = 1/m 的情况, 对比同花顺数据, 是正确的.
96
96
 
97
- # 判断参数是否正确
98
- match True:
99
- case True if not utils.isTrue(df, DataFrame):
100
- logger.error("argument error: df")
101
- return None
102
- case True if not any([utils.isTrue(kdj_options, tuple), all(utils.isTrue(item, int) for item in kdj_options)]):
103
- logger.error("argument error: kdj_options")
104
- return None
105
- case _:
106
- pass
97
+ # 检查参数
98
+ if isinstance(df, DataFrame) and df.empty:
99
+ logger.error("argument error: df")
100
+ return None
101
+
102
+ if not utils.check_arguments([(kdj_options, tuple, "kdj_options")]):
103
+ return None
104
+
105
+ if not all(utils.isTrue(item, int) for item in kdj_options):
106
+ logger.error("argument error: kdj_options")
107
+ return None
107
108
 
108
109
  try:
109
110
  low_list = df['low'].rolling(kdj_options[0]).min()
@@ -128,25 +129,23 @@ def data_vector(
128
129
  ) -> DataFrame | None:
129
130
  """数据运算"""
130
131
 
131
- # 判断参数是否正确
132
- match True:
133
- case True if not utils.isTrue(df, DataFrame):
134
- logger.error("argument error: df")
135
- return None
136
- case True if not any([utils.isTrue(macd_options, tuple), all(utils.isTrue(item, int) for item in macd_options)]):
137
- logger.error("argument error: macd_options")
138
- return None
139
- case True if not any([utils.isTrue(kdj_options, tuple), all(utils.isTrue(item, int) for item in kdj_options)]):
140
- logger.error("argument error: kdj_options")
141
- return None
142
- case _:
143
- pass
132
+ # 检查参数
133
+ if isinstance(df, DataFrame) and df.empty:
134
+ logger.error("argument error: df")
135
+ return None
144
136
 
145
- try:
137
+ if not utils.check_arguments([(macd_options, tuple, "macd_options"), (kdj_options, tuple, "kdj_options")]):
138
+ return None
146
139
 
147
- # 数据为空
148
- if isinstance(df, DataFrame) and df.empty:
149
- return None
140
+ if not all(utils.isTrue(item, int) for item in macd_options):
141
+ logger.error("argument error: macd_options")
142
+ return None
143
+
144
+ if not all(utils.isTrue(item, int) for item in kdj_options):
145
+ logger.error("argument error: kdj_options")
146
+ return None
147
+
148
+ try:
150
149
 
151
150
  # ------------------------------------------------------------------------------------------
152
151
 
@@ -174,7 +173,13 @@ def data_vector(
174
173
  # ------------------------------------------------------------------------------------------
175
174
 
176
175
  # 计算 MACD: 默认参数 12 26 9
177
- macd_dif, macd_dea, macd_bar = ta.MACD(df['close'].values, fastperiod=macd_options[0], slowperiod=macd_options[1], signalperiod=macd_options[2]) # type: ignore
176
+ macd_dif, macd_dea, macd_bar = ta.MACD( # type: ignore
177
+ df['close'].values,
178
+ fastperiod=macd_options[0],
179
+ slowperiod=macd_options[1],
180
+ signalperiod=macd_options[2]
181
+ )
182
+
178
183
  macd_dif[np.isnan(macd_dif)], macd_dea[np.isnan(macd_dea)], macd_bar[np.isnan(macd_bar)] = 0, 0, 0
179
184
 
180
185
  # https://www.bilibili.com/read/cv10185856
@@ -182,15 +187,26 @@ def data_vector(
182
187
  df['MACD_DIF'] = macd_dif
183
188
  df['MACD_DEA'] = macd_dea
184
189
 
185
- # MACD 金叉死叉: 0 无, 1 金叉, 2 死叉
190
+ # 初始化 MACD_X 列(0 无, 1 金叉, 2 死叉)
186
191
  df['MACD_X'] = 0
192
+
193
+ # 计算 MACD 条件
187
194
  macd_position = df['MACD_DIF'] > df['MACD_DEA']
188
- df.loc[macd_position[(macd_position is True) & (macd_position.shift() is False)].index, 'MACD_X'] = 1 # type: ignore
189
- df.loc[macd_position[(macd_position is False) & (macd_position.shift() is True)].index, 'MACD_X'] = 2 # type: ignore
195
+
196
+ # 设置 MACD_X = 1: False 变为 True 的位置
197
+ df.loc[macd_position & ~macd_position.shift(fill_value=False), 'MACD_X'] = 1
198
+
199
+ # 设置 MACD_X = 2: 从 True 变为 False 的位置
200
+ df.loc[~macd_position & macd_position.shift(fill_value=False), 'MACD_X'] = 2
201
+
202
+ # 将浮点数限制为小数点后两位
203
+ df['MACD'] = df['MACD'].round(2)
204
+ df['MACD_DIF'] = df['MACD_DIF'].round(2)
205
+ df['MACD_DEA'] = df['MACD_DEA'].round(2)
190
206
 
191
207
  # ------------------------------------------------------------------------------------------
192
208
 
193
- # 计算 KDJ: : 默认参数 9 3 3
209
+ # # 计算 KDJ: : 默认参数 9 3 3
194
210
  kdj_data = kdj_vector(df, kdj_options)
195
211
 
196
212
  if kdj_data is not None:
@@ -200,11 +216,22 @@ def data_vector(
200
216
  df['D'] = kdj_data['D'].values
201
217
  df['J'] = kdj_data['J'].values
202
218
 
203
- # KDJ 金叉死叉: 0 无, 1 金叉, 2 死叉
219
+ # 初始化 KDJ_X 列(0 无, 1 金叉, 2 死叉)
204
220
  df['KDJ_X'] = 0
221
+
222
+ # 计算 MACD 条件
205
223
  kdj_position = df['J'] > df['D']
206
- df.loc[kdj_position[(kdj_position is True) & (kdj_position.shift() is False)].index, 'KDJ_X'] = 1 # type: ignore
207
- df.loc[kdj_position[(kdj_position is False) & (kdj_position.shift() is True)].index, 'KDJ_X'] = 2 # type: ignore
224
+
225
+ # 设置 KDJ_X = 1: False 变为 True 的位置
226
+ df.loc[kdj_position & ~kdj_position.shift(fill_value=False), 'KDJ_X'] = 1
227
+
228
+ # 设置 KDJ_X = 2: 从 True 变为 False 的位置
229
+ df.loc[~kdj_position & kdj_position.shift(fill_value=False), 'KDJ_X'] = 2
230
+
231
+ # 将浮点数限制为小数点后两位
232
+ df['K'] = df['K'].round(2)
233
+ df['D'] = df['D'].round(2)
234
+ df['J'] = df['J'].round(2)
208
235
 
209
236
  # ------------------------------------------------------------------------------------------
210
237
 
@@ -261,12 +288,10 @@ def get_stock_data_from_akshare(
261
288
  "收盘": "close",
262
289
  "最高": "high",
263
290
  "最低": "low",
264
- "成交量": "volume",
265
- "成交额": "turnover"
291
+ "成交量": "volume"
266
292
  })
267
- df = df.round({'turnover': 4})
268
293
  logger.success(f"{info} [成功]")
269
- return df[['date', 'open', 'close', 'high', 'low', 'volume', 'turnover']].copy()
294
+ return df[['date', 'open', 'close', 'high', 'low', 'volume']].copy()
270
295
  except Exception as e:
271
296
  logger.error(f"{info} [失败]")
272
297
  logger.exception(e)
@@ -292,18 +317,28 @@ def save_data_to_database(engine: Engine, code: str, latest: bool = False) -> bo
292
317
 
293
318
  logger.info(f"{info} ......")
294
319
 
320
+ # 代码名称转换
321
+ name = coderename(code)
322
+
323
+ if not isinstance(name, str):
324
+ logger.error(f"{info} [代码名称转换错误]")
325
+ return False
326
+
327
+ # 获取数据
295
328
  df: DataFrame | None = get_stock_data_from_akshare(code)
296
329
 
297
330
  if df is None:
298
- logger.error(f"{info} [获取数据失败]")
331
+ logger.error(f"{info} [获取数据错误]")
299
332
  return False
300
333
 
301
- name = coderename(code)
334
+ # 计算数据
335
+ df: DataFrame | None = data_vector(df)
302
336
 
303
- if not isinstance(name, str):
304
- logger.error(f"{info} [代码名称转换失败]")
337
+ if df is None:
338
+ logger.error(f"{info} [计算数据错误]")
305
339
  return False
306
340
 
341
+ # 保存到数据库
307
342
  if utils.isTrue(latest, bool):
308
343
  df = df.tail(1)
309
344
  df.to_sql(name=name, con=engine, if_exists="append", index=False)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ezKit
3
- Version: 1.9.10
3
+ Version: 1.9.12
4
4
  Summary: Easy Kit
5
5
  Author: septvean
6
6
  Author-email: septvean@gmail.com
@@ -3,7 +3,7 @@ from setuptools import find_packages, setup
3
3
 
4
4
  setup(
5
5
  name='ezKit',
6
- version='1.9.10',
6
+ version='1.9.12',
7
7
  author='septvean',
8
8
  author_email='septvean@gmail.com',
9
9
  description='Easy Kit',
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes