title: 数据源 description: 从各种来源加载数据


数据源

数据源为您的策略提供市场数据。Backtrader 支持多种数据源和格式。

快速开始

import backtrader as bt
import datetime

# 向 cerebro 添加数据

data = bt.feeds.CSVGeneric(
    dataname='AAPL.csv',
    datetime=0,
    open=1,
    high=2,
    low=3,
    close=4,
    volume=5,
    dtformat='%Y-%m-%d'
)

cerebro = bt.Cerebro()
cerebro.adddata(data)

```bash

## 数据源

### CSV 文件

#### 通用 CSV

```python
data = bt.feeds.CSVGeneric(
    dataname='data.csv',
    datetime=0,     # 日期时间列索引
    time=-1,        # 时间列索引 (可选)
    open=1,         # 开盘价列索引
    high=2,         # 最高价列索引
    low=3,          # 最低价列索引
    close=4,        # 收盘价列索引
    volume=5,       # 成交量列索引
    openinterest=-1,# 持仓量列索引 (可选)
    dtformat='%Y-%m-%d %H:%M:%S',
    tmformat='%H:%M:%S',
    timeframe=bt.TimeFrame.Days
)

```bash

#### BTC CSV (比特币专用)

```python
data = bt.feeds.BTCCSV(
    dataname='btc.csv',
    datetime=None,  # 自动检测
    timeframe=bt.TimeFrame.Minutes
)

```bash

### Pandas DataFrame

```python
import pandas as pd

# 创建 DataFrame

df = pd.DataFrame({
    'datetime': pd.date_range('2023-01-01', periods=100),
    'open': np.random.randn(100).cumsum() + 100,
    'high': np.random.randn(100).cumsum() + 102,
    'low': np.random.randn(100).cumsum() + 98,
    'close': np.random.randn(100).cumsum() + 100,
    'volume': np.random.randint(1000, 10000, 100)
})

# 转换为数据源

data = bt.feeds.PandasData(
    dataname=df,
    datetime=None,  # 使用索引作为日期时间
    open='open',
    high='high',
    low='low',
    close='close',
    volume='volume',
    openinterest=None
)

```bash

### Yahoo Finance

```python
data = bt.feeds.YahooFinanceData(
    dataname='AAPL',
    fromdate=datetime.datetime(2023, 1, 1),
    todate=datetime.datetime(2023, 12, 31),
    timeframe=bt.TimeFrame.Days,
    adjclose=False,  # 使用复权收盘价
    reversed=False   # 数据顺序

)

```bash

### 实盘交易数据

#### CCXT (加密货币)

```python
from backtrader.feeds import CCXTFeed

# 创建存储

store = CCXTStore(
    exchange='binance',
    currency='USDT',
    config={'apiKey': 'YOUR_KEY', 'secret': 'YOUR_SECRET'}
)

# 添加数据源

data = store.getdata(
    dataname='BTC/USDT',
    timeframe=bt.TimeFrame.Minutes,
    use_websocket=True  # 使用 WebSocket 获取实时数据

)

cerebro.adddata(data)
cerebro.setbroker(store.getbroker())

```bash

#### CTP (期货)

```python
from backtrader.stores import CTPStore
from backtrader.feeds import CTPData

# 创建存储

store = CTPStore(
    userid='YOUR_ID',
    password='YOUR_PASSWORD',
    brokerid='9999',  # SimNow
    appid='simnow_client',
    authcode='0000000000000000'
)

# 添加数据源

data = CTPData(
    store=store,
    dataname='au2506',  # 合约
    timeframe=bt.TimeFrame.Minutes
)

cerebro.adddata(data)
cerebro.setbroker(store.getbroker())

```bash

## 多数据源

```python
cerebro = bt.Cerebro()

# 添加多个数据源

data1 = bt.feeds.YahooFinanceData(dataname='AAPL', ...)
data2 = bt.feeds.YahooFinanceData(dataname='MSFT', ...)
data3 = bt.feeds.YahooFinanceData(dataname='GOOGL', ...)

cerebro.adddata(data1, name='AAPL')
cerebro.adddata(data2, name='MSFT')
cerebro.adddata(data3, name='GOOGL')

# 在策略中访问

class MyStrategy(bt.Strategy):
    def next(self):
        aapl_price = self.datas[0].close[0]
        msft_price = self.datas[1].close[0]  # 或 self.msft.close[0]
        googl_price = self.datas[2].close[0]  # 或 self.googl.close[0]

```bash

## 数据重采样

将数据转换为不同的时间周期

```python

# 原始数据是分钟级

data = bt.feeds.CSVGeneric(dataname='minute_data.csv', ...)

# 重采样为日线

cerebro = bt.Cerebro()
cerebro.resampledata(data, timeframe=bt.TimeFrame.Days)
cerebro.adddata(data, name='daily')

```bash

## 数据过滤

### 交易日过滤

```python

# 只在特定日期交易

data = bt.feeds.CSVGeneric(dataname='data.csv', ...)
data.addfilter(bt.filters.CalendarDays())

```bash

### 交易时段过滤

```python

# 只在正常交易时段交易

data = bt.feeds.CSVGeneric(dataname='data.csv', ...)
data.addfilter(bt.filters.SessionFilter(
    starttime=datetime.time(9, 30),
    endtime=datetime.time(16, 0)
))

```bash

## 数据要求

### 最小数据格式

每个数据源至少需要

| 字段 | 必需 | 描述 |

|------|------|------|

| datetime |  | K 线时间戳 |

| open |  | 开盘价 |

| high |  | 最高价 |

| low |  | 最低价 |

| close |  | 收盘价 |

| volume |  | 成交量 |

| openinterest |  | 持仓量 (期货) |

### CSV 格式示例

```csv
datetime,open,high,low,close,volume
2023-01-01,100.0,102.5,99.5,101.0,1000000
2023-01-02,101.0,103.0,100.5,102.5,1200000
2023-01-03,102.5,104.0,102.0,103.0,900000

```bash

## 下一步学习

- [指标](indicators.md) - 在数据上使用指标
- [策略](strategies.md) - 构建交易策略
- [实盘交易](../CCXT_LIVE_TRADING_GUIDE.md) - 实时交易