Backtrader中文筆記之Renko Bricks
The Renko Bricks is a different way to present the evolution of prices in which price plays a more important role than time. This has been introduced as a filter in release 1.9.54.122
of backtrader
Stockcharts has a good reference on the Renko Bricks. See Renko Bricks @StockCharts
Renko塊是一種不同的方式來呈現價格的演變,其中價格的作用比時間更重要。這在backtrader的1.9.54.122版本中作為過濾器引入
股票圖表對Renko塊有很好的參考價值。參見Renko Bricks@股票圖表
Some examples
Note
The size=35
and align=10.0
parameters are appropriate for the sample data in the backtrader repository. Those values have to be fine tuned for each data asset.
注意:
size=35和align=10.0引數適用於backtrader儲存庫中的示例資料。這些值必須針對每個資料資產進行微調。
First, let’s put the Renko Bricks
首先,讓我們把Renko磚單獨放在圖表中:
$ ./renko.py --renko size=35,align=10.0 --plot
輸出:
One can see that the chart immediately reveals some resistance/support areas, which is one of the main advantages of the Renko Bricks. It should also be obvious that the temporal evolution in the X-Axis is no longer constant and is stretched or compressed, depending on whether the price action was more static during the period or moved several bricks.
你可以看到圖表立即顯示了一些阻力/支撐區域,這是Renko磚塊的主要優勢之一。同樣明顯的是,x軸上的時間演化不再是恆定的,而是被拉伸或壓縮,這取決於在此期間價格走勢是更加穩定還是移動了幾塊磚。
To better see and appreciate the effects, let’s put the normal price bars and the Renko Bricks together on a chart:
為了更好地觀察和欣賞效果,讓我們把正常價格條和Renko磚放在一個圖表上:
$ ./renko.py --renko size=35,align=10.0 --plot --dual
輸出
The strechting and compression of time periods is now a lot more obvious. One other factor to consider is how the focus on the price action also has an effect on the indicators which are applied, as shown by the two RSI
indicators which have been placed on the chart.
現在對時間段的限制與壓縮更加明顯了。另一個需要考慮的因素是,對價格行為的關注如何也會對所應用的指標產生影響,如圖表上的兩個RSI指標所示。
Sample Usage
$ ./renko.py --help usage: renko.py [-h] [--data0 DATA0] [--fromdate FROMDATE] [--todate TODATE] [--cerebro kwargs] [--broker kwargs] [--sizer kwargs] [--strat kwargs] [--plot [kwargs]] [--renko kwargs] [--dual] Renko bricks sample optional arguments: -h, --help show this help message and exit --data0 DATA0 Data to read in (default: ../../datas/2005-2006-day-001.txt) --fromdate FROMDATE Date[time] in YYYY-MM-DD[THH:MM:SS] format (default: ) --todate TODATE Date[time] in YYYY-MM-DD[THH:MM:SS] format (default: ) --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: ) --renko kwargs kwargs in key=value format (default: ) --dual put the filter on a second version of the data (default: False)
Sample Code
from __future__ import (absolute_import, division, print_function, unicode_literals) import argparse import datetime import backtrader as bt class St(bt.Strategy): params = dict( ) def __init__(self): for d in self.datas: bt.ind.RSI(d) def next(self): pass 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) data0 = bt.feeds.BacktraderCSVData(dataname=args.data0, **kwargs) fkwargs = dict() fkwargs.update(**eval('dict(' + args.renko + ')')) if not args.dual: data0.addfilter(bt.filters.Renko, **fkwargs) cerebro.adddata(data0) else: cerebro.adddata(data0) data1 = data0.clone() data1.addfilter(bt.filters.Renko, **fkwargs) cerebro.adddata(data1) # Broker cerebro.broker = bt.brokers.BackBroker(**eval('dict(' + args.broker + ')')) # Sizer cerebro.addsizer(bt.sizers.FixedSize, **eval('dict(' + args.sizer + ')')) # Strategy cerebro.addstrategy(St, **eval('dict(' + args.strat + ')')) # Execute kwargs = dict(stdstats=False) kwargs.update(**eval('dict(' + args.cerebro + ')')) cerebro.run(**kwargs) if args.plot: # Plot if requested to kwargs = dict(style='candle') kwargs.update(**eval('dict(' + args.plot + ')')) cerebro.plot(**kwargs) def parse_args(pargs=None): parser = argparse.ArgumentParser( formatter_class=argparse.ArgumentDefaultsHelpFormatter, description=( 'Renko bricks sample' ) ) parser.add_argument('--data0', default='../../datas/2005-2006-day-001.txt', required=False, help='Data to read in') # Defaults for dates parser.add_argument('--fromdate', required=False, default='', help='Date[time] in YYYY-MM-DD[THH:MM:SS] format') parser.add_argument('--todate', required=False, default='', 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') parser.add_argument('--renko', required=False, default='', metavar='kwargs', help='kwargs in key=value format') parser.add_argument('--dual', required=False, action='store_true', help='put the filter on a second version of the data') return parser.parse_args(pargs) if __name__ == '__main__': runstrat()