ezKit 1.9.10__py3-none-any.whl → 1.9.11__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
ezKit/stock.py CHANGED
@@ -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)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ezKit
3
- Version: 1.9.10
3
+ Version: 1.9.11
4
4
  Summary: Easy Kit
5
5
  Author: septvean
6
6
  Author-email: septvean@gmail.com
@@ -9,12 +9,12 @@ ezKit/mongo.py,sha256=dOm_1wXEPp_e8Ml5Qq78M7FDNrQUAZaThzVIiiLJJwk,2393
9
9
  ezKit/qywx.py,sha256=X_H4fzP-iEqeDEbumr7D1bXi6dxczaxfO8iyutzy02s,7171
10
10
  ezKit/redis.py,sha256=g2_V4jvq0djRc20jLZkgeAeF_bYrq-Rbl_kHcCUPZcA,1965
11
11
  ezKit/sendemail.py,sha256=tRXCsJm_RfTJ9xEWe_lTQ5kOs2JxHGPXvq0oWA7prq0,7263
12
- ezKit/stock.py,sha256=cbL0ZXCur4G290wFN5ynmLmMjgDRNSvVQgsE_0jSQKU,11802
12
+ ezKit/stock.py,sha256=J-fM2XH2q7G6-Q30N8clqLIv7sSn87_fN1qjLOiTrFk,12088
13
13
  ezKit/token.py,sha256=HKREyZj_T2S8-aFoFIrBXTaCKExQq4zE66OHXhGHqQg,1750
14
14
  ezKit/utils.py,sha256=TDsL3PRkQy6NdZgphkgwacbWvHqEmq4LOkfNzmxV4DY,42682
15
15
  ezKit/xftp.py,sha256=XyIdr_2rxRVLqPofG6fIYWhAMVsFwTyp46dg5P9FLW4,7774
16
- ezKit-1.9.10.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
17
- ezKit-1.9.10.dist-info/METADATA,sha256=7xdrfPXxnqwajfaZzvzvayL0KDLsfjstCk-j_f_gA5k,191
18
- ezKit-1.9.10.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
19
- ezKit-1.9.10.dist-info/top_level.txt,sha256=aYLB_1WODsqNTsTFWcKP-BN0KCTKcV-HZJ4zlHkCFw8,6
20
- ezKit-1.9.10.dist-info/RECORD,,
16
+ ezKit-1.9.11.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
17
+ ezKit-1.9.11.dist-info/METADATA,sha256=O05DZpUqxTH6u_llpwm7s7FCxb1EgTqMwX_xjYx3fcw,191
18
+ ezKit-1.9.11.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
19
+ ezKit-1.9.11.dist-info/top_level.txt,sha256=aYLB_1WODsqNTsTFWcKP-BN0KCTKcV-HZJ4zlHkCFw8,6
20
+ ezKit-1.9.11.dist-info/RECORD,,
File without changes