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 — second real-data validation (110 names, cross-sectional top-k, 2023 → 2026-07) NO_VALIDATED_EDGE
Setup candidates
20,316
Out-of-sample trades
3,334
Expectancy
−0.006 R/trade
Win rate
47.0%
Profit factor
0.98
Null check
0/10 passed · clean

Read this as the system working, not failing. Two honest campaigns are now complete: the 20-name threshold run (785 trades, −0.0002R) and the 110-name cross-sectional run (3,334 trades, −0.006R, negative under cost stress). Classic technical setups have no edge after costs at either scale, and the gates correctly refuse to trade. The next campaign is event-conditioned signals.

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. 2 · Create a free Finnhub accountYou · ~5 min

    The earnings-blackout code is built and tested, but account creation is yours to do: sign up at finnhub.io, copy the API key, and paste it here as FINNHUB_API_KEY. Research runs then drop candidates around earnings, and the live earnings gate uses real dates.

    DONE WHEN — a research summary shows the earnings filter active with a nonzero symbols-checked count.

  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 signalsClaude runs · next up

    The remaining and most plausible signal family: post-earnings drift (unlocks with your Finnhub key), gap-day statistics, and overnight-vs-intraday return decomposition as first-class setups rather than side features.

    DONE WHEN — a research summary reports PROMOTABLE, or the idea list is exhausted and I report that 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