mplfinance模块新版功能Panels绘制子图MACD(v=0.12.6a3)(四)
mplfinance模块新版功能Panels绘制子图MACD(v=0.12.6a3)(四)
续:
mplfinance模块详解(一)
mplfinance模块详解(二)
mplfinance模块详解(三)
目录(续四-使用面板绘制子图Panels)
九、使用panel绘制子图
十、设置子图比例和数量
十一、绘制macd子图案例
九、使用panel绘制子图
mplfinance的早期版本只支持两个面板,称之为“main”和“lower”。为了向后兼容,如果任何代码通过panel='main’,将被翻译为panel=0,而panel='lower’将被翻译为panel=1。新版(当前版本:v=0.12.6a3)以后建议用户使用整数来标识面板。当前版本最多可以添加9个子图,即panel<=9,否则 或报错。
其实这个在“详解二”中已经有更新介绍了,只是做了文字介绍,而最近回复中总有人问如何绘制macd,所以这里附上代码结合macd子图作为案例详细介绍一下,善于用脑的朋友只要仔细看了前面三篇,本篇内容是可以自己动手实现的。
class DataFinanceDraw(object): """ 获取数据,并按照 mplfinanace 需求的格式格式化,然后绘图 """ def __init__(self): self.data = pandas.DataFrame() def my_data(self, file_name='2020.csv'): """ 获取数据,把数据格式化成mplfinance的标准格式 :return: """ data = pandas.read_csv(os.getcwd() + '\\resource\\' + file_name) data['Date'] = pandas.to_datetime(data['Date'], format='%Y-%m-%d') data.set_index('Date', inplace=True) self.data = data return data def panel_draw(self): """ make_addplot 绘制多个子图 """ data = self.data.iloc[0:50] add_plot = [ mplfinance.make_addplot(data, type='candle',panel=2) ] mplfinance.plot(data, type='candle', mav=(2, 5), addplot=add_plot, volume=True, figscale=1.5, title='Candle', figratio=(5, 5), ylabel='price', ylabel_lower='volume', ) plt.show() # 显示 plt.close() # 关闭plt,释放内存 if __name__ == "__main__": candle = DataFinanceDraw() candle.my_data('2020.csv') candle.panel_draw()
my_data()方法格式化数据,这个在第一篇就详细介绍过,这里不多说。
add_plot = [ ] 添加子图,这里主图和子图绘制的数据都是data,也就是绘制了两个相同的k线图,并无实际意义,只是介绍panel添加子图的方式。实际中如果做两个关联品种的k线图对比直接把子图的数据换掉即可,但是注意的是主图与子图的data在x轴要相同,否则就对比就没有意义。
make_addplot中的参数panel即是设置添加到第几个子图。显示结果:
途中可以看到,子图的k线图在最下面,按照排序最上为主图0,下面依次为1,2,…,9。
当然你也可以打乱顺序,两个k线图对比的话,图表相连比较合适,修改如下:
add_plot = [ mplfinance.make_addplot(data, type='candle',panel=1) ] mplfinance.plot(data, type='candle', mav=(2, 5), addplot=add_plot, volume=True, figscale=1.5, title='Candle', figratio=(5, 5), ylabel='price', ylabel_lower='volume', main_panel=0, volume_panel=2, )
可以看到make_addplot添加子图的面板编号改成1,而在plot中,增加了main_panel=0, volume_panel=2,两个参数,main_panel 是设置主图编号,volume_panel是设置成交量图的编号。绘制结果如下:
需要注意一点,main_panel 是设置主图编号,默认是0的,既然有此参数自然可以修改,所以主图并非必须是0号,可以修改为其他序号,这里自己测试。
十、设置子图比例和数量
仍然是上面的代码案例,只需在plot中增加两个参数panel_ratios和num_panels,panel_ratios是用了设置子图和主图的比例,参数的顺序是按图序号来设置的,例如:panel_ratios(1,0.3,0.8) 即0号图比例是1,1号图比例是0.3,2号图是0.8,只是注意:是按面板的序号而并非第一个就是主图比例,因为0号面板默认是主图但不一定必然是主图!!可以通过main_panel = 2 将主图改变序号。
num_panels是用了显式设置有几个子图,这个用到的会比较少,比如我们只添加了两个子图,而num_panels设置为4,那么就会有一个空白图,而这里有个小坑就是,一旦设置了num_panels的数量,那么panel_ratios的参数个数必须与之对应,否则会报错:
mplfinance.plot(data, type='candle', mav=(2, 5), addplot=add_plot, volume=True, figscale=1.5, title='Candle', figratio=(5, 5), ylabel='price', ylabel_lower='volume', panel_ratios=(1, 0.3, 0.8, 0.5), num_panels=4, main_panel=0, volume_panel=2, )
绘制结果:(num_panels设置为4,而实际我们只添加了主图和两个子图,所以最下面一个是空白图表)
十一、绘制macd子图案例
最近一直有人在问如何绘制macd指标,macd指标是金融数据分析中比较常用的,其实仔细阅读了前面三篇是完全可以自己动手实现的,既然频繁有人问,就作为一个案例放这里吧:
class DataFinanceDraw(object): """ 获取数据,并按照 mplfinanace 需求的格式格式化,然后绘图 """ def __init__(self): self.data = pandas.DataFrame() def my_data(self, file_name='2020.csv'): """ 获取数据,把数据格式化成mplfinance的标准格式 :return: """ data = pandas.read_csv(os.getcwd() + '\\resource\\' + file_name) data['Date'] = pandas.to_datetime(data['Date'], format='%Y-%m-%d') data.set_index('Date', inplace=True) self.data = data return data def more_panel_draw(self): """ make_addplot 绘制多个图,这里添加macd指标为例 """ data = self.data.iloc[0:50] # 计算macd的数据。计算macd数据可以使用第三方模块talib(常用的金融指标kdj、macd、boll等等都有,这里不展开了),如果在金融数据分析和量化交易上深耕的朋友相信对这些指标的计算原理已经了如指掌,直接通过原始数据计算即可,以macd的计算为例如下: exp12 = data['Close'].ewm(span=12, adjust=False).mean() exp26 = data['Close'].ewm(span=26, adjust=False).mean() macd = exp12 - exp26 signal = macd.ewm(span=9, adjust=False).mean() histogram = macd - signal # 添加macd子图 add_plot = [ mplfinance.make_addplot(exp12, type='line', color='y'), mplfinance.make_addplot(exp26, type='line', color='r'), mplfinance.make_addplot(histogram, type='bar', width=0.7, panel=2, color='dimgray', alpha=1, secondary_y=False), mplfinance.make_addplot(macd, panel=2, color='fuchsia', secondary_y=True), mplfinance.make_addplot(signal, panel=2, color='b', secondary_y=True), mplfinance.make_addplot(data['PercentB'], panel=1, color='g', secondary_y='auto'), ] mplfinance.plot(data, type='candle', addplot=add_plot, volume=True, figscale=1.5, title='MACD', figratio=(5, 5), ylabel='price', ylabel_lower='volume', main_panel=0, volume_panel=1, ) plt.show() # 显示 plt.close() # 关闭plt,释放内存 if __name__ == "__main__": candle = DataFinanceDraw() candle.my_data('2020.csv') candle.more_panel_draw()
这里只是一个macd的简单实例,如果你想要更漂亮的效果,比如macd柱线在0轴上下方不同颜色,或者在变长时一种颜色缩短时一种颜色,这些都是数据处理的问题了,把上面的柱线数据histogram按0分为两组数据即可,分组的时候注意为保证x轴坐标相同,分组后缺失的数据用nan填充,make_addplot添加数据时多添加一组数据设置不同颜色即可。这里以按0轴上下分色为例修改代码,其他风格以此类推。
修改部分代码如下:
histogram = macd - signal histogram[histogram < 0] = None histogram_positive = histogram histogram = macd - signal histogram[histogram >= 0] = None histogram_negative = histogram add_plot = [ mplfinance.make_addplot(exp12, type='line', color='y'), mplfinance.make_addplot(exp26, type='line', color='r'), mplfinance.make_addplot(histogram_positive, type='bar', width=0.7, panel=2, color='b'), mplfinance.make_addplot(histogram_negative, type='bar', width=0.7, panel=2, color='fuchsia'), mplfinance.make_addplot(macd, panel=2, color='fuchsia', secondary_y=True), mplfinance.make_addplot(signal, panel=2, color='b', secondary_y=True), mplfinance.make_addplot(data['PercentB'], panel=1, color='g', secondary_y='auto'), ]
最终输出: