自动化回测#

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

算法交易 的目标之一是自动化交易,而 backtrader 是一个旨在检查交易算法的 回测*平台(因此是一个 算法交易*平台),

自动化使用backtrader是一个明显的目标。

当安装 backtrader 时,提供了 2 个入口点,以脚本/可执行文件的形式自动化大部分任务:

  • bt-run-py 一个使用下一个项目的代码库的脚本

  • btrun (可执行文件)

    setuptools 在打包过程中创建的入口点。该可执行文件在Windows下具有优势, 理论上不会出现关于“路径/文件未找到”的错误。

下面的描述同样适用于这两个工具。

btrun 允许最终用户:- 说明必须加载的数据源
  • 设置加载数据的格式

  • 指定数据的日期范围

  • 将参数传递给Cerebro - 禁用标准观察者

    这是在实施”Cerebro”参数之前的原始额外开关。因此,如果向Cerebro传递了与标准观察者相关的参数,将会被忽略(参数 stdstats 用于Cerebro)

  • 从内置观察者或Python模块加载一个或多个观察者(例如: DrawDown

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

  • 启用绘图,控制图表数量和以何种方式呈现数据

  • 向系统添加一个带参数的写入器

最后,核心能力应为:

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

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

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

应用自定义策略#

让我们考虑以下策略:

  • 简单地加载一个SimpleMovingAverage(默认周期为15)

  • 打印输出

  • 文件名为 mymod.py

非常简单:

btrun –csvformat btcsv

–data ../../datas/2006-day-001.txt –strategy mymod.py

图表输出

控制台输出:

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

命令行:

btrun –csvformat btcsv

–data ../../datas/2006-day-001.txt –plot –strategy mymod.py:period=50图表输出。

注意

如果没有给出 .py 扩展名,bt-run会自动添加。

使用内置策略#

backtrader 将逐渐包含示例(教科书式)策略。与 bt-run.py 脚本一起提供了一个标准的 简单移动平均线交叉 策略。策略名称为:

  • SMA_CrossOver

  • 参数

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

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

策略在快速移动平均线上交叉快速移动平均线并买入,只有在之前买入后,当快速移动平均线下交慢速移动平均线时才卖出。

代码.. literalinclude:: ./sma_crossover.py
language:

python

lines:

21-

标准执行:

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

请注意 :` 符号。加载策略的标准表示法(见下文)是:

  • module:stragegy:kwargs

遵循以下规则:

  • 如果指定了 module 并且指定了 strategy,则使用该策略

  • 如果指定了 module 但未指定 strategy,则返回模块中找到的第一个策略

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

  • 如果指定了 module 和/或 strategy,并且存在 kwargs,则将其传递给相应的策略.. 注意:

同样的符号和规则也适用于 --observer--analyzer--indicator 选项

显然适用于相应的对象类型

输出

最后一个例子添加佣金计划、现金和更改参数:

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

输出

我们已经对策略进行了回测:- 更改移动平均周期 - 设置新的起始现金 - 为类似期货的工具设定佣金方案

请注意每个条形图现金的连续变化,因为现金会根据类似期货的工具的每日变动进行调整

不使用策略#

这是一个夸大的说法。将应用一个策略,但您可以省略任何类型的策略,系统将添加默认的backtrader.Strategy。

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

例如:

btrun --csvformat btcsv \
      --data ../../datas/2006-day-001.txt \
      --cash 20000 \
      --commission 2.0 \
      --mult 10 \
      --margin 2000 \
      --nostdstats \
      --observer :Broker

这样做没有多大作用,只是为了演示目的:

  • 默认的backtrader.Strategy会在后台添加

  • Cerebro将不会实例化常规的“stdstats”观察器(Broker、BuySell、Trades)

  • 手动添加了一个“Broker”观察器

如上所述,“nostdstats”是一个遗留参数。较新版本的“btrun”可以直接将参数传递给“Cerebro”。等效的调用方式为:运行以下命令:

btrun –csvformat btcsv

–data ../../datas/2006-day-001.txt –cash 20000 –commission 2.0 –mult 10 –margin 2000 –cerebro stdstats=False –observer :Broker

添加分析器#

btrun 还支持使用与选择内部/外部分析器相同的语法来添加 分析器

以下是一个使用 SharpeRatio 分析2005-2006年数据的示例:

btrun –csvformat btcsv

–data ../../datas/2005-2006-day-001.txt –strategy :SMA_CrossOver –analyzer :SharpeRatio

控制台输出为

如果需要打印 Analyzer 的结果,可以使用下列选项:

  • --pranalyzer ,默认调用下一个分析器(除非分析器已覆盖正确的方法)

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

注意

这两个打印选项是在 backtrader 成为一部分之前实现的。添加一个没有csv输出的写入器可以实现相同的效果(并且输出已经得到改进)扩展上面的示例:

```bash btrun –csvformat btcsv

–data ../../datas/2005-2006-day-001.txt –strategy :SMA_CrossOver –analyzer :SharpeRatio –plot –pranalyzer

```

== 分析器#

夏普比率#

{‘夏普比率’: 11.647332609673256}

好策略!(实际上这个例子纯属运气,而且也没有佣金)

图表(由于分析器无法绘制,所以图表中没有显示分析器,它们不是线对象)

../_images/bt-run-sma-crossover-sharpe.png

使用 writer 参数的相同示例:

```bash btrun –csvformat btcsv

–data ../../datas/2005-2006-day-001.txt –strategy :SMA_CrossOver –analyzer :SharpeRatio –plot –writer

```

    • Data0: - 名称:2005-2006-day-001 - 时间框架:天 - 压缩:1

  • SMA_CrossOver: *** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** - 参数:

    • 快速线:10

    • 慢速线:30

    • _movav:SMA

    *** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** - 指标:

    • SMA: - 线:sma ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - 参数:

      • 周期:30

    • CrossOver: - 线:crossover - 参数:无

    *** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** - 监控器:

    • 经纪人: - 线:现金,价值 - 参数:无

    • 买卖: - 线:买入,卖出 - 参数:无

    • 交易: - 线:正收益,负收益 - 参数:无

    *** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** - 分析器:

    • 价值: - 开始:10000.0 - 结束:10496.68

    • 夏普比率: - 参数:无 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - 分析:

      • 夏普比率:11.6473326097

添加指标和监控器 ==================与“策略”和“分析器”一样,btrun还可以添加以下内容:

  • “指标”

  • “观察者”

语法与上面添加“经纪人”观察者时完全相同。

让我们重复一下例子,添加一个“随机指标”,一个“经纪人”并查看绘图(我们将更改一些参数):

```plaintext btrun –csvformat btcsv

–data ../../datas/2006-day-001.txt –nostdstats –observer :Broker –indicator :Stochastic:period_dslow=5 –plot

```

图表

绘图控制 ================最上面的示例大多使用了以下选项:

  • --plot 激活了创建默认图表的功能

可以通过给 --plot 选项添加 kwargs 来实现更多的控制

  • 例如,使用 --plot style="candle" 以绘制蜡烛图而不是默认的 LineOnClose 样式

调用方式:

btrun –csvformat btcsv

–data ../../datas/2006-day-001.txt –nostdstats –observer :Broker –indicator :Stochastic:period_dslow=5 –plot style="candle"

注意

引号 candle 前面使用了反斜杠 \ 进行转义,因为示例在 bash shell 中运行,该字符在传递给脚本之前会被移除。

在这种情况下需要使用反斜杠进行转义,以确保 “bar” 能够传递给脚本并作为字符串进行评估。

图表.. 缩略图:: ./bt-run-plot-candle.png

脚本用法#

从脚本中直接使用:

$ btrun --help
usage: btrun-script.py [-h] --data DATA [--cerebro [kwargs]] [--nostdstats]
                       [--format {yahoocsv_unreversed,vchart,vchartcsv,yahoo,mt4csv,ibdata,sierracsv,yahoocsv,btcsv,vcdata}]
                       [--fromdate FROMDATE] [--todate TODATE]
                       [--timeframe {microseconds,seconds,weeks,months,minutes,days,years}]
                       [--compression COMPRESSION]
                       [--resample RESAMPLE | --replay REPLAY]
                       [--strategy module:name:kwargs]
                       [--signal module:signaltype:name:kwargs]
                       [--observer module:name:kwargs]
                       [--analyzer module:name:kwargs]
                       [--pranalyzer | --ppranalyzer]
                       [--indicator module:name:kwargs] [--writer [kwargs]]
                       [--cash CASH] [--commission COMMISSION]
                       [--margin MARGIN] [--mult MULT] [--interest INTEREST]
                       [--interest_long] [--slip_perc SLIP_PERC]
                       [--slip_fixed SLIP_FIXED] [--slip_open]
                       [--no-slip_match] [--slip_out] [--flush]
                       [--plot [kwargs]]

Backtrader运行脚本

可选参数:
  -h, --help            显示帮助信息并退出
  --resample RESAMPLE, -rs RESAMPLE
                        使用时间帧:压缩值重新采样
  --replay REPLAY, -rp REPLAY
                        使用时间帧:压缩值进行回放
  --pranalyzer, -pralyzer
                        自动打印分析器
  --ppranalyzer, -ppralyzer
                        自动将分析器漂亮打印
  --plot [kwargs], -p [kwargs]
                        绘制读取的数据并应用任何传递的kwargs

                        例如:

                          --plot style="candle"(绘制蜡烛图)

数据选项:
  --data DATA, -d DATA  要添加到系统的数据文件

Cerebro选项:
  --cerebro [kwargs], -cer [kwargs]
                        参数可以以以下形式指定:- kwargs

                            示例: "preload=True" 将其设置为 True

                        传递的 kwargs 将直接传递给为执行创建的 cerebro 实例

                        cerebro 可用的 kwargs 有:
                          - preload (默认: True)
                          - runonce (默认: True)
                          - maxcpus (默认: None)
                          - stdstats (默认: True)
                          - live (默认: False)
                          - exactbars (默认: False)
                          - preload (默认: True)
                          - writer (默认 False)
                          - oldbuysell (默认 False)
                          - tradehistory (默认 False)
  --nostdstats          禁用标准统计观察者
  --format {yahoocsv_unreversed,vchart,vchartcsv,yahoo,mt4csv,ibdata,sierracsv,yahoocsv,btcsv,vcdata}, --csvformat {yahoocsv_unreversed,vchart,vchartcsv,yahoo,mt4csv,ibdata,sierracsv,yahoocsv,btcsv,vcdata}, -c {yahoocsv_unreversed,vchart,vchartcsv,yahoo,mt4csv,ibdata,sierracsv,yahoocsv,btcsv,vcdata}
                        CSV 格式
  --fromdate FROMDATE, -f FROMDATE
                        开始日期,格式为 YYYY-MM-DD[THH:MM:SS]
  --todate TODATE, -t TODATE
                        结束日期,格式为 YYYY-MM-DD[THH:MM:SS]
  --timeframe {microseconds,seconds,weeks,months,minutes,days,years}, -tf {microseconds,seconds,weeks,months,minutes,days,years}
                        时间框架,格式为 YYYY-MM-DD[THH:MM:SS]
  --compression COMPRESSION, -cp COMPRESSION
                        压缩格式

策略选项:
  --strategy module:name:kwargs, -st module:name:kwargs
                        此选项可以多次指定。

                        参数可以使用以下格式指定:

                          - module:classname:kwargs

                            示例: mymod:myclass:a=1,b=2

                        kwargs 是可选的

                        如果省略 module,则类名将在内置策略模块中查找。例如:- :name:kwargs 或者 :name

如果省略了 name,则将使用 mod 中找到的第一个策略。例如:

  • module 或者 module::kwargs

信号: –signal module:signaltype:name:kwargs, -sig module:signaltype:name:kwargs 可以多次指定此选项。

参数的形式可以以下列形式指定:

  • signaltype:module:signaltype:classname:kwargs

示例: longshort+mymod:myclass:a=1,b=2

signaltype 可以省略: 将使用 longshort

示例: mymod:myclass:a=1,b=2

kwargs 是可选的signaltype将被大写以匹配backtrader.signal模块中的定义。

如果省略模块,则将在内置信号模块中查找类名。例如:

  • LONGSHORT::name:kwargs或:name

如果省略name,则将使用找到的模块中的第一个信号。例如:

  • module或module:::kwargs

观察者和统计信息: –observer module:name:kwargs,-ob module:name:kwargs 可以多次指定此选项。

参数可以用以下形式指定:

  • module:classname:kwargs

    示例:mymod:myclass:a=1,b=2

kwargs是可选的。如果省略模块,则会在内置的观察者模块中查找类名。例如:

  • :name:kwargs 或 :name

如果省略名称,则会使用在模块中找到的第一个观察者。例如:

  • 模块或模块::kwargs

分析器:

–analyzer module:name:kwargs, -an module:name:kwargs

可以多次指定此选项。

参数可以使用以下形式指定:

  • 模块:类名:kwargs

例如:mymod:myclass:a=1,b=2

kwargs是可选的。

如果省略模块,则会在内置的分析器模块中查找类名。例如:- :name:kwargs 或者 :name

如果省略了name,则将使用找到的第一个分析器。例如:

  • module 或者 module::kwargs

指示符:

–indicator module:name:kwargs, -ind module:name:kwargs 可以多次指定该选项。

参数可以使用以下形式指定:

  • module:classname:kwargs

    示例:mymod:myclass:a=1,b=2

kwargs 是可选的。

如果省略了module,则在内置的分析器模块中寻找类名。例如:

  • :name:kwargs 或者 :name如果省略了名称,则会使用找到的第一个分析器。例如:

  • module or module::kwargs

写作者: –writer [kwargs], -wr [kwargs] 可以多次指定此选项。

参数的格式如下:

  • kwargs

    示例:a=1,b=2

kwargs是可选的。

它创建一个系统级的写作者,用于输出运行数据。

请参阅文档以获取可用的kwargs。

现金和佣金方案参数: –cash CASH, -cash CASH 设置给经纪人的现金 –commission COMMISSION, -comm COMMISSION 设置佣金值 –margin MARGIN, -marg MARGIN 设置保证金类型 –mult MULT, -mul MULT 要使用的乘数 –interest INTEREST 应用的信用利率(0.0x) –interest_long 将信用利息应用于多仓位 –slip_perc SLIP_PERC 使用百分比值启用滑点 –slip_fixed SLIP_FIXED 使用固定点值启用滑点 –slip_open 为匹配开盘价启用滑点 –no-slip_match 禁用滑点匹配,即:如果滑点超过高低限制,则匹配被限制在高低之间 –slip_out 在启用滑点匹配的情况下,匹配超出高低 –flush 刷新输出 - 在win32系统下很有用