Backtest, paper, or live: choose the runner¶
The strategy class can stay the same. The code that starts it must select a
historical backtest or a broker run. Calling MyStrategy.backtest(...)
always starts a backtest. Constructing a strategy with a broker and calling
run_live() or Trader.run_all() starts broker execution. A flag does not
rewrite one call into the other.
Path |
Runner call |
Account or data source |
|---|---|---|
Historical backtest |
|
Historical data source and dates; no trading broker is started. |
Paper broker |
|
Broker credentials and an explicitly selected paper account. |
Live broker |
The same broker runner call |
Broker credentials and an explicitly selected live account. |
IS_BACKTESTING is a useful convention only when the runner reads it and
branches on it. Some examples assign a local Boolean in their __main__
block, while the lumibot init template imports the environment value from
lumibot.credentials. Exporting IS_BACKTESTING=false cannot make a file
that only calls backtest() trade through a broker. Similarly,
ALPACA_IS_PAPER selects an Alpaca account for a broker runner; it does not
select between backtesting and broker execution.
When using lumibot init, the explicit commands are simplest:
lumibot backtest my-bot --days 90
lumibot run my-bot --paper
The CLI imports the strategy class, so a file’s if __name__ == "__main__"
block does not run. When you execute an example with python file.py or
python -m package.module, that block determines what happens. Read its
run-mode label before executing it. A historical example is not evidence that
its broker path has been qualified for your broker and market.
AI example entry points¶
The following list covers the AI strategy source files in
lumibot/example_strategies. These labels describe direct file
execution, not the capability of the importable strategy class.
Backtest only: ai_researcher_trader.py.
Backtest or live, chosen by the environment: agent_alpaca_news_builtin.py,
agent_discretionary.py, agent_m2_liquidity.py,
agent_m2_liquidity_anthropic.py, agent_m2_liquidity_grok.py,
agent_m2_liquidity_openai.py, agent_macro_risk.py,
agent_momentum_allocator.py, agent_news_sentiment.py,
ai_nancy_pelosi_trading_bot.py, ai_nancy_pelosi_copy_trading_bot.py,
ai_insider_trading_bot.py, ai_fear_and_greed_trading_bot.py,
ai_iron_condor.py, ai_credit_spread.py,
ai_0dte_options_trading_bot.py, ai_vwap.py,
ai_opening_range_breakout.py, ai_trading_team_warren_buffett_value.py,
ai_trading_team_bill_ackman_concentrated.py,
ai_trading_team_bull_bear_large_cap_stocks.py, and
ai_trading_team_bull_bear_leveraged_etf.py. Each ends with the same block
as a BotSpot main.py:
if __name__ == "__main__":
from lumibot.credentials import IS_BACKTESTING
if IS_BACKTESTING:
from lumibot.backtesting import YahooDataBacktesting
MyBot.backtest(YahooDataBacktesting)
else:
MyBot().run_live()
Set IS_BACKTESTING=true in your .env file to backtest, with
BACKTESTING_START and BACKTESTING_END for the dates. Otherwise
run_live() trades with the broker in your .env file (paper or live, as
that file says).
Backtest and broker, chosen by the environment (BotSpot copies):
ai_trading_team_citadel_sector_pods.py,
ai_trading_team_citadel_sector_pods_leveraged.py,
ai_trading_team_ray_dalio_idea_meritocracy.py, and
ai_trading_team_ray_dalio_idea_meritocracy_leveraged.py. These four files
are the exact code running on BotSpot. They import IS_BACKTESTING from
lumibot.credentials, so set IS_BACKTESTING=true in the environment to
run their historical branch.
The saved docs/assets/ai-trading/spy-20260913/strategy.py is a historical
proof artifact, not the current quickstart source.
For a complete backtest-to-broker walkthrough, see Start with LumiBot. For the specific opening-range example, see Opening Range Breakout AI Trading Bot.