上一篇future-spot 將原始數據和稍微(隨機)修改的數據繪製在同一空間上,但不在同一軸上。
從該帖子中恢復第一張圖片。
有人能看見:
圖表左右兩側有不同的刻度
當查看在原始數據周圍振盪
+- 50點的擺動紅線(隨機數據)時,這一點最為明顯。在圖表上,視覺印像是這些隨機數據大多總是高於原始數據。由於比例不同,這只是視覺印象。
雖然1.9.32.116版已經有了一些初始支持,可以完全繪製在同一軸上,但圖例標籤會被複製(只有標籤,而不是數據),這真的很令人困惑。
版本1.9.33.116治癒了這種影響,並允許在同一軸上進行完整繪圖。使用模式就像決定要繪製哪些其他數據的模式。從之前的帖子。
import backtrader as bt cerebro = bt.Cerebro() data0 = bt.feeds.MyFavouriteDataFeed(dataname='futurename') cerebro.adddata(data0) data1 = bt.feeds.MyFavouriteDataFeed(dataname='spotname') data1.compensate(data0) # let the system know ops on data1 affect data0 data1.plotinfo.plotmaster = data0 data1.plotinfo.sameaxis = True cerebro.adddata(data1) ... cerebro.run()
data1獲取一些plotinfo值以:
在與
plotmaster的data0相同的空間上繪圖獲取使用相同軸的
sameaxis這個指示的原因是平台無法提前知道每個數據的尺度是否兼容。這就是為什麼它將以獨立的比例繪製它們
上一個示例獲得了在sameaxis上繪製的附加選項。示例執行:
$ ./future-spot.py --sameaxis
結果圖表
通知:
右手邊只有一個刻度
現在隨機數據似乎明顯圍繞原始數據振盪,這是預期的視覺行為
示例使用
$ ./future-spot.py --help usage: future-spot.py [-h] [--no-comp] [--sameaxis] Compensation example optional arguments: -h, --help show this help message and exit --no-comp --sameaxis
示例代碼
from __future__ import (absolute_import, division, print_function,
unicode_literals)
import argparse
import random
import backtrader as bt
# The filter which changes the close price
def close_changer(data, *args, **kwargs):
data.close[0] += 50.0 * random.randint(-1, 1)
return False # length of stream is unchanged
# override the standard markers
class BuySellArrows(bt.observers.BuySell):
plotlines = dict(buy=dict(marker='$\u21E7$', markersize=12.0),
sell=dict(marker='$\u21E9$', markersize=12.0))
class St(bt.Strategy):
def __init__(self):
bt.obs.BuySell(self.data0, barplot=True) # done here for
BuySellArrows(self.data1, barplot=True) # different markers per data
def next(self):
if not self.position:
if random.randint(0, 1):
self.buy(data=self.data0)
self.entered = len(self)
else: # in the market
if (len(self) - self.entered) >= 10:
self.sell(data=self.data1)
def runstrat(args=None):
args = parse_args(args)
cerebro = bt.Cerebro()
dataname = '../../datas/2006-day-001.txt' # data feed
data0 = bt.feeds.BacktraderCSVData(dataname=dataname, name='data0')
cerebro.adddata(data0)
data1 = bt.feeds.BacktraderCSVData(dataname=dataname, name='data1')
data1.addfilter(close_changer)
if not args.no_comp:
data1.compensate(data0)
data1.plotinfo.plotmaster = data0
if args.sameaxis:
data1.plotinfo.sameaxis = True
cerebro.adddata(data1)
cerebro.addstrategy(St) # sample strategy
cerebro.addobserver(bt.obs.Broker) # removed below with stdstats=False
cerebro.addobserver(bt.obs.Trades) # removed below with stdstats=False
cerebro.broker.set_coc(True)
cerebro.run(stdstats=False) # execute
cerebro.plot(volume=False) # and plot
def parse_args(pargs=None):
parser = argparse.ArgumentParser(
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
description=('Compensation example'))
parser.add_argument('--no-comp', required=False, action='store_true')
parser.add_argument('--sameaxis', required=False, action='store_true')
return parser.parse_args(pargs)
if __name__ == '__main__':
runstrat()