backtrader 已经可以从分钟数据中重新采样。接受价格变动数据不是问题,只需将 4 个常用字段(open、 high、 low、 close)设置为价格变动值。
但是传递要重新采样的逐笔报价数据再次生成相同的数据。作为或版本 1.1.11.88,情况已不再如此。现在
-
时间框架 (backtrader.TimeFrame) 已扩展为包含 “Ticks”、“MicroSeconds” 和 “Seconds” 的常量和名称
-
重新采样可以管理上述 3 个时间帧并对其进行采样。
注意
因为逐笔报价数据是最低可能的时间帧,它实际上可以被“压缩”(n 根柱线到 1 根柱线),但不能从最小的时间帧内进行采样。
新版本包含一个小tickdata.csv
示例,该示例添加到源数据中,并添加了一个新的示例脚本 resample-tickdata.py
来使用它。
注意
更新了脚本以使用新Cerebro.resampledata
方法,从而避免了手动实例化 backtrader.DataResampler
缺省运行不涉及数据:
$ ./resample-tickdata.py
产生此图表:
将 3 个分时压缩为 1 个:
$ ./resample-tickdata.py --timeframe ticks --compression 3
产生此图表:
压缩后,我们不再有单个「价格变动」 而是「柱线」。
现在压缩到秒和5条压缩:
$ ./resample-tickdata.py --timeframe seconds --compression 5
使用新图表:
最后到几分钟。范例数据报含 4 个不同分钟的逐笔报价数据(文件中 last 分时是第 4 分钟 的唯一价格变动):
$ ./resample-tickdata.py --timeframe minutes
有4个柱(在顶部可以看到最终价格是3069)。第 4 根 柱线是此分钟的单个点,档中存在单个价格变动。
文稿用法:
$ ./resample-tickdata.py --help usage: resample-tickdata.py [-h] [--dataname DATANAME] [--timeframe {ticks,microseconds,seconds,minutes,daily,weekly,monthly}] [--compression COMPRESSION] Resampling script down to tick data optional arguments: -h, --help show this help message and exit --dataname DATANAME File Data to Load --timeframe {ticks,microseconds,seconds,minutes,daily,weekly,monthly} Timeframe to resample to --compression COMPRESSION Compress n bars into 1
还有代码。
from __future__ import (absolute_import, division, print_function, unicode_literals) import argparse import backtrader as bt import backtrader.feeds as btfeeds def runstrat(): args = parse_args() # Create a cerebro entity cerebro = bt.Cerebro(stdstats=False) # Add a strategy cerebro.addstrategy(bt.Strategy) # Load the Data datapath = args.dataname or '../../datas/ticksample.csv' data = btfeeds.GenericCSVData( dataname=datapath, dtformat='%Y-%m-%dT%H:%M:%S.%f', timeframe=bt.TimeFrame.Ticks, ) # Handy dictionary for the argument timeframe conversion tframes = dict( ticks=bt.TimeFrame.Ticks, microseconds=bt.TimeFrame.MicroSeconds, seconds=bt.TimeFrame.Seconds, minutes=bt.TimeFrame.Minutes, daily=bt.TimeFrame.Days, weekly=bt.TimeFrame.Weeks, monthly=bt.TimeFrame.Months) # Resample the data data = cerebro.resampledata(data, timeframe=tframes[args.timeframe], compression=args.compression) # add a writer cerebro.addwriter(bt.WriterFile, csv=True) # Run over everything cerebro.run() # Plot the result cerebro.plot(style='bar') def parse_args(): parser = argparse.ArgumentParser( description='Resampling script down to tick data') parser.add_argument('--dataname', default='', required=False, help='File Data to Load') parser.add_argument('--timeframe', default='ticks', required=False, choices=['ticks', 'microseconds', 'seconds', 'minutes', 'daily', 'weekly', 'monthly'], help='Timeframe to resample to') parser.add_argument('--compression', default=1, required=False, type=int, help=('Compress n bars into 1')) return parser.parse_args() if __name__ == '__main__': runstrat()