量化交易学习(十八)backtrader平台运行概念1

今天这篇是backtrader文档的学习笔记。主要介绍了线迭代器的概念。

官方文档链接:https://www.backtrader.com/docu/operating/

线迭代器(Line Iterators)

为了方便操作,backtrader采用线迭代器的概念。

策略和指标都是线迭代器。

线迭代器的执行流程如下:

  • 一个线迭代器启动从属的线迭代器,通知它们进线迭代。
  • 然后,线迭代器对其自己声明的线变量进线迭代,设置值。

迭代的关键,就像普通的 Python 迭代器一样,是:

  • next方法:它将在每次迭代时被调用。backtrader将线迭代器拥有的,作为逻辑/计算的基础的 datas 数组的索引移动到下一个索引上(除了数据重放外)。
  • 当达到线迭代器的最小周期时被调用。关于这一点,稍后会更多地介绍。

但由于它们不是常规迭代器,它们还存在两种额外的的方法:

  • prenext:在达到线迭代器最小周期之前被调用。
  • nextstart:当达到线迭代器最小周期时,仅调用一次。
  • 默认行为是将调用转发到 next,但如果需要,可以覆盖它。

指标类的额外方法

为了加快运行速度,指标支持一种称为“runonce”的批处理操作模式。它并不是必需的(next 方法就足够了),但它可以大大缩短时间。

runonce 方法使索引为 0 的点 get/set 操作无效,直接访问保存数据的底层数组,并为每个状态传递正确的索引。
定义的方法遵循 next 系列的命名:

  • once(self, start, end):当达到最小周期时调用。必须在 start 和 end 之间处理内部数组,它们从内部数组的开始为零。
  • preonce(self, start, end):在达到最小周期之前调用。
  • oncestart(self, start, end):当达到最小周期时仅调用一次。
  • 默认行为是将调用转发到 once,但如果需要,可以覆盖它。

最小周期

以SimpleMovingAverage为例,解释最小周期:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class SimpleMovingAverage(Indicator):
lines = ('sma',)
params = dict(period=20)

def __init__(self):
... # Not relevant for the explanation

def prenext(self):
print('prenext:: current period:', len(self))

def nextstart(self):
print('nextstart:: current period:', len(self))
# emulate default behavior ... call next
self.next()

def next(self):
print('next:: current period:', len(self))
```
该类在实例化时可以这样写:

`sma = btind.SimpleMovingAverage(self.data, period=25)`

简单地解释下:

- 假设传递给移动平均线的数据源是标准的,其默认周期为 1(即不会产生延迟)。
- 那么,在计算一个周期为 25 的移动平均线时,它的方法调用会是这样的:
- prenext 被调用 24 次:这是在计算移动平均线之前所做的准备工作。
- nextstart 被调用 1 次, 它会接着调用 next 方法。
- next 被调用 n 次,直到数据源耗尽。 n 表示数据的条数。

更进一步,我们可以组合两个简单移动平均线来创建一个更厉害的指标:使用一个简单移动平均线作为另一个简单移动平均线的输入。代码示例如下:
```python
sma1 = btind.SimpleMovingAverage(self.data, period=25)

sma2 = btind.SimpleMovingAverage(sma1, period=20)

接下来会发生什么呢?

  • sma1 与之前相同:它的 prenext, nextstart, next 等方法会按照之前提到的顺序逐个调用。
  • sma2 接收的数据流: 它接收的不是原始数据,而是 sma1 的输出。因此,它的最小周期等于 sma1 的周期(即 25)。
  • 生成 sma2 时的方法调用如下:
    • prenext 被调用 43 次:
      • 前 25 次是为了让 sma1 生成第一个有效值。
      • 后 18 次是为了积累额外的 sma1 值。
    • nextstart 被调用 1 次,接着调用 next。
    • next 被调用 n 次,直到数据流耗尽。
  • 总之,平台在处理了 44 个数据点后才会真正调用 next 方法。
  • 最小周期自动调整: 系统会自动将 SMA2 的最小周期调整为输入数据的周期。
  • 策略和指标都遵循这种行为: 只有当自动计算的最小周期达到后,才会调用 next 方法(除了最初的 nextstart 调用)。

简而言之,SMA2 会先等待 SMA1 生成足够的数据,然后才会开始计算自己的移动平均值。这种嵌套的方式可以带来更复杂的技术分析指标,帮助投资者进行更深入的市场分析。


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

江达小记