Cerebro #
Cerebro
是 Backtrader 的核心类,负责整个系统的运行。
它的功能包括:
- 收集输入(数据源)、执行者(策略)、观察者、评论者(分析器)和记录者(编写器),确保系统的正常运行。
- 执行回测或实时数据供给和交易。
- 返回回测结果。
- 提供策略绘图功能。
创建 Cerebro
实例
#
创建 Cerebro
实例时,可以通过传递一些控制参数:
cerebro = bt.Cerebro(**kwargs)
这些参数会影响系统的执行,具体的参数说明可以参考文档(也可以应用于后续的 run
方法)。
添加数据源 #
最常见的方式是使用 cerebro.adddata(data)
添加数据源,data
是已实例化的数据源。例如:
data = bt.BacktraderCSVData(dataname='mypath.days', timeframe=bt.TimeFrame.Days)
cerebro.adddata(data)
数据的重采样与重放 #
Cerebro
也支持对数据进行重采样或重放:
重采样:
data = bt.BacktraderCSVData(dataname='mypath.min', timeframe=bt.TimeFrame.Minutes)
cerebro.resampledata(data, timeframe=bt.TimeFrame.Days)
重放数据:
data = bt.BacktraderCSVData(dataname='mypath.min', timeframe=bt.TimeFrame.Minutes)
cerebro.replaydata(data, timeframe=bt.TimeFrame.Days)
你可以同时使用多种类型的数据源,包括常规数据、重采样数据和重放数据。但需要确保它们的时间对齐。详见文档中的 多时间框架 和 数据重采样 部分。
添加策略 #
Cerebro
接受策略类并传递相关参数,即使没有优化,也可以使用以下方式添加策略:
cerebro.addstrategy(MyStrategy, myparam1=value1, myparam2=value2)
策略优化 #
在优化时,参数需要作为可迭代对象传递。例如:
cerebro.optstrategy(MyStrategy, myparam1=range(10, 20))
这会运行 MyStrategy
10次,myparam1
的值从 10 到 19。
添加其他组件 #
你可以通过以下方法为回测添加额外的功能:
addwriter
:记录回测数据。addanalyzer
:分析回测结果。addobserver
或addobservermulti
:添加观察者,实时跟踪策略执行。
自定义经纪人 #
Cerebro
默认使用 Backtrader 内建的经纪人,但你也可以自定义经纪人:
broker = MyBroker()
cerebro.broker = broker # 通过 getbroker/setbroker 方法设置
接收通知 #
数据源或经纪人可能会发出通知。Cerebro
通过 notify_store
方法接收这些通知。处理通知有三种方式:
使用回调函数 #
你可以通过 addnotifycallback(callback)
向 Cerebro
添加回调函数,函数签名如下:
callback(msg, *args, **kwargs)
在策略中覆盖 notify_store
方法
#
你也可以在策略类中直接覆盖 notify_store
方法来处理通知,签名如下:
def notify_store(self, msg, *args, **kwargs):
# 处理通知
子类化 Cerebro
#
通过子类化 Cerebro
并覆盖 notify_store
,这是最不推荐的方法。
执行回测 #
回测执行通过以下方法进行:
result = cerebro.run(**kwargs)
run
方法支持多种参数,可以在实例化时指定,详细说明可以参考文档。
标准观察者 #
Cerebro
默认会实例化三个标准观察者:
- 经纪人观察者:追踪现金和投资组合的价值。
- 交易观察者:记录每笔交易的效果。
- 买卖观察者:记录操作的执行时间。
如果不需要这些标准观察者,可以通过 stdstats=False
禁用它们。
返回回测结果 #
回测执行后,Cerebro
会返回策略实例,供你分析回测结果。你可以访问策略中的所有元素进行详细检查:
result = cerebro.run(**kwargs)
优化时的返回结果 #
- 如果没有使用优化,
result
将是一个策略实例列表。 - 如果进行了优化,
result
将是一个列表的列表,每个内部列表对应一次优化运行后的策略实例。
注意:优化的默认行为已经更改,优化时只会返回分析器结果,优化的策略结果需要通过设置 optreturn=False
来获取。
提供绘图功能 #
如果你安装了 matplotlib
,可以通过以下方式绘制回测图形:
cerebro.plot()
回测流程概述 #
回测的执行逻辑大致如下:
- 传递任何存储的通知。
- 数据源提供下一组 tick/条。
- 数据同步:多个数据源的数据会按时间对齐,确保不同时间框架的数据能够同时进行计算。
- 版本更新:1.9.0.99 版本引入了新的同步行为。
- 通知策略有关订单、交易和现金的更新。
- 经纪人接受排队订单,并根据新数据执行订单。
- 调用策略的
next
方法,评估新数据并执行策略逻辑。 - 更新观察者、指标、分析器等,触发其他活动。
- 将数据写入目标(通过编写器)。
重要注意事项 #
在数据源传递新的一组数据时,这些数据是“已关闭”的。这意味着策略发出的订单将基于 下一条数据 执行,而不是当前数据。