手记

哪些 Python 库让你相见恨晚?

大家贴了很多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库更详细的使用技巧大家可以到慕课网手记板块查询。


以上,感谢阅读。


推荐阅读:

如何确定自己是否适合做程序员?

半路学编程,可以成为大牛吗?

如何使用 GitHub?

在做程序员的道路上,你掌握了什么概念或技术使你感觉自我提升突飞猛进?

你看过/写过哪些有意思的代码?

如何在程序里留下彩蛋?

为什么部分程序员下班后只关显示器不关电脑?

有哪些好笑的关于程序员的笑话?

如何防止自己被人肉搜索到?

面试必备之乐观锁与悲观锁

慕课网:搞定计算机网络面试,看这篇就够了(补充版)


1人推荐
随时随地看视频
慕课网APP