上一篇文章期貨和現貨補償,在同一空間上繪製原始數據和略微(隨機)修改的數據,但不是在同一軸上。
從該帖子中恢復第 1張圖片。
人們可以看到:
-
圖表的左側和右側有不同的刻度
-
當查看在原始數據周圍振蕩
+- 50
點的旋轉紅line(隨機數據)時,這一點最為明顯。在圖表上,視覺印象是這種隨機數據大多總是高於原始數據。由於尺度不同,這隻是視覺印象。
儘管 Release1.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()