教你用MyTT、TA-Lib、Pandas TA计算股票指标,附源代码
- 前言
- 一、目前Python流行的几款股票行情分析指标计算库
- 1. MyTT
- 2. Ta-lib
- 3. Pandas TA
- 二、指标计算的准备工作
- 1.下载MyTT文件
- 2.安装Ta-lib包
- 3. 安装Pandas-ta包
- 三、分别用MyTT、Talib 、Pandas-ta计算5日均线、布林线、RSI、MACD指标
- 1. 获取日K数据
- 2. 计算5日均线、布林线、RSI、MACD指标源代码及耗时
- 总结
- 看到这里,如果文章对你有帮助,不妨在评论区写个评论,或是转发一下。对你无所谓,但它可以拓展笔者的写作权限,好写出更多的好文章分享给大家!
- 后记
前言
话说做量化交易,多多少少都会用到各种指标。可是,使用过程中才发现,各种问题,搞得人焦头烂额。
- 股票指标怎么算?
- 谁家的库计算起来又快又准?
- Talib的macd指标计算出来和国内软件不一样,怎么办?
这些笔者已经踩过无数的坑,下面我就带大家来一一解决实现。
一、目前Python流行的几款股票行情分析指标计算库
1. MyTT
它将通达信,同花顺,文华麦语言等指标公式indicators,最简移植到Python中,核心库单个文件,仅百行代码,实现和转换同花顺通达信所有常见指标,整个包就是一个文件,将其复制到项目目录即可调用,指标可以自行扩展。有些平台不允许安装第三方包,这个就一个文件,复制上去就可以用。而且速度也很快。
2. Ta-lib
Technical Analysis Library, 即技术分析库)是Python金融量化的高级库,涵盖了150多种股票、期货交易软件中常用的技术分析指标用得最普遍,估计量化人没有不知道的。因为已经编译过,所以速度很快,但有些指标和国内算法略有差异,指标不能自行扩展。但个人还是很推荐,毕竟速度快啊!
3. Pandas TA
它是python3中的Pandas技术分析库,是pandas和ta-lib的结合产物,方便的了dataframe的数据运算,对宽客们算是个利好。
二、指标计算的准备工作
因测试代码需要使用MyTT、Talib 、Pandas-ta包,请提前使用pip语句进行安装。MyTT为单文件,将其和测试代码放在同一目录即可。Talib 、Pandas-ta可使用如下方法安装。
1.下载MyTT文件
访问https://github.com/mpquant/MyTT,下载MyTT文件放到运行Python的目录即可。
2.安装Ta-lib包
Ta-lib 最简单的安装方式:pip install Ta-lib ,推荐使用如下代码:
pip install Ta-lib -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn --upgrade
注:Ta-lib很多人反映不好安装,经常报错。如果有问题,可参考《一文解决python各类第三方包的 pip 安装问题(含加速镜像源、pip在线离线安装方法,多环境安装,量化talib包安装方法)》https://blog.csdn.net/popboy29/article/details/126140862
3. 安装Pandas-ta包
pip install pandas_ta -i https://pypi.tuna.tsinghua.edu.cn/simple/
为了方便数据展示,需要调用prettytable包,请测试前提前安装,以免报错。安装语句如下:
pip install -U prettytable
三、分别用MyTT、Talib 、Pandas-ta计算5日均线、布林线、RSI、MACD指标
1. 获取日K数据
计算指标,先得有数据,采集数据可考文章《一文学懂通过Tushare、AKshare、baostock、Ashare、Pytdx获取股票行情数据(含代码)》
https://blog.csdn.net/popboy29/article/details/125815775
为了方便,这里我们使用 Ashare包,小巧方便,只一个文件。下载Ashare.py并将其也和测试代码放在同一目录即可。
2. 计算5日均线、布林线、RSI、MACD指标源代码及耗时
我们提取1000跟日K线数据,并给指标设定相同的参数,使用以上三种包分别计算指标。
具体代码如下:
import time
from Ashare import *
# 加载指标计算库
from MyTT import *
import talib
import pandas_ta as ta# ===============表格美化输出===============
def df_table(df,index):import prettytable as pt#利用prettytable对输出结果进行美化,index为索引列名:df_table(df,'market')tb = pt.PrettyTable()df = df.reset_index(drop = True)tb.add_column(index,df.index)for col in df.columns.values:#df.columns.values的意思是获取列的名称tb.add_column(col, df[col])print(tb)def cal_indicators_MyTT(df_data):# MyTT C = df_data['close']df_data['ma5'] = MA(C,5)df_data['bollUpper'],df_data['bollMiddle'],df_data['bollBottom'] = BOLL(C,N=20, P=2)df_data['rsi'] = RSI(C,14)df_data['diff'],df_data['dea'],df_data['macd']=MACD(C,SHORT=12,LONG=26,M=9)return df_data.round(3)def cal_indicators_Talib(df_data):# talibC = df_data['close']df_data['ma5'] = talib.MA(C,5)df_data['bollUpper'],df_data['bollMiddle'],df_data['bollBottom'] = talib.BBANDS(C,timeperiod=20,nbdevup=2,nbdevdn=2,matype=0)df_data['rsi'] = talib.RSI(C, timeperiod=14)df_data['diff'], df_data['dea'], df_data['macd'] = talib.MACD(C, fastperiod=12, slowperiod=26, signalperiod=9)# macd值需要乘以2,才可以和国内的股票软件一致df_data['macd']=df_data['macd'].map(lambda x: x*2)return df_data.round(3)def cal_indicators_Pandas_ta(df_data):# pandas-taCustomStrategy = ta.Strategy(name="我的指标库",description="SMA 50, BBANDS, RSI, MACD",ta=[{"kind": "sma", "length": 5},{"kind": "bbands", "length": 20},{"kind": "rsi", "length": 14},{"kind": "macd", "fast": 12, "slow": 26, "signal":9},])# # To run your "Custom Strategy"# print('df.ta.cores',df_data.ta.cores)# df_data.ta.cores = 0df_data.ta.strategy(CustomStrategy)# macd值需要乘以2,才可以和国内的股票软件一致df_data['MACDh_12_26_9']=df_data['MACDh_12_26_9'].map(lambda x: x*2)return df_data.round(3)if __name__ == "__main__":# 1.过Ashare获取数据print('开始提取K线数据')from Ashare import *df_data=get_price('sz300750',frequency='1d',count=1000) #frequency='1d' 表是获取日K,count=1000,表示获取1000根K线# print('Ashare行情获取\n',df_data)df_table(df_data.tail(20),'df_data')# 2. 测试计时开始,测试哪个就把if 后面的0改为1即可,其它改成0。time1 = time.time()print('开始计算指标')if 0:df = cal_indicators_MyTT(df_data)df_table(df.tail(20),'MyTT')# 计算指标耗时: 0.022001266479492188 秒if 0:df = cal_indicators_Talib(df_data)df_table(df.tail(20),'Talib')# 计算指标耗时: 0.019998788833618164 秒if 1:df = cal_indicators_Pandas_ta(df_data)df_table(df.tail(20),'Pandas_ta')# 计算指标耗时: 2.5784144401550293 秒time2 = time.time()print("计算指标耗时:",time2-time1,'秒')
2.1 使用MyTT计算结果如下:
2.2 使用Talib计算结果如下:
2.3 使用Pandas_ta计算结果如下:
总结
1、通过对比可以发现,使用MyTT和Talib计算耗时较短,而且Talib更胜一筹。这是因为后者为已编译过的库,所以运算效率极高。这也是其使用普遍的原因。不过,由于MyTT是单个文件,语法很是精炼,提供了源代码方便大家自由扩展。
2、细心的朋友应该已经发现,Talib计算MACD指标和国内不一样,需要对macd值再乘以2才可以对齐国内的指标。另外Talib库有很多指标国内没有,需要的朋友可自行百度学习。
3、Pandas_ta 有个好处,可以一次性打包计算多个指标值,这个值得我们学习。不过其计算效率打折严重,如果对时效要求不高,那就无所谓了。另外,因为使用Talib进行包装,所以MACD同样需要乘以2哦。
看到这里,如果文章对你有帮助,不妨在评论区写个评论,或是转发一下。对你无所谓,但它可以拓展笔者的写作权限,好写出更多的好文章分享给大家!
后记
Pandas Technical Analysis(Pandas TA)是一个易于使用的库,它基于Python的Pandas库构建,具有120多个指标和实用函数。这些指标通常用于带有列或标签的金融时间序列数据集:datetime、open、high、low、close、volume等。包括许多常用的指标,如:简单移动平均(sma)、移动平均收敛发散(macd)、赫尔指数移动平均(hma)、布林格带(BBAND)、On-Balance体积(obv)、Aron&Aron振荡器(Aron)、挤压(Squeeze)等。
PandasTA有三种不同的处理技术指标的方法,如下所述。在Pandas数据帧扩展模式下运行指示器的主要要求是open、high、low、close、volume都是小写的。根据指示器的不同,它们要么返回命名序列,要么返回大写下划线参数格式的DataFrame。例如,MACD(fast=12,slow=26,signal=9)将返回一个包含列的数据帧:[‘MACD_12_26_9’,‘MACDh_12_26_9’,‘MACDs_12_26_9’]。这个和国内的指标对应关系分别是diff,macd,dea。