话说做量化交易,多多少少都会用到各种指标。可是,使用过程中才发现,各种问题,搞得人焦头烂额。
这些笔者已经踩过无数的坑,下面我就带大家来一一解决实现。
它将通达信,同花顺,文华麦语言等指标公式indicators,最简移植到Python中,核心库单个文件,仅百行代码,实现和转换同花顺通达信所有常见指标,整个包就是一个文件,将其复制到项目目录即可调用,指标可以自行扩展。有些平台不允许安装第三方包,这个就一个文件,复制上去就可以用。而且速度也很快。
Technical Analysis Library, 即技术分析库)是Python金融量化的高级库,涵盖了150多种股票、期货交易软件中常用的技术分析指标用得最普遍,估计量化人没有不知道的。因为已经编译过,所以速度很快,但有些指标和国内算法略有差异,指标不能自行扩展。但个人还是很推荐,毕竟速度快啊!
它是python3中的Pandas技术分析库,是pandas和ta-lib的结合产物,方便的了dataframe的数据运算,对宽客们算是个利好。
因测试代码需要使用MyTT、Talib 、Pandas-ta包,请提前使用pip语句进行安装。MyTT为单文件,将其和测试代码放在同一目录即可。Talib 、Pandas-ta可使用如下方法安装。
访问https://github.com/mpquant/MyTT,下载MyTT文件放到运行Python的目录即可。
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
pip install pandas_ta -i https://pypi.tuna.tsinghua.edu.cn/simple/
为了方便数据展示,需要调用prettytable包,请测试前提前安装,以免报错。安装语句如下:
pip install -U prettytable
计算指标,先得有数据,采集数据可考文章《一文学懂通过Tushare、AKshare、baostock、Ashare、Pytdx获取股票行情数据(含代码)》
https://blog.csdn.net/popboy29/article/details/125815775
为了方便,这里我们使用 Ashare包,小巧方便,只一个文件。下载Ashare.py并将其也和测试代码放在同一目录即可。
我们提取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):
# talib
C = 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-ta
CustomStrategy = 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 = 0
df_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。