文章目录
- 8. plot 绘制金融图
- 8.1 金融分析曲线
- 8.2 多曲线金融指标
- 8.3 Observers 观测子模块
- 8.4 plot 绘图函数的常用参数
- 8.5 买卖点符号和色彩风格
- 8.6 vol 成交参数
- 8.7 多图拼接模式
- 8.8 绘制 HA 平均 K 线图
8. plot 绘制金融图
8.1 金融分析曲线
BackTrader内置的plot绘图函数, 通过style参数变量控制不同风格的K线图, 默认有以下几种风格:
- line:线条图
- candle:蜡烛图,标准 K 线图
- ohlc:美式 K 线图,和 bar 参数一样
- bar:ohlc 曲线图,美式 K 线图,和 ohlc 参数一样。
将style参数设置为bar或者ohlc, 生成的图都是一样的。 如果不设置 style ,默认是line线条图,或者上一次设置参数。下面使用代码生成四种风格的图表,文件名称为Plot.py
。
line 线条图:
candle 图:
OHLC 图:
Bar 图:
在K线图中, 每天的图标信息都包含开盘价、 最高价、 最低价和收盘价四组价格数据, 但曲线图通常只有收盘价一组价格。 ohlc美式价格曲线也称为美式K线, 每天的图标也包含开盘价、 最高价、 最低价和收盘价四组价格数据, 这种格式相对比较少见。
8.2 多曲线金融指标
常见的MACD指标及PivotPoint(支撑点) 指标都是复杂的多曲线金融指标, 包含多组指标曲线。
BackTrader支持复杂的多曲线金融指标曲线的绘制, 而且绘制模式非常灵活。
8.3 Observers 观测子模块
在BackTrader量化程序中, 自定义买卖点符号的修改调用都是在主流程中通过Observers观测子模块完成的, 代码如下:
bt.observers.BuySell = MyBuySell
Observers观测子模块类似于传统的Log日志模块或者后台监控模块, 主要用于记录后台交易数据及图信息。
8.4 plot 绘图函数的常用参数
下图为 plot 模块关系属性示意图:
从图中可以看出,plot 模块主要相关模块有:LineBuffer、Cerebro、Strategy 等。
在BackTrader的指标模块Indicators和观测模块Observers中内置了一个plotinfo绘图参数变量, 用于控制指标和观测数据的绘制, 调用模式如下:
sma = bt.indicators.SimpleMovingAverage(self.data,period=15)
sma.plotinfo.plotname 'mysma'
plotinfo变量采用的是dict字典格式, 常用内置参数设置如下:
plotinfo = dict(plot=True,
subplot=True,
plotname='',
plotskip=False,
plotabove=False,
plotlinelabels=False,
plotlinevalues=True,
plotvaluetags=True,
plotymargin=0.0,
plotyhlines=[],
plotyticks=[],
plothlines=[],
plotforce=False,
plotmaster=None,
plotylimited=True,
)
通常, SMA均线指标、 vol成交量和主图价格曲线会叠加显示, 其他指标(如rsi、 kdj等) 都采用独立subplot子图模式, 在主图下方显示。
8.5 买卖点符号和色彩风格
买卖点符号是可以自定义的,案例代码 PlotExt1.py 演示如何自定义买卖点符号,主要代码修改有:
class MyBuySell(bt.observers.BuySell):
plotlines = dict(
# buy=dict(marker='$\u21E7$', markersize=12.0), #arrow
# sell=dict(marker='$\u21E9$', markersize=12.0)
#
# buy=dict(marker='$++$', markersize=12.0),
# sell=dict(marker='$--$', markersize=12.0)
#
buy=dict(marker="$✔$", markersize=12.0),
sell=dict(marker="$✘$", markersize=12.0),
)
... ...
bt.observers.BuySell = MyBuySell
本案例使用对勾符号(√) 表示买入, 使用叉符号(×) 表示卖出, 同时这两个符号的尺寸也更大一些。在源码中, “√”和“×”符号需要用两个“$”符号表示, 并括住符号代码, 因为需要使用UTF代码符号。自定义买卖点符号的修改调用, 是在主流程中通过BackTrader的
Observers观测子模块完成的:
bt.observers.BuySell = MyBuySell
下面再看一下对图表颜色的修改。
相对于修改买卖点符号而言, 对颜色进行修改更加简单。 在调用plot绘图函数时, 可以直接通过参数传递颜色参数:
tq10_corUp, tq10_corDown = ["#7F7F7F", "#17BECF"] # plotly
tq09_corUp, tq09_corDown = ["#B61000", "#0061B3"]
tq08_corUp, tq08_corDown = ["#FB3320", "#020AF0"]
tq07_corUp, tq07_corDown = ["#B0F76D", "#E1440F"]
tq06_corUp, tq06_corDown = ["#FF3333", "#47D8D8"]
tq05_corUp, tq05_corDown = ["#FB0200", "#007E00"]
tq04_corUp, tq04_corDown = ["#18DEF5", "#E38323"]
tq03_corUp, tq03_corDown = ["black", "blue"]
tq02_corUp, tq02_corDown = ["red", "blue"]
tq01_corUp, tq01_corDown = ["red", "lime"]
#
tq_ksty01 = dict(
volup=tq01_corUp, voldown=tq01_corDown, barup=tq01_corUp, bardown=tq01_corDown
)
tq_ksty02 = dict(
volup=tq02_corUp, voldown=tq02_corDown, barup=tq02_corUp, bardown=tq02_corDown
)
tq_ksty03 = dict(
volup=tq03_corUp, voldown=tq03_corDown, barup=tq03_corUp, bardown=tq03_corDown
)
tq_ksty04 = dict(
volup=tq04_corUp, voldown=tq04_corDown, barup=tq04_corUp, bardown=tq04_corDown
)
tq_ksty05 = dict(
volup=tq05_corUp, voldown=tq05_corDown, barup=tq05_corUp, bardown=tq05_corDown
)
tq_ksty06 = dict(
volup=tq06_corUp, voldown=tq06_corDown, barup=tq06_corUp, bardown=tq06_corDown
)
tq_ksty07 = dict(
volup=tq07_corUp, voldown=tq07_corDown, barup=tq07_corUp, bardown=tq07_corDown
)
tq_ksty08 = dict(
volup=tq08_corUp, voldown=tq08_corDown, barup=tq08_corUp, bardown=tq08_corDown
)
tq_ksty09 = dict(
volup=tq09_corUp, voldown=tq09_corDown, barup=tq09_corUp, bardown=tq09_corDown
)
tq_ksty10 = dict(
volup=tq10_corUp, voldown=tq10_corDown, barup=tq10_corUp, bardown=tq10_corDown
)
......
cerebro.plot(style="candle", **tq_ksty10)
程序代码当中的**tq_ksty10
变量参数, 两个星号“**”变量是Python的特有语法中字典模式的多变量, 这有些类似于C语言的“宏定义”.
barup和bardown是箭头符号颜色, volup和voldown是成交量曲线颜色。
up(上涨) 、 down(下跌) 表示价格/成交量的变化。
在K线图中有专门的规定, 比如, 当天的成交量或者价格超过昨天的, 则使用up颜色。
在案例中预设了10种不同风格的颜色组合, 大家还可以自己修改其他更多的颜色组合, 看看不同参数的绘制效果,最终显示效果如下所示:
8.6 vol 成交参数
本示例代码为 PlotExt2vol.py 。
默认的绘图函数代码是:
cerebro.plot(style='candle')
这其中省略了两个和 volume 成交了相关的参数,这两个参数都是布尔类型:
- volume:默认为 True,表示绘制成交量图形;若为 False,则不绘制成交量图形;
- voloverlay:默认为 True,表示使用叠加绘制模式;若为 False,则表示非叠加模式,采用独立的 sub 子图绘制成交量。
看看下面代码生成的图片:
cerebro.plot(style="candle", volume=True)
再看一下如下代码生成的图片:
cerebro.plot(style="candle", volume=True, voloverlay=False) # volume成交量:采用subplot子图模式,默认为voloverlay=True叠加模式
volume成交量曲线相对来说比较重要, 所以BackTrader量化软件专门设计了一个plot_volume成交量曲线绘制子函数, 其关系属性示意图如下所示:
8.7 多图拼接模式
本实例代码为 PlotExt3.py 。
在调用 plot 绘图函数时,使用 numfigs
设置图形数目,本示例设置为 5,结果图被切分为 5 张独立图片,而不是一张图片:
# plot多图拼接,BT版的股市:《清明上河图》
# 注意修改其实日期参数为:空字符串
# numfigs,默认值为:1
cerebro.plot(numfigs=5)
生成如下 5 张图片:
注意, 各图之间的时间指标是连续的, 把图拼起来就是一张很长的图。当数据太多时,单张图片的部分细节会模糊,影响显示效果。可以使用这种多图拼接模式,使细节更清晰。
8.8 绘制 HA 平均 K 线图
本实例代码 PlotExt4hak.py
在 cerebro.adddata(data)
代码行上面添加如下代码设置过滤器:
# ----ha-k
data.addfilter(bt.filters.HeikinAshi)
生成图片如下所示:
HA平均K线图通过对数值进行平均化处理, 更加容易发现买卖点信号, 即平均价格的波动, 更容易出现买卖的机会。 一般买卖点信号出现在连续颜色的突变时, 而单个交易日颜色的变化可以忽略。