有時,獲得有關使用反向交易者的提示有助於了解人們可能在尋找什麼以及使用該平台的目的。
參考資料:
這是一篇分析兩個 ETF 的帖子(西班牙語): GLD
vs SPY
(實際上是黃金 vs S&P500)
在不進行翻譯的情況下,讓我們專注於backtrader的要點:
添加相關指標。為此,選擇了
PearsonR
。並且為了創建它而不是從頭開始編碼它的壯舉,完成瞭如何從
scipy
函數中完成它的示例。編碼class PearsonR(bt.ind.PeriodN): _mindatas = 2 # hint to the platform lines = ('correlation',) params = (('period', 20),) def next(self): c, p, = scipy.stats.pearsonr(self.data0.get(size=self.p.period), self.data1.get(size=self.p.period)) self.lines.correlation[0] = c
添加滾動對數回報
該平台已經有一個對數返回的分析器,但不是滾動的。
添加了分析器
LogReturnsRolling
,它需要一個timeframe
參數(和compression
)來使用與數據不同的時間幀(如果需要)與它一起並用於可視化(在內部使用分析器)一個
LogReturns
觀察者允許數據繪圖(輕鬆)。像這樣
# Data feeds data0 = YahooData(dataname=args.data0, **kwargs) # cerebro.adddata(data0) cerebro.resampledata(data0, timeframe=bt.TimeFrame.Weeks) data1 = YahooData(dataname=args.data1, **kwargs) # cerebro.adddata(data1) cerebro.resampledata(data1, timeframe=bt.TimeFrame.Weeks) data1.plotinfo.plotmaster = data0
只需使用
plotmaster=data0
將在data0
上繪製data1
從平台一開始就支持在自己的軸上和彼此上繪製移動平均線。
分析器和觀察器也已添加到平台中,以及與博客文章中的默認值相同的示例。
運行示例:
$ ./gold-vs-sp500.py --cerebro stdstats=False --plot volume=False
筆記
stdstats= False
和volume = False
通過刪除一些常見的東西(例如CashValue
觀察者和體積子圖)來減少圖表中的混亂。
生成一個模仿文章大部分輸出的圖表。
不包含:
創建回報分佈的圖表。
它們不適合具有基於日期時間的 x 軸的圖表。
但是可能會有這些分佈。
示例使用
$ ./gold-vs-sp500.py --help usage: gold-vs-sp500.py [-h] [--data0 TICKER] [--data1 TICKER] [--offline] [--fromdate FROMDATE] [--todate TODATE] [--cerebro kwargs] [--broker kwargs] [--sizer kwargs] [--strat kwargs] [--plot [kwargs]] [--myobserver] Gold vs SP500 from https://estrategiastrading.com/oro-bolsa-estadistica-con- python/ optional arguments: -h, --help show this help message and exit --data0 TICKER Yahoo ticker to download (default: SPY) --data1 TICKER Yahoo ticker to download (default: GLD) --offline Use the offline files (default: False) --fromdate FROMDATE Date[time] in YYYY-MM-DD[THH:MM:SS] format (default: 2005-01-01) --todate TODATE Date[time] in YYYY-MM-DD[THH:MM:SS] format (default: 2016-01-01) --cerebro kwargs kwargs in key=value format (default: ) --broker kwargs kwargs in key=value format (default: ) --sizer kwargs kwargs in key=value format (default: ) --strat kwargs kwargs in key=value format (default: ) --plot [kwargs] kwargs in key=value format (default: )
示例代碼
from __future__ import (absolute_import, division, print_function, unicode_literals) # Reference # https://estrategiastrading.com/oro-bolsa-estadistica-con-python/ import argparse import datetime import scipy.stats import backtrader as bt class PearsonR(bt.ind.PeriodN): _mindatas = 2 # hint to the platform lines = ('correlation',) params = (('period', 20),) def next(self): c, p, = scipy.stats.pearsonr(self.data0.get(size=self.p.period), self.data1.get(size=self.p.period)) self.lines.correlation[0] = c class MACrossOver(bt.Strategy): params = ( ('ma', bt.ind.MovAv.SMA), ('pd1', 20), ('pd2', 20), ) def __init__(self): ma1 = self.p.ma(self.data0, period=self.p.pd1, subplot=True) self.p.ma(self.data1, period=self.p.pd2, plotmaster=ma1) PearsonR(self.data0, self.data1) def runstrat(args=None): args = parse_args(args) cerebro = bt.Cerebro() # Data feed kwargs kwargs = dict() # Parse from/to-date dtfmt, tmfmt = '%Y-%m-%d', 'T%H:%M:%S' for a, d in ((getattr(args, x), x) for x in ['fromdate', 'todate']): if a: strpfmt = dtfmt + tmfmt * ('T' in a) kwargs[d] = datetime.datetime.strptime(a, strpfmt) if not args.offline: YahooData = bt.feeds.YahooFinanceData else: YahooData = bt.feeds.YahooFinanceCSVData # Data feeds data0 = YahooData(dataname=args.data0, **kwargs) # cerebro.adddata(data0) cerebro.resampledata(data0, timeframe=bt.TimeFrame.Weeks) data1 = YahooData(dataname=args.data1, **kwargs) # cerebro.adddata(data1) cerebro.resampledata(data1, timeframe=bt.TimeFrame.Weeks) data1.plotinfo.plotmaster = data0 # Broker kwargs = eval('dict(' + args.broker + ')') cerebro.broker = bt.brokers.BackBroker(**kwargs) # Sizer kwargs = eval('dict(' + args.sizer + ')') cerebro.addsizer(bt.sizers.FixedSize, **kwargs) # Strategy if True: kwargs = eval('dict(' + args.strat + ')') cerebro.addstrategy(MACrossOver, **kwargs) cerebro.addobserver(bt.observers.LogReturns2, timeframe=bt.TimeFrame.Weeks, compression=20) # Execute cerebro.run(**(eval('dict(' + args.cerebro + ')'))) if args.plot: # Plot if requested to cerebro.plot(**(eval('dict(' + args.plot + ')'))) def parse_args(pargs=None): parser = argparse.ArgumentParser( formatter_class=argparse.ArgumentDefaultsHelpFormatter, description=( 'Gold vs SP500 from ' 'https://estrategiastrading.com/oro-bolsa-estadistica-con-python/') ) parser.add_argument('--data0', required=False, default='SPY', metavar='TICKER', help='Yahoo ticker to download') parser.add_argument('--data1', required=False, default='GLD', metavar='TICKER', help='Yahoo ticker to download') parser.add_argument('--offline', required=False, action='store_true', help='Use the offline files') # Defaults for dates parser.add_argument('--fromdate', required=False, default='2005-01-01', help='Date[time] in YYYY-MM-DD[THH:MM:SS] format') parser.add_argument('--todate', required=False, default='2016-01-01', help='Date[time] in YYYY-MM-DD[THH:MM:SS] format') parser.add_argument('--cerebro', required=False, default='', metavar='kwargs', help='kwargs in key=value format') parser.add_argument('--broker', required=False, default='', metavar='kwargs', help='kwargs in key=value format') parser.add_argument('--sizer', required=False, default='', metavar='kwargs', help='kwargs in key=value format') parser.add_argument('--strat', required=False, default='', metavar='kwargs', help='kwargs in key=value format') parser.add_argument('--plot', required=False, default='', nargs='?', const='{}', metavar='kwargs', help='kwargs in key=value format') return parser.parse_args(pargs) if __name__ == '__main__': runstrat()