经过 backtrader 微调(因为它已经运行了一段时间),我决定不仅通过GitHub分享它,还告诉世界它在那里,并在“Reddit”中发布它的存在。
在评论了为什么交易/算法交易平台会弹出,以及关于支持许多同时交易的即时交易的平台的私人问题之后,我得出的结论是,我自己的孩子应该拥有自己的博客。
我们来了。但让我们专注于业务。
backtrader
旨在让我快速尝试一些想法,并检查我的眼睛可能告诉我这可能是一个机会。
backtrader
(现在)完全是关于回溯测试的,还没有连接到任何即时交易平台,甚至可能没有(尽管我相信技术实现会允许它)
当我使用「尝试想法」这个表达时,我的意思是两件事:
-
能够快速起草指针并能够直观地评估其行为
-
无论是这种情况,都可以围绕该指针或与他人的组合制定潜在的战略。
我的个人交易是100%判断性的,因为自动化系统不会做出任何一个决定。但我看看指针有什么要说明的。无论这些「迹象」是否真的是一个信号,它都留给了我错误的人类思维。
但是让我们来试试吧。在Reddit上发布了第一 次之后,我添加了一个众所周知的指针:
- 特里克斯
Stockcharts在Trix上有一个很好的讨论:ChartSchool - Trix
让我们尝试一下如何做到这一点,以最小可能 lines:
from __future__ import (absolute_import, division, print_function, unicode_literals) import backtrader as bt import backtrader.indicators as btind class MyTrix(bt.Indicator): lines = ('trix',) params = (('period', 15),) def __init__(self): ema1 = btind.EMA(self.data, period=self.p.period) ema2 = btind.EMA(ema1, period=self.p.period) ema3 = btind.EMA(ema2, period=self.p.period) self.lines.trix = 100.0 * (ema3 - ema3(-1)) / ema3(-1)
Trix指针已启动并运行。看着这一点,作为该平台的作者,我确实相信我的目标是能够快速尝试易于使用的新想法......已达到。
开发细分:
-
lines = ('trix',)
此元组定义指针的输出 lines (在本例中仅为一个)。类声明开头的此语句在类创建和对象实例化期间生成大量后台操作。
足以说该对象具有一个属性“lines”,该属性包含“trix”。
作为奖励,如果在指针本身内部不使用名称“trix”,则“line”也可以通过“self.trix”到达。但为了清楚起见,我更喜欢“自我”。lines.trix”
其他访问方法:
-
self.l.trix
-
自我。lines[0] ...作为索引是对应于元组中位置的索引
-
-
参数 = (('句点', 15),)
这个元组元组(也可以是字典或 OrderedDict)定义指针接受的参数并声明默认值。
解析 kwargs 的负担从用户的肩上卸下来。
可以使用“self.params.xxxxx”表示法或速记“self.p.xxxxx”访问参数
-
计算(其中 EMA 代表 ExponentialMovingAverage)
-
ema1 = btind.EMA(self.data, period=self.p.period)
显示新的奖金...“自我数据”。这似乎是突然出现的,但这又是在指针的后台完成的预处理。
传递给指针进行计算的任何「数据」都会被拦截并放置在数字
self.datas
中,其中通常self.datas[0]
可用于访问第一个数据。速记确实存在,如下所示:self.data 和 self.data0 表示数组中的第一个数据。从那时起,self.data1,self.data2。
Trix只需要一个数据
-
ema2 = btind.EMA(ema1, period=self.p.period)
没什么可说的。EMA 使用 ema1 作为输入数据
-
ema3 = btind.EMA(ema2, period=self.p.period)
更不用说
-
自我。lines.trix = 100.0 * (ema3 - ema3(-1)) / ema3(-1)
首先,完成一个简单的1周期百分比差异计算。
魔术 ema3(-1) 是一种表示法,用于表示:ema 的前一个值。
计算结果被分配给在类创建期间定义的输出“line”“trix”。
-
简单易用。但是,如果我没有获得Trix正在做什么的视觉反馈,「实验」就不会完成(即使Stockcharts有一篇很好的文章)。
注意
实际的Trix实施有一些额外的花里胡哨的东西,主要是为了美化情节而结束的,这与这篇文章无关。
我们假设我们已经将MyTrix
指针放在一个 mytrix.py 档中。
from __future__ import (absolute_import, division, print_function, unicode_literals) import backtrader as bt import backtrader.feeds as btfeeds from mytrix import MyTrix class NoStrategy(bt.Strategy): params = (('trixperiod', 15),) def __init__(self): MyTrix(self.data, period=self.p.trixperiod) if __name__ == '__main__': # Create a cerebro entity cerebro = bt.Cerebro() # Add a strategy cerebro.addstrategy(NoStrategy, trixperiod=15) # Create a Data Feed datapath = ('../datas/2006-day-001.txt') data = bt.feeds.BacktraderCSVData(dataname=datapath) # Add the Data Feed to Cerebro cerebro.adddata(data) # Run over everything cerebro.run() # Plot the result cerebro.plot()
视觉输出如下(open 图表在新窗口/选项卡中查看全尺寸图像),希望显示创建指针和可视化评估的速度和简便性backtrader