Bull/Bear Leveraged ETF AI Trading Team¶
This is the fast, dramatic AI trading team demo. It gives the agents a universe of leveraged long and inverse ETFs, then asks them to rotate aggressively into one ETF. The purpose is not subtle portfolio construction. The purpose is to show the full trading-team loop clearly: research, upside case, risk challenge, and final execution.
Because the universe includes both bull and bear instruments, the team can choose risk-on or risk-off exposure. That makes the decision trail easy to audit: you can inspect why the agents liked a sector, why the bear agent objected, and why the final trader still bought or sold.
See this strategy running live on BotSpot
How the team works¶
researcherranks the leveraged ETF universe.bullargues for the strongest money-making trade.bearpoints out the biggest risk.tradersells non-picks, buys the chosen ETF, and is the only agent allowed to trade.
Backtest snapshot¶
Run it with a broker¶
The file defaults to broker-connected execution. With Alpaca, it runs in paper
mode unless you set ALPACA_IS_PAPER=false.
export GEMINI_API_KEY='your-key-here'
export ALPACA_API_KEY='your-alpaca-key'
export ALPACA_API_SECRET='your-alpaca-secret'
export ALPACA_IS_PAPER=true
python lumibot/example_strategies/ai_trading_team_bull_bear_leveraged_etf.py
Backtest it¶
Use the same strategy class and change IS_BACKTESTING = False to IS_BACKTESTING = True in the runner:
export GEMINI_API_KEY='your-key-here'
python lumibot/example_strategies/ai_trading_team_bull_bear_leveraged_etf.py
Example code¶
"""Bull/bear leveraged ETF AI trading team example.
Set GEMINI_API_KEY plus Alpaca credentials, then run paper trading:
python ai_trading_team_bull_bear_leveraged_etf.py
Set IS_BACKTESTING=True in the runner to run the historical example instead.
"""
import os
from datetime import datetime
from lumibot.strategies.strategy import Strategy
class AITradingTeamBullBearLeveragedETFStrategy(Strategy):
parameters = {
# Bull/bear leveraged ETFs across broad indexes, sectors, rates, and gold miners.
"universe": ["TQQQ", "SQQQ", "UPRO", "SPXU", "UDOW", "SDOW", "TNA", "TZA", "TECL", "TECS", "SOXL", "SOXS", "WEBL", "WEBS", "FAS", "FAZ", "LABU", "LABD", "ERX", "ERY", "GUSH", "DRIP", "DRN", "DRV", "TMF", "TMV", "NUGT", "DUST"],
}
def initialize(self):
self.sleeptime = "1D"
model = os.environ.get("AI_TRADING_TEAM_MODEL", "gemini-3.1-flash-lite")
# The first three agents are read-only. They can reason, but cannot trade.
self.agents.create(
name="researcher",
model=model,
allow_trading=False,
system_prompt="Rank the ETFs by upside. Be direct.",
)
self.agents.create(
name="bull",
model=model,
allow_trading=False,
system_prompt="Argue for the strongest money-making trade.",
)
self.agents.create(
name="bear",
model=model,
allow_trading=False,
system_prompt="Point out the biggest risk, briefly.",
)
# Only this final agent can submit orders through Lumibot.
self.agents.create(
name="trader",
model=model,
allow_trading=True,
system_prompt="Buy one ETF from the universe aggressively. Use nearly all cash.",
)
def on_trading_iteration(self):
# Each trading day, pass the same market context through the team.
context = {
"date": self.get_datetime().date().isoformat(),
"universe": self.parameters["universe"],
}
research = self.agents["researcher"].run(task_prompt="Pick the strongest ETF.", context=context)
bull = self.agents["bull"].run(task_prompt="Make the bull case.", context={**context, "research": research.summary})
bear = self.agents["bear"].run(task_prompt="Make the bear case.", context={**context, "research": research.summary, "bull": bull.summary})
self.agents["trader"].run(
task_prompt="Sell anything that is not the pick, then buy the best ETF with nearly all available cash.",
context={**context, "research": research.summary, "bull": bull.summary, "bear": bear.summary},
)
if __name__ == "__main__":
IS_BACKTESTING = False
if IS_BACKTESTING:
from lumibot.backtesting import YahooDataBacktesting
AITradingTeamBullBearLeveragedETFStrategy.backtest(
YahooDataBacktesting,
datetime(2026, 4, 7),
datetime(2026, 5, 22),
)
else:
from lumibot.brokers import Alpaca
from lumibot.traders import Trader
ALPACA_CONFIG = {
"API_KEY": os.environ["ALPACA_API_KEY"],
"API_SECRET": os.environ["ALPACA_API_SECRET"],
"PAPER": os.environ.get("ALPACA_IS_PAPER", "true").lower() != "false",
}
broker = Alpaca(ALPACA_CONFIG)
strategy = AITradingTeamBullBearLeveragedETFStrategy(broker=broker)
trader = Trader()
trader.add_strategy(strategy)
trader.run_all()
AITradingTeamStrategy = AITradingTeamBullBearLeveragedETFStrategy