Backtrader 文档学习- Plotting - Plotting Date Ranges
1.概述
1.9.31.x版本增加了绘制部分图形的功能。
- 可以使用策略实例中保留完整长度的时间戳数组的索引
- 或者使用实际的datetime.date 或datetime.datetime 实例来限制需要绘制的内容。
仍然可以使用标准的cerebro.plot 。例如:
cerebro.plot(start=datetime.date(2005, 7, 1), end=datetime.date(2006, 1, 31))
更直接人性化的方法。具有扩展能力,实际上可以尝试使用datetime 时间戳的索引,如下所示:
cerebro.plot(start=75, end=185)
下面是一个非常标准的示例,包含一个简单移动平均线(在数据绘制中),一个随机指标(独立绘制)和随机线的交叉点。 cerebro.plot 的参数作为命令行参数传递。
使用日期方法执行:
python ./partial-plot.py --plot 'start=datetime.date(2005, 7, 1),end=datetime.date(2006, 1, 31)'
Python中的eval魔法允许直接在命令行中编写datetime.date并将其映射到实际内容。
实话实说,eval好像没有作用,直接报错,没有找到原因,可能还是eval用法的问题:
usage: partial-plot.py [-h] [--data0 DATA0] [--fromdate FROMDATE][--todate TODATE] [--cerebro kwargs] [--broker kwargs][--sizer kwargs] [--strat kwargs] [--plot [kwargs]]
partial-plot.py: error: unrecognized arguments: 7, 1),end=datetime.date(2006, 1, 31)'
在程序中修改:
if args.plot: # Plot if requested to#cerebro.plot(**eval('dict(' + args.plot + ')'))cerebro.plot(start=datetime.date(2005, 7, 1), end=datetime.date(2006, 1, 31))
时间起点是05年7月1日,终点是06年1月31日图示:
按数据的时间范围:
程序修改回来。
if args.plot: # Plot if requested to#cerebro.plot(**eval('dict(' + args.plot + ')'))cerebro.plot(start=datetime.date(2005, 7, 1), end=datetime.date(2006, 1, 31))
时间访问是数据的时间范围。
python ./partial-plot.py --plot
2.Help
$ ./partial-plot.py --help
usage: partial-plot.py [-h] [--data0 DATA0] [--fromdate FROMDATE][--todate TODATE] [--cerebro kwargs] [--broker kwargs][--sizer kwargs] [--strat kwargs] [--plot [kwargs]]Sample for partial plottingoptional 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: )
3.代码
from __future__ import (absolute_import, division, print_function,unicode_literals)import argparse
import datetimeimport backtrader as btclass St(bt.Strategy):params = ()def __init__(self):bt.ind.SMA()stoc = bt.ind.Stochastic()bt.ind.CrossOver(stoc.lines.percK, stoc.lines.percD)def next(self):passdef runstrat(args=None):args = parse_args(args)cerebro = bt.Cerebro()# Data feed kwargskwargs = dict()# Parse from/to-datedtfmt, 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)# Data feeddata0 = bt.feeds.BacktraderCSVData(dataname=args.data0, **kwargs)cerebro.adddata(data0)# Brokercerebro.broker = bt.brokers.BackBroker(**eval('dict(' + args.broker + ')'))# Sizercerebro.addsizer(bt.sizers.FixedSize, **eval('dict(' + args.sizer + ')'))# Strategycerebro.addstrategy(St, **eval('dict(' + args.strat + ')'))# Executecerebro.run(**eval('dict(' + args.cerebro + ')'))if args.plot: # Plot if requested tocerebro.plot(**eval('dict(' + args.plot + ')'))def parse_args(pargs=None):parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter,description=('Sample for partial plotting'))parser.add_argument('--data0', default='../../datas/2005-2006-day-001.txt',required=False, help='Data to read in')# Defaults for datesparser.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')return parser.parse_args(pargs)if __name__ == '__main__':runstrat()