python 量化交易 库_Python进阶量化交易专栏场外篇19-建立基于TA-Lib的指标库

欢迎大家订阅《教你用 Python 进阶量化交易》专栏!为了能够提供给大家更轻松的学习过程,笔者在专栏内容之外已陆续推出一些手记来辅助同学们学习本专栏内容,目前推出的扩展篇链接如下:

为了将专栏中分散的知识点贯穿起来,笔者在专栏的末尾小节《制作自己的量化交易工具》中分享了早期制作的一个简易版量化交易小工具,希望大家能够通过调试代码的方式掌握相关的知识。

目前在场外篇第9篇中已经移植到了Python3.7x版本上,接下来我们在这个版本的基础上逐步完善这个工具,使专栏的读者不仅能够通过小工具掌握专栏的相关知识点,也能够把工具用到自己的股票量化交易中去。

TA-Lib库的强大我们已经有目共睹了,对此可以基于TA-Lib库建立起基础的指标库。首先创建一个py文件“IndicatorsLib.py”,文件中创建QtYx_Talib_Indictors类,用于集合所有TA-Lib实现的技术指标。

TA-Lib库的函数分为10个功能组,如Overlap Studies(重叠研究)、Momentum Indicators(动量指标)、Volume Indicators(交易量指标)、Cycle Indicators(周期指标)、Price Transform(价格变换)、Volatility Indicators(波动率指标)、Pattern Recognition(模式识别)、Statistic Functions(统计函数)、Math Transform(数学变换)、Math Operators(数学运算),此处我们有代表性地选取几个指标接口去实现。

比如动量指标中包括如下指标:

ADX - Average Directional Movement Index

ADXR - Average Directional Movement Index Rating

CMO - Chande Momentum Oscillator

MACD - Moving Average Convergence/Divergence

STOCH - Stochastic

……

实现代码如下所示:

class QtYx_Talib_Indictors():

# Momentum Indicator Functions

@staticmethod

def ADX_DF(DataFrame, N=14):

# ADX - Average Directional Movement Index

res = talib.ADX(DataFrame.high.values, DataFrame.low.values, DataFrame.close.values, N)

return pd.DataFrame({'ADX': res}, index=DataFrame.index)

@staticmethod

def ADXR_DF(DataFrame, N=14):

# ADXR - Average Directional Movement Index Rating

res = talib.ADXR(DataFrame.high.values, DataFrame.low.values, DataFrame.close.values, N)

return pd.DataFrame({'ADXR': res}, index=DataFrame.index)

@staticmethod

def CMO(Series, timeperiod=14):

# CMO - Chande Momentum Oscillator

res = talib.CMO(Series.values, timeperiod)

return pd.Series(res, index=Series.index)

@staticmethod

def MACD_SER(Series, fastperiod=12, fastmatype=0, slowperiod=26, slowmatype=0, signalperiod=9, signalmatype=0):

# MACD - Moving Average Convergence/Divergence

macd_dif, macd_dea, macd_bar = talib.MACD(

Series.values, fastperiod, slowperiod, signalperiod)

return pd.Series(macd_dif, index=Series.index), pd.Series(macd_dea, index=Series.index), pd.Series(macd_bar, index=Series.index)

@staticmethod

def STOCH_DF(DataFrame, fastkperiod=9, slowkperiod=3, slowkmatype=0, slowdperiod=3, slowdmatype=0):

# STOCH - Stochastic

K, D = talib.STOCH(DataFrame.high.values, DataFrame.low.values, DataFrame.close.values, \

fastkperiod, slowkperiod, slowkmatype, slowdperiod, slowdmatype)

J = 3 * K - 2 * D

return pd.Series(K, index=DataFrame.index), pd.Series(D, index=DataFrame.index), pd.Series(J, index=DataFrame.index)

这里要注意的是全部接口都用@staticmethod静态方法修饰,这样一来可以当成函数去使用这些接口。另外有些指标只需要提供收盘价序列即可,有些则包括最高价、最低价等其他数据,对于前者我们以Series格式输入基础行情数据,后者则以DataFrame格式输入行情行情数据。

把各个指标集合之后,我们用字典格式重新封装指标,即字典的键为指标名称,字典的值为函数,如下所示:

indictors_dict = {"MA":QtYx_Base_Indictors.MA_DF,

"ADX":QtYx_Talib_Indictors.ADX_DF,

"BBANDS":QtYx_Talib_Indictors.BBANDS_SER,

"ADX":QtYx_Talib_Indictors.ADX_DF,

"AD":QtYx_Talib_Indictors.AD_DF,

"ADOSC":QtYx_Talib_Indictors.ADOSC_DF,

"MACD": QtYx_Talib_Indictors.MACD_SER,

"STOCH": QtYx_Talib_Indictors.STOCH_DF

}

接下来我们计算下BBANDS和MA这两个指标,BBANDS指标返回的是三个独立的series序列,而MA返回的则是DataFrame数据,如下所示:

print(indictors_dict["BBANDS"](df_stockDat.close, timeperiod=5, nbdevup=2, nbdevdn=2, matype=0))

"""

trade_date

2018-01-02 NaN

2018-01-03 NaN

2018-01-04 NaN

2018-01-05 NaN

2018-01-08 13.780169

2018-01-09 13.467012

2018-01-10 13.566040

2018-01-11 13.627829

2018-01-12 13.752504

2018-01-15 14.273103

2018-01-16 14.482287

2018-01-17 14.642702

2018-01-18 14.923935

2018-01-19 14.971701

"""

print(indictors_dict["MA"](df_stockDat, 120, 60, 20))

"""

MA120 MA60 MA20

trade_date

2018-01-02 NaN NaN NaN

2018-01-29 NaN NaN 13.8955

2018-01-30 NaN NaN 13.8930

2018-01-31 NaN NaN 13.9290

2018-02-01 NaN NaN 13.9680

2018-02-02 NaN NaN 14.0055

2018-02-05 NaN NaN 14.0850

... ... ... ...

2018-11-22 9.886917 10.454833 10.7490

2018-11-23 9.888917 10.470833 10.7060

2018-11-26 9.890250 10.476000 10.6855

"""

集合了基础指标之后,我们可以改进量化小工具代码里的GetStockDatPro()函数,把之前MA、MACD、KDJ的实现方法更新为调取TA-Lib的指标库的方式,如下所示:

def GetStockDatPro(stockName=None,stockTimeS=None,stockTimeE=None):

stockPro = GetStockDatApi(stockName, stockTimeS, stockTimeE)

# 处理移动平均线

stockDat = pd.DataFrame({'High': stockPro.high, 'Low': stockPro.low, 'Open': stockPro.open, 'Close': stockPro.close,\

'Volume': stockPro.vol})

stockDat = pd.concat([stockDat, indictors_dict['MA'](stockPro, 20, 60, 120)], axis=1)

# 处理MACD

stockDat['macd_dif'],stockDat['macd_dea'], stockDat['macd_bar'] = indictors_dict['MACD'](stockPro.close)

# 处理KDJ

stockDat['K'], stockDat['D'], stockDat['J'] = indictors_dict['STOCH'](stockPro)

return stockDat

使用字典封装指标接口的另外一个好处是可以取字典的键作为切换指标的名称,如下所示:

# 基础指标

Indicators_Text = wx.StaticText(self.ParaPanel, -1, u'基础指标')

Indicators_Combo_Val = list(indictors_dict.keys())

self.indicators_Val = "BBANDS"

self.indicators_CMBO = wx.ComboBox(self.ParaPanel, -1, self.indicators_Val, choices = Indicators_Combo_Val, style = wx.CB_READONLY|wx.CB_DROPDOWN) # 指标名称

实现效果如下所示:

d5cc97e18303a5bc19d9254f5f2798da.png

关于完整代码可以加入专栏交流群获取。更多的量化交易内容欢迎大家订阅专栏阅读!!

打开App,阅读手记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值