004 | 掌握金融量化交易库Talib
订阅本专栏的可以下载对应的代码和数据集
| 🚀 上一篇 | 🌟 下一篇 |
|---|---|
| ⬅️ 003 掌握金融量化交易库Tushare | 005 马科维茨投资组合理论实现 ➡️ |
金融数据和量化交易
Talib
TA-Lib,全称为"Technical Analysis Library",是Python金融量化领域的高级开发库。该系统性地整合了广泛应用于股票和期货交易软件中的技术分析指标,共计150多种。包括经典的动量指标、RSI、KDJ以及布林带等技术分析工具。
安装TA-Lib库:首先访问官方网站:https://www.lfd.uci.edu/~gohlke/pythonlibs,下载对应的安装包,文件名称为TA_Lib-0.4.17-cp37-cp37m-win_amd64.whl。然后在终端中切换至命令模式,运行安装命令:`pip install TA_Lib-0.4.17-cp37-cp37m-win_amd64.whl。最后导入库并进行配置:import talib as ta`,以方便后续使用。
(1)移动平均线
在技术分析理论中,移动平均线是最常用的重要指标之一。它主要用以确认、跟踪和判断趋势,以及提供买卖信号提示。较为容易地把握市场机会和规避风险。然而,移动平均线通常需要与其他技术指标或基本面分析相结合使用。特别地,当市场处于整理行情时,移动平均线的买卖信号容易频繁出现,导致失真。
移动平均线MA语法:
ta.MA(close,timeperiod=30,matype=0)
AI助手
其中,close代表收盘价,构成时间序列,timeperiod设定为时间跨度,默认值为30天。指标类型matype即为:0对应SMA,1对应EMA,2对应WMA,3对应DEMA,4对应TEMA,5对应TRIMA,6对应KAMA,7对应MAMA,8对应T3的默认设置为SMA。
下表是移动平均线类型常见九大类型
| 英文简称 | 移动平均线类型 |
|---|---|
| SMA | 简单移动平均线 |
| EMA | 指数移动平均线 |
| WMA | 加权移动平均线 |
| DEMA | 加权移动平均线 |
| TEMA | 三重指数移动平均线 |
| TRIMA | 三角移动平均线 |
| KAMA | 考夫曼自适应移动平均线 |
| MAMA | MESA自适应移动平均线 |
| T3 | 三重指数移动平均线 |
实例:使用Talib绘制上证指数各种类型移动平均线
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
#正常显示画图时出现的中文和负号
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False
#引入TA-Lib库
import talib as ta
#使用tushare获取上证指数数据作为示例
import tushare as ts
df=ts.get_k_data('sh',start='2000-01-01')
df.index=pd.to_datetime(df.date)
df=df.sort_index()
types=['SMA','EMA','WMA','DEMA','TEMA','TRIMA','KAMA','MAMA','T3']
df_ma=pd.DataFrame(df.close)
for i in range(len(types)):
df_ma[types[i]]=ta.MA(df.close,timeperiod=5,matype=i)
df_ma.tail()
df_ma.loc['2018-08-01':].plot(figsize=(16,6))
plt.title('上证指数各种类型移动平均线',fontsize=15)
plt.show()
AI助手
运行代码,结果如下图14所示

(2)布林带
布林带(Bollinger Band)是由以下三个组成部分构成的:支撑线、压力线和价格平均线。通常情况下,价格线会在支撑线和压力线所形成的上下区间内震荡。该区间的位置会随着价格的波动而 responsive地进行调整。
布林带共由三条线组成,分别为上轨、中轨、下轨
中轨:由最近5个交易日的收盘价计算得出的平均值形成的线条。上轨:基于5日收盘价的标准差计算得出的上界和下界。下轨:基于5日收盘价的标准差计算得出的上界和下界。
下图15是布林带,中线是收盘价20日移动平均线

布林带收窄代表稳定的取值,张开代表有较大的波动空间的趋势
布林线的理论应用原则为:当股价突破最外层压力线(支撑线)时,预示着卖出(买入)信号的出现。即使股价未能突破最外层压力线,但若发生回拉突破第二条线,则同样构成卖出或买入的信号。
计算方法:首先计算过去 N 日收盘价的标准差 std(Standard Deviation),通常乘以 2 得到 2 倍标准差。上轨(Up 线)即 N 日平均线加两倍的标准差,下轨(Down 线)则为 N 日平均线减两倍的标准差。
布林带BBANDS语法:
ta.BBANDS(close, timeperiod=5, nbdevup=2, nbdevdn=2, matype=0)
AI助手
实例:以上证指数收盘价20日移动平均线为均线,绘制2019年上证指数布林带
H_line,M_line,L_line=ta.BBANDS(df.close, timeperiod=20, nbdevup=2, nbdevdn=2, matype=0)
df1=pd.DataFrame(df.close,index=df.index,columns=['close'])
df1['H_line']=H_line
df1['M_line']=M_line
df1['L_line']=L_line
df1.tail()
df1.loc['2019-01-01':'2019-12-30'].plot(figsize=(16,6))
plt.title('上证指数布林带',fontsize=15)
plt.show()
AI助手
运行代码,结果如下图16所示

(3) 价格转换
TA-Lib模块中包含四个价格转换函数,用于计算其开盘价、收盘价、最高价和最低价的平均值。具体数据可参考下表。
| 英文全称 | 中文名称 | 函数 |
|---|---|---|
| Average Price | 平均价格 | ta.AVGPRICE(open, high, low, close) |
| Median Price | 中位数价格 | ta.MEDPRICE(high, low) |
| Typical Price | 代表性价格 | ta.TYPPRICE(high, low, close) |
| Weigthted Close Price | 加权收盘价 | ta.WCLPRICE(high, low, close) |
实例:绘制上证指数其价格转换成对应类型的价格图
#获取上证指数收盘价、最高、最低价格
df=df[['open','close','high','low']]
#开盘价,最高价,最低价,收盘价的均值
df['average']=ta.AVGPRICE(df.open,df.high,df.low,df.close)
#最高价,最低价的均值
df['median']=ta.MEDPRICE(df.high,df.low)
#最高价,最低价,收盘价的均值
df['typical']=ta.TYPPRICE(df.high,df.low,df.close)
#最高价,最低价,收盘价的加权
df['weight']=ta.WCLPRICE(df.high,df.low,df.close)
df.loc['2019-12-01':,['close','average','median','typical','weight']].plot(figsize=(12,6))
plt.title('上证指数及其价格转换',fontsize=15)
plt.show()
AI助手
运行代码,结果如下图17所示

(4)周期指标函数
希尔伯特变换(Hilbert Transform)属于积分变换的一种,在信号处理领域具有广泛的应用。在工程实践中,常用于处理窄带数字信号。金融市场的波动呈现出非周期、不规则的特征,但只要波动存在,就可以通过希尔伯特变换识别其周期性特征。在分析股价走势时,通常将其分解为长期趋势、中短期周期性波动以及噪声三个组成部分。在剔除长期趋势的影响后,可以通过希尔伯特变换分析中短期周期性波动的特征。
| 英文全称 | 中文名称 | 函数 |
|---|---|---|
| Hilbert Transform-Dominant Cycle Period | 希尔伯特变换-主导周期 | ta.HT_DCPERIOD(close),计算价格的周期位置 |
| Hilbert Transform-Dominant Cycle Phase | 希尔伯特变换-主导循环阶段 | ta.HT_DCPHASE(close) |
| Hilbert Transform-Phasor Components | 希尔伯特变换-相位构成 | inphase,quadrature=ta.HT_PHASOR(close)< |
| Hilbert Transform-SineWave | 希尔伯特变换-正弦波 | sine, leadsine = ta.HT_SINE(close) |
| Hilbert Transform-Trend vs Cycle Mode | 希尔伯特变换-趋势与周期模式 | ta.HT_TRENDMODE(close) |
实例:绘制上证指数周期变换图
df['dcperiod']=ta.HT_DCPERIOD(df.close)
df['dcphase']=ta.HT_DCPHASE(df.close)
df['inhpase'],df['quadrature']=ta.HT_PHASOR(df.close)
df['sine'],df['leadsine']=sine, leadsine = ta.HT_SINE(df.close)
df['trendmode']=ta.HT_TRENDMODE(df.close)
#将上述函数计算得到的结果进行可视化
df.loc['2019-12-01':,['close','dcperiod','dcphase','inhpase','quadrature','sine',
'leadsine','trendmode']].plot(figsize=(20,18),subplots = True,layout=(4, 2))
plt.subplots_adjust(wspace=0,hspace=0.2)
AI助手
运行代码,结果如下图18所示

(5) 波动率指标
当前交易日的最高价与最低价差值、上一交易日收盘价与当日最高价的差值、上一交易日收盘价与当日最低价的差值,这三者中的最大值即为真实波幅。即真实波动幅度的计算方式为:最大值减去最小值。其平均真实波动幅度则为N日指数移动平均数。波动幅度的变化趋势能够反映出交易者的情绪和预期。当波动幅度出现显著上升时,通常预示着交易者可能准备持续买入或卖出股票;而波动幅度的下降则表明市场参与者对当前走势缺乏兴趣。波动率指标通过衡量价格的波动程度,能够辅助分析市场趋势变化的可能性以及整体的交易氛围。
| 英文全称 | 中文名称 | 函数 |
|---|---|---|
| Average True Range | 平均真实波动幅度 | ta.ATR(high, low, close, timeperiod=14) |
| Normalized Average True Range | 归一化的均真实波动幅度 | ta.NATR(high, low, close, timeperiod=14) |
| True Range | 真实波动幅度 | ta.TRANGE(high, low, close, timeperiod=14) |
实例:绘制上证指数波动率指标图
df['atr']=ta.ATR(df.high, df.low, df.close, timeperiod=14)
df['natr']=ta.NATR(df.high, df.low, df.close, timeperiod=14)
df['trange']=ta.TRANGE(df.high, df.low, df.close)
df.loc['2019-12-01':,['atr','natr','trange']].plot(figsize=(10,8),subplots=True,layout=(3,1))
AI助手
运行代码,结果如下图19所示

(6)数学运算
TA-Lib包含有向量(即数组)的加减乘除运算、在特定时间段内求和运算、最大值、最小值及其索引位置等基本计算函数。需要注意的是,TA-Lib的向量运算与Pandas中的移动窗口运算有何异同。类似于Pandas中的moving window功能,TA-Lib的向量计算功能也会生成一个新的序列。具体运算结果可参考下表。
| 英文全称 | 中文名称 | 函数 |
|---|---|---|
| Vector Arithmetic Add | 向量加法运算 | ta.ADD(high,low) |
| Vector Arithmetic Substraction | 向量减法运算 | ta.SUB(high,low) |
| Vector Arithmetic Mult | 向量乘法运算 | ta.MULT(high,low) |
| Vector Arithmetic Div | 向量除法运算 | ta.DIV(high,low) |
| Summation | 周期内求和 | ta.SUM(close, timeperiod=30) |
| Highest value over a specified period | 周期内最大值 | ta.MAX(close, timeperiod=30) |
| Index of Highest value over a specified period | 周期内最大值的索引 | ta.MAXINDEX(close, timeperiod=30) |
| Lowest value over a specified period | 周期内最小值 | ta.MIN(close, timeperiod=30) |
| Index of Lowest value over a specified period | 周期内最小值的索引 | ta.MININDEX(close, timeperiod=30) |
| Lowest and Highest values over a specified period | 周期内最小值和最大值 | min, max=ta.MINMAX(close, timeperiod=30) |
| Indexes of Lowest and Highest values over a specified period | 周期内最小值和最大值的索引 | minidx, maxidx= ta.MINMAXINDEX(close, timeperiod=30) |
示例:上证指数数学运算
#最高价与最低价之和
df['add']=ta.ADD(df.high,df.low)
#最高价与最低价之差
df['sub']=ta.SUB(df.high,df.low)
#最高价与最低价之乘
df['mult']=ta.MULT(df.high,df.low)
#最高价与最低价之除
df['div']=ta.DIV(df.high,df.low)
#收盘价的每30日移动求和
df['sum']=ta.SUM(df.close, timeperiod=30)
#收盘价的每30日内的最大最小值
df['min'], df['max'] = ta.MINMAX(df.close, timeperiod=30)
#收盘价的每30日内的最大最小值对应的索引值(第N行)
df['minidx'], df['maxidx'] = ta.MINMAXINDEX(df.close, timeperiod=30)
df.tail()
#将上述函数计算得到的结果进行可视化
df.loc['2019-12-01':,['close','add','sub','mult','div','sum','min','max']].plot(figsize=(15,8), subplots = True,layout=(4, 2))
plt.subplots_adjust(wspace=0,hspace=0.2)
AI助手
运行代码,结果如下图20所示

(7) 统计学函数
包含有基础统计学函数的TA-Lib,基于时间序列的移动窗口计算。需注意TA-Lib中的beta参数,示例中计算的是某只股票的最高价与最低价序列的移动beta值,其默认计算周期为5个交易日。在资本资产定价模型中,通常分析的是某只股票相对于市场指数(如大盘指数)的波动特征。如上表所示,具体指标为:
| 英文全称 | 中文名称 | 函数 |
|---|
Beta值 - 资本资产定价模型(CAPM) | 资本资产定价模型中的Beta值 | ta.BETA(high, low, timeperiod=5)
移动Beta值计算(回归分析) | 计算两个序列的移动Beta值(回归分析法) | ta.BETA(high, low, timeperiod=30)
Person’s相关系数 - 皮尔逊相关系数 | 皮尔逊相关系数 | ta.CORREL(high, low, timeperiod=30)
| Linear Regression Model | 时间序列的线性回归分析 | ta.LINEARREG(close,timeperiod=14) |
|---|---|---|
| Linear Regression Analysis | 回归模型的斜率正切值 | ta.LINEARREG_ANGLE(close,timeperiod=14) |
| Linear Regression Intercept | 回归模型的截距值 | ta.LINEARREG_INTERCEPT(close,timeperiod=14) |
| --- | --- | --- |
| Standard Deviation Calculation | 每五个数据点计算标准差 | ta.STDDEV(close,timeperiod=5,nbdev=1) |
| Time Series Forecast Output | 基于时间序列的预测结果 | ta.TSF(close,timeperiod=14) |
| Variance Calculation | 每五个数据点计算方差 | ta.VAR(close,timeperiod=5,nbdev=1) |
示例:预测上证指数
#收盘价对时间t的线性回归预测值
df['linearreg']=ta.LINEARREG(df.close, timeperiod=14)
#时间序列预测值
df['tsf']=ta.TSF(df.close, timeperiod=14)
#画图
df.loc['2019-12-01':,['close','linearreg','tsf']].plot(figsize=(12,6))
AI助手
运行代码,结果如下图21所示

订阅本专栏的可以下载对应的代码和数据集
| 🚀 上一篇 | 🌟 下一篇 |
|---|---|
| ⬅️ 003 掌握金融量化交易库Tushare | 005 马科维茨投资组合理论实现 ➡️ |
