The Condor Papers

How We Taught a Foundation Model to See ES Futures
February 19-20, 2026 — A night session with Claude Opus 4
The Coin Flip That Wasn't — cyberpunk trading desk at 2AM
Chapter 1 The Coin Flip That Wasn't
Timeline

February 19, 2026 — 6:00 PM

Danielle's been flying iron condors on ES 0DTE for weeks. 38 legs, $32K account, $12K/day theta carry. The positions are good. But the predictions are not.

Google's TimesFM 2.0 — a 500-million parameter time series foundation model — is running on the RTX 5090. Zero-shot, it claims to predict ES direction.

Personal

"Count, Don't Theorize"

Niederhoffer (voice profile) A model that's 96% accurate on direction? I've seen claims like this before. Count: how many of the 4% misses coincide with the 10 biggest move days of the year?

We'd just built Niederhoffer's voice profile from comprehensive web research — 20 lessons from a man who made 35% annually for 20 years selling puts, then lost everything. Twice.

Concept

The Honest Backtest

45.5% Zero-shot accuracy
50.0% Coin flip
-4.5% Worse than random

We ran an honest backtest. Zero-shot TimesFM on 5-minute ES bars: 45.5% directional accuracy. Worse than a coin flip. The foundation model had never seen futures data shaped like this.

What We Built

The Sidecar

$ uv run python timesfm-sidecar.py --port 8701
TimesFM ES Sidecar -- port 8701, interval 5m
Model: google/timesfm-2.0-500m-pytorch
Loading on cuda... 1903MB VRAM
Model loaded in 1780ms
GPU: RTX 5090 (32GB)

The sidecar: a Python HTTP server wrapping TimesFM on CUDA. Endpoints for /predict, /health, /history. Auto-refreshes every 300s. First inference: 804ms cold, 37ms warm.

* * *
Neural network architecture blueprint — 25 years through transformers
Chapter 2 Teaching the Model to See Futures
Architecture

Multi-Resolution Fine-Tuning

  DATA PIPELINE
  ═════════════

  yfinance ES=F
       │
       ├── Daily bars ──── 6,419 bars (25 years)
       │   freq_token=1    1997-2026
       │
       ├── Hourly bars ─── 1,092 bars (60 days)
       │   freq_token=0    intraday rhythm
       │
       └── 5-min bars ──── 12,996 bars (60 days)
           freq_token=0    microstructure

       │
       ▼
  ┌─────────────────────────────┐
  │   ESBarDataset              │
  │   normalize: ÷ first value  │
  │   context: 512 bars         │
  │   horizon: 128 bars         │
  │   label: direction ±        │
  └─────────────────────────────┘
       │
       ▼
  ┌─────────────────────────────┐
  │   TimesFM 2.0 (500M)       │
  │   google/timesfm-2.0-500m  │
  │   ─────────────────────     │
  │   AdamW lr=1e-5             │
  │   CosineAnnealing 20 ep    │
  │   Gradient clip 1.0         │
  │   Mixed precision fp32      │
  └─────────────────────────────┘
       │
       ▼
  best.pt (5.9 GB)
  epoch 16, val_loss=0.000030
      

Three resolutions of ES history, concatenated into one training set. The model learns the long-term structure from 25 years of daily bars, the intraday rhythm from hourly, and the microstructure from 5-minute bars.

Timeline

The Training Run

Ep 1 86.2% dir acc
Ep 4 91.6% dir acc
Ep 12 96.7% dir acc

16 of 20 epochs completed before an accidental process kill. But the best checkpoint was already saved. 96.4% directional accuracy on held-out validation.

Key assumption: normalization by dividing by the first context value. This teaches the model relative price movements, not absolute levels — critical for a futures contract that changes notional value every quarter.

Personal

2 AM, RTX 5090 Glowing

The model loaded fine-tuned weights at 2 AM. First prediction from the fine-tuned model:

ES 6873 → BEAR -0.057% conf 0.7
98/100 Monte Carlo paths end below current
Danielle we should have a bunelectron and really sexy montecarlo graphic that shows at maximum fps, the ES futures signal and the current and past prediction paths...
* * *
Monte Carlo prediction fan — aurora borealis of forecast paths
Chapter 3 The Monte Carlo Cockpit
Concept

Batched Perturbed Inference

  GPU MONTE CARLO (RTX 5090)
  ══════════════════════════

  Context: 512 bars of ES 5m closes
       │
       │  + Gaussian noise (σ=0.0003)
       │    ×100 independent perturbations
       ▼
  ┌──────────────────────┐
  │ Batch: [100, 512]    │  ← 100 perturbed contexts
  │ TimesFM forward pass │
  │ 192ms total          │  ← 1.9ms per path
  │ 32GB VRAM headroom   │
  └──────────────────────┘
       │
       ▼
  100 genuine forecast paths
  (not quantile interpolation --
   actual model uncertainty)

  Bull paths:  2/100 (2%)  → cyan
  Bear paths: 98/100 (98%) → magenta
      

Not fake Monte Carlo from quantile interpolation. Each path is a genuine forward pass through the 500M parameter model with slightly perturbed input context. The 5090 batches 100 at once in 192ms.

What We Built

The Live Visualization

  ┌────────────────────────────────────────┐
  │ CONDOR COCKPIT    ES 6898 ▲ +21 BEAR  │
  ├────────────────────────────────────────┤
  │                                        │
  │  6920 ┤                                │
  │       │    ╱╲      ← Live ES (white)   │
  │  6900 ┤──╱──╲──NOW──────────────       │
  │       │       ╲  ╲╲╲╲ ← MC paths      │
  │  6880 ┤        ╲╲╲╲╲╲ (pink=bear)     │
  │       │          ╲╲╲╲╲                 │
  │  6860 ┤            ╲╲╲ ← gold forecast │
  │       ├────┼────┼────┼────┼────        │
  │      -2h  -1h  now  +2h  +4h          │
  │  ┌─VOL──┐                              │
  │  │▃▅▇▂▃│  ← volume anomaly bars       │
  │  └──────┘                              │
  ├────────────────────────────────────────┤
  │ GPU MC (192ms)  Fade:[====] Alpha:[==] │
  └────────────────────────────────────────┘
      

Canvas2D at 60fps. Every 2 seconds: 200 new GPU paths. Old paths ghostfade (rate controllable via slider). Vintage traces accumulate — blue when fresh, reddening with age — like the classic EIA energy forecast chart.

Timeline

The Stack at 3 AM

SERVICE          PORT   STATUS
────────────────────────────────
market-pylon     8710   Connected (60 pos)
TimesFM sidecar  8701   Fine-tuned, GPU MC
Condor Cockpit   8702   60fps Canvas2D
PLL auto-close   --     4 resting orders
pylon.db         --     Schema v3, 3300+ calls

Five services running in concert. Market data flows from IB through market-pylon, predictions flow from the 5090 through the sidecar, and the PLL places and reprices close orders every 5 seconds at the natural BID.

Personal

Vintage Forecasts

The idea came from energy forecasts — those charts where every year's prediction is a line, and you can see them all fan out from different starting points against reality.

Danielle you know how there's that chart of previous years energy predictions? maybe we can chart those as lines, nearer are blue, older are redder...

Each new forecast becomes a vintage. Blue when born, reddening over 4 hours. The actual ES price carves through the fan of predictions. Truth vs prophecy, rendered at 60fps.

* * *
Terminal execution — MOD CLOSE orders scrolling, green on black
Chapter 4 The Breathing Machine
Concept

Phase Lock Loop

  PLL CONTROL LOOP
  ════════════════

  theta_portfolio ─┐
                   ├→ error ─→ Kelly DAC
  theta_target ────┘     │
                         ▼
                   best action:
                   OPEN / CLOSE / HOLD
                         │
                   ┌─────┴──────┐
                   │ Breathing  │
                   │ beta=0.68  │
                   │ EXHALE     │
                   └─────┬──────┘
                         │
                   limit order
                   @ natural BID
                   modify q5s
      

The PLL treats portfolio theta as a process variable and the target theta band as the reference signal. Kelly criterion scores every possible spread. Breathing modulates aggression.

What We Built

Auto-Close: The Fix

// THE BUG: line 1230
if order_book.already_submitted(&key) {
    continue; // ← skipped MOD path!
}

// THE FIX:
let is_reprice = order_book
    .already_submitted(&key);
if !is_reprice {
    // only enforce limits for NEW orders
    if let Some(reason) = order_book
        .can_submit(...) { break; }
}

The repricing bug: already_submitted was gating the MOD path. Resting orders sat at stale prices forever. One-line fix: let existing orders through to the modify branch.

Timeline

Safety Rails

5/hr Circuit breaker
$6K Theta floor
60m Anti-woodchipper

Close-only: no new positions. Theta floor $6K: stops at half. Circuit breaker: max 5 fills/hr. BID pricing: most patient. Tabu: 60-min cooldown per strike after close. ntfy.sh: push alerts on fills.

* * *
The Council — chess board options spreads, three advisor portraits
Chapter 5 Adversarial Everything
Concept

Volume Anomaly Detection

  VOLUME vs TIME-OF-DAY
  ═════════════════════

  Expected: ▁▁▂▃▅█▇▅▃▂▂▁▁
  Actual:   ▁▁▂▃▅█▇▅███▁▁
                      ^^^
                      z=3.2σ → ORANGE ALERT

  Normal volume at 2AM ET:  ~500 contracts/bar
  Current volume at 2AM ET: ~4200 contracts/bar
  Something is happening.
      

Build a time-of-day volume profile from 5 days of history. Compare each bar's volume to its slot's mean. z > 1.8 = yellow. z > 2.5 = orange. z > 3.5 = red. Pulsing alert in the cockpit header.

What We Built

Lean 4 Formal Verification

-- 15 theorems, 0 sorry
theorem bullPut_bounded :
  ∀ s f l, l ≤ s → s ≤ f →
  putIntrinsic s f - putIntrinsic s l ≥ 0

theorem pll_hold_in_band :
  ∀ theta floor ceil,
  floor ≤ theta → theta ≤ ceil →
  pllControl theta floor ceil = .Hold

theorem stale_blocks_all :
  ∀ age limit, age > limit →
  checkFreshness age limit = false

We proved the core properties in Lean 4. Spread boundedness, PLL convergence, freshness guards. 15 theorems, zero sorry. The math is verified by a proof assistant, not just tested.

Timeline

Bugs Found by Opus

3 Critical
7 High
10 Medium

C3: EDT/EST timezone — canary disabled final hour 6mo/yr. C2: perm_id i32 truncation — duplicate orders. C1: unwind_dsl 50x multiplier — margin calc 50x wrong. All fixed same session.

Personal

The Council Session

Three advisors examined the 0DTE game board independently:

Von Neumann: "This is a minimax position with a saddle point near 6870."

Feynman: "The payoff surface has attractors at the short strikes and a phase transition at the wings."

Niederhoffer: "I did this exact trade. I made 35% annually. Then I lost everything. Twice."

The rendered payoff revealed it was a directional bear bet, not a theta play. Peak profit +$8,813 at ES=6860.

* * *
The Machine Is Breathing — system architecture, city at night
Chapter 6 The Full System
System Architecture

Condor Flight Software — Complete Stack

  ┌─────────────────────────────────────────────────────────────────────────────┐
  │                          INTERACTIVE BROKERS (TWS)                          │
  │                          Port 4002 / Client 1                               │
  └─────────────────┬───────────────────────────────────┬───────────────────────┘
                    │ positions, quotes, account          │ place/modify orders
                    ▼                                     ▲
  ┌─────────────────────────────┐        ┌───────────────────────────────────┐
  │      market-pylon :8710     │        │      condor-calc (PLL)            │
  │  ┌─────────────────────┐   │        │  ┌─────────────────────────────┐  │
  │  │ REST API             │   │        │  │ Phase Lock Loop              │  │
  │  │ /positions           │───────────│  │   Kelly DAC scoring           │  │
  │  │ /quotes              │   │        │  │   Breathing modulation       │  │
  │  │ /account             │   │        │  │   Circuit breaker            │  │
  │  │ /orders (CRUD)       │◄──────────│  │   Anti-woodchipper tabu      │  │
  │  └─────────────────────┘   │        │  │   BID→MID adaptive pricing   │  │
  └─────────────────┬──────────┘        │  └─────────────────────────────┘  │
                    │                    │  ┌─────────────────────────────┐  │
                    │                    │  │ Forecast Client              │  │
                    │                    │  │   polls sidecar q60s        │  │
                    │                    │  │   kelly_bias() modulation   │  │
                    │                    │  └──────────┬──────────────────┘  │
                    │                    └─────────────│─────────────────────┘
                    │                                  │
                    │         ┌─────────────────────────┘
                    │         │
                    ▼         ▼
  ┌─────────────────────────────────┐     ┌─────────────────────────────────┐
  │   TimesFM Sidecar :8701        │     │   Condor Cockpit :8702          │
  │  ┌───────────────────────────┐ │     │  ┌───────────────────────────┐  │
  │  │ TimesFM 2.0 (500M)       │ │     │  │ Canvas2D @ 60fps          │  │
  │  │ Fine-tuned on 25yr ES    │ │     │  │   Monte Carlo fan         │  │
  │  │ RTX 5090 (32GB VRAM)     │ │     │  │   Vintage forecasts       │  │
  │  │ 7.6GB allocated          │ │     │  │   Volume anomaly alert    │  │
  │  ├───────────────────────────┤ │     │  │   Accuracy tracking       │  │
  │  │ /predict    single fcast  │──────│  │   Fade/alpha sliders      │  │
  │  │ /monte-carlo  batched MC  │──────│  └───────────────────────────┘  │
  │  │ /health     GPU status    │ │     │                                  │
  │  │ /history    bar data      │ │     │  Polls: /quotes q1s             │
  │  └───────────────────────────┘ │     │         /predict q5s            │
  └────────────────────────────────┘     │         /monte-carlo q2s        │
                                          └─────────────────────────────────┘

  ┌────────────────────────────────────────────────────────────────────────────┐
  │ SUPPORT INFRASTRUCTURE                                                     │
  │                                                                            │
  │  pylon (guard + statusline + chain_id)    Lean 4 (15 theorems verified)   │
  │  pylon.db (Schema v3, WAL mode)           Council (von-neumann, feynman,  │
  │  ntfy.sh (push fill notifications)          niederhoffer voice profiles)  │
  │  chain_id KV handoff (P50=45ms)           Niederhoffer: "count, don't    │
  │  guard-audit.jsonl (security trail)         theorize"                      │
  └────────────────────────────────────────────────────────────────────────────┘
      
* * *
Epilogue Assumptions & Honest Accounting
Assumptions

What We Assumed

1. Normalization: Dividing by first context value makes the model learn relative, not absolute, price movements. This is standard for financial time series but means the model can't learn level-dependent effects.

2. Stationarity: We assume the patterns in 25 years of daily bars transfer to current 5-minute microstructure. Regime changes could invalidate this.

3. Frequency tokens: TimesFM uses 0 for high-freq, 1 for daily. We mixed both in training. The model learns to distinguish them, but edge cases at frequency boundaries are untested.

4. Direction accuracy ≠ profit: 96.4% correct on direction says nothing about magnitude. Being right on 96 small days and wrong on 4 big days can still lose money. Niederhoffer's exact warning.

Limitations

What Could Break

Overfitting: 16 epochs on 20K bars. Val loss was still decreasing. But with only 5 days of 5-min holdout, we can't rule out memorization of intraday patterns.

Distribution shift: The model was trained on ES=F via yfinance. A regime change (liquidity crisis, circuit breaker, flash crash) would produce out-of-distribution inputs.

Latency: 667ms inference for a single prediction. In a fast market, that's 3-4 ticks of staleness. The freshness guard (9999s default → fail-safe) mitigates but doesn't eliminate this.

Monte Carlo noise level: σ=0.0003 perturbation is a hyperparameter we picked heuristically. Too small = paths cluster, too large = nonsense. Needs calibration.

Key Files

The Codebase

scripts/python/
  timesfm-sidecar.py      # Sidecar + MC

projects/trading-bot/
  timesfm-finetune/
    train.py               # Fine-tuning
    checkpoints/best.pt    # Weights (5.9GB)

tools/condor-calc/
  src/forecast.rs          # ForecastClient
  src/pll.rs               # PLL + auto-close
  src/unwind_dsl.rs        # Exhale poses
  lean/ThetaYoga.lean      # 15 proofs

tools/condor-pilot/
  cockpit/index.html       # Monte Carlo viz

mindpalace/agents/
  niederhoffer/             # Voice profile
Personal

3:30 AM

The PLL is running auto close-only. 4 resting orders at natural BID, repricing every 5 seconds. The cockpit is painting 200 GPU Monte Carlo paths every 2 seconds on a dark canvas. Volume anomaly detector watching for overnight surprises.

$32,272 net liq. 54% cushion. $12K theta carry. 38 legs.

Tomorrow the Feb 20 0DTE expires. The condor either closes profitably overnight or settles at expiry. Either way, the infrastructure is here now.

The model says bear. Niederhoffer says count. The PLL says exhale. The machine is breathing.