ezKit 1.9.10__tar.gz → 1.9.11__tar.gz
Sign up to get free protection for your applications and to get access to all the features.
- {ezkit-1.9.10/ezKit.egg-info → ezkit-1.9.11}/PKG-INFO +1 -1
- {ezkit-1.9.10 → ezkit-1.9.11}/ezKit/stock.py +64 -39
- {ezkit-1.9.10 → ezkit-1.9.11/ezKit.egg-info}/PKG-INFO +1 -1
- {ezkit-1.9.10 → ezkit-1.9.11}/setup.py +1 -1
- {ezkit-1.9.10 → ezkit-1.9.11}/LICENSE +0 -0
- {ezkit-1.9.10 → ezkit-1.9.11}/MANIFEST.in +0 -0
- {ezkit-1.9.10 → ezkit-1.9.11}/README.md +0 -0
- {ezkit-1.9.10 → ezkit-1.9.11}/ezKit/__init__.py +0 -0
- {ezkit-1.9.10 → ezkit-1.9.11}/ezKit/bottle.py +0 -0
- {ezkit-1.9.10 → ezkit-1.9.11}/ezKit/bottle_extensions.py +0 -0
- {ezkit-1.9.10 → ezkit-1.9.11}/ezKit/cipher.py +0 -0
- {ezkit-1.9.10 → ezkit-1.9.11}/ezKit/cls.py +0 -0
- {ezkit-1.9.10 → ezkit-1.9.11}/ezKit/database.py +0 -0
- {ezkit-1.9.10 → ezkit-1.9.11}/ezKit/http.py +0 -0
- {ezkit-1.9.10 → ezkit-1.9.11}/ezKit/mongo.py +0 -0
- {ezkit-1.9.10 → ezkit-1.9.11}/ezKit/qywx.py +0 -0
- {ezkit-1.9.10 → ezkit-1.9.11}/ezKit/redis.py +0 -0
- {ezkit-1.9.10 → ezkit-1.9.11}/ezKit/sendemail.py +0 -0
- {ezkit-1.9.10 → ezkit-1.9.11}/ezKit/token.py +0 -0
- {ezkit-1.9.10 → ezkit-1.9.11}/ezKit/utils.py +0 -0
- {ezkit-1.9.10 → ezkit-1.9.11}/ezKit/xftp.py +0 -0
- {ezkit-1.9.10 → ezkit-1.9.11}/ezKit.egg-info/SOURCES.txt +0 -0
- {ezkit-1.9.10 → ezkit-1.9.11}/ezKit.egg-info/dependency_links.txt +0 -0
- {ezkit-1.9.10 → ezkit-1.9.11}/ezKit.egg-info/requires.txt +0 -0
- {ezkit-1.9.10 → ezkit-1.9.11}/ezKit.egg-info/top_level.txt +0 -0
- {ezkit-1.9.10 → ezkit-1.9.11}/setup.cfg +0 -0
@@ -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
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
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
|
-
|
133
|
-
|
134
|
-
|
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
|
-
|
137
|
+
if not utils.check_arguments([(macd_options, tuple, "macd_options"), (kdj_options, tuple, "kdj_options")]):
|
138
|
+
return None
|
146
139
|
|
147
|
-
|
148
|
-
|
149
|
-
|
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(
|
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
|
-
#
|
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
|
-
|
189
|
-
|
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
|
-
#
|
219
|
+
# 初始化 KDJ_X 列(0 无, 1 金叉, 2 死叉)
|
204
220
|
df['KDJ_X'] = 0
|
221
|
+
|
222
|
+
# 计算 MACD 条件
|
205
223
|
kdj_position = df['J'] > df['D']
|
206
|
-
|
207
|
-
|
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'
|
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)
|
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
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|