操作平台 – backtrader中文教程
操作platform
Line Iterators
To参与到行动中,plaftorm使用线路的概念迭代器。他们Python的迭代器后,被松散的蓝本,但有其实无关them.
Strategies和指标线iterators.
The线的迭代器概念试图描述如下:
- 一个行迭代器踢奴隶线迭代器告诉然后他们iterate
- A线迭代器在自己的声明的命名线设置迭代values
The键进行迭代,就像一般的Python迭代器,就是:
- `的
next
methodIt将要求每个迭代。在
datas
阵列其中line
iterator具有与作为逻辑基础/计算将已经被平台(禁止数据的重放)调用时最小为线迭代period已经满足移动到下一个索引。一种多一点对这个below.
But因为他们不是普通的迭代器,另外两种方法存在:
prenext
之前被称为最低period为线iterator`已经met.
nextstart
Called正是ONCE当的线iterator`最小period一直met.
The默认行为是将呼叫转移到
next
,但当然也如果needed.
Extra方法被重写为Indicators
为了加快操作,指示器支持批量操作模式,其具有被称为的RunOnce。它并不是必需的(一个next
方法就足够了)但它大大降低time.
The的RunOnce方法规则索引为0丧失了get / set点,并依靠直接访问底层阵列保持的数据,并传递的每个state.
The定义的方法正确指数跟随下一个家庭的命名:
once(self, start, end)
当最小周期已经达到调用。内部数组必须是开始和结束之间进行处理,其是从的开始基于零内部array
preonce(self, start, end)
Called的最短期限之前已经met.
oncestart(self, start, end)
Called正是ONCE时的最短期限已经met.
The默认行为是将呼叫转移到
once
,但当然也如果needed.
Minimum Period
一张图片胜过在这种情况下一千字和可能的示例太。一个SimpleMovingAverage能够解释它:
class SimpleMovingAverage(Indicator): lines = ("sma",) params = dict(period=20) def __init__(self): ... # Not relevant for the explanation def prenext(self): print("prenext:: current period:", len(self)) def nextstart(self): print("nextstart:: current period:", len(self)) # emulate default behavior ... call next self.next() def next(self): print("next:: current period:", len(self))
而且实例可以是这样的:
sma = btind.SimpleMovingAverage(self.data, period=25)
简要说明:
- 假定传递到移动平均的数据是标准数据养活其缺省时间段是
1
是:数据馈送产生没有酒吧初始delay. - Then的“期间= 25”实例均线将有它的方法称为如下:
prenext
24 timesnextstart
1时间(依次调用next
)next
N个附加次,直到data feed已exhausted
我们去的杀手指标:a SimpleMovingAverage在另一SimpleMovingAverage。实例化可能看起来像:
sma1 = btind.SimpleMovingAverage(self.data, period=25) sma2 = btind.SimpleMovingAverage(sma1, period=20)
现在什么那张:
- 上面相同的
sma1
sma2
正在接收数据feed其中有一个minimum period<>61<>sma1
<>62<>- <>63<>
sma2
<>64<>prenext
第一25 + 18次,总共43 times- <>66<>
sma1
产生其1st明智value - 18倍积累额外
sma1
values - For共有19个值(1后25个电话,然后18个)
nextstart
然后1时间(依次调用next
)next
n个额外次数,直到data feed已经exhausted
The平台正在呼叫next
当系统已经处理44 bars.
Theminimum period已自动调整到传入data.
Strategies和指示灯坚持这种行为:
- 只有当自动计算最小周期已经达到会
next
<>83<>nextstart
<>84<>
<>85<>
该规则同样适用于preonce
, oncestart
和once
对于该runonce批量操作mode
Note
该最低period行为可以被操纵,虽然它不是推荐的。是否应该祝愿使用的setminperiod(minperiod)
方法在任一或策略和Indicators
Up Running
起床和运行涉及至少3Lines对象:
- A数据feed
- 的策略(实际上是从策略派生的类)
- 一个脑(brain在西班牙语)
数据Feeds
这些目的,很明显,提供一种将通过施加回测数据计算(直接和/或与指标)
该平台提供了几个数据提要:
- 几个CSV格式通用CSV reader
- 雅虎在线fetcher
- 用于接收Pandas DataFrames和blazeobjects
- 使用实时数据订阅Interacive Brokers, Visual Chart和Oanda
该平台不会做出有关数据馈送的内容,比如假设时限和压缩。这些值,具有名称一起,能够供给对于信息的目的,提前操作,如数据馈送重采样(转动一个例如5分钟数据馈送到一个每日数据馈送)
建立雅虎财经数据源的例子:
import backtrader as bt import backtrader.feeds as btfeeds ... datapath = "path/to/your/yahoo/data.csv" data = btfeeds.YahooFinanceCSVData( dataname=datapath, reversed=True)
可选的reversed
雅虎参数显示,这是因为CSV文件从雅虎直接下载了最新的日期开始,而不是与oldest.
如果您的数据涵盖了大量时间范围,实际加载的数据可以做如下限制:
data = btfeeds.YahooFinanceCSVData( dataname=datapath, reversed=True fromdate=datetime.datetime(2014, 1, 1), todate=datetime.datetime(2014, 12, 31))
无论是fromdate和todate将包括如果存在于数据feed.
如已经提到的时间范围,压缩和名称可以被添加:
data = btfeeds.YahooFinanceCSVData( dataname=datapath, reversed=True fromdate=datetime.datetime(2014, 1, 1), todate=datetime.datetime(2014, 12, 31) timeframe=bt.TimeFrame.Days, compression=1, name="Yahoo" )
如果数据被绘制,这些值将是used.
A策略(派生)class
Note
之前和一个更简单的方法去,请检查Signals的文档的部分,如果继承的策略是不wished.
<>129<>
<>130<>
__init__
next
<>131<>
下一个方法是后来被称为以适用于每个的每列中的逻辑和不同的时间范围(因此不同巴计数)的data.
Note
If数据馈送都通过了next
方法将被调用的主数据(所述1st一个传递到脑,见下文),其必须是数据与较小的timeframe
Note
如果使用了数据重放功能时,next
方法将是叫来几个时间一样吧的吧的发展replayed.
A基本策略派生类:
class MyStrategy(bt.Strategy): def __init__(self): self.sma = btind.SimpleMovingAverage(self.data, period=20) def next(self): if self.sma > self.data.close: self.buy() elif self.sma < self.data.close: self.sell()
<>142<>
class MyStrategy(bt.Strategy): def __init__(self): self.sma = btind.SimpleMovingAverage(self.data, period=20) def next(self): if self.sma > self.data.close: submitted_order = self.buy() elif self.sma < self.data.close: submitted_order = self.sell() def start(self): print("Backtesting is about to start") def stop(self): print("Backtesting is finished") def notify_order(self, order): print("An order new/changed/executed/canceled has been received")
<>143<>start
和stop
方法应该是不言自明。正如预期的及按照打印功能的文本中,notify_order
法会当策略需要通知调用。使用情况:
- 买入或卖出的要求(如在明年看到的)
买/卖会返回一个order并提交给代理。保持一个参考这个提交的订单达到了caller.
例如,它可以被用来确保没有新的订单如果提交为了仍然pending.
- 如果订单被接受/伏法/取消/改变了经纪人会通知状态改变(并且例如执行大小)经由回策略该通知method
快速入门导具有订单管理的一个完整和功能实例在notify_order
method.
更可与其他策略类来完成:
buy
<>155<>sell
<>156<>close
使用底层broker和sizer发送代理的买入/卖出order
同样可以通过手动创建一个订单并将其传递到完成经纪人。但该平台的目的是使很方便地使用这些it.
close
将获得当前的市场地位,并关闭它immediately.getposition
(或属性“位置”)返回当前市场position
setsizer
/getsizer
(或属性“定径机”)这允许设置/获取潜在的股权仪。相同的逻辑可对抗尺寸仪这对于同样提供不同的利害关系检查情况(固定大小,比例,以资本指数)
有大量的文献,但范·撒普K.对优秀的书籍subject.
A策略是Lines对象和这些支持参数,它们被收集使用标准的Python kwargs论点:
class MyStrategy(bt.Strategy): params = (("period", 20),) def __init__(self): self.sma = btind.SimpleMovingAverage(self.data, period=self.params.period) ... ...
注意,此时的SimpleMovingAverage
不再与固定实例化20的值,而是与已经用于定义的参数“期间”该strategy.
A Cerebro
一旦数据源可用和战略已经确定,一个脑实例是什么让一切融合在一起,并执行动作。实例化一个很简单:
cerebro = bt.Cerebro()
默认正在服用的,如果没有什么特别的是wished.
- A默认代理护理created
- No认监委operations
- Data饲料将preloaded
- 默认执行模式将被RUNONCE(分批操作),它是faster
All指标必须支持
runonce
全速模式。那些包括在平台do.Custom指标并不需要实现的RunOnce功能。
Cerebro
将模拟它,这意味着那些非的RunOnce兼容指标运行速度会变慢。不过还是大部制会在批量运行mode.
Since数据文件是已经上市和战略太(前面创建)把它放在一起,并得到它的启动和运行标准方法是:
cerebro.adddata(data) cerebro.addstrategy(MyStrategy, period=25) cerebro.run()
注意下列事项:
- 数据馈送“实例”是added
- The MyStrategy“下课”用参数(kwargs)一起加入,这将是传递给MyStrategy的it.
The实例将通过脑在后台进行而在“addstrategy”任何kwargs将被传递到it
用户可以添加任意多的策略和数据Feed的希望。如何策略相互沟通,达到协调(如果希望是)不执行/由platform.
Of限制过程中脑提供更多的可能性:
- 决定有关预加载和运行方式:
cerebro = bt.Cerebro(runonce=True, preload=True)
这里有一个限制:
runonce
需要预压(如果没有,批操作不能被执行)当然预加载数据馈送不强制runonce
setbroker
/getbroker
(以及broker属性)的定制经纪人可以如果希望设置。实际的代理实例,也可以accesed
- Plotting。在常规情况下一样容易:
cerebro.run() cerebro.plot()
情节需要的customization
numfigs=1
If一些参数的情节过于密集它可以分解成若干plots
plotter=None
A客户绘图仪例如可以通过与脑不会实例化一个默认one
**kwargs
– 标准关键字argumentsWhich将得到传递给plotter.
Please看到的绘图部分获取更多information.
- 上述strategies.
As的优化,脑得到一个策略派生类(不是实例)并且将在实例被传递给它的关键字参数,在“运行”是called.
This是如此,以使优化,这将发生。同样的策略类将是根据需要用新的参数实例化多次。如果一个实例过被传递到脑…这不会possible.
Optimization要求如下:
cerebro.optstrategy(MyStrategy, period=xrange(10, 20))
方法
optstrategy
有相同的签名addstrategy
但做额外的管理,以确保优化运行正常。一项战略可以期待range作为一个战略一个正常的参数和addstrategy
将使没有关于通过parameter.On假设另一方面,
optstrategy
会明白,可迭代是一组值的,其具有在序列要传递到的每个实例战略class.Notice这不是单个值的range<>216<>
如果更复杂的战略与额外的参数制定他们都可以传递给optstrategy。必须没有经过优化的参数可以直接传递,而不需要创建一个虚拟终端用户迭代只是一个值。例如:
cerebro.optstrategy(MyStrategy, period=xrange(10, 20), factor=3.5)
的
optstrategy
法看到因子,并创建(一个需要)虚设迭代在背景为因子,其具有单一的元件(在实施例3.5)Note
交互式Python外壳和某些类型的冷冻可执行文件下Windows有Python的
multiprocessing
modulePlease阅读Python文档有关
multiprocessing
.