Package: ta-cn
ta_cn 中国版技术指标项目背景初学量化，技术指标一般使用TA-Lib，但存在以下问题部分技术指标与国内不同。但大部分中国股民都是参考国内技术指标进行交易。需要实现中国版指标TA-Lib只支持单支序列，要计算多支股票需循环，耗时久。在实现遗传算法挖因子时，意识到如果能将常用的操作都转成算子，将大大简化策略的研究，
特别是将+、-、*、/等中缀操作符转成ADD()、SUB()、MUL()、DIV()前缀函数，可直接输到遗传算法工具中所以开始参考Alpha101和各券商金融工程研报，试着实现一些算子，但后期实现中发现一些问题每家金工的研报指标命名上都有区别，难以统一指标太多，实现工作太大直到看到了MyTT这个项目才意识到，指标命名参考股票软件的公式才是最方便直接的，可以直接到各股软中复制公式。遇到性能问题再针对性转换即可。本人为何不直接用MyTT，而是重复造轮子呢？大部分公式只支持单条数据，遇到几千支股票的DataFrame，循环太慢TA-Lib与国内指标不同，区别在哪，没有对比。错过了很好的教学机会为了行数短牺牲了可读性部分函数直接复制于股票软件，代码没有优化，有重复计算再次大迭代，仿WorldQuant2022年9月初，知道WorldQuant Websim重新开放为WorldQuant BRAIN后，开始研究国外的平台WQ公式更加科学。例如：WQ时序有ts_前缀WQ有横截面函数和分组函数，通达信没有通达信将大量不相关的指标都归类为引用函数WQ公式为Alpha因子而设计，有大量的权重处理等函数目标优先实现WorldQuant公式，然后实现通达信公式通过在通达信中导入WQ公式并别名，来实现通达信公式覆盖支持二维矩阵计算支持长表和宽表，支持NaN跳过最终实现WQ的本地版实现方案优先级bottleneck。支持二维数据，优先使用TA-Lib。封装了常用函数，次要选择numba。速度受影响，最后才用它安装只想使用二维矩阵TA-Lib，只需安装基础版即可pip install ta_cn -i https://mirrors.aliyun.com/pypi/simple --upgrade使用中国版指标加速pip install ta_cn[cn] -i https://mirrors.aliyun.com/pypi/simple --upgrade开发人员安装。开发迭代很快，只有版本稳定才会发布到PyPI，需要时效更高的安装方法从github下载zip文件解压zip, 进入解压后目录，输入以下命令pip install .[cn] -i https://mirrors.aliyun.com/pypi/simple --upgrade库维护者安装。可修改本地文件pip install -e .常见使用方法转发原生talib，输入一维向量优点: 本库提供了跳过空值的功能缺点: 不要在大量循环中调用，因为跳过空值的功能每调用一次就要预分配内存封装原生talib，输入二维矩阵，同时支持参数一维向量化优点：可为不同股票指定不同参数，可用于按天遍历计算指标。只分配一次内存直接调用包中定义的指标，如KDJ等优点：符合中国习惯的技术指标缺点：指标数目前比较少。一般没有跳过空值功能输入为长表，分组计算优点：使用简单，可进行指标嵌套缺点：速度会慢一些。准备工作偏复杂输入为宽表优点：计算快缺点：计算前需要准备数据为指定格式，占大量内存停牌处理，跳过空值TA-Lib遇到空值后面结果全为NaN跳过NaN后，导致数据长度不够，部分函数可能报错方案一：将所有数据进行移动，时序指标移动到最后，横截面指标移动到最右。优点：原指标不需要改动，只要提前处理数据。处理速度也快缺点：时序指标与横截面指标不能混合使用，得分别处理方案二：预先初始化空白区，计算指标时屏蔽NaN,算完后回填优点：外部调用简单，不需要对数据提前处理缺点：由于有大量的是否跳过NaN的处理，所以速度慢常见示例importnumpyasnp# 新版talib,只要替换引用，并添加一句init即可importta_cn.talibastafromta_cn.utils_wideimportpushna,pullna# 原版talib,不支持二维数据# import talib as ta# 准备数据h=np.random.rand(1000000).reshape(-1,5000)+10l=np.random.rand(1000000).reshape(-1,5000)c=np.random.rand(1000000).reshape(-1,5000)# 指定模式，否则对talib封装的所有函数都不存在ta.init(mode=2,skipna=False,to_globals=True)# 几个调用函数演示r=ta.ATR(h,l,c,timeperiod=10)print(r)x,y,z=ta.BBANDS(c,timeperiod=10,nbdevup=2,nbdevdn=2)print(z)# 将少量值设置为空，用来模拟停牌c[c<0.4]=np.nan# 提前处理数据，跳过停牌进行计算，再还原的演示# 嵌套指标时，全为时序指标使用down,或全为截面使用right。混合时此方法不要轻易使用arr,row,col=pushna(c,direction='down')rr=ta.SMA(arr,timeperiod=10)r=pullna(rr,row,col)print(r)使用ta_cn中定义的公式importnumpyasnpfromta_cn.talibimportinit,set_compatibility_enable,set_compatibilityfromta_cn.tdx.over_bought_over_soldimportATR_CNfromta_cn.tdx.trendimportMACD# ta_cn.talib库底层是循环调用talib，部分计算效率不高# 可导入ta_cn中的公式# 准备数据h=np.random.rand(10000000).reshape(-1,50000)+10l=np.random.rand(10000000).reshape(-1,50000)c=np.random.rand(10000000).reshape(-1,50000)init(mode=2,skipna=False)r=ATR_CN(h,l,c,timeperiod=10)print(r)# 设置参数，让MACD中的EMA算法与国内算法相同set_compatibility_enable(True)set_compatibility(1)set_compatibility_enable(False)x,y,z=MACD(c,fastperiod=12,slowperiod=26,signalperiod=9)print(z)长宽表处理二维矩阵计算，的确方便，Alpha101中的公式很快就可以实现，即支持时序又支持截面，但其中有一个难点，
就是NaN值的处理。pushna和pullna可用于解决此问题，但在公式中嵌入就比较棘手。所以，本项目还特别提供了长表与宽表的装饰器，按照一定的要求套用装饰器，就能让原本不可跳过空值的函数自动跳过空值。
如果明确数据内不会产生空值，可以不使用长宽表装饰器，效率会更快。长表处理慢一些，但结果更适合于机器学习。
底层主要通过series_groupby_apply（针对单列输入）和dataframe_groupby_apply（针对多列输入）装饰器来实现跳过空值。importpandasaspdfromta_cn.imports.long_taimportATR,SMAfromta_cn.imports.long_wqimportgroup_neutralize,rankpd._testing._N=500pd._testing._K=30open_=pd._testing.makeTimeDataFrame()+5high=pd._testing.makeTimeDataFrame()+10low=pd._testing.makeTimeDataFrame()+5close=pd._testing.makeTimeDataFrame()+5group=close.copy()*100//1%5df={'open_':open_.stack(),'high':high.stack(),'low':low.stack(),'close':close.stack(),'group':group.stack(),}df=pd.DataFrame(df)df.index.names=['date','asset']kwargs=df.to_dict(orient='series')# 单输入r=SMA(df['close'],timeperiod=10)print(r.unstack())# 多输入r=ATR(df['high'],df['low'],df['close'],10)print(r.unstack())# 横截面r=rank(df['close'])print(r.unstack())r=group_neutralize(df['close'],df['group'])print(r.unstack())宽表处理速度通常比长表要快。核心是输入需要封装成WArr,输出要.raw()提取。
底层通过wide_wraps装饰器来实现空值跳过，通过long_wraps装饰器来实现长表函数转宽表函数importpandasaspdfromta_cn.imports.wide_taimportATRfromta_cn.utilsimportnp_to_pdfromta_cn.utils_wideimportWArrpd._testing._N=250pd._testing._K=30h=pd._testing.makeTimeDataFrame()+10l=pd._testing.makeTimeDataFrame()c=pd._testing.makeTimeDataFrame()# 数据需要封装成特殊对象，实现NaN的堆叠和还原h_=WArr.from_array(h,direction='down')l_=WArr.from_array(l,direction='down')c_=WArr.from_array(c,direction='down')r=ATR(h_,l_,c_,10)# 返回的数据可能是np.ndarrayprint(r.raw())# 可以再封装回pd.DataFramed=np_to_pd(r.raw(),copy=False,index=c.index,columns=c.columns)print(d.iloc[-5:])指标对比清单参考指标对比未完工，待补充Alpha101/Alpha191本项目，试着用公式系统实现Alpha101、Alpha191，请参考examples文件下的测试示例。它最大的特点是尽量保持原公式的形式，
少改动，防止乱中出错。然后再优化代码提高效率。停牌处理，空值填充板块指数，停牌了也要最近的行情进行计算，否则指数过小停牌期的开高低收都是最近的收盘价，收盘价可以ffill参考项目TA-LibTA-Lib C语言版，非官方镜像ta-libTA-Lib Python版封装MyTTMy麦语言 T通达信 T同花顺funcat公式移植pandas-ta支持Pandas扩展的技术指标ta通过类实现的技术指标WorldQuant算子WorldQuant算子详情交流群ta_cn技术指标交流群: 601477228