bt虚拟货币交易所
一、数据收集和计算:
导入库:
import backtrader as btimport backtrader.indicators as btindimport backtrader.feeds as btfeeds
计算方式:
thefeed = bt.feeds.OneOfTheFeeds(...)theind = bt.indicators.SimpleMovingAverage(...)
喂入数据:
class MyStrategy(bt.Strategy): params = dict(period=20) def __init__(self): sma = btind.SimpleMovingAverage(self.datas[0], period=self.params.period) ... cerebro = bt.Cerebro() ... data = btfeeds.MyFeed(...) cerebro.adddata(data) ... cerebro.addstrategy(MyStrategy, period=30) ...
双均线构建以及生成新数据:
class MyStrategy(bt.Strategy): params = dict(period1=20, period2=25, period3=10, period4) def __init__(self): sma1 = btind.SimpleMovingAverage(self.datas[0], period=self.p.period1) # This 2nd Moving Average operates using sma1 as "data" sma2 = btind.SimpleMovingAverage(sma1, period=self.p.period2) # New data created via arithmetic operation something = sma2 - sma1 + self.data.close # This 3rd Moving Average operates using something as "data" sma3 = btind.SimpleMovingAverage(something, period=self.p.period3) # Comparison operators work too ... greater = sma3 > sma # Pointless Moving Average of True/False values but valid # This 4th Moving Average operates using greater as "data" sma3 = btind.SimpleMovingAverage(greater, period=self.p.period4) ...
将数据按照顺序传输给策略并进行计算、运行:
class MyStrategy(bt.Strategy): params = dict(period=20) def __init__(self): sma = btind.SimpleMovingAverage(self.datas[0], period=self.params.period)...cerebro = bt.Cerebro()...data = btfeeds.MyFeed(...)cerebro.adddata(data)...cerebro.addstrategy(MyStrategy, period=30)...
当然,这个不仅仅只适用于案例,如果读者学习了,可以通过构建新的策略来传递数据,并且运行。
定位访问:
self.data targets self.datas[0]#意味着当前值self.dataX targets self.datas[X]#意味着距离当前值距离X的值,#从目前学习来看,X多为负数,而正数要取的案例还是比较少的。
以Python量化_backtrader03:为策略添加卖单 的策略来看:
是通过引用close[-2],close[-1]的方式来进行访问和比较,从而生成策略的。当然秉承着杜绝未来函数的可能性,backtrader是按照顺序来传输的情况下,这种设计是很有必要的。毕竟close[0]应当是当天的价格,如果当我们要取close[1]的情况下,就意味着今天可能会取到明天的数据,从这点来讲,是会出现逻辑错误的,这一点是违背常理的。
尽管我们能够掌握历史数据,但是回测过程中我们应当严格去执行市场逻辑才是。
因为策略需要生成的新数据同时将close删除:
class MyStrategy(bt.Strategy): params = dict(period=20) def __init__(self): sma = btind.SimpleMovingAverage(period=self.params.period)...
在这里我们生成了20日均线的数据,但是在传输的过程中,正如close一样顺序传入,sma数据的生成必然也是在等待19根日线之后,在第20根日线开始生成sma值,然后进行同向对比产生交易逻辑。
当然,不仅仅只是股票价格数据可以传输,我们同样还可以去理解为生成的交易所产生的盈利,亏损,手续费等进行计算传输,也可以引用。按照Python量化backtrader06:单均线策略 通过生成单独的npl列表去捕捉这些数据。
访问全局变量的参数并进行计算:
#元组方式:class MyStrategy(bt.Strategy): params = (('period', 20),) def __init__(self): sma = btind.SimpleMovingAverage(self.data, period=self.p.period)#字段方式:class MyStrategy(bt.Strategy): params = dict(period=20) def __init__(self): sma = btind.SimpleMovingAverage(self.data, period=self.p.period)#另外需要提一点的是,self.p.period就是self.params.period的简写。
线的概念:
实际上就是我们日常所见到的行。
当然,在之前的学习笔记中,我们大多数是援引的是close,即收盘价,其实我们也可以引用其他基础数据,即open,high,low。
在本小结中,作者对访问其数据属性的变量进行了简写处理,处理规则如下:
xxx.lines can be shortened to xxx.lxxx.lines.name can be shortened to xxx.lines_nameComplex objects like Strategies and Indicators offer quick access to data’s linesself.data_name offers a direct access to self.data.lines.nameWhich also applies to the numbered data variables: self.data1_name ->self.data1.lines.namexxx.lines可以缩写为xxx.lxxx.lines.name可以缩写为xxx.lines_name诸如策略和指标之类的复杂对象提供对数据行的快速访问self.data_name提供对self.data.lines.name的直接访问这也适用于编号的数据变量:self.data1_name->self.data1.lines.name此外,可以通过以下方式直接访问行名称:self.data.close和self.movav.sma
二、系列文章:
Python量化_backtrader05:定制策略参数01