Skip to content

数据重采样

原文: https://www.backtrader.com/blog/posts/2015-08-23-data-resampling/data-resampling/

当数据仅在一个时间段内可用,并且必须针对不同的时间段进行分析时,是时候进行一些重采样了。

“重采样”实际上应该被称为“上采样”,因为从源时间段到更大的时间段(例如:几天到几周)

“下采样”尚不可能。

backtrader内置了对重新采样的支持,通过智能命名为DataResampler的过滤对象传递原始数据。

该类有两个功能:

  • 改变时间表

  • 压杆

为此,DataResampler在施工期间使用标准feed.DataBase参数:

  • timeframe(默认值:bt.TimeFrame.Days)

    有用的目标时间范围必须等于或大于源时间范围

  • compression(默认值:1)

    将所选值“n”压缩到 1 巴

让我们看一个从每天到每周的手工脚本示例:

$ ./data-resampling.py --timeframe weekly --compression 1 

输出:

!image

我们可以将其与原始每日数据进行比较:

$ ./data-resampling.py --timeframe daily --compression 1 

输出:

!image

通过执行以下步骤,可以完成此魔术:

  • 像往常一样加载数据

  • 将数据输入到具有所需数据的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 

输出:

!image

从原来的 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() 

我们一直在努力

apachecn/AiLearning

【布客】中文翻译组