量化小课堂-Python&Pandas系列第二讲:绘制移动平均线和布林带通道

移动平均线
布林带
rolling_apply
标签: #<Tag:0x00007f61f3beaee0> #<Tag:0x00007f61f3bead00> #<Tag:0x00007f61f3beab20>

(华尔街的猫) #1

移动平均线和通道的运用在量化策略开发中特别常见。金融数据是时间序列数据,其移动平均值自然具有重要参考意义。技术分析人员通常认为股价在一定的通道中运行,应用比较多的通道指标是布林带指标,该指标是美国股市分析家约翰•布林根据统计学中的标准差原理设计出来的一种非常简单实用的技术分析指标。本文主要介绍如何使用Pandas计算股价移动平均值和如何绘制布林带通道。

首先,我们获取某只股票的价格数据,以平安银行为例。

data = D.history_data(['000001.SZA'], '2016-01-01', '2016-10-01',
           fields=['open', 'high','low','close','adjust_factor'])

history_data获取数据的接口可以参考文档
我们看一下data数据的结构,head()方法表示查看数据框前5行的数据:

data.head()

因为date为列名,我们使用set_index将其转化为日期索引:

data = data.set_index('date')

细心的用户可能会发现,股票价格数据怎么和交易所交易的数据不一致呢,主要是因为平台采用的后复权处理,如果想要转化为与交易所交易数据一致,将其除以复权因子即可:

data[['open','high','low','close','adjust_factor']].apply(
       lambda x : x/x['adjust_factor'],axis=1).head()

这样处理后,价格看起来就正常了。

我们简单地看一下平安银行的价格走势,将价格数据的折线图绘制出来(简单的plot方法绘制的图形真心不好看:joy:):

T.plot(data[["close"]],chart_type='line')

ma_list = [5, 20, 60,120]
for ma in ma_list:
    data['MA_' + str(ma)] = pd.rolling_mean(data['close'], ma)
T.plot(data[['MA_5','MA_20','MA_60','MA_120']],chart_type='line',title='000001.SZA')


小伙伴们,这里主要运用了pandas的rolling_mean函数,没有掌握的,赶紧恶补Pandas知识吧,在绘图时,rot参数表示坐标轴标签旋转30度,grid表示绘图区含有网格线,figsize参数定义了图表的长和宽,title用来为图表设置标题。
然后,我们再来绘制布林带通道:

data['std'] = pd.rolling_apply(data['close'],20,np.std)
data['upper_line'] =  data['MA_20'] + 2 * data['std']
data['lower_line'] =  data['MA_20'] - 2 * data['std']
T.plot(data[['upper_line','MA_20','close','lower_line']],chart_type='line',title='Bollinger line')

在绘制布林带通道时,需要掌握Pandas的rolling_apply函数。
布林带通道运用非常广泛,趋势策略和震荡策略都可以基于此开发出来。这里之所以选择通道宽度为上下两倍标准差其实是有逻辑的,还记得正态分布下,95%的数据落在多少倍标准差之内吗?
是不是觉得Pandas在处理金融数据时非常便捷灵活?要知道AQR正是为解决量化交易策略开发中的数据处理才创建Pandas包的,因此做宽客,必备Pandas利器。