用python实现全功能动态交互式K线图
- 手把手用`python`一步步实现动态交互式K线图
-
- ` mplfinance`的基本K线图
- 目标
- 实现自定义风格和颜色
- 图表尺寸调整、相关信息的显示
- 添加完整移动平均线
- 添加指标MACD
- 实现鼠标拖动平移交互功能
- 实现鼠标滚轮缩放
- 实现双击切换指标
- 使用键盘方向键平移缩放K线图及切换指标
-
- 这一段代码感谢 @szFoxtech 的贡献!
- 完整代码
手把手用一步步实现动态交互式K线图
特别鸣谢:@szFoxtech 同学热心提供了通过键盘操作平移和缩放K线图的代码!!
的基本K线图
在我的另一篇文章《七行代码利用tushare和mplfinance生成K线图》中,我介绍了两个非常好用的python库,结合起来可以非常方便容易地生成股票的K线图,对于使用python进行量化投资研究的朋友可谓是必备良方。如下图所示,仅仅几行代码,就能生成下面这张K线图:
下面,我们就一步步地实现并扩充基本的K线图,使它成为一个具备基本实用性的股票价格可视化工具,成为一个真正的动态可交互K线蜡烛图。
目标
在开始实际工作之前,需要确定我们需要达到的目标,以便一步步实现:
- 符合中国习惯的配色风格——红涨绿跌自然是必须实现的第一步
- 图表上要能显示股票代码和股票名称、以及价格信息
- 图表上要显示完整的移动平均线
- 在交易量的下方显示第三张图表,同步显示相关指标如MACD等
- 在图表上用鼠标单击拖动,可以平移K线图以显示更早或更晚的K线
- 在图表上是用鼠标滚轮缩放,可以实现放大或缩小所显示的K线的范围
- 在图表上双击,可以循环切换移动平均线和布林带线
- 在指标图上双击,可以循环切换不同的指标类型如MACD/DEMA/RSI等等
为了简单起见,我们使用提前准备好的K线数据,包含OHLC、交易量、移动平均价格以及MACD指标数据,需要的朋友可以在这里下载
实现自定义风格和颜色
这肯定是上面的所有功能中最容易实现的一个。提供了两个相关的函数: 以及。示例如下:
在函数中,几个不同的参数主要用于设置K线的颜色, 和都很明显,用于分别指定上涨K线和下跌K线的颜色。因此根据国内习惯自然应该设置也就是red红色,自然就是也就是绿色。不过需要注意的是这里仅仅设置K线的柱子的内部填充色,如果不指定边框、上下影线的颜色,他们都会是黑色,显示的效果就是黑色的边框、黑色的上下影线,挺难看的,因此还需要设置边框的颜色。此处设置为或代表“使用主配色“。也就是说,阳线(上涨)的柱子外框线跟阳线的内部填充色一致,那么如果阳线的颜色为红色,边框的颜色也是红色,如果阳线是绿色,则边框也是绿色。阴线也一样。
设置的就是上下影线的颜色,这里为了显眼,同样设置为。
类似的,设置的是交易量柱子的颜色,也设置为就可以了。
有朋友可能想问,如果我不喜欢标准的红绿色配色,觉得太鲜艳了,想改成自定义的RGB配色可不可以,当然可以,不过需要注意的是,在标准的中,可以传入一个元组表示RGB配色,例如然而不能直接传递元组作为颜色代码,但可以接受一个表示元组的字符串,如上面代码中的。
make_mpf_style()函数接受上面的参数,将所有的配置都存储在一个字典中,然后使用mpf的基本绘图方法,就可以生成一张符合中国股市习惯的K线图了:
在模式下,由于我们手动创建了几个对象(这也就是的由来),调用函数,注意调用的方式跟上一节不同,这里需要指定,将K线图显示在中,交易量显示在中。
通过运行上面的代码得到下面的图表:
然后修改一下前面的代码,将格式分别应用到各个文本中去:
可以看到,这次得到正确的结果了:
添加指标MACD
至此,一个静态的实用K线图已经初具雏形了,不过,还是空的,这里本来应该显示指标的,那么如何实现呢然还是需要!
不过,在开始之前,我们要知道,MACD指标包含两条线,还有一组柱状图,而且柱状图还分红绿两色,不是一个简单的图形,需要分别绘制。在中,可以是一个字典,也可以是一个列表,列表中包含多组不同的,这样在调用的时候,可以传入任意多个,从而实现复杂的图表形式。
将上面的代码添加到前一节的示例代码中,并运行后得到结果,可以看到MACD指标已经可以显示出来了:
那么实际上,如果我们希望在K线图上将画面向右平移,以看到更早交易日的K线图,只需要将N减少,视野向左移动,反之则将N增大,视野向右移动,K线图中的画面向左平移,因此,所谓K线图的平移,实际上是通过N的大小来控制的,减少N则画面向右平移,增加N则画面向左平移。
同时,在K线图平移的过程中,图像是需要不断刷新的,最简单的做法就是当N值改变时,不断地刷新画面,清除原来的内容并重新绘制新的K线图,为了方便地实现画面刷新的功能,需要定义一个刷新画面的函数,同时,还需要保存N值。所以,我们最好是定义一个K线图类,将画面刷新函数和属性N都封装起来,便于使用。
class InterCandle: # 定义一个交互K线图类 def __init__(self, data, my_style):# 初始化交互式K线图对象,历史数据作为唯一的参数用于初始化对象self.data = dataself.style = my_style# 设置初始化的K线图显示区间起点为0,即显示第0到第99个交易日的数据(前100个数据)self.idx_start = 0 # 初始化figure对象,在figure上建立三个Axes对象并分别设置好它们的位置和基本属性self.fig = mpf.figure(style=my_style, figsize=(12, 8), facecolor=(0.82, 0.83, 0.85))fig = self.figself.ax1 = fig.add_axes([0.08, 0.25, 0.88, 0.60])self.ax2 = fig.add_axes([0.08, 0.15, 0.88, 0.10], sharex=self.ax1)self.ax2.set_ylabel('volume')self.ax3 = fig.add_axes([0.08, 0.05, 0.88, 0.10], sharex=self.ax1)self.ax3.set_ylabel('macd')# 初始化figure对象,在figure上预先放置文本并设置格式,文本内容根据需要显示的数据实时更新# 初始化时,所有的价格数据都显示为空字符串self.t1 = fig.text(0.50, 0.94, 'TITLE', **title_font)self.t2 = fig.text(0.12, 0.90, '开/收: ', **normal_label_font)self.t3 = fig.text(0.14, 0.89, '', **large_red_font)self.t4 = fig.text(0.14, 0.86, '', **small_red_font)self.t5 = fig.text(0.22, 0.86, '', **small_red_font)self.t6 = fig.text(0.12, 0.86, '', **normal_label_font)self.t7 = fig.text(0.40, 0.90, '高: ', **normal_label_font)self.t8 = fig.text(0.40, 0.90, '', **small_red_font)self.t9 = fig.text(0.40, 0.86, '低: ', **normal_label_font)self.t10 = fig.text(0.40, 0.86, '', **small_green_font)self.t11 = fig.text(0.55, 0.90, '量(万手): ', **normal_label_font)self.t12 = fig.text(0.55, 0.90, '', **normal_font)self.t13 = fig.text(0.55, 0.86, '额(亿元): ', **normal_label_font)self.t14 = fig.text(0.55, 0.86, '', **normal_font)self.t15 = fig.text(0.70, 0.90, '涨停: ', **normal_label_font)self.t16 = fig.text(0.70, 0.90, '', **small_red_font)self.t17 = fig.text(0.70, 0.86, '跌停: ', **normal_label_font)self.t18 = fig.text(0.70, 0.86, '', **small_green_font)self.t19 = fig.text(0.85, 0.90, '均价: ', **normal_label_font)self.t20 = fig.text(0.85, 0.90, '', **normal_font)self.t21 = fig.text(0.85, 0.86, '昨收: ', **normal_label_font)self.t22 = fig.text(0.85, 0.86, '', **normal_font) def refresh_plot(self, idx_start):""" 根据最新的参数,重新绘制整个图表"""all_data = self.dataplot_data = all_data.iloc[idx_start: idx_start + 100]ap = []# 添加K线图重叠均线ap.append(mpf.make_addplot(plot_data[['MA5', 'MA10', 'MA20', 'MA60']], ax=self.ax1))# 添加指标MACD
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!