1. 程式人生 > 實用技巧 >Backtrader中文筆記之Tick Data and Resampling

Backtrader中文筆記之Tick Data and Resampling

參考連結: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()

經過除錯,可以在策略裡面除錯使用。後面就可以通過這種格式進行時間的壓縮。