大家贴了很多Python的库,有关于文档处理、网络爬虫、WEB服务器、数据可视化等等,顿时感觉自己接触到的只是Python的冰山一角。不过说真的Python库实在是太多了,涉及到了方方面面的应用场景,我们不可能什么都掌握,大家平时接触比较多的Python库主要有:
Matplotlib——应用于可视化绘图
Bokeh——应用于Web交互式可视化绘图
Urllib3——应用于HTTP客户端网络请求
Numpy——应用于科学计算
Pandas——应用于金融数据分析
Statsmodels——应用于统计模型和分析
TA-Lib——应用于金融技术指标计算
Tushare——应用于财经数据的获取
Django——应用于Web框架的搭建
scrapy——应用于爬虫框架的搭建
...........................……………………..........大家好,我叫分割线................………………………………
上面列举的这些库里面Pandas是金融量化分析中最常使用的库,它封装了Numpy、Matplotlib、Urllib3等基础库,因此Pandas功能十分强大,不仅可以进行科学计算、数据可视化分析,也可以下载金融数据等。正是因为Pandas在金融量化分析中十分著名,一开始踏入这个领域的时候就接触到了,并不能说相见恨晚。
真正让我后知后觉、相见恨晚、一见如故的是TA-Lib这个计算金融技术指标的开源库。来说下是怎么接触到TA-Lib库的,“故事”的发生是这样的,最开始的时候我准备实现一幅查看股票技术指标的界面,如下图所示,其中我需要绘制包括K线图、成交量、均线和MACD、KDJ这几个常用的指标。
我先用了Matplotlib库中Candlestick方法绘制K线图,bar方法绘制成交量,很轻松,没什么问题。接下来绘制均线我先用了两个序列的线性卷积方式实现:
符号*表示卷积这个特定的运算形式,不过没过多久我就找到了pandas库rolling_mean方法来优化均线的实现方法,还算比较顺利,大家可以感受下两种方法的代码实现。
卷积实现:
N_20,N_60,N_120 = 19,59,119 #N-1 weg20 = np.ones(N_20) / N_20 self.Ma_20 = np.convolve(weg20, self.close)[N_20:-N_20] """ M20 均线序列生成 """ L_zeros = np.zeros(N_20).tolist()#生成M20 0序列 L_zeros.extend(self.Ma_20)#补齐列表长度 self.Ma_20 = copy.deepcopy(L_zeros)#深度拷贝列表数据
Pandas实现:
stock['Ma20'] = pd.rolling_mean(stock.Close,window=20)
再下一步绘制MACD的DIF(差离值)和DEA(差离平均值),±DIF值是短期移动平均线与长期移动平均线之间的聚合与分离值,DEA是对DIF值进行N日移动平滑,用常规的代码来实现差不多需要10行左右,但是我觉得即然用了Python语言,就要追求更优雅的方式,就在这个时候我在不停的搜索中发现了一套优雅的库TA-Lib,TA-Lib中MACD方法可以根据输入的收盘价直接计算得到DIF、DEA、BAR三组数据,只需要1行代码就轻松搞定。
dif, dea, bar= talib.MACD(close, fastperiod=12, slowperiod=26, signalperiod=9)
同样KDJ可以用STOCH(Stochastic Oscillator Slow)方法来实现,这里要注意的是KDJ指标最早雏形是由芝加哥期货交易商George Lane提出的KD指标,该指标又被称为随机震荡指标,在TA-Lib库中对应的方法为STOCH,而KDJ指标则在随机震荡指标K线和D线的基础上增加了一条J线,进一步提高了随机震荡指标对市场买卖信号捕捉的准确度。使用TA-Lib库我们也只需要1行代码就轻松搞定,大家可以感受下计算实现和TA-Lib库实现这两种方法的代码。
计算实现:
date = self.kl_pd.index.to_series() RSV = pd.Series(np.zeros(len(date)-self.xd),index=date.index[self.xd:]) Kvalue = pd.Series(0.0,index=RSV.index) Dvalue = pd.Series(0.0,index=RSV.index) Kvalue[0],Dvalue[0] = 50,50 for day_ind in range(self.xd, len(date)): RSV[date[day_ind]] = (self.kl_pd.Close[day_ind] - self.kl_pd.Low[day_ind-self.xd:day_ind+1].min())/(self.kl_pd.High[day_ind-self.xd:day_ind+1].max()-self.kl_pd.Low[day_ind-self.xd:day_ind+1].min())*100 if day_ind > self.xd: index = day_ind-self.xd Kvalue[index] = 2.0/3*Kvalue[index-1]+RSV[date[day_ind]]/3 Dvalue[index] = 2.0/3*Dvalue[index-1]+Kvalue[index]/3 self.kl_pd['RSV'] = RSV self.kl_pd['K'] = Kvalue self.kl_pd['D'] = Dvalue self.kl_pd['J'] = 3*Kvalue-2*Dvalue
TA-lib实现:
slowk, slowd'= talib.STOCH(High, Low, Close, fastk_period=9, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0)
我继续深入地去了解TA-Lib库,在 http://tadoc.org/这个网站上找到了TA-Lib库中实现各种指标的对应实现方法,包括ATR、OBV、RSI等等,总共涵盖了大约200个技术指标的实现方法,并且支持java,C,C++,Perl,Python等多种语言的API,它的强大和便捷令人不得不折服。
这里大家要注意下关于输入到MACD、STOCH这些方法中的股票数据类型,要求输入为numpy.ndarray,千万别习惯性的输入Series类型。以上就是对相见恨晚的TA-Lib库的一些介绍,关于TA-Lib库更详细的使用技巧大家可以到慕课网手记板块查询。
以上,感谢阅读。
推荐阅读:
在做程序员的道路上,你掌握了什么概念或技术使你感觉自我提升突飞猛进?