量化交易学习(十八)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 | class SimpleMovingAverage(Indicator): |
接下来会发生什么呢?
- sma1 与之前相同:它的 prenext, nextstart, next 等方法会按照之前提到的顺序逐个调用。
- sma2 接收的数据流: 它接收的不是原始数据,而是 sma1 的输出。因此,它的最小周期等于 sma1 的周期(即 25)。
- 生成 sma2 时的方法调用如下:
- prenext 被调用 43 次:
- 前 25 次是为了让 sma1 生成第一个有效值。
- 后 18 次是为了积累额外的 sma1 值。
- nextstart 被调用 1 次,接着调用 next。
- next 被调用 n 次,直到数据流耗尽。
- prenext 被调用 43 次:
- 总之,平台在处理了 44 个数据点后才会真正调用 next 方法。
- 最小周期自动调整: 系统会自动将 SMA2 的最小周期调整为输入数据的周期。
- 策略和指标都遵循这种行为: 只有当自动计算的最小周期达到后,才会调用 next 方法(除了最初的 nextstart 调用)。
简而言之,SMA2 会先等待 SMA1 生成足够的数据,然后才会开始计算自己的移动平均值。这种嵌套的方式可以带来更复杂的技术分析指标,帮助投资者进行更深入的市场分析。
这一篇就到这里啦。欢迎大家点赞、转发、私信。还没有关注我的朋友可以关注 江达小记