今天这篇是backtrader文档的学习笔记。主要介绍了自动化回测。
官方文档链接:https://www.backtrader.com/docu/automated-bt-run/automated-bt-run/
自动化回测
到目前为止,所有backtrader示例和工作示例都是从头开始创建一个主要的Python模块,该模块加载数据、策略、观察者并准备现金和佣金方案。
算法交易的目标之一是交易自动化,鉴于 backtrader 是一个旨在调试交易算法的回测平台(因此也是一个算法交易平台),因此自动化使用显然也是backtrader平台一个的目标。
安装backtrader后以脚本/可执行文件的形式提供 2 个入口点,可自动执行大多数任务:
btrun
支持用户做以下事情:
最后,告诉系统要执行的具体策略:
-
加载策略(内置策略或来自 Python 模块)
-
将参数传递给加载的策略
有关脚本的用法,请参阅下文。
应用用户定义的策略
让我们考虑以下策略:
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
|
图表输出:

控制台输出:
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
|
相同的策略,但是:
命令行:
1 2 3 4
| btrun --csvformat btcsv \ --data ../../datas/2006-day-001.txt \ --plot \ --strategy mymod.py:period=50
|
图表输出。

注意:如果没有给出.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
|
注意::
是加载策略的标准符号(见下文):
遵循以下规则:
-
如果模块存在并且指定了策略,那么将使用该策略
-
如果模块存在但未指定策略,则将返回在模块中找到的第一个策略
-
如果未指定模块,则假定“策略”指的是backtrader
包中的策略
-
如果模块和/或策略存在,如果 kwargs
存在,它们将被传递给相应的策略
注意:相同的符号和规则适用于--observer
,--analyzer
和--indicator
选项
输出:

最后一个例子是添加佣金方案、现金和更改参数:
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
|
输出:

我们以下参数对该策略进行了回测:
- 更改移动平均周期
- 设置新的起始现金
- 为类似期货的工具制定佣金计划
查看每条柱的现金连续变化,因为现金会根据类似期货工具的每日变化进行调整
不使用策略
这是一个夸张的说法。还是会应用策略,但您可以省略任何类型的策略,默认策略将被添加。
分析器、观察者和指标将自动注入策略中。
一个例子:
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
结果,则必须指定:
注意:这两个打印选项在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}
|
好策略!!!(这个例子纯粹是运气,实际上也不收取佣金)
图表(分析器不在图中,因为分析器无法绘制,它们不是线条对象)

相同的示例但使用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
|
添加指标和观察者
和Strategies
及Analyzers
一样btrun
也可以添加:
语法与上面添加Broker
观察者时看到的语法完全相同。
让我们重复这个示例,但添加Stochastic
和Broker
然后看一下绘图(我们将更改一些参数):
1 2 3 4 5 6
| btrun --csvformat btcsv \ --data ../../datas/2006-day-001.txt \ --nostdstats \ --observer :Broker \ --indicator :Stochastic:period_dslow=5 \ --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"
进入脚本并可以作为字符串进行求值
图表:

可以通过btrun --help
查看btrun
的更多使用方法。
这一篇就到这里啦。欢迎大家点赞、转发、私信。还没有关注我的朋友可以关注 江达小记
