量化交易学习(二十六)backtrader平台运行概念3策略类

今天这篇是backtrader文档的学习笔记。主要介绍了数据源的概念。

官方文档链接:https://www.backtrader.com/docu/operating/#a-strategy-derived-class

策略(派生)类

使用backtrader对数据进行回溯测试是在策略(派生类)内完成的。

策略类至少有2个方法需要覆盖:

  • __init__

  • next

在初始化期间,创建数据指标和其他计算指标,为以后应用逻辑做好准备。

之后调用 next 方法来处理每个 bar 的数据。

注意:如果将不同时间范围(bar的数量不同)的数据源传递给 next 方法,则将为主数据源( 第一个传递给 cerebro 的数据源,见下文)调用 next 方法,该数据源必须是具有较小时间范围的数据。

注意:如果使用数据重放功能,则在next重放bar的进度时,将针对同一bar多次调用该方法。

一个简单的策略派生类:

1
2
3
4
5
6
7
8
9
10
11
12
13
class MyStrategy(bt.Strategy):

def __init__(self):

self.sma = btind.SimpleMovingAverage(self.data, period=20)

def next(self):

if self.sma > self.data.close:
self.buy()

elif self.sma < self.data.close:
self.sell()

策略有其他可以被覆盖的方法(或挂钩点):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class MyStrategy(bt.Strategy):

def __init__(self):

self.sma = btind.SimpleMovingAverage(self.data, period=20)

def next(self):

if self.sma > self.data.close:
submitted_order = self.buy()

elif self.sma < self.data.close:
submitted_order = self.sell()

def start(self):
print('Backtesting is about to start')

def stop(self):
print('Backtesting is finished')

def notify_order(self, order):
print('An order new/changed/executed/canceled has been received')

startstop方法就是字面意思。当策略发送通知时,会调用 notify_order 方法。例如:

  • 挂买入或卖出单时(如下所示)

    买入/卖出将返回提交给经纪商的 order 。是否保留提交的订单由调用者决定。

    例如,它可用于确保在订单仍处于待处理状态时不会提交新订单。

  • 如果订单被接受/执行/取消/更改,经纪商将通过notify_order方法将更改后的状态通知策略

下面介绍几个常用的策略类方法:

  • buysellclose

    使用底层 brokersizer 向经纪商发送买入/卖出订单

    可以通过手动创建订单并将其传递给经纪人来完成相同的操作。但该平台的目的是让使用它的人变得更容易。

    close将获取当前头寸并立即平仓。

  • getposition(或属性“position”)

    返回当前头寸

  • setsizer/ getsizer(或属性“sizer”)

    这些函数/属性允许设置/获取底层的仓位分配器 (Sizer)。 使用相同的逻辑可以检查针对相同情况提供不同仓位的分配器 (例如固定资金量、按比例分配资金、指数增长),从而选择合适的分配策略。

策略类由一个 Lines 对象和它所支持的参数组成的,这些参数是使用 Python 的kwargs 参数收集的:

1
2
3
4
5
6
7
8
9
10
class MyStrategy(bt.Strategy):

params = (('period', 20),)

def __init__(self):

self.sma = btind.SimpleMovingAverage(self.data, period=self.params.period)

...
...

请注意,SimpleMovingAverage不再使用固定值 20 进行实例化,而是使用为策略定义的参数“period”进行实例化。


这一篇就到这里啦。欢迎大家点赞、转发、私信。还没有关注我的朋友可以关注 江达小记

江达小记