量化交易学习(四十四)backtrader文档——自动化回测

今天这篇是backtrader文档的学习笔记。主要介绍了自动化回测。

官方文档链接:https://www.backtrader.com/docu/automated-bt-run/automated-bt-run/

自动化回测

到目前为止,所有backtrader示例和工作示例都是从头开始创建一个主要的Python模块,该模块加载数据、策略、观察者并准备现金和佣金方案。

算法交易的目标之一是交易自动化,鉴于 backtrader 是一个旨在调试交易算法的回测平台(因此也是一个算法交易平台),因此自动化使用显然也是backtrader平台一个的目标。

安装backtrader后以脚本/可执行文件的形式提供 2 个入口点,可自动执行大多数任务:

  • bt-run-py 就是我们之前一直在用的python脚本的形式

  • btrun(可执行文件)

    打包期间由setuptools创建的入口点。该可执行文件为 Windows 作了优化,理论上不会发生有关“路径/文件未找到”的错误。

btrun支持用户做以下事情:

  • 说明必须加载哪些数据源

  • 设置加载数据的格式

  • 指定数据的日期范围

  • 将参数传递给 Cerebro

    • 禁用标准观察者
      这是“Cerebro”参数实例化之前的原始额外开关。因此,如果传递了与标准观察者有关的 cerebro 参数,则该参数将被忽略(Cerebro 的stdstats参数)
  • 从内置观察者或 python 模块中加载一个或多个观察者(例如:DrawDown)

  • 设置经纪商的现金和佣金方案参数(佣金、保证金、倍数)

  • 启用绘图、控制图表数量和呈现数据的样式

  • 向系统添加参数化写入器

最后,告诉系统要执行的具体策略:

  • 加载策略(内置策略或来自 Python 模块)

  • 将参数传递给加载的策略

有关脚本的用法,请参阅下文。

应用用户定义的策略

让我们考虑以下策略:

  • 只需加载 SimpleMovingAverage(默认周期 15)指标

  • 打印输出

  • 位于名为mymod.py的文件中

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
from __future__ import (absolute_import, division, print_function,
unicode_literals)


import backtrader as bt
import backtrader.indicators as btind


class MyTest(bt.Strategy):
params = (('period', 15),)

def log(self, txt, dt=None):
''' Logging function fot this strategy'''
dt = dt or self.data.datetime[0]
if isinstance(dt, float):
dt = bt.num2date(dt)
print('%s, %s' % (dt.isoformat(), txt))

def __init__(self):
sma = btind.SMA(period=self.p.period)

def next(self):
ltxt = '%d, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f'

self.log(ltxt %
(len(self),
self.data.open[0], self.data.high[0],
self.data.low[0], self.data.close[0],
self.data.volume[0], self.data.openinterest[0]))

执行策略很简单:

1
2
3
btrun --csvformat btcsv \
--data ../../datas/2006-day-001.txt \
--strategy mymod.py

图表输出:
78f2711070d6bafa55d7b8a570d1637e.png

控制台输出:

1
2
3
4
5
6
7
8
9
10
2006-01-20T23:59:59+00:00, 15, 3593.16, 3612.37, 3550.80, 3550.80, 0.00, 0.00
2006-01-23T23:59:59+00:00, 16, 3550.24, 3550.24, 3515.07, 3544.31, 0.00, 0.00
2006-01-24T23:59:59+00:00, 17, 3544.78, 3553.16, 3526.37, 3532.68, 0.00, 0.00
2006-01-25T23:59:59+00:00, 18, 3532.72, 3578.00, 3532.72, 3578.00, 0.00, 0.00
...
...
2006-12-22T23:59:59+00:00, 252, 4109.86, 4109.86, 4072.62, 4073.50, 0.00, 0.00
2006-12-27T23:59:59+00:00, 253, 4079.70, 4134.86, 4079.70, 4134.86, 0.00, 0.00
2006-12-28T23:59:59+00:00, 254, 4137.44, 4142.06, 4125.14, 4130.66, 0.00, 0.00
2006-12-29T23:59:59+00:00, 255, 4130.12, 4142.01, 4119.94, 4119.94, 0.00, 0.00

相同的策略,但是:

  • 将参数period设置为 50

命令行:

1
2
3
4
btrun --csvformat btcsv \
--data ../../datas/2006-day-001.txt \
--plot \
--strategy mymod.py:period=50

图表输出。
aa893e835051202b67501768e148bec6.png

注意:如果没有给出.py扩展名,btrun 将添加它。

使用内置策略

backtrader将慢慢包括示例(教科书)策略。除了脚本之外,还包括bt-run.py标准的简单移动平均线交叉策略。策略名字:

  • SMA_CrossOver

  • 参数:

    • fast(默认10)快速移动平均线的周期

    • slow(默认30)慢速移动平均线的周期

该策略在快线上穿慢线时买入,并在快线下穿慢均线时卖出(仅当之前已买入)。

代码:

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
from __future__ import (absolute_import, division, print_function,
unicode_literals)


import backtrader as bt
import backtrader.indicators as btind


class SMA_CrossOver(bt.Strategy):

params = (('fast', 10), ('slow', 30))

def __init__(self):

sma_fast = btind.SMA(period=self.p.fast)
sma_slow = btind.SMA(period=self.p.slow)

self.buysig = btind.CrossOver(sma_fast, sma_slow)

def next(self):
if self.position.size:
if self.buysig < 0:
self.sell()

elif self.buysig > 0:
self.buy()

命令行执行:

1
2
3
4
btrun --csvformat btcsv \
--data ../../datas/2006-day-001.txt \
--plot \
--strategy :SMA_CrossOver

注意::是加载策略的标准符号(见下文):

1
module:stragegy:kwargs

遵循以下规则:

  • 如果模块存在并且指定了策略,那么将使用该策略

  • 如果模块存在但未指定策略,则将返回在模块中找到的第一个策略

  • 如果未指定模块,则假定“策略”指的是backtrader包中的策略

  • 如果模块和/或策略存在,如果 kwargs 存在,它们将被传递给相应的策略

注意:相同的符号和规则适用于--observer,--analyzer--indicator选项

输出:
3523baa99acbaa91cbc84c90bd411214.png

最后一个例子是添加佣金方案、现金和更改参数:

1
2
3
4
5
6
7
8
btrun --csvformat btcsv \
--data ../../datas/2006-day-001.txt \
--plot \
--cash 20000 \
--commission 2.0 \
--mult 10 \
--margin 2000 \
--strategy :SMA_CrossOver:fast=5,slow=20

输出:
e4fb7e38bcf622f90ddc1c4e04c81a59.png

我们以下参数对该策略进行了回测:

  • 更改移动平均周期
  • 设置新的起始现金
  • 为类似期货的工具制定佣金计划

查看每条柱的现金连续变化,因为现金会根据类似期货工具的每日变化进行调整

不使用策略

这是一个夸张的说法。还是会应用策略,但您可以省略任何类型的策略,默认策略将被添加。

分析器、观察者和指标将自动注入策略中。

一个例子:

1
2
3
4
5
6
7
8
btrun --csvformat btcsv \
--data ../../datas/2006-day-001.txt \
--cash 20000 \
--commission 2.0 \
--mult 10 \
--margin 2000 \
--nostdstats \
--observer :Broker

这不会做太多事情,但可以达到以下目的:

  • 后台添加默认的策略
  • Cerebro 不会实例化常规stdstats观察者(经纪商、买卖、交易)
  • 手动添加Broker观察者

如上所述,nostdstats是一个遗留参数。较新版本的btrun可以直接将参数传递给Cerebro. 等效的调用是:

1
2
3
4
5
6
7
8
btrun --csvformat btcsv \
--data ../../datas/2006-day-001.txt \
--cash 20000 \
--commission 2.0 \
--mult 10 \
--margin 2000 \
--cerebro stdstats=False \
--observer :Broker

添加分析器

btrun还支持使用与在内部/外部分析器之间进行选择的策略相同的语法进行添加Analyzers

以 2005-2006 年SharpeRatio分析为例:

1
2
3
4
btrun --csvformat btcsv \
--data ../../datas/2005-2006-day-001.txt \
--strategy :SMA_CrossOver \
--analyzer :SharpeRatio

控制台输出什么也没有。

如果希望打印Analyzer结果,则必须指定:

  • --pranalyzer默认调用下一个(除非分析器重写了正确的方法)

  • --ppranalyzer它使用pprint模块来打印结果

注意:这两个打印选项在writers是 backtrader 的一部分之前就已实现。添加不带 csv 输出的writer将实现相同的效果(并且输出已得到改进)

扩展上面的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
btrun --csvformat btcsv \
--data ../../datas/2005-2006-day-001.txt \
--strategy :SMA_CrossOver \
--analyzer :SharpeRatio \
--plot \
--pranalyzer

====================
== Analyzers
====================
##########
sharperatio
##########
{'sharperatio': 11.647332609673256}

好策略!!!(这个例子纯粹是运气,实际上也不收取佣金)

图表(分析器不在图中,因为分析器无法绘制,它们不是线条对象)
a8ba47512250eb8185c7f8e0470dfeef.png

相同的示例但使用writer参数:

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
btrun --csvformat btcsv \
--data ../../datas/2005-2006-day-001.txt \
--strategy :SMA_CrossOver \
--analyzer :SharpeRatio \
--plot \
--writer

===============================================================================
Cerebro:
-----------------------------------------------------------------------------
- Datas:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- Data0:
- Name: 2005-2006-day-001
- Timeframe: Days
- Compression: 1
-----------------------------------------------------------------------------
- Strategies:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- SMA_CrossOver:
*************************************************************************
- Params:
- fast: 10
- slow: 30
- _movav: SMA
*************************************************************************
- Indicators:
.......................................................................
- SMA:
- Lines: sma
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Params:
- period: 30
.......................................................................
- CrossOver:
- Lines: crossover
- Params: None
*************************************************************************
- Observers:
.......................................................................
- Broker:
- Lines: cash, value
- Params: None
.......................................................................
- BuySell:
- Lines: buy, sell
- Params: None
.......................................................................
- Trades:
- Lines: pnlplus, pnlminus
- Params: None
*************************************************************************
- Analyzers:
.......................................................................
- Value:
- Begin: 10000.0
- End: 10496.68
.......................................................................
- SharpeRatio:
- Params: None
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Analysis:
- sharperatio: 11.6473326097

添加指标和观察者

StrategiesAnalyzers一样btrun也可以添加:

  • Indicators
  • Observers

语法与上面添加Broker观察者时看到的语法完全相同。

让我们重复这个示例,但添加StochasticBroker然后看一下绘图(我们将更改一些参数):

1
2
3
4
5
6
btrun --csvformat btcsv \
--data ../../datas/2006-day-001.txt \
--nostdstats \
--observer :Broker \
--indicator :Stochastic:period_dslow=5 \
--plot

图表:
e42ce7c93c56184b7aefe78c9d06076d.png

绘图控制

上面的大多数示例都使用了以下选项:

  • --plot这已经激活了默认绘图功能

通过添加kwargs参数给--plot选项可以实现更多的绘图控制
- 例如--plot style="candle",使用蜡烛图绘制而不是使用LineOnClose样式绘制(这是默认绘制方式)

命令行:

1
2
3
4
5
6
btrun --csvformat btcsv \
--data ../../datas/2006-day-001.txt \
--nostdstats \
--observer :Broker \
--indicator :Stochastic:period_dslow=5 \
--plot style=\"candle\"

注意:candle周围的引号用反斜杠\\引起来,是因为该示例正在 bash shell 中运行,该 shell 在将参数传递给脚本之前将引号删除。

在这种情况下需要反斜杠引用,以确保"bar"进入脚本并可以作为字符串进行求值

图表:
7594589d0cf6a8668386b24fd5a24c68.png

可以通过btrun --help查看btrun的更多使用方法。


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

江达小记