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中的列名(作为索引)
open
,high
,low
,high
,close
,volume
,openinterest
(默认值:对所有列都为-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()