Bill Ackman Portfolio AI Trading Bot

Research agent finds the best ideas, short seller agent attacks each idea, trading agent holds the best 3 to 5, then the trade order

This bot invests the way Bill Ackman describes his style at Pershing Square: own a small number of simple, high-quality companies and put real money behind each one. Pershing Square usually keeps most of its money in just 8 to 12 core holdings (Pershing Square Holdings), and its value rose 70.2% in 2020, its best year (2020 annual report).

How it works

  1. Research agent studies each company for simple, predictable businesses that make lots of cash and are priced well, and ranks its top 5 ideas.

  2. Short seller agent attacks each idea the way a short seller would: too much debt, weak management, strong rivals, accounting that looks off, or a price that is too high. It says which ideas survive.

  3. Trading agent holds the 3 to 5 ideas that survived, with bigger weights on the best ones. It sells a stock when it no longer survives the attack.

Change universe to pick from different companies.

Run it on BotSpot

Run this bot on BotSpot without installing anything. BotSpot runs LumiBot in the cloud, backtests it, and connects it to your broker.

Backtest tear sheet

GPT-6 Luna, January 5 to 16, 2026, Yahoo daily prices, $100,000 start. After the short seller’s attack the bot held four survivors, CMG, GOOGL, MSFT, and UBER, and ended at $99,083 (-0.9%) while SPY rose 1%. Two weeks is far too short to judge a concentrated long-term portfolio. Cash never went below $2,453.

Backtest tear sheet for the Bill Ackman Portfolio AI Trading Bot

Open the full tear sheet. A short backtest shows the bot works as written. It is not a promise of future returns.

The code

The whole bot is one short file. The prompts are plain English, and they are the strategy.

"""Bill Ackman Portfolio AI Trading Bot.

Invests the way Bill Ackman describes his style: own just a few simple,
high-quality companies and put real money behind them. A research agent finds
the best ideas. A short seller agent attacks each one. A trading agent holds the
3 to 5 that survive, with the most money in the best ideas.
Not affiliated with or endorsed by Bill Ackman or Pershing Square.
"""

from lumibot.strategies import Strategy


class AITradingTeamBillAckmanConcentratedStrategy(Strategy):
    parameters = {"universe": ["GOOGL", "CMG", "HLT", "QSR", "UBER", "CP", "LOW", "MDLZ", "BKNG", "MSFT"]}

    def initialize(self):
        self.sleeptime = "1D"
        self.agents.create(
            name="researcher",
            allow_trading=False,
            system_prompt=(
                "Find the simple, predictable companies in the universe that make lots of cash and trade at a "
                "good price. Rank your top 5 ideas and say why. Do not trade."
            ),
        )
        self.agents.create(
            name="short_seller",
            allow_trading=False,
            system_prompt=(
                "You are a short seller. Attack each idea: too much debt, weak management, strong rivals, or "
                "a price that is too high. Say which ideas survive. Do not trade."
            ),
        )
        self.agents.create(
            name="trader",
            allow_trading=True,
            system_prompt=(
                "Hold the 3 to 5 ideas that survived, with more money in the best ones. Sell a stock when it "
                "no longer survives the attack."
            ),
        )

    def on_trading_iteration(self):
        facts = {"universe": self.parameters["universe"]}
        research = self.agents["researcher"].run(task_prompt="Rank your best ideas.", context=facts)
        attack = self.agents["short_seller"].run(
            task_prompt="Attack each idea.", context={**facts, "research": research.summary}
        )
        self.agents["trader"].run(task_prompt="Hold the survivors.", context={**facts, "short_seller": attack.summary})


if __name__ == "__main__":
    from lumibot.credentials import IS_BACKTESTING

    if IS_BACKTESTING:
        from lumibot.backtesting import YahooDataBacktesting

        AITradingTeamBillAckmanConcentratedStrategy.backtest(YahooDataBacktesting)
    else:
        AITradingTeamBillAckmanConcentratedStrategy().run_live()

Run it yourself

pip install lumibot
python -m lumibot.example_strategies.ai_trading_team_bill_ackman_concentrated

Put these in your .env file: OPENAI_API_KEY, and your broker keys (for example ALPACA_API_KEY, ALPACA_API_SECRET, and ALPACA_IS_PAPER=true for paper trading). With IS_BACKTESTING=false the bot trades. With IS_BACKTESTING=true it backtests instead; set BACKTESTING_START and BACKTESTING_END to pick the dates, and start with a week or two, because every AI call costs a little.

Good to know

  • Inspired by Bill Ackman’s public comments on concentrated investing. Not affiliated with or endorsed by Bill Ackman or Pershing Square.

See AI Trading Bot Examples for more AI trading bots and Backtest, paper, or live: choose the runner for backtest and live runs.