參考鏈接:https://www.backtrader.com/blog/posts/2015-09-25-tickdata-resample/resample-tickdata/
backtrader could already do resampling up from minute data. Accepting tick data was not a problem, by simply setting the 4 usual fields (open, high, low, close) to the tick value.
backtrader已經可以從微小數據進行重新采樣。接受點數據不是問題,只要簡單地將4個常用字段(open, high, low, close)設置為點值。
But passing the tick data to be resampled produced the same data again. As or release 1.1.11.88 this is no longer so. Now
但是傳遞要重新采樣的tick數據會再次產生相同的數據。現在已經不是1.1.11.88版本了。
-
TimeFrame (backtrader.TimeFrame) has been extended to contain constants and names for “Ticks”, “MicroSeconds” and “Seconds”
- 時間幀(backtrader.TimeFrame)被擴展為包含“Ticks”、“MicroSeconds”和“Seconds”的常量和名稱。
-
Resampling can manage the 3 aforementioned timeframes and sample them up.
- 重新采樣可以管理上述3個時間框架和樣本。
Note
Because tick data is the lowest possible timeframe it can actually be “compressed” (n bars to 1 bar) but not be sampled up from a smallest timeframe.
因為tick數據是最低可能的時間框架,它實際上可以被“壓縮”(n條到1條),但不能從最小的時間框架進行采樣。
The new release contains a small tickdata.csv sample added to the sources data a new sample script resample-tickdata.py to play with it.
新版本包含一個添加到源數據的小示例tickdata.csv,一個新的示例腳本resams -tickdata.py來處理它。
Note
Updated the script to use the new Cerebro.resampledata method which avoids the need to manually instantiate a backtrader.DataResampler
更新了腳本以使用新的Cerebro.resampledata方法,避免了手動實例化backtrader.DataResampler
The default execution doesn’t touch the data:
默認的操作不會接觸到數據
$ ./resample-tickdata.py
Producing this chart:
產生的圖形:

Compressing 3 ticks to 1:
壓縮三個ticks到1個:
$ ./resample-tickdata.py --timeframe ticks --compression 3
Producing this chart:
After the compression we no longer have single “ticks” but “bars”.
在壓縮之后,我們不再有單一的“刻度”,而是“條”。
Now compressing to seconds and 5 bars compression:
現在壓縮到秒和5條壓縮:
$ ./resample-tickdata.py --timeframe seconds --compression 5
With a new chart:

And finally to minutes. The sample data contains tick data from 4 different minutes (the last tick in the file is the only tick for the 4th minute):
最后是分鍾數據。示例數據包含4分鍾的tick數據(文件中的最后一個tick是第4分鍾的唯一tick):
$ ./resample-tickdata.py --timeframe minutes
With a 4 bars (at the top it can be seen the final price was 3069). The 4th bar is a single point given for this minute a single tick is present in the file.
4個bars(在頂部可以看到最終價格是3069)。第4個bar是為這分鍾給定的一個單點,文件中有一個單點。

The script usage:
$ ./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
And the code.
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()
經過調試,可以在策略里面調試使用。后面就可以通過這種格式進行時間的壓縮。
