当数据仅在一个时间范围内可用并且必须在不同的时间范围内进行分析时,是时候进行一些重新采样了。
“重新采样”实际上应该称为“上采样”,因为从源时间范围到更大的时间范围(例如:几天到几周)
“下采样”尚不可能。
backtrader
通过将原始数据传递给智能命名为DataResampler
的过滤器对象,内置了对重采样的支持。
该类有两个功能:
更改时间范围
压缩杆
为此, DataResampler
在构建期间使用标准feed.DataBase
参数:
timeframe
(默认:bt.TimeFrame.Days)有用的目标时间范围必须等于或大于源
compression
(默认值:1)将所选值“n”压缩为 1 bar
让我们看一个使用手工脚本从每日到每周的示例:
$ ./data-resampling.py --timeframe weekly --compression 1
输出:
我们可以将其与原始的每日数据进行比较:
$ ./data-resampling.py --timeframe daily --compression 1
输出:
魔术是通过运行以下步骤来完成的:
像往常一样加载数据
将数据送入具有所需数据的
DataResampler
大体时间
压缩
示例中的代码(底部的整个脚本)。
# Load the Data datapath = args.dataname or '../datas/sample/2006-day-001.txt' data = btfeeds.BacktraderCSVData( dataname=datapath) # Handy dictionary for the argument timeframe conversion tframes = dict( daily=bt.TimeFrame.Days, weekly=bt.TimeFrame.Weeks, monthly=bt.TimeFrame.Months) # Resample the data data_resampled = bt.DataResampler( dataname=data, timeframe=tframes[args.timeframe], compression=args.compression) # Add the resample data instead of the original cerebro.adddata(data_resampled)
最后一个示例,我们首先将时间范围从每天更改为每周,然后应用 3 比 1 的压缩:
$ ./data-resampling.py --timeframe weekly --compression 3
输出:
从最初的 256 个每日柱,我们最终得到 18 个 3 周柱。细分:
52 周
52 / 3 = 17.33 因此 18 个柱
不需要更多。当然,日内数据也可以重新采样。
重采样测试脚本的示例代码。
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/sample/2006-day-001.txt' data = btfeeds.BacktraderCSVData( dataname=datapath) # Handy dictionary for the argument timeframe conversion tframes = dict( daily=bt.TimeFrame.Days, weekly=bt.TimeFrame.Weeks, monthly=bt.TimeFrame.Months) # Resample the data data_resampled = bt.DataResampler( dataname=data, timeframe=tframes[args.timeframe], compression=args.compression) # Add the resample data instead of the original cerebro.adddata(data_resampled) # Run over everything cerebro.run() # Plot the result cerebro.plot(style='bar') def parse_args(): parser = argparse.ArgumentParser( description='Pandas test script') parser.add_argument('--dataname', default='', required=False, help='File Data to Load') parser.add_argument('--timeframe', default='weekly', required=False, choices=['daily', 'weekly', 'monhtly'], 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()