polars-ta 0.4.4__py3-none-any.whl → 0.4.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.
@@ -0,0 +1,449 @@
1
+ from polars import Expr
2
+
3
+ from polars_ta.tdx.arithmetic import ABS
4
+ from polars_ta.tdx.logical import EXIST, EVERY
5
+ from polars_ta.tdx.pattern import ts_WINNER_COST
6
+ from polars_ta.tdx.reference import COUNT
7
+ from polars_ta.tdx.reference import HHV
8
+ from polars_ta.tdx.reference import LLV
9
+ from polars_ta.tdx.reference import MA
10
+ from polars_ta.tdx.reference import REF
11
+ from polars_ta.tdx.reference import SUM
12
+ from polars_ta.wq.time_series import ts_cum_max, ts_cum_min
13
+
14
+
15
+ def N天内有跳空向上缺口(H: Expr, L: Expr, N: int = 1, M: float = 0.01) -> Expr:
16
+ """C100 N天内有跳空向上缺口
17
+
18
+ Parameters
19
+ ----------
20
+ N
21
+ 天数
22
+ M
23
+ 涨幅
24
+
25
+ """
26
+ XSTK = L > REF(H, 1) * (100 + M)
27
+ return EXIST(XSTK, N)
28
+
29
+
30
+ def N日内创新高(HIGH: Expr, N: int = 10) -> Expr:
31
+ """C101 N日内创新高
32
+ """
33
+ return HHV(HIGH, N) == ts_cum_max(HIGH)
34
+
35
+
36
+ def N日内创新低(LOW: Expr, N: int = 10) -> Expr:
37
+ """C102 N日内创新低
38
+ """
39
+ return LLV(LOW, N) == ts_cum_min(LOW)
40
+
41
+
42
+ def N日内阴线多于阳线(OPEN: Expr, CLOSE: Expr, N: int = 30, M: float = 0.6) -> Expr:
43
+ """C103 M日内阴线多于阳线
44
+
45
+ Parameters
46
+ ----------
47
+ N
48
+ 天数
49
+ M
50
+ 比例
51
+
52
+ """
53
+ return COUNT(OPEN > CLOSE, N) / N >= M
54
+
55
+
56
+ def N日内阳线多于阴线(OPEN: Expr, CLOSE: Expr, N: int = 30, M: float = 0.6) -> Expr:
57
+ """C104 M日内阳线多于阴线
58
+
59
+ Parameters
60
+ ----------
61
+ N
62
+ 天数
63
+ M
64
+ 比例
65
+
66
+ """
67
+ return COUNT(OPEN < CLOSE, N) / N >= M
68
+
69
+
70
+ def N日内上涨多于下跌(CLOSE: Expr, N: int = 120, M: float = 0.6) -> Expr:
71
+ """C105 N日内上涨多于下跌
72
+
73
+ Parameters
74
+ ----------
75
+ N
76
+ 天数
77
+ M
78
+ 比例
79
+
80
+ """
81
+ return COUNT(CLOSE > REF(CLOSE, 1), N) / N >= M
82
+
83
+
84
+ def N日内下跌多于上涨(CLOSE: Expr, N: int = 120, M: float = 0.6) -> Expr:
85
+ """C106 N日内下跌多于上涨
86
+
87
+ Parameters
88
+ ----------
89
+ N
90
+ 天数
91
+ M
92
+ 比例
93
+
94
+ """
95
+ return COUNT(CLOSE < REF(CLOSE, 1), N) / N >= M
96
+
97
+
98
+ def 连续N天收阳线(OPEN: Expr, CLOSE: Expr, N: int = 7) -> Expr:
99
+ """C107 连续N天收阳线
100
+
101
+ Parameters
102
+ ----------
103
+ N
104
+ 天数
105
+
106
+ """
107
+ return EVERY(CLOSE > OPEN, N)
108
+
109
+
110
+ def 连续N天收阴线(OPEN: Expr, CLOSE: Expr, N: int = 7) -> Expr:
111
+ """C108 连续N天收阴线
112
+
113
+ Parameters
114
+ ----------
115
+ N
116
+ 天数
117
+
118
+ """
119
+ return EVERY(OPEN > CLOSE, N)
120
+
121
+
122
+ def 单日放量(VOL: Expr, CAPITAL: Expr, N: float = 2, M: float = 0.15) -> Expr:
123
+ """C110 单日放量
124
+
125
+ Parameters
126
+ ----------
127
+ N
128
+ 5日平均成交量的倍数
129
+ M
130
+ 流通股本的倍数
131
+
132
+ """
133
+ A1 = MA(VOL, 5)
134
+ A2 = REF(A1, 1)
135
+ C1 = VOL / A2 > N
136
+ C2 = VOL / CAPITAL > M
137
+ return C1 & C2
138
+
139
+
140
+ def 阶段缩量(VOL: Expr, CAPITAL: Expr, N: int = 20, M: float = 0.02) -> Expr:
141
+ """C111 阶段缩量
142
+
143
+ Parameters
144
+ ----------
145
+ VOL
146
+ 成交量
147
+ CAPITAL
148
+ 流通股本
149
+
150
+ Notes
151
+ -----
152
+ 成交量与流通股本单位要一致,都为手,或者都为股
153
+
154
+ """
155
+ return SUM(VOL, N) / CAPITAL <= M
156
+
157
+
158
+ def 阶段放量(VOL: Expr, CAPITAL: Expr, N: int = 10, M: float = 2.0) -> Expr:
159
+ """C112 阶段放量
160
+
161
+ Parameters
162
+ ----------
163
+ VOL
164
+ 成交量
165
+ CAPITAL
166
+ 流通股本
167
+
168
+ """
169
+ return SUM(VOL, N) / CAPITAL >= M
170
+
171
+
172
+ def 持续放量(VOL: Expr, M: int = 5) -> Expr:
173
+ """C113 持续放量
174
+
175
+ Parameters
176
+ ----------
177
+ VOL
178
+ 成交量
179
+
180
+ """
181
+ return EVERY(VOL >= REF(VOL, 1), M)
182
+
183
+
184
+ def 持续缩量(VOL: Expr, M: int = 5) -> Expr:
185
+ """C114 持续缩量
186
+
187
+ Parameters
188
+ ----------
189
+ VOL
190
+ 成交量
191
+
192
+ """
193
+ return COUNT(VOL <= REF(VOL, 1), M) == M
194
+
195
+
196
+ def 间隔放量(VOL: Expr, N: int = 30, N1: float = 4.0, N2: float = 2.0, N3: int = 3) -> Expr:
197
+ """C115 间隔放量
198
+
199
+ Parameters
200
+ ----------
201
+ VOL
202
+ 成交量
203
+ N
204
+ 均量周期
205
+ N1
206
+ 最小均量与最大均量的倍数
207
+ N2
208
+ 成交量与均量的倍数
209
+ N3
210
+ 满足N2时的次数
211
+
212
+ """
213
+ A = MA(VOL, 5)
214
+ C1 = HHV(A, N) < N1 * LLV(A, N) # 成交量最大与最小在一定范围内
215
+ C2 = COUNT(VOL > N2 * A, N) > N3 # 成交量大于均量一定倍数
216
+ return C1 & C2
217
+
218
+
219
+ def 放量上攻(CLOSE: Expr, VOL: Expr, CAPITAL: Expr,
220
+ N: float = 0.01, N1: int = 3, N2: float = 0.2, N3: int = 4) -> Expr:
221
+ """C116 放量上攻
222
+
223
+ Parameters
224
+ ----------
225
+ CLOSE
226
+ 复权收盘价
227
+ VOL
228
+ 成交量
229
+ CAPITAL
230
+ 流通股本
231
+ N
232
+ 涨幅
233
+ N1, N2
234
+ N1天内成交量大于N2*流通股本
235
+ N3
236
+ 连续N3天满足涨幅
237
+
238
+ """
239
+ A = (CLOSE - REF(CLOSE, 1)) / REF(CLOSE, 1) >= N
240
+ C1 = SUM(VOL, N1) / CAPITAL >= N2
241
+ C2 = COUNT(VOL > REF(VOL, 1), N3) == N3
242
+ C3 = COUNT(A, N3) == N3
243
+ return C1 & C2 & C3
244
+
245
+
246
+ def 温和放量上攻(CLOSE: Expr, VOL: Expr, CAPITAL: Expr, N: int = 5) -> Expr:
247
+ """C117 温和放量上攻
248
+
249
+ Parameters
250
+ ----------
251
+ CLOSE
252
+ 复权收盘价
253
+ VOL
254
+ 成交量
255
+ CAPITAL
256
+ 流通股本
257
+ N
258
+ 观察天数
259
+
260
+ """
261
+ A1 = CLOSE / REF(CLOSE, 1)
262
+ A2 = (A1 > 1) & (A1 < 1.03) # {股价小幅上扬}
263
+ B1 = VOL / REF(VOL, 1)
264
+ B2 = (B1 > 1) & (A1 < 2) # {成交量小幅上扬}
265
+ C1 = MA(VOL, N) / CAPITAL < 0.05 # 日成交量小于流通股本的5%
266
+ C2 = COUNT(A2 & B2, N) / N > 0.6
267
+ return C1 & C2
268
+
269
+
270
+ def 突然放量(VOL: Expr, N: int = 10, M: float = 3.0) -> Expr:
271
+ """C118 突然放量
272
+
273
+ Parameters
274
+ ----------
275
+ VOL
276
+ 成交量
277
+ N
278
+ 观察天数
279
+ M
280
+ 倍数
281
+
282
+ """
283
+ return VOL > REF(HHV(VOL, N), 1) * M
284
+
285
+
286
+ def 平台整理(CLOSE: Expr, N: int = 30, N1: float = 0.05) -> Expr:
287
+ """C119 平台整理
288
+
289
+ Parameters
290
+ ----------
291
+ N
292
+ 天数
293
+ N1
294
+ 幅度
295
+
296
+ """
297
+ return HHV(CLOSE, N) / LLV(CLOSE, N) <= 1 + N1
298
+
299
+
300
+ def 小步碎阳(O: Expr, H: Expr, L: Expr, C: Expr, avg: Expr, turnover_ratio: Expr, N: int = 4) -> Expr:
301
+ """C120 小步碎阳
302
+
303
+ Parameters
304
+ ----------
305
+ avg
306
+ 成交均价
307
+ turnover_ratio
308
+ 换手率
309
+ N
310
+ 观察天数
311
+
312
+ """
313
+ AA = (C > REF(C, 1)) & (C > O)
314
+ A1 = COUNT(AA, N) == N
315
+ A2 = C / REF(C, N) < 1.05
316
+ A3 = ts_WINNER_COST(H, L, avg, turnover_ratio, C, 0.5).struct[0] > 0.75
317
+
318
+ return A1 & A2 & A3
319
+
320
+
321
+ def 突破长期盘整(HIGH: Expr, LOW: Expr, CLOSE: Expr, N: int = 30, N1: int = 5) -> Expr:
322
+ """C123 突破长期盘整
323
+
324
+ Parameters
325
+ ----------
326
+ N
327
+ 天数
328
+ N1
329
+ 涨幅
330
+
331
+ """
332
+ C1 = REF(HHV(HIGH, N) / LLV(LOW, N), 1) <= N1 + 1
333
+ C2 = CLOSE >= REF(HHV(HIGH, N), 1)
334
+
335
+ return C1 & C2
336
+
337
+
338
+ def N天内出现以涨停收盘(收盘涨停: Expr, N: int = 10) -> Expr:
339
+ """C128 N天内出现以涨停收盘
340
+
341
+ Parameters
342
+ ----------
343
+ N
344
+ 天数
345
+
346
+ """
347
+ return EXIST(收盘涨停, N)
348
+
349
+
350
+ def N天内出现涨停(最高涨停: Expr, N: int = 20) -> Expr:
351
+ """C129 N天内出现涨停
352
+
353
+ Parameters
354
+ ----------
355
+ N
356
+ 天数
357
+
358
+ """
359
+ return EXIST(最高涨停, N)
360
+
361
+
362
+ def N天内经常涨停(收盘涨停: Expr, N: int = 100, M: int = 8) -> Expr:
363
+ """C130 N天内经常涨停
364
+
365
+ Parameters
366
+ ----------
367
+ N
368
+ 天数
369
+ M
370
+ 涨停天数
371
+
372
+ """
373
+ return COUNT(收盘涨停, N) >= M
374
+
375
+
376
+ def 下跌多日再放量上涨(HIGH: Expr, CLOSE: Expr, VOL: Expr) -> Expr:
377
+ """C131 下跌多日再放量上涨
378
+
379
+ """
380
+ A1 = REF(CLOSE, 5) > REF(CLOSE, 4)
381
+ A2 = REF(CLOSE, 4) > REF(CLOSE, 3)
382
+ A3 = REF(CLOSE, 3) > REF(CLOSE, 2)
383
+ A4 = REF(CLOSE, 2) > REF(CLOSE, 1)
384
+ A5 = (CLOSE > REF(HIGH, 1)) & (VOL > REF(VOL, 1))
385
+ return A1 & A2 & A3 & A4 & A5
386
+
387
+
388
+ def 跳空高开或低开(O: Expr, H: Expr, L: Expr, C: Expr, N: float = 0.03) -> Expr:
389
+ """C132 跳空高开或低开
390
+
391
+ Parameters
392
+ ----------
393
+ N
394
+ 涨幅
395
+
396
+ """
397
+ if N > 0:
398
+ A = (O > REF(H, 1)) & (O / REF(C, 1) > (1 + N))
399
+ return A
400
+ else:
401
+ B = (O < REF(L, 1)) & (O / REF(C, 1) < (1 + N))
402
+ return B
403
+
404
+
405
+ def 拉升后多日调整(C: Expr, N: int = 3, ZF: float = 0.09) -> Expr:
406
+ """C133 拉升后多日调整
407
+
408
+ Parameters
409
+ ----------
410
+ N
411
+ 天数
412
+ ZF
413
+ 涨幅
414
+
415
+ """
416
+ C1 = REF(C, N) / REF(C, N + 1) > 1 + ZF
417
+ C2 = EVERY(C < REF(C, 1), N)
418
+ return C1 & C2
419
+
420
+
421
+ def 昨日底部十字星(O: Expr, H: Expr, L: Expr, C: Expr, N: int = 60) -> Expr:
422
+ """C134 昨日底部十字星
423
+
424
+ Parameters
425
+ ----------
426
+ N
427
+ 天数
428
+
429
+ """
430
+
431
+ C1 = L <= LLV(L, N)
432
+ C2 = ABS(C - O) / (H - L) < 0.05
433
+ C3 = H > L
434
+ return REF(C1 & C2 & C3, 1)
435
+
436
+
437
+ def 价量渐低后阳包阴(O: Expr, C: Expr, V: Expr) -> Expr:
438
+ """C135 价量渐低后阳包阴
439
+ """
440
+ A1 = REF(C, 4) > REF(C, 3)
441
+ A2 = REF(C, 3) > REF(C, 2)
442
+ A3 = REF(C, 2) > REF(C, 1)
443
+ B1 = REF(V, 3) > REF(V, 2)
444
+ B2 = REF(V, 2) > REF(V, 1)
445
+ AA1 = A1 & A2 & A3 & B1 & B2
446
+ AA2 = (REF(O, 1) > REF(C, 1)) & (C > REF(O, 1))
447
+ AA3 = (C > O) & (V < REF(V, 1))
448
+
449
+ return AA1 & AA2 & AA3