
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.
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.
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.
$ 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.

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.
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.
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

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.
┌────────────────────────────────────────┐
│ 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.
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.
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.
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.

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.
// 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.
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.

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.
-- 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.
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.
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.

┌─────────────────────────────────────────────────────────────────────────────┐
│ 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" │
└────────────────────────────────────────────────────────────────────────────┘
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.
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.
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
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.