Backtrader 文档学习-Strategy(上)

本文围绕BackTrader的核心模块Strategy展开学习。介绍了策略的生命周期,如start、next等方法;阐述了买卖平仓操作及order参数;还说明了策略的成员属性、参考方法等。强调Strategy在回测设计中至关重要,需后续程序验证理解。

Backtrader 文档学习-Strategy(上)

策略通过方法的形式体现生命周期。
是BackTrader的核心模块,需要好好研读。

1.Strategy

  • (1)怀胎
    在init中创建indicator和需要的属性值
  • (2)出生
    start方法,策略启动,start默认是空方法
  • (3)儿童
    prenext方法,indicator 在init初始化的时候设置了成熟期的时间,称为最小周期。上面在 __init__创建了一个周期=15的SimpleMovingAverage。
  • (4)成人
    next方法,一旦系统生成15个bar,SMA缓存了足够的用于启动的数据,策略就可以真正执行。
    nextstart方法执行一次,是从prenext切换到next的标志,nextstart默认执行是调用next方法。
  • (5)生育
    策略中并没有真正的生育,但是从某种意义上来说是存在的,因为如果优化用不同的参数的话,系统会实例化多次。算是生育吧
  • (6)死亡
    stop方法,系统通知策略重启,恢复所有设置,默认是空方法。

策略就像现实世界中的交易员一样,会在事件发生时得到通知。实际上在每一个next循环在回测过程中 :

  • 通过notify_order(order)获得订单状态变化的通知
  • 通过notify_trade(trade)通知所有开仓/更新/平仓交易
  • 通过notify_cashvalue(cash,value)通知在broker中当前现金和投资组合
  • 通过notify_fund(cash,value,fundvalue,shares)跟踪broker中当前现金和投资组合,以及基金价值和份额
  • 通过notify_store(msg,*args,**kwargs)实现特定事件 ,请参见Cerebro的关于store的说明。event将被传递给策略,即使已经被传递给cerebro实例(通过重写notify_store方法或通过回调)

策略像交易者有机会在市场期间通过next方法试图实现获利

  • buy方法 是做多或减少/平仓空头的头寸
  • sell方法 是做空或减少/平仓多头的头寸
  • close方法 是平仓存在的仓位
  • cancel方法 是取消尚未执行的订单

2. How to Buy/Sell/Close

order常用的方法是Buy和Sell方法。当被调用时,它们返回一个订单(或子类)实例作参考。该订单具有唯一的参考标识符,可用于对比。

order的参数:

  • data(默认:无) 必须为其创建订单的数据。如果没有,则将使用系统中的第一个数据,即self.datas[0]或self.data0(也称为self.data)
  • size(默认值:无) 用于订单的数据单位的大小(正值)。 如果没有,将使用通过getsizer检索的sizer来确定大小。
  • price(默认值:无) 如要设置的价格(实时broker会对其进行限制,如果格式不符合最小报价单位要求)
    None对market订单和close订单是有效(市价决定价格)
    对于limit限价单、stop止损单和stoplimit单,该值price决定是否触发,(在限价单limit的情况下,触发点显然是订单应该匹配price)
  • exectype(默认值:None) 执行订单的类型:
    • Order.Market or None,市价单将以next可用价格执行。回测中,next使用第二天的开盘价执行订单。
    • Order.Limit,只能以给定价格或更低(好)价格执行的订单
    • Order.Stop,止损价格被触发,和订单一样执行。
    • Order.StopLimit,以价格触发的订单,隐含限价订单执行,价格由pricelimit执行,理解应该是止损单的止损价格。
    • numeric value: 如果是一个与matplotlib编码中的日期时间相对应的值(backtrader使用的日期时间),就是该数字能转换成正确的日期,可以生成一个在该时间(截止日期)之前有效的订单。

如果backtrader直接支持的4种订单执行类型还不够用,例如在交互时broker,可以将作为kwargs传递:

orderType='LIT', lmtPrice=10.0, auxPrice=9.8

将重写backtrader创建的设置,并生成一个触及限价单,触及价格为9.8,限价为10.0。

3.Information Bits

策略的长度总是等于主数据(datas[0])的长度,可以用len(self) 。
如果正在replay数据或正载入数据,并且新tick正在到达相同的时间点,调用next而不改变长度 。(没有理解 ?)

4.Member Attributes

  • env:加载策略的cerebro 实体
  • datas:加载到cerebro的数据,默认data/data0是data[0],dataX是data[X]
  • dnames:通过名称访问数据加载的替代方法。
    在数据加载时:
    data = bt.feeds.PandasData(dataname=stock_hfq_df, fromdate=start_date, todate=end_date,name='days')  # 加载数据

    # Add the Data Feed to Cerebro
    cerebro.adddata(data)
    cerebro.resampledata(data, timeframe=bt.TimeFrame.Weeks, name='weeks')

在策略的indicator中:

class MyStrategy(bt.Strategy):  
    def __init__(self):  
        self.dataclose = self.datas[0].close  

        smadays = bt.indicators.SMA(self.dnames.days, period=30)  # or self.dnames['days']
        smaweeks = bt.indicators.SMA(self.dnames.weeks, period=10)  # or self.dnames['weeks']
  • broker:策略所关联的broker
  • stats:由cerebro为相关策略创建的Observers ,保存为列表/命名的类似元组的序列
  • analyzers:由cerebro为相关策略创建的analyzers,保存为列表/命名的类似元组的序列
  • position:data0的仓位

5.Member Attributes (适用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值