title: Data Feeds description: Loading data from various sources
Data Feeds¶
Data feeds provide market data to your strategies. Backtrader supports multiple data sources and formats.
Quick Start¶
import backtrader as bt
import datetime
# Add data to 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
## Data Sources
### CSV Files
#### Generic CSV
```python
data = bt.feeds.CSVGeneric(
dataname='data.csv',
datetime=0, # Column index for datetime
time=-1, # Column index for time (optional)
open=1, # Column index for open price
high=2, # Column index for high price
low=3, # Column index for low price
close=4, # Column index for close price
volume=5, # Column index for volume
openinterest=-1,# Column index for open interest (optional)
dtformat='%Y-%m-%d %H:%M:%S',
tmformat='%H:%M:%S',
timeframe=bt.TimeFrame.Days
)
```bash
#### BTC CSV (Bitcoin specific)
```python
data = bt.feeds.BTCCSV(
dataname='btc.csv',
datetime=None, # Auto-detect
timeframe=bt.TimeFrame.Minutes
)
```bash
### Pandas DataFrame
```python
import pandas as pd
# Create 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)
})
# Convert to data feed
data = bt.feeds.PandasData(
dataname=df,
datetime=None, # Use index as datetime
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, # Use adjusted close
reversed=False # Data order
)
```bash
### Live Trading Data
#### CCXT (Cryptocurrency)
```python
from backtrader.feeds import CCXTFeed
# Create store
store = CCXTStore(
exchange='binance',
currency='USDT',
config={'apiKey': 'YOUR_KEY', 'secret': 'YOUR_SECRET'}
)
# Add data feed
data = store.getdata(
dataname='BTC/USDT',
timeframe=bt.TimeFrame.Minutes,
use_websocket=True # Use WebSocket for live data
)
cerebro.adddata(data)
cerebro.setbroker(store.getbroker())
```bash
#### CTP (Futures)
```python
from backtrader.stores import CTPStore
from backtrader.feeds import CTPData
# Create store
store = CTPStore(
userid='YOUR_ID',
password='YOUR_PASSWORD',
brokerid='9999', # SimNow
appid='simnow_client',
authcode='0000000000000000'
)
# Add data feed
data = CTPData(
store=store,
dataname='au2506', # Contract
timeframe=bt.TimeFrame.Minutes
)
cerebro.adddata(data)
cerebro.setbroker(store.getbroker())
```bash
## Multiple Data Feeds
```python
cerebro = bt.Cerebro()
# Add multiple data feeds
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')
# Access in strategy
class MyStrategy(bt.Strategy):
def next(self):
aapl_price = self.datas[0].close[0]
msft_price = self.datas[1].close[0] # or self.msft.close[0]
googl_price = self.datas[2].close[0] # or self.googl.close[0]
```bash
## Data Resampling
Convert data to a different timeframe.
```python
# Original data is minute-based
data = bt.feeds.CSVGeneric(dataname='minute_data.csv', ...)
# Resample to daily
cerebro = bt.Cerebro()
cerebro.resampledata(data, timeframe=bt.TimeFrame.Days)
cerebro.adddata(data, name='daily')
```bash
## Data Filtering
### Calendar Days Filter
```python
# Only trade on specific days
data = bt.feeds.CSVGeneric(dataname='data.csv', ...)
data.addfilter(bt.filters.CalendarDays())
```bash
### Session Filter
```python
# Only trade during regular hours
data = bt.feeds.CSVGeneric(dataname='data.csv', ...)
data.addfilter(bt.filters.SessionFilter(
starttime=datetime.time(9, 30),
endtime=datetime.time(16, 0)
))
```bash
## Data Requirements
### Minimum Data Format
Each data feed requires at minimum:
| Field | Required | Description |
|-------|----------|-------------|
| datetime | Yes | Bar timestamp |
| open | Yes | Opening price |
| high | Yes | Highest price |
| low | Yes | Lowest price |
| close | Yes | Closing price |
| volume | No | Trading volume |
| openinterest | No | Open interest (futures) |
### CSV Format Example
```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
## Next Steps
- [Indicators](indicators.md) - Use indicators with your data
- [Strategies](strategies.md) - Build trading strategies
- [Live Trading](../live-trading/ccxt-guide.md) - Real-time trading