【指标计算】老妈再也不担心我的指标算不好了(教你用MyTT、TA-Lib、Pandas TA计算股票指标,附源代码)

教你用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):
    # 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计算结果如下:
【指标计算】老妈再也不担心我的指标算不好了(教你用MyTT、TA-Lib、Pandas TA计算股票指标,附源代码)_第1张图片
2.2 使用Talib计算结果如下:
【指标计算】老妈再也不担心我的指标算不好了(教你用MyTT、TA-Lib、Pandas TA计算股票指标,附源代码)_第2张图片
2.3 使用Pandas_ta计算结果如下:
【指标计算】老妈再也不担心我的指标算不好了(教你用MyTT、TA-Lib、Pandas TA计算股票指标,附源代码)_第3张图片


总结

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。

你可能感兴趣的:(量化交易,金融,python,大数据)