Skip to content

Commit a569a61

Browse files
authored
Merge pull request #14 from wukan1986/dev
少量更新
2 parents 74123fb + 0d053ac commit a569a61

File tree

15 files changed

+320
-124
lines changed

15 files changed

+320
-124
lines changed

README.md

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,33 @@
11
# ta_cn 中国版技术指标
22

3+
## !!! 注意:如要在`polars`中使用技术指标,请使用[polars_ta](https://github.com/wukan1986/polars_ta)
4+
35
## 项目背景
6+
47
初学量化,技术指标一般使用`TA-Lib`,但存在以下问题
8+
59
1. 部分技术指标与国内不同。但大部分中国股民都是参考国内技术指标进行交易。需要实现中国版指标
610
2. `TA-Lib`只支持单支序列,要计算多支股票需循环,耗时久。
711

812
在实现遗传算法挖因子时,意识到如果能将常用的操作都转成算子,将大大简化策略的研究,
913
特别是将`+``-``*``/`等中缀操作符转成`ADD()``SUB()``MUL()``DIV()`前缀函数,可直接输到遗传算法工具中
1014

1115
所以开始参考`Alpha101`和各券商金融工程研报,试着实现一些算子,但后期实现中发现一些问题
16+
1217
1. 每家金工的研报指标命名上都有区别,难以统一
1318
2. 指标太多,实现工作太大
1419

1520
直到看到了`MyTT`这个项目才意识到,指标命名参考股票软件的公式才是最方便直接的,可以直接到各股软中复制公式。遇到性能问题再针对性转换即可。
1621

1722
## 本人为何不直接用`MyTT`,而是重复造轮子呢?
23+
1824
1. 大部分公式只支持单条数据,遇到几千支股票的DataFrame,循环太慢
1925
2. `TA-Lib`与国内指标不同,区别在哪,没有对比。错过了很好的教学机会
2026
3. 为了行数短牺牲了可读性
2127
4. 部分函数直接复制于股票软件,代码没有优化,有重复计算
2228

2329
## 再次大迭代,仿WorldQuant
30+
2431
1. 2022年9月初,知道WorldQuant Websim重新开放为WorldQuant BRAIN后,开始研究国外的平台
2532
2. WQ公式更加科学。例如:
2633
1. WQ时序有`ts_`前缀
@@ -29,42 +36,49 @@
2936
4. WQ公式为Alpha因子而设计,有大量的权重处理等函数
3037

3138
## 目标
39+
3240
1. 优先实现WorldQuant公式,然后实现通达信公式
3341
2. 通过在通达信中导入WQ公式并别名,来实现通达信公式覆盖
3442
3. 支持二维矩阵计算
3543
4. 支持长表和宽表,支持NaN跳过
3644
5. 最终实现WQ的本地版
3745

38-
3946
## 实现方案优先级
47+
4048
1. bottleneck。支持二维数据,优先使用
4149
2. TA-Lib。封装了常用函数,次要选择
4250
3. numba。速度受影响,最后才用它
4351

4452
## 安装
53+
4554
1. 只想使用二维矩阵TA-Lib,只需安装基础版即可
55+
4656
```commandline
4757
pip install ta_cn -i https://mirrors.aliyun.com/pypi/simple --upgrade
4858
```
4959

5060
2. 使用中国版指标加速
61+
5162
```commandline
5263
pip install ta_cn[cn] -i https://mirrors.aliyun.com/pypi/simple --upgrade
5364
```
5465

5566
3. 开发人员安装。开发迭代很快,只有版本稳定才会发布到`PyPI`,需要时效更高的安装方法
5667
1. 从github下载zip文件
5768
2. 解压zip, 进入解压后目录,输入以下命令
69+
5870
```commandline
5971
pip install .[cn] -i https://mirrors.aliyun.com/pypi/simple --upgrade
6072
```
6173

6274
4. 库维护者安装。可修改本地文件
75+
6376
```commandline
6477
pip install -e .
6578
```
6679

6780
## 常见使用方法
81+
6882
1. 转发原生talib,输入一维向量
6983
- 优点: 本库提供了跳过空值的功能
7084
- 缺点: 不要在大量循环中调用,因为跳过空值的功能每调用一次就要预分配内存
@@ -79,8 +93,9 @@ pip install -e .
7993
5. 输入为宽表
8094
- 优点:计算快
8195
- 缺点:计算前需要准备数据为指定格式,占大量内存
82-
96+
8397
## 停牌处理,跳过空值
98+
8499
1. TA-Lib遇到空值后面结果全为NaN
85100
2. 跳过NaN后,导致数据长度不够,部分函数可能报错
86101
3. 方案一:将所有数据进行移动,时序指标移动到最后,横截面指标移动到最右。
@@ -89,8 +104,9 @@ pip install -e .
89104
4. 方案二:预先初始化空白区,计算指标时屏蔽NaN,算完后回填
90105
- 优点:外部调用简单,不需要对数据提前处理
91106
- 缺点:由于有大量的是否跳过NaN的处理,所以速度慢
92-
107+
93108
### 常见示例
109+
94110
```python
95111
import numpy as np
96112

@@ -127,6 +143,7 @@ print(r)
127143
```
128144

129145
### 使用ta_cn中定义的公式
146+
130147
```python
131148
import numpy as np
132149

@@ -157,15 +174,18 @@ print(z)
157174
```
158175

159176
## 长宽表处理
177+
160178
二维矩阵计算,的确方便,`Alpha101`中的公式很快就可以实现,即支持时序又支持截面,但其中有一个难点,
161179
就是NaN值的处理。`pushna``pullna`可用于解决此问题,但在公式中嵌入就比较棘手。
162180

163181
所以,本项目还特别提供了长表与宽表的装饰器,按照一定的要求套用装饰器,就能让原本不可跳过空值的函数自动跳过空值。
164182
如果明确数据内不会产生空值,可以不使用长宽表装饰器,效率会更快。
165183

166184
### 长表
185+
167186
处理慢一些,但结果更适合于机器学习。
168187
底层主要通过`series_groupby_apply`(针对单列输入)和`dataframe_groupby_apply`(针对多列输入)装饰器来实现跳过空值。
188+
169189
```python
170190
import pandas as pd
171191

@@ -209,8 +229,10 @@ print(r.unstack())
209229
```
210230

211231
### 宽表
232+
212233
处理速度通常比长表要快。核心是输入需要封装成`WArr`,输出要`.raw()`提取。
213234
底层通过`wide_wraps`装饰器来实现空值跳过,通过`long_wraps`装饰器来实现长表函数转宽表函数
235+
214236
```python
215237
import pandas as pd
216238

@@ -241,17 +263,21 @@ print(d.iloc[-5:])
241263
```
242264

243265
## 指标对比清单
266+
244267
参考 [指标对比](指标对比.xlsx) 未完工,待补充
245268

246269
## Alpha101/Alpha191
270+
247271
本项目,试着用公式系统实现`Alpha101``Alpha191`,请参考examples文件下的测试示例。它最大的特点是尽量保持原公式的形式,
248272
少改动,防止乱中出错。然后再优化代码提高效率。
249273

250274
## 停牌处理,空值填充
275+
251276
1. 板块指数,停牌了也要最近的行情进行计算,否则指数过小
252277
2. 停牌期的开高低收都是最近的收盘价,收盘价可以ffill
253278

254279
## 参考项目
280+
255281
1. [TA-Lib](https://github.com/TA-Lib/ta-lib) TA-Lib C语言版,非官方镜像
256282
2. [ta-lib](https://github.com/mrjbq7/ta-lib) TA-Lib Python版封装
257283
3. [MyTT](https://github.com/mpquant/MyTT) My麦语言 T通达信 T同花顺
@@ -262,4 +288,5 @@ print(d.iloc[-5:])
262288
8. [WorldQuant算子详情](https://platform.worldquantbrain.com/learn/data-and-operators/detailed-operator-descriptions)
263289

264290
## 交流群
291+
265292
ta_cn技术指标交流群: 601477228

best_practices/step2_feature.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,13 @@ def calc_ts(df) -> LazyFrame:
5353
# 第一阶段
5454
df = df.with_columns([
5555
# 收益率标签
56-
pl.col('close_adj').map(lambda x: pl_np_wraps(ts_returns)(x, -1)).alias('returns_1'),
57-
pl.col('close_adj').map(lambda x: pl_np_wraps(ts_returns)(x, -5)).alias('returns_5'),
58-
pl.col('close_adj').map(lambda x: pl_np_wraps(ts_returns)(x, -10)).alias('returns_10'),
56+
pl.col('close_adj').pct_change(1).shift(-1).alias('returns_1'),
57+
pl.col('close_adj').pct_change(5).shift(-5).alias('returns_5'),
58+
pl.col('close_adj').pct_change(10).shift(-10).alias('returns_10'),
5959

60-
pl.col('close_adj').map(lambda x: pl_np_wraps(ts_returns)(x, 1)).alias('mom_1'),
61-
pl.col('close_adj').map(lambda x: pl_np_wraps(ts_returns)(x, 5)).alias('mom_5'),
62-
pl.col('close_adj').map(lambda x: pl_np_wraps(ts_returns)(x, 10)).alias('mom_10'),
60+
pl.col('close_adj').pct_change(1).alias('mom_1'),
61+
pl.col('close_adj').pct_change(5).alias('mom_5'),
62+
pl.col('close_adj').pct_change(10).alias('mom_10'),
6363
#
6464
*[pl.col('CLOSE').pct_change(i).alias(f'ROCP_{i}') for i in (1, 3, 5, 10, 20, 60)],
6565

0 commit comments

Comments
 (0)