Backtesting Trading Strategies in Python with LumiBot

What BotSpot MCP adds

Use Claude, ChatGPT, Codex, Cursor, VS Code or another MCP-compatible assistant? Connect the free BotSpot MCP for:

  • Skills: build LumiBot strategies.

  • Free data: news, economics and SEC filings.

  • Backtests: run tests and read charts.

  • Cloud hosting: low-cost scheduled bots.

  • Community: share bots and discuss trades.

  • Marketplace: discover and publish strategies.

  • Broker linking: connect accounts through BotSpot.

Connect your AI assistant

Choose a backtesting source from the strategy’s asset class and required bar interval:

LumiBot backtesting data choices

Need

Start with

Typical granularity

Setup

Daily stocks and ETFs

Yahoo

Daily

No data-provider credentials

Intraday stocks and options

ThetaData

Minute, hour, and daily

Data Downloader and provider access

Stocks, options, forex, or crypto

Polygon.io

Intraday and daily

Polygon.io API key

Futures and market-data schemas

Databento

Tick through daily, by dataset

Databento API key and dataset access

Your own stock or futures data

Pandas

Whatever the supplied file contains

Local data prepared in LumiBot’s format

Interactive Brokers history

IBKR REST

Provider-supported intervals

Client Portal and Data Downloader access

Options with your own Alpaca account

Alpaca

Minute and daily

Alpaca API key (free accounts include option history from about February 2024)

Prediction contracts

Polymarket

Market price history

Polymarket market identifiers

Selected YES/NO prediction contracts

Kalshi

Completed minute, hour, or daily candles

Market ticker plus selected outcome; public history needs no trading key

Use Yahoo for the simplest free daily-stock example. Use ThetaData when a stock or option strategy needs intraday history, and use Pandas when you already own the data and can prepare it in LumiBot’s input format.

Select the provider with BACKTESTING_DATA_SOURCE or pass a data-source class in Python. An environment setting takes precedence over the class in code. See Choose your backtest data for examples, defaults, and help with an unexpected provider.

Managed Backtesting on BotSpot

Backtesting is better on BotSpot when you want to move faster than a local setup. BotSpot already has the workflow around Lumibot: hosted data setup, parallel backtest workers, generated artifacts, charts, logs, and the path from a passing backtest into paper or live trading.

  • Backtesting data included. Use supported hosted stock, futures, options, macro, filings, and other data sources without sourcing every vendor, API key, downloader, and local file yourself. Some data is included; premium datasets can be much cheaper than buying direct subscriptions.

  • Parallel experiments. Launch multiple strategy variants on BotSpot servers and compare results instead of waiting for one local run at a time.

  • Better artifacts. Inspect charts, trades, logs, files, decisions, and audit history from one place instead of stitching together local output folders.

  • Lumibot-tuned iteration. BotSpot’s AI workflows and MCP tools understand Lumibot strategy structure, so Codex, Claude Code, Cursor, and other agents can run backtests and inspect results instead of only editing Python.

  • Ready for deployment. A strategy that survives backtesting can move into paper or live trading with supported broker connections, monitoring, alerts, and kill-switch controls already available.

Try backtesting a sample Lumibot strategy on BotSpot

Agentic Backtesting

Lumibot also supports agentic backtesting. A strategy can create one or more AI agents, run them from normal lifecycle methods, analyze point-in-time data with DuckDB, and replay identical agent runs from cache on the next backtest instead of paying for another model call.

This matters if you want:

  • an AI trading agent that makes decisions inside on_trading_iteration()

  • an LLM trading bot that can also be tested historically

  • external MCP tools attached to a strategy

  • backtest/live parity for agent-driven strategies

See Build AI Trading Agents in Python with LumiBot for the full agent runtime guide and usage examples.

Files Generated from Backtesting

When you run a backtest, several important files are generated, each prefixed by the strategy name and the date. These files provide detailed insights into the performance and behavior of the strategy.

Contents:

Learn to build and backtest with Rob

Learn with Rob Grzesik, creator of LumiBot. Join the FREE AI challenge.

Rob Grzesik, creator of LumiBot. Join the FREE AI challenge.

Frequently asked questions

Which data sources can LumiBot backtest with?

LumiBot can backtest with Yahoo, ThetaData, Polygon.io, Databento, Interactive Brokers (REST), Alpaca, Polymarket, Kalshi, CCXT crypto exchanges, and your own data through the Pandas backtester. The table at the top of this page shows which one fits each need.

Each source has its own page with setup steps, for example Free Daily Stock Backtesting with Yahoo and LumiBot, ThetaData Options and Stock Backtesting with LumiBot and Pandas (CSV or other data).

Which asset classes can I backtest in LumiBot?

You can backtest stocks and ETFs, options, futures (including continuous futures), forex, crypto and prediction contracts. What you can test depends on the data source you pick. For example, Yahoo covers daily stocks and ETFs only, while Databento and Interactive Brokers cover futures.

Can I backtest for free?

Yes. Yahoo daily stock backtests need no data provider credentials. The Pandas backtester uses data you already have. A free Alpaca account also includes option history from about February 2024.

Other providers may need a paid plan for more history or faster downloads. Check each provider’s own site for current plans.

How do I pick the data source for a backtest?

Pass a data source class in Python, such as YahooDataBacktesting, or set BACKTESTING_DATA_SOURCE. Accepted names include yahoo, thetadata, polygon, databento, ibkr, alpaca, ccxt and polymarket.

When BACKTESTING_DATA_SOURCE is set, it wins over the class in your code. If you set neither, LumiBot uses ThetaData. See Choose your backtest data for more examples.

Can I use different data sources for different assets in one backtest?

Yes. Set BACKTESTING_DATA_SOURCE to a JSON map that names a source for each asset type, for example ThetaData for stocks and options and Interactive Brokers for futures. The IBKR page shows a full example.

How do I add commissions and slippage to a backtest?

Pass buy_trading_fees and sell_trading_fees (lists of TradingFee objects) to run_backtest(). A fee can be flat, a percent of the order, or a per contract amount.

For slippage, pass buy_trading_slippages and sell_trading_slippages with TradingSlippage objects. See Trading Fee and Trading Slippage.

Can I backtest crypto?

Yes. Set BACKTESTING_DATA_SOURCE=ccxt to use the CCXT crypto backtester, or use Polygon.io, ThetaData or Interactive Brokers when they carry the coins you need. You can also load your own crypto bars with the Pandas backtester.

Can an AI agent run inside a backtest?

Yes. A strategy can create AI agents, call them from normal lifecycle methods such as on_trading_iteration(), and attach MCP tools. Identical agent runs are replayed from cache on the next backtest, so you do not pay for the same model call twice. See Build AI Trading Agents in Python with LumiBot.

What files does a backtest create?

A backtest writes files named after the strategy and the date. They include an HTML tearsheet, trade files, indicator files and a CSV log. See LumiBot Backtest Tear Sheets and Performance Reports, Trades Files, Indicators Files and Logs CSV.

Do backtest results tell me how a strategy will do live?

No. A backtest replays past data with simulated fills. Live results can be different because of real fills, costs, missing data and changing markets. Use a backtest to find problems and compare ideas, not as a forecast.