Short-Term Trading Decision System

The actions ahead, in order

What's finished, what's waiting on you, and what unlocks next. Follow it top to bottom — nothing below a gate starts before the gate opens.

updated 2026-07-14 · evening all merged to main · production deployed · market-data mode live paper trading only — no live orders exist
Where the system stands — third campaign: first promising lead (gap continuation, 2023 → 2026-07) NO_VALIDATED_EDGE · promising lead
Gap-family OOS trades
29 too few
Expectancy
+0.34 R/trade
Win rate
65.5%
Profit factor
2.13
3× cost stress
+0.25 R
Null check
0/5 passed · clean

Three campaigns complete, all judged honestly. Classic setups: no edge (785 then 3,334 trades, ~0R). Earnings gap-drift: negative, discarded. But the GAP_CONTINUATION family — strong opening gaps that keep going — shows +0.34R out-of-sample and survives 3× cost stress. The gates still say NO_TRADE for exactly the right reason: 29 trades is not evidence, it's a hint. The next action is more history (Alpaca SIP reaches back to 2016), which multiplies the sample roughly 3×, and lets this lead prove itself or die.

Step 0 — Waiting on you

Two items remain that only you can do; neither blocks my current work, but item 2 unlocks the earnings-drift experiments.

  1. 1 · Rotate the pasted keysYou · ~5 min

    The Alpaca paper keys and the Resend key were pasted into chat in plaintext (the Alpaca pair now also lives in Railway production env). Regenerate both in their dashboards and paste the new ones — I'll update .env, the Keychain, and Railway. Nothing secret was ever committed to git.

    DONE WHEN — new keys verified with a live 200-status probe everywhere they're used.

  2. ✓ Earnings data connectedDone

    Your Finnhub key powers the live forward-looking earnings gate. Historical announcement dates come from SEC EDGAR 8-K filings (free, official) — 115 symbols checked, 1,152 earnings-window candidates filtered in campaign 3.

  3. ✓ Push, merge, deployDone

    PRs #6 and #7 merged to main. Production redeployed with the strategy engine, real Alpaca keys, and DEMO_MODE=false — the live dashboard now fetches real market data and answers honest NO_TRADE with explicit reasons. Verified end-to-end with a logged-in analysis of AAPL.

Phase A — Hunt for a real edge

My work, iterative, starts after Step 0. Each experiment is judged by the same locked gates plus the null check — most will fail, and failures are discarded, never tuned until they pass. The exit bar for every idea: expectancy lower bound > 0 under 2× modeled costs, clean null, all locked gates green.

  1. ✓ A1 · Cross-sectional rankingDone · no edge found

    Top-k per-session selection is built and was chosen by the selector itself (top-3, plan P14) — but the out-of-sample result stayed negative. The structure works; the underlying signals don't carry edge.

  2. ✓ A3 · Widen the universeDone · no edge found

    Universe grown to ~110 sector-mapped liquid names; 3,334 out-of-sample trades — enough for the trade-count and concentration gates to be meaningful. Expectancy −0.006R, negative under cost stress.

  3. ✓ A2 · Event-conditioned signalsDone · found a lead

    Earnings gap-drift tested negative and was discarded. Gap continuation tested clearly positive out-of-sample and survives cost stress — but with far too few trades to promote. First real lead of the project.

  4. A4 · Deepen history to 2016 and re-validate the gap familyClaude runs · next up

    Fetch 2016→2026 SIP history (~3× the gap events), re-run the full purged validation and null harness on GAP_CONTINUATION. If the expectancy lower bound stays positive at ~100+ out-of-sample trades, we're within reach of the trade-count gates; if it dies, the lead was noise and gets discarded.

    DONE WHEN — a research summary reports PROMOTABLE, or the lead is killed and reported honestly.

Phase B — Intraday depth

Parallel track, not blocking Phase A.

  1. B1 · 5-minute labelingGated · after A1

    Extend the labeling engine to intraday bars so VWAP and EMA-based exit plans (P11–P13) can be researched with real fills instead of daily approximations.

Phase C — Promotion to the live dashboard

  1. C1 · Serve the validated modelGated · needs a PROMOTABLE artifact

    Production already runs in market-data mode with real Alpaca data; the last step is MODEL_ARTIFACT_PATH pointing at a promotable artifact. The dashboard and MCP tools then issue real gated decisions — LONG only when every gate, the regime filter, and the spread check all pass; NO_TRADE otherwise, with reasons listed.

    DONE WHEN — status page shows “Model artifact configured: Yes” in production.

Phase D — 20-day forward paper portfolio

  1. D1 · Execute the approved planGated · after C1

    The US$30,000 simulated forward portfolio you already specced: 20 NYSE sessions, locked universe, P03 official exits, hash-chained event journal, pre-entry email alerts, auditable dashboard. Runs on its own branch per the plan. Forward-testing starts only when there's a validated model to test.

How to follow along

cd ~/Library/Mobile\ Documents/com~apple~CloudDocs/Trading PYTHONPATH=src python3 -m pytest -q # full test suite (300+ tests) set -a; source .env; set +a ALPACA_FEED=sip PYTHONPATH=src python3 -m short_term_trader.cli research \ --start 2023-01-01 --end 2026-07-14 \ --universe extended --top-ks 1,2,3 # rerun the widened validation yourself