量化交易学习(三十)backtrader文档——策略类(1)
今天这篇是backtrader文档的学习笔记。主要介绍了策略类的概念。
官方文档链接:https://www.backtrader.com/docu/strategy/
对于backtrader来说,Cerebro就像是跳动心脏和控制它的大脑。对于用户来说,Strategy类也起到这样的作用。
策略的生命周期
策略在方法中表达的生命周期
注意:策略在启动期间可以通过抛出backtrader.errors模块中StrategySkipError异常来中断策略的运行。
这将避免在回测期间运行该策略。参见文档的Exceptions部分
1、__init__
概念
在实例化期间调用:indicators以及其他所需的属性将在此处创建。例如:
1 | def __init__(self): |
2、出生:start
世界 ( cerebro) 告诉策略是时候开始行动了。默认为空方法。
3、童年:prenext
在__init__
方法中声明的indicators将对策略需要成熟的时间施加限制:这称为minimum period。上面__init__创建了一个带有period=15的SimpleMovingAverage 指标。
只要系统看到小于15根柱线,prenext就会被调用(默认实现是无操作)
4、成年期:next
一旦系统看到15根柱线并且SimpleMovingAverage有足够大的缓冲区可以开始产生值,该策略就足够成熟,可以真正执行。
有一个只调用一次的nextstart方法,用于标记从 prenext方法切换到next方法。默认的实现是nextstart方法简单地调用next方法
5、再生产:None
好吧,策略并不能真正重现。但从某种意义上说,它们确实如此,因为如果运行策略优化(使用不同的参数),系统会多次实例化它们
6、死亡:stop
系统告诉策略进行重置并让一切恢复正常的时间已经到来。默认为空方法。
策略类的使用
在大多数情况下,像下面这样定义策略类:
1 | class MyStrategy(bt.Strategy): |
在这个片段中:
- 在
__init__
期间为属性分配指示符 - 默认的空start方法没有被覆盖
- prenext和nexstart方法不被覆盖
- 在next方法中,指标值与收盘价进行比较来执行某些操作
- 默认的空stop方法不被覆盖
策略就像现实世界中的交易者一样,会在事件发生时收到通知。实际上在回测循环过程中每个next调用时,策略将:
- 通过 notify_order(order) 获得订单中的任何状态变化的通知
- 通过 notify_trade(trade) 获得任何开仓/更新/平仓交易的通知
- 通过 notify_cashvalue(cash, value) 获得经纪人当前的现金和投资组合的通知
- 通过 notify_fund(cash, value, fundvalue, shares) 获得经纪人当前的现金和投资组合以及基金和股票价值的通知
- 通过
notify_store(msg, *args, **kwargs)
获取事件(特定于实现)的通知
有关store通知的说明,请参阅 Cerebro 。这些通知将传递给策略,即使它们也已传递给实例cerebro(使用重写notify_store方法或通过回调)
策略也像交易者一样,在next方法中有机会在市场中通过执行以下方法,尝试实现利润:
- buy方法用于做多或减少/平空头头寸
- sell方法用于做空或减少/平多头头寸
- close方法用于平仓
- cancel方法取消未执行订单
这一篇就到这里啦。欢迎大家点赞、转发、私信。还没有关注我的朋友可以关注 江达小记