数据源#
Backtrader 提供了一组数据源解析器(在撰写本文时都是基于 CSV 的)以便从不同来源加载数据。
- Yahoo(在线或已保存到文件)
 - VisualChart(参见 www.visualchart.com)
 - Backtrader CSV(自定义格式用于测试)
 - 通用 CSV 支持
 
从快速入门指南中可以清楚地看到,您可以将数据源添加到 Cerebro 实例中。这些数据源稍后将在策略中可用:
self.datas数组(按插入顺序)- 数组对象的别名:
self.data和self.data0指向第一个元素self.dataX指向数组中索引为 X 的元素
 
以下是插入方式的快速提醒:
import backtrader as bt
import backtrader.feeds as btfeeds
data = btfeeds.YahooFinanceCSVData(dataname='wheremydatacsvis.csv')
cerebro = bt.Cerebro()
cerebro.adddata(data)  # 可以传递一个 'name' 参数用于绘图数据源通用参数#
这个数据源可以直接从 Yahoo 下载数据并将其输入系统。
Backtrader 数据源常用参数:
| 参数名 | 默认值 | 描述 | 
|---|---|---|
dataname | None | 必须提供。其含义因数据源类型而异,例如文件路径、股票代码等。 | 
name | '' | 用于绘图时的装饰性名称。如果未指定,可能会从 dataname 派生(例如:文件路径的最后一部分)。 | 
fromdate | mindate | Python datetime 对象,表示应忽略此日期之前的任何数据。 | 
todate | maxdate | Python datetime 对象,表示应忽略此日期之后的任何数据。 | 
timeframe | TimeFrame.Days | 时间框架。可能的值包括:Ticks、Seconds、Minutes、Days、Weeks、Months 和 Years。 | 
compression | 1 | 每个实际条形图的条形数。仅在数据重采样/重放中有效。 | 
sessionstart | None | 数据会话的开始时间。可用于重采样等目的。 | 
sessionend | None | 数据会话的结束时间。可用于重采样等目的。 | 
CSV 数据源通用参数#
参数(除了通用参数外):
| 参数名 | 默认值 | 描述 | 
|---|---|---|
headers | True | 指示传递的数据是否具有初始标题行。 | 
separator | ',' | 分隔符,用于标记 CSV 每行中的各个字段。 | 
GenericCSVData#
此类公开了一个通用接口,允许解析几乎所有的 CSV 文件格式。
根据参数定义的顺序和字段存在情况解析 CSV 文件。
特定参数(或特定含义):
| 参数名 | 默认值 | 描述 | 
|---|---|---|
dataname | 必须提供 | 要解析的文件名或类似文件的对象。 | 
datetime | 0 | 包含日期(或日期时间)字段的列索引。 | 
time | -1 | 如果与日期时间字段分开,则包含时间字段的列索引(-1 表示不存在)。 | 
open | 1 | 包含开盘价字段的列索引。 | 
high | 2 | 包含最高价字段的列索引。 | 
low | 3 | 包含最低价字段的列索引。 | 
close | 4 | 包含收盘价字段的列索引。 | 
volume | 5 | 包含成交量字段的列索引。 | 
openinterest | 6 | 包含未平仓合约数字段的列索引。 | 
nullvalue | float('NaN') | 如果缺少应有的值(CSV 字段为空),将使用的值。 | 
dtformat | '%Y-%m-%d %H:%M:%S' | 用于解析日期时间 CSV 字段的格式。 | 
tmformat | '%H:%M:%S' | 如果存在,用于解析时间 CSV 字段的格式(默认情况下时间 CSV 字段不存在)。 | 
这些参数允许用户根据其 CSV 文件的结构自定义数据解析方式,以便正确加载数据进行回测。
示例使用#
满足以下要求的示例用法:
- 限制输入年份为 2000
 - HLOC 顺序而不是 OHLC
 - 将缺失值替换为零(0.0)
 - 提供日线数据,日期时间只是格式为 YYYY-MM-DD 的日期
 - 没有 
openinterest列 
代码如下:
import datetime
import backtrader as bt
import backtrader.feeds as btfeeds
...
...
data = btfeeds.GenericCSVData(
    dataname='mydata.csv',
    fromdate=datetime.datetime(2000, 1, 1),
    todate=datetime.datetime(2000, 12, 31),
    nullvalue=0.0,
    dtformat=('%Y-%m-%d'),
    datetime=0,
    high=1,
    low=2,
    open=3,
    close=4,
    volume=5,
    openinterest=-1
)
...略微修改后的要求:
- 限制输入年份为 2000
 - HLOC 顺序而不是 OHLC
 - 将缺失值替换为零(0.0)
 - 提供日内数据,带有单独的日期和时间列
 - 日期格式为 YYYY-MM-DD
 - 时间格式为 HH.MM.SS(而不是通常的 HH:MM:SS)
 - 没有 
openinterest列 
代码如下:
import datetime
import backtrader as bt
import backtrader.feeds as btfeeds
...
...
data = btfeeds.GenericCSVData(
    dataname='mydata.csv',
    fromdate=datetime.datetime(2000, 1, 1),
    todate=datetime.datetime(2000, 12, 31),
    nullvalue=0.0,
    dtformat=('%Y-%m-%d'),
    tmformat=('%H.%M.%S'),
    datetime=0,
    time=1,
    high=2,
    low=3,
    open=4,
    close=5,
    volume=6,
    openinterest=-1
)这也可以通过子类化永久保存:
import datetime
import backtrader.feeds as btfeeds
class MyHLOC(btfeeds.GenericCSVData):
  params = (
    ('fromdate', datetime.datetime(2000, 1, 1)),
    ('todate', datetime.datetime(2000, 12, 31)),
    ('nullvalue', 0.0),
    ('dtformat', ('%Y-%m-%d')),
    ('tmformat', ('%H.%M.%S')),
    ('datetime', 0),
    ('time', 1),
    ('high', 2),
    ('low', 3),
    ('open', 4),
    ('close', 5),
    ('volume', 6),
    ('openinterest', -1)
)现在可以通过提供 dataname 重用此新类:
data = btfeeds.MyHLOC(dataname='mydata.csv')