python金融股票市场数据分析神器TA-Lib学习使用
作为一名python的粉丝,每次看到有什么新鲜的库、框架什么的总会忍不住想去试试,哪怕就是简单的小实践也可以,因为这些库的确是功能十分地强大而且API好用,今天浏览文章的时候无意间看到一个金融股票相关的分析工具,其实之前也接触到一个类似的库叫做tushare,可以获取股市相关的数据用来作分析工作,今天这个talib模块相比tushare更为强大一些,它是完全基于Cpython封装得到的模块。
talib相关的中文文档十分地稀缺,这里先给出来GitHub地址在这里,官方文档在这里。在社区找到一个还可以的中文文档翻译放在这里。
先说一下安装,使用pip方式安装的话可能会报错,所以呢,如果不想麻烦的话建议下载这里的whl文件来直接安装,亲测可行,没有出现报错信息。
python27环境下的下载:TA_Lib‑0.4.17‑cp27‑cp27m‑win_amd64.whl
python36环境下的下载:TA_Lib‑0.4.17‑cp36‑cp36m‑win_amd64.whl
python37环境下的下载:TA_Lib‑0.4.17‑cp37‑cp37m‑win_amd64.whl
根据自己系统中python解释器具体的版本来下载和安装对应的whl文件进行安装即可。安装完成后,进入python提供的shell环境中执行下述命令若无报错则说明安装成功:
接下来就进入使用的阶段了,先简单看一下talib模块提供的一些功能和功能组。
print ta.get_functions()
print ta.get_function_groups()
输出如下:
['ATR', 'NATR', 'TRANGE', 'BBANDS', 'DEMA', 'EMA', 'HT_TRENDLINE', 'KAMA', 'MA', 'MAMA', 'MAVP', 'MIDPOINT', 'MIDPRICE', 'SAR', 'SAREXT', 'SMA', 'T3', 'TEMA', 'TRIMA', 'WMA', 'BETA', 'CORREL', 'LINEARREG', 'LINEARREG_ANGLE', 'LINEARREG_INTERCEPT', 'LINEARREG_SLOPE', 'STDDEV', 'TSF', 'VAR', 'ADX', 'ADXR', 'APO', 'AROON', 'AROONOSC', 'BOP', 'CCI', 'CMO', 'DX', 'MACD', 'MACDEXT', 'MACDFIX', 'MFI', 'MINUS_DI', 'MINUS_DM', 'MOM', 'PLUS_DI', 'PLUS_DM', 'PPO', 'ROC', 'ROCP', 'ROCR', 'ROCR100', 'RSI', 'STOCH', 'STOCHF', 'STOCHRSI', 'TRIX', 'ULTOSC', 'WILLR', 'CDL2CROWS', 'CDL3BLACKCROWS', 'CDL3INSIDE', 'CDL3LINESTRIKE', 'CDL3OUTSIDE', 'CDL3STARSINSOUTH', 'CDL3WHITESOLDIERS', 'CDLABANDONEDBABY', 'CDLADVANCEBLOCK', 'CDLBELTHOLD', 'CDLBREAKAWAY', 'CDLCLOSINGMARUBOZU', 'CDLCONCEALBABYSWALL', 'CDLCOUNTERATTACK', 'CDLDARKCLOUDCOVER', 'CDLDOJI', 'CDLDOJISTAR', 'CDLDRAGONFLYDOJI', 'CDLENGULFING', 'CDLEVENINGDOJISTAR', 'CDLEVENINGSTAR', 'CDLGAPSIDESIDEWHITE', 'CDLGRAVESTONEDOJI', 'CDLHAMMER', 'CDLHANGINGMAN', 'CDLHARAMI', 'CDLHARAMICROSS', 'CDLHIGHWAVE', 'CDLHIKKAKE', 'CDLHIKKAKEMOD', 'CDLHOMINGPIGEON', 'CDLIDENTICAL3CROWS', 'CDLINNECK', 'CDLINVERTEDHAMMER', 'CDLKICKING', 'CDLKICKINGBYLENGTH', 'CDLLADDERBOTTOM', 'CDLLONGLEGGEDDOJI', 'CDLLONGLINE', 'CDLMARUBOZU', 'CDLMATCHINGLOW', 'CDLMATHOLD', 'CDLMORNINGDOJISTAR', 'CDLMORNINGSTAR', 'CDLONNECK', 'CDLPIERCING', 'CDLRICKSHAWMAN', 'CDLRISEFALL3METHODS', 'CDLSEPARATINGLINES', 'CDLSHOOTINGSTAR', 'CDLSHORTLINE', 'CDLSPINNINGTOP', 'CDLSTALLEDPATTERN', 'CDLSTICKSANDWICH', 'CDLTAKURI', 'CDLTASUKIGAP', 'CDLTHRUSTING', 'CDLTRISTAR', 'CDLUNIQUE3RIVER', 'CDLUPSIDEGAP2CROWS', 'CDLXSIDEGAP3METHODS', 'AD', 'ADOSC', 'OBV', 'ADD', 'DIV', 'MAX', 'MAXINDEX', 'MIN', 'MININDEX', 'MINMAX', 'MINMAXINDEX', 'MULT', 'SUB', 'SUM', 'ACOS', 'ASIN', 'ATAN', 'CEIL', 'COS', 'COSH', 'EXP', 'FLOOR', 'LN', 'LOG10', 'SIN', 'SINH', 'SQRT', 'TAN', 'TANH', 'AVGPRICE', 'MEDPRICE', 'TYPPRICE', 'WCLPRICE', 'HT_DCPERIOD', 'HT_DCPHASE', 'HT_PHASOR', 'HT_SINE', 'HT_TRENDMODE']
{'Pattern Recognition': ['CDL2CROWS', 'CDL3BLACKCROWS', 'CDL3INSIDE', 'CDL3LINESTRIKE', 'CDL3OUTSIDE', 'CDL3STARSINSOUTH', 'CDL3WHITESOLDIERS', 'CDLABANDONEDBABY', 'CDLADVANCEBLOCK', 'CDLBELTHOLD', 'CDLBREAKAWAY', 'CDLCLOSINGMARUBOZU', 'CDLCONCEALBABYSWALL', 'CDLCOUNTERATTACK', 'CDLDARKCLOUDCOVER', 'CDLDOJI', 'CDLDOJISTAR', 'CDLDRAGONFLYDOJI', 'CDLENGULFING', 'CDLEVENINGDOJISTAR', 'CDLEVENINGSTAR', 'CDLGAPSIDESIDEWHITE', 'CDLGRAVESTONEDOJI', 'CDLHAMMER', 'CDLHANGINGMAN', 'CDLHARAMI', 'CDLHARAMICROSS', 'CDLHIGHWAVE', 'CDLHIKKAKE', 'CDLHIKKAKEMOD', 'CDLHOMINGPIGEON', 'CDLIDENTICAL3CROWS', 'CDLINNECK', 'CDLINVERTEDHAMMER', 'CDLKICKING', 'CDLKICKINGBYLENGTH', 'CDLLADDERBOTTOM', 'CDLLONGLEGGEDDOJI', 'CDLLONGLINE', 'CDLMARUBOZU', 'CDLMATCHINGLOW', 'CDLMATHOLD', 'CDLMORNINGDOJISTAR', 'CDLMORNINGSTAR', 'CDLONNECK', 'CDLPIERCING', 'CDLRICKSHAWMAN', 'CDLRISEFALL3METHODS', 'CDLSEPARATINGLINES', 'CDLSHOOTINGSTAR', 'CDLSHORTLINE', 'CDLSPINNINGTOP', 'CDLSTALLEDPATTERN', 'CDLSTICKSANDWICH', 'CDLTAKURI', 'CDLTASUKIGAP', 'CDLTHRUSTING', 'CDLTRISTAR', 'CDLUNIQUE3RIVER', 'CDLUPSIDEGAP2CROWS', 'CDLXSIDEGAP3METHODS'], 'Volume Indicators': ['AD', 'ADOSC', 'OBV'], 'Math Transform': ['ACOS', 'ASIN', 'ATAN', 'CEIL', 'COS', 'COSH', 'EXP', 'FLOOR', 'LN', 'LOG10', 'SIN', 'SINH', 'SQRT', 'TAN', 'TANH'], 'Math Operators': ['ADD', 'DIV', 'MAX', 'MAXINDEX', 'MIN', 'MININDEX', 'MINMAX', 'MINMAXINDEX', 'MULT', 'SUB', 'SUM'], 'Cycle Indicators': ['HT_DCPERIOD', 'HT_DCPHASE', 'HT_PHASOR', 'HT_SINE', 'HT_TRENDMODE'], 'Volatility Indicators': ['ATR', 'NATR', 'TRANGE'], 'Overlap Studies': ['BBANDS', 'DEMA', 'EMA', 'HT_TRENDLINE', 'KAMA', 'MA', 'MAMA', 'MAVP', 'MIDPOINT', 'MIDPRICE', 'SAR', 'SAREXT', 'SMA', 'T3', 'TEMA', 'TRIMA', 'WMA'], 'Statistic Functions': ['BETA', 'CORREL', 'LINEARREG', 'LINEARREG_ANGLE', 'LINEARREG_INTERCEPT', 'LINEARREG_SLOPE', 'STDDEV', 'TSF', 'VAR'], 'Momentum Indicators': ['ADX', 'ADXR', 'APO', 'AROON', 'AROONOSC', 'BOP', 'CCI', 'CMO', 'DX', 'MACD', 'MACDEXT', 'MACDFIX', 'MFI', 'MINUS_DI', 'MINUS_DM', 'MOM', 'PLUS_DI', 'PLUS_DM', 'PPO', 'ROC', 'ROCP', 'ROCR', 'ROCR100', 'RSI', 'STOCH', 'STOCHF', 'STOCHRSI', 'TRIX', 'ULTOSC', 'WILLR'], 'Price Transform': ['AVGPRICE', 'MEDPRICE', 'TYPPRICE', 'WCLPRICE']}
从上我们看到talib提供的指示器组包括下述指标:
各项展开信息如下:
以官网实例中提供的简单收盘价计算的相关方法为基础,具体实践如下:
#!usr/bin/env python
#encoding:utf-8
from __future__ import division
'''
__Author__:沂水寒城
功能: 股市技术分析利器之TA-Lib 实践
'''
import numpy as np
import talib as ta
import pandas as pd
from talib import MA_Type
from talib import abstract
from talib.abstract import *
import matplotlib.pyplot as plt
from pylab import mpl #正常显示画图时出现的中文和负号
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False
english={'family':'Times New Roman','weight':'normal','size':12}
chinese={'family':'SimHei','weight':'normal','size':12}
color_list=['#CD853F','#DC143C','#00FF7F','#FF6347','#8B008B','#00FFFF','#0000FF','#8B0000','#FF8C00',
'#1E90FF','#00FF00','#FFD700','#008080','#008B8B','#8A2BE2','#228B22','#FA8072','#808080']
def ploter(data_list,label,title,savepath):
'''
简单曲线绘图功能
'''
plt.clf()
#plt.figure(figsize=(7,7))
for i in range(len(data_list)):
plt.plot(data_list[i])
#plt.legend(label,loc='upper right')
plt.legend(label,loc='best',ncol=5)
plt.title(title,chinese)
plt.savefig(savepath)
def closeTestFunc():
'''
计算收盘价的简单移动平均数SMA、布林线、三指数移动平均、收盘价的动量
'''
close=np.random.random(100) #创建随机收盘价序列
print 'close: ',close
sma_res=ta.SMA(close) #计算收盘价的一个简单移动平均数SMA
print 'sma_res: ',sma_res
upper,middle,lower=ta.BBANDS(close,matype=MA_Type.T3) #计算布林线,三指数移动平均
print 'upper: ',upper
print 'middle: ',middle
print 'lower: ',lower
mom_res=ta.MOM(close,timeperiod=5) #计算收盘价的动量,时间为5:
print 'mom_res: ',mom_res
data_list=[close,sma_res,upper,middle,lower,mom_res]
title=u"收盘价的简单计算实践"
label_list=['close','sma_res','upper','middle','lower','mom_res']
ploter(data_list,label_list,title,'closeTestFunc.png')
def abstractAPITestFunc():
'''
抽象API使用
'''
input_arrays={
'open':np.random.random(100),
'high':np.random.random(100),
'low':np.random.random(100),
'close':np.random.random(100),
'volume':np.random.random(100)
}
sma=abstract.SMA
sma=abstract.Function('sma')
sma=SMA(input_arrays,timeperiod=25) # SMA均线价格计算收盘价
sma_open=SMA(input_arrays,timeperiod=25,price='open') # SMA均线价格计算收盘价
upper,middle,lower=BBANDS(input_arrays,20,2,2)
slowk,slowd=STOCH(input_arrays,5,3,0,3,0) #uses high, low, close by default
slowk2,slowd2=STOCH(input_arrays,5,3,0,3,0,prices=['high','low','open'])
data_list=[input_arrays['open'],input_arrays['high'],input_arrays['low'],input_arrays['close'],
input_arrays['volume'],sma,sma_open,upper,middle,lower,slowk,slowd,slowk2,slowd2]
title=u"收盘价的简单计算与抽象API使用"
label_list=['open','high','low','close','volume','sma','sma_open','upper','middle','lower','slowk',
'slowd','slowk2','slowd2']
ploter(data_list,label_list,title,'abstractAPITestFunc.png')
if __name__=='__main__':
closeTestFunc()
abstractAPITestFunc()
其中,closeTestFunc.png结果如下:
abstractAPITestFunc.png结果如下:
仅仅只是简单的实践,所用的数据均无实际的意义,接下来有时间会继续相关的使用和研究。