Pandas数据源示例#

注意

必须安装 pandas 及其依赖项

许多人都关心支持 Pandas <http://pandas.pydata.org> _数据帧, 他们依赖于已经提供的用于不同数据源(包括CSV)的解析代码和Pandas提供的其他功能。

数据源的重要声明。

class PandasData(feed.DataBase):
    '''
    The ``dataname`` parameter inherited from ``feed.DataBase`` is the pandas
    DataFrame
    '''

    params = (
        # Possible values for datetime (must always be present)
        #  None : datetime is the "index" in the Pandas Dataframe
        #  -1 : autodetect position or case-wise equal name
        #  >= 0 : numeric index to the colum in the pandas dataframe
        #  string : column name (as index) in the pandas dataframe
        ('datetime', None),

        # Possible values below:
        #  None : column not present
        #  -1 : autodetect position or case-wise equal name
        #  >= 0 : numeric index to the colum in the pandas dataframe
        #  string : column name (as index) in the pandas dataframe
        ('open', -1),
        ('high', -1),
        ('low', -1),
        ('close', -1),
        ('volume', -1),
        ('openinterest', -1),
    )

上述从 PandasData 类中摘取的代码显示了关键点:

  • 实例化过程中类的 dataname 参数保存了Pandas数据帧

    此参数是继承自基类 feed.DataBase

  • 新的参数具有 DataSeries 中常规字段的命名约定- datetime (默认值:None)

  • None:datetime 是Pandas Dataframe中的“索引”

  • -1:自动检测位置或大小写相同的名称

  • >= 0:Pandas Dataframe中的数值索引到列

  • 字符串:Pandas Dataframe中的列名(作为索引)

  • openhighlowhighclosevolumeopeninterest (默认值:对所有列都为-1)

    • None:列不存在

    • -1:自动检测位置或大小写相同的名称

    • >= 0:Pandas Dataframe中的数值索引到列

    • 字符串:Pandas Dataframe中的列名(作为索引)

可以加载标准的2006样本,并且已经由“Pandas”解析,而不是直接由“backtrader”解析的一个小样本

运行样本以使用CSV数据中现有的“headers”:

Open High Low Close Volume OpenInterest

Date 2006-01-02 3578.73 3605.95 3578.73 3604.33 0 0 2006-01-03 3604.08 3638.42 3601.84 3614.34 0 0 2006-01-04 3615.23 3652.46 3615.23 3652.46 0 0

相同的样本,但告诉脚本跳过标头:

1 2 3 4 5 6

0 2006-01-02 3578.73 3605.95 3578.73 3604.33 0 0 2006-01-03 3604.08 3638.42 3601.84 3614.34 0 0 2006-01-04 3615.23 3652.46 3615.23 3652.46 0 0

第2次运行使用了告诉 pandas.read_csv 的参数:- 要跳过第一行输入(将 skiprows 关键字参数设置为1)

  • 不要寻找标题行(将 header 关键字参数设置为None)

backtrader 支持Pandas尝试自动检测列名是否已被使用,否则使用数字索引,并相应地采取行动,试图提供最佳匹配。

以下图表是成功的致敬。Pandas Dataframe已正确加载(两种情况下)

测试的示例代码。

from __future__ import (absolute_import, division, print_function,
                        unicode_literals)

import argparse

import backtrader as bt
import backtrader.feeds as btfeeds

import pandas


def runstrat():
    args = parse_args()

    # Create a cerebro entity
    cerebro = bt.Cerebro(stdstats=False)

    # Add a strategy
    cerebro.addstrategy(bt.Strategy)

    # Get a pandas dataframe
    datapath = ('../../datas/2006-day-001.txt')

    # Simulate the header row isn't there if noheaders requested
    skiprows = 1 if args.noheaders else 0
    header = None if args.noheaders else 0

    dataframe = pandas.read_csv(datapath,
                                skiprows=skiprows,
                                header=header,
                                parse_dates=True,
                                index_col=0)

    if not args.noprint:
        print('--------------------------------------------------')
        print(dataframe)
        print('--------------------------------------------------')

    # Pass it to the backtrader datafeed and add it to the cerebro
    data = bt.feeds.PandasData(dataname=dataframe)

    cerebro.adddata(data)

    # 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('--noheaders', action='store_true', default=False,
                        required=False,
                        help='Do not use header rows')

    parser.add_argument('--noprint', action='store_true', default=False,
                        help='Print the dataframe')

    return parser.parse_args()


if __name__ == '__main__':
    runstrat()