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()