Citadel Sector Pods AI Trading Team¶
This strategy is inspired by the pod-style structure associated with Ken Griffin’s Citadel and other multi-manager platforms. The idea is simple: do not ask one generalist to understand every market at once. Give each specialist a clear lane, let them pitch their strongest idea, then put a risk manager and portfolio manager above the debate.
In Lumibot, that becomes an AI trading team. Sector pods study different parts of the market, a risk manager challenges the strongest pitches, and only the portfolio manager has permission to submit orders. It is a good example when you want to test whether specialist agents can create better decisions than one single broad prompt.
See this strategy running live on BotSpot
How the team works¶
technology_podlooks at technology and communications exposure.financials_podlooks at financials and rate-sensitive exposure.healthcare_podlooks at healthcare and defensive growth.energy_podlooks at energy and commodity-sensitive exposure.consumer_podlooks at consumer and housing-sensitive exposure.risk_managerchallenges crowding, drawdown, macro, and reversal risk.portfolio_managerrotates into the strongest sector 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_citadel_sector_pods.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_citadel_sector_pods.py
Example code¶
"""Citadel / Surveyor-inspired sector-pod AI trading team example.
This example is inspired by public descriptions of sector-specialist equities
teams. It is not affiliated with or endorsed by Citadel, Surveyor Capital, or
related companies.
Set GEMINI_API_KEY plus Alpaca credentials, then run paper trading:
python ai_trading_team_citadel_sector_pods.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 AITradingTeamCitadelSectorPodsStrategy(Strategy):
parameters = {
"universe": ["XLK", "XLF", "XLV", "XLE", "XLY", "XLI", "XLP", "XLU", "XLB", "XLRE", "XLC"],
}
def initialize(self):
self.sleeptime = "1D"
model = os.environ.get("AI_TRADING_TEAM_MODEL", "gemini-3.1-flash-lite")
self.agents.create(
name="technology_pod",
model=model,
allow_trading=False,
system_prompt="Rank technology and communications sector ETFs. Use exact symbols from the universe only. Do not invent symbols or table names.",
)
self.agents.create(
name="financials_pod",
model=model,
allow_trading=False,
system_prompt="Rank financial and rate-sensitive sector ETFs. Use exact symbols from the universe only. Do not invent symbols or table names.",
)
self.agents.create(
name="healthcare_pod",
model=model,
allow_trading=False,
system_prompt="Rank healthcare and defensive growth sector ETFs. Use exact symbols from the universe only. Do not invent symbols or table names.",
)
self.agents.create(
name="energy_pod",
model=model,
allow_trading=False,
system_prompt="Rank energy and commodity-sensitive sector ETFs. Use exact symbols from the universe only. Do not invent symbols or table names.",
)
self.agents.create(
name="consumer_pod",
model=model,
allow_trading=False,
system_prompt="Rank consumer discretionary, staples, and housing-sensitive sector ETFs. Use exact symbols from the universe only. Do not invent symbols or table names.",
)
self.agents.create(
name="risk_manager",
model=model,
allow_trading=False,
system_prompt="Compare the pod picks. Challenge crowding, factor exposure, drawdown risk, and reversal risk.",
)
self.agents.create(
name="portfolio_manager",
model=model,
allow_trading=True,
system_prompt="Choose the best sector ETF from the universe. Use nearly all cash and rotate decisively.",
)
def on_trading_iteration(self):
context = {
"date": self.get_datetime().date().isoformat(),
"universe": self.parameters["universe"],
}
technology = self.agents["technology_pod"].run(task_prompt="Pick the best technology or communications ETF.", context=context)
financials = self.agents["financials_pod"].run(task_prompt="Pick the best financial or rate-sensitive ETF.", context=context)
healthcare = self.agents["healthcare_pod"].run(task_prompt="Pick the best healthcare or defensive-growth ETF.", context=context)
energy = self.agents["energy_pod"].run(task_prompt="Pick the best energy or commodity-sensitive ETF.", context=context)
consumer = self.agents["consumer_pod"].run(task_prompt="Pick the best consumer or housing-sensitive ETF.", context=context)
risk = self.agents["risk_manager"].run(
task_prompt="Compare all pod picks and identify the biggest risks.",
context={**context, "technology": technology.summary, "financials": financials.summary, "healthcare": healthcare.summary, "energy": energy.summary, "consumer": consumer.summary},
)
self.agents["portfolio_manager"].run(
task_prompt="Sell anything that is not the strongest sector ETF, then buy the strongest ETF with nearly all available cash.",
context={**context, "technology": technology.summary, "financials": financials.summary, "healthcare": healthcare.summary, "energy": energy.summary, "consumer": consumer.summary, "risk": risk.summary},
)
if __name__ == "__main__":
IS_BACKTESTING = False
if IS_BACKTESTING:
from lumibot.backtesting import YahooDataBacktesting
AITradingTeamCitadelSectorPodsStrategy.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 = AITradingTeamCitadelSectorPodsStrategy(broker=broker)
trader = Trader()
trader.add_strategy(strategy)
trader.run_all()