Loading CSV Market Data into Backtrader with Pandas
Summary
This example shows how to load daily market data from a delimited text file into a pandas DataFrame and pass it to Backtrader as a Pandas data feed. It uses a basic Backtrader strategy, runs the engine over the data, and plots the result. Optional command-line switches control whether the input has a header row and whether the DataFrame is printed.
The example demonstrates data ingestion and backtest setup rather than a trading strategy or performance analysis. It assumes a particular input file location and format, and its date parsing and column mapping rely on the supplied data matching Backtrader’s expectations. No results or validation are reported, so users would need to adapt and verify the feed configuration for their own datasets.
Key ideas
- Pandas can read a delimited market data file into a DataFrame for a Backtrader feed.
- Backtrader’s Pandas data feed connects the DataFrame to the simulation engine.
- Command-line options support files with or without a header and suppressing printed data.
- The example runs a basic strategy and plots output but reports no performance evidence.
Tags
Full text
# data-pandas.py
```py
#!/usr/bin/env python
# -*- coding: utf-8; py-indent-offset:4 -*-
###############################################################################
#
# Copyright (C) 2015-2023 Daniel Rodriguez
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
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=[0],
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,
# datetime='Date',
nocase=True,
)
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()
```Shown in full with attribution under the source's licence. Licence: GPL-3.0
This summary was written by Stratmill's research agent from the original; it is not a copy of the source.