polars-ta 0.4.5__py3-none-any.whl → 0.4.7__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.
- polars_ta/_version.py +1 -1
- polars_ta/prefix/tdx.py +55 -0
- polars_ta/tdx/__init__.py +2 -0
- polars_ta/tdx/pattern_feature.py +236 -0
- polars_ta/tdx/reference.py +6 -0
- polars_ta/tdx/trend_feature.py +449 -0
- polars_ta/wq/arithmetic.py +453 -20
- polars_ta/wq/cross_sectional.py +10 -0
- polars_ta/wq/time_series.py +36 -3
- {polars_ta-0.4.5.dist-info → polars_ta-0.4.7.dist-info}/METADATA +3 -2
- {polars_ta-0.4.5.dist-info → polars_ta-0.4.7.dist-info}/RECORD +14 -12
- {polars_ta-0.4.5.dist-info → polars_ta-0.4.7.dist-info}/WHEEL +1 -1
- {polars_ta-0.4.5.dist-info → polars_ta-0.4.7.dist-info/licenses}/LICENSE +0 -0
- {polars_ta-0.4.5.dist-info → polars_ta-0.4.7.dist-info}/top_level.txt +0 -0
@@ -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
|