可视化系统¶
Backtrader 提供多种可视化后端来分析回测结果,包括用于交互式图表的 Plotly、 用于实时更新的 Bokeh 以及用于静态出版级图表的 Matplotlib。
快速开始¶
cerebro = bt.Cerebro()
# ... 设置策略和数据 ...
results = cerebro.run()
# 默认 matplotlib 绑图
cerebro.plot()
# 交互式 Plotly 图表
cerebro.plot(backend='plotly')
# Bokeh 图表
cerebro.plot(backend='bokeh')
Plotly 后端(推荐)¶
Plotly 创建具有缩放、平移和悬停功能的交互式 HTML 图表。
基本用法¶
# 交互式绑图
cerebro.plot(backend='plotly', style='candle')
# 自定义外观
cerebro.plot(
backend='plotly',
style='candle', # 'candle'、'bar'、'line'
barup='green',
bardown='red',
volup='lightgreen',
voldown='lightcoral'
)
保存为 HTML¶
from backtrader.plot import PlotlyPlot
# 创建绑图器
plotter = PlotlyPlot(style='candle')
# 生成图形
figs = plotter.plot(results[0])
# 保存为 HTML 文件
figs[0].write_html('backtest_chart.html')
# 保存为静态图片(需要 kaleido)
figs[0].write_image('backtest_chart.png', width=1920, height=1080)
大数据集处理¶
Plotly 可以高效处理 100k+ 数据点的大型数据集:
cerebro.plot(
backend='plotly',
style='candle',
numfigs=1, # 单个图形
plotdist=0.1, # 子图间距
)
Bokeh 后端¶
Bokeh 提供具有实时更新功能的交互式图表。
# 基本 Bokeh 绑图
cerebro.plot(backend='bokeh')
# 输出到文件
from bokeh.io import output_file, save
output_file('backtest.html')
figs = cerebro.plot(backend='bokeh')
Matplotlib 后端¶
Matplotlib 创建静态的出版级图表。
基本绑图¶
import matplotlib.pyplot as plt
# 默认绑图
cerebro.plot()
# 蜡烛图样式
cerebro.plot(style='candle')
# 折线图
cerebro.plot(style='line')
# 柱状图(OHLC)
cerebro.plot(style='bar')
自定义设置¶
cerebro.plot(
style='candle',
barup='green',
bardown='red',
volup='lightgreen',
voldown='lightcoral',
fmt_x_data='%Y-%m-%d',
fmt_x_ticks='%b %d',
plotdist=0.5,
numfigs=1,
width=16,
height=9,
dpi=100,
tight=True
)
保存图形¶
import matplotlib.pyplot as plt
cerebro.plot(style='candle')
plt.savefig('backtest.png', dpi=300, bbox_inches='tight')
plt.savefig('backtest.pdf', bbox_inches='tight')
指标可视化¶
配置指标显示¶
class MyStrategy(bt.Strategy):
def __init__(self):
# 在主图显示的指标
self.sma = bt.indicators.SMA(period=20)
self.sma.plotinfo.plotmaster = self.data
# 在子图显示的指标
self.rsi = bt.indicators.RSI(period=14)
self.rsi.plotinfo.subplot = True
# 自定义线条样式
self.bbands = bt.indicators.BollingerBands()
self.bbands.plotlines.top._plotskip = False
self.bbands.plotlines.mid.color = 'blue'
self.bbands.plotlines.bot.linestyle = '--'
自定义指标绑图¶
class MyIndicator(bt.Indicator):
lines = ('signal',)
plotinfo = dict(
plot=True,
subplot=True,
plotname='我的信号',
plotabove=False,
plotlinelabels=True
)
plotlines = dict(
signal=dict(
_name='信号',
color='blue',
linewidth=1.5,
linestyle='-'
)
)
观察者可视化¶
观察者在图表上显示交易信息:
cerebro = bt.Cerebro()
# 添加内置观察者
cerebro.addobserver(bt.observers.BuySell) # 买卖标记
cerebro.addobserver(bt.observers.Trades) # 交易盈亏
cerebro.addobserver(bt.observers.Value) # 投资组合价值
cerebro.addobserver(bt.observers.DrawDown) # 回撤
cerebro.addobserver(bt.observers.Cash) # 现金水平
# 自定义观察者外观
cerebro.addobserver(
bt.observers.BuySell,
barplot=True,
bardist=0.015
)
多数据可视化¶
cerebro = bt.Cerebro()
cerebro.adddata(data1, name='股票1')
cerebro.adddata(data2, name='股票2')
results = cerebro.run()
# 在不同图形中绑制所有数据
cerebro.plot(numfigs=2)
# 绑制特定数据
cerebro.plot(plotdata=[0]) # 仅第一个数据
专业报告¶
生成全面的 HTML 报告:
# 添加报告分析器
cerebro.add_report_analyzers(riskfree_rate=0.02)
# 运行回测
results = cerebro.run()
# 生成报告
cerebro.generate_report(
filename='report.html',
user='交易员',
memo='SMA 金叉死叉策略回测',
strategy_name='SMA Cross'
)
报告内容¶
汇总统计:总收益率、夏普比率、最大回撤
资金曲线:投资组合价值随时间变化
回撤图表:回撤百分比随时间变化
交易分析:胜率、盈利因子、平均交易
月度收益:月度绩效热力图
持仓分析:交易入场/出场详情
绑图配置参考¶
plotinfo 选项¶
选项 |
默认值 |
描述 |
|---|---|---|
plot |
True |
启用/禁用绑图 |
subplot |
False |
在单独子图中绑制 |
plotmaster |
None |
一起绑制的数据 |
plotname |
'' |
自定义绑图名称 |
plotabove |
False |
在主图上方绑制 |
plotlinelabels |
False |
显示线条标签 |
样式选项¶
样式 |
描述 |
|---|---|
candle |
日本蜡烛图 |
bar |
OHLC 柱状图 |
line |
折线图(收盘价) |
最佳实践¶
性能:对于大数据集(>10k 根K线)使用 Plotly
出版:对于论文和报告使用 Matplotlib
开发:对于实时/实盘开发使用 Bokeh
报告:使用
generate_report()进行全面分析