Systematic Swing 01
US EQUITIES · DAILY · CRSP 2000–2026 · MEAN-REVERSION
UPDATED
2026-07-31 09:40
Paper Source ↗
Status
ACTIVE
Active positions
10
Exposure
LONG-ONLY
Max drawdown
-36.74 pp
Last signal
2026-07-29
Data freshness
2026-07-29
01

Performance

n = 12
Expectancy / trade
+0.66%
mean return across 12 closed
Profit factor
1.16
gross win ÷ gross loss
Win rate
58.3%
7 / 12 wins
Cumulative
+7.90%
summed per-trade %
Avg win / loss
+8.04 / -9.68
percent per trade
Sample
12
⚠ LOW CONFIDENCE SAMPLE
02

Equity Trajectory

R H B
CUMULATIVE % · PER-TRADE
SERIES · summed per-trade % returns, not an account equity curvePOINTS · 12 closed tradesLATEST · +7.90%R realized · H stop-adjusted · B benchmark

Confidence

12 closed
⚠ LOW CONFIDENCE SAMPLE
Win rate58.3%
95% Wilson CI32–81%
Interval is wide at n=12; treat metrics as directional.

Risk

Max drawdown-36.74 pp
ExposureLong-only
Open positions10
Disaster stop4×ATR + GTC

Strategy

TypeMean-reversion
SignalsBBands · RSI
ValidationWalk-forward
UniverseUS equities
DataCRSP + yfinance
03

Scenario Analysis

If the stop had worked as designed

Hypothetical · Not realized
What happened
One position (INTU) ran uncut past its protective stop.
Affected position
INTU · exited 2026-06-26 · -13.09%
Bug status
June 2026 stop-expiry bug — fixed (persistent GTC stops + daily re-arm guard).
Assumed stop
Disaster stop fires at entry −5% as designed → -5.00%.
MetricRealizedAdjustedDelta
Profit factor1.161.40+0.24
Avg loss-9.68%-8.06%+1.62 pp
Expectancy+0.66%+1.33%+0.67 pp
Cumulative+7.90%+15.99%+8.09 pp
Adjusted figures isolate the cost of one infrastructure failure. Headline metrics on this page remain unadjusted.
04

Trade Ledger

click a row for detail
#DateTickerSideEntryExit ReturnHoldReasonStatus
2026-04-29SYKLONG313.33348.52+11.23%93dopenOPEN
2026-04-29LLYLONG858.701,175.00+36.83%93dopenOPEN
2026-04-30STELONG212.73231.48+8.81%92dopenOPEN
2026-06-05ACGLLONG88.35102.07+15.53%56dopenOPEN
2026-07-01TJXLONG150.95158.98+5.32%30dopenOPEN
2026-07-06SBACLONG179.59183.01+1.91%25dopenOPEN
2026-07-16TDGLONG1,225.651,255.71+2.45%15dopenOPEN
2026-07-21PWRLONG640.55648.09+1.18%10dopenOPEN
2026-07-28EWLONG84.6285.86+1.45%3dopenOPEN
2026-07-29VSATLONG73.6575.82+2.94%2dopenOPEN
122026-07-28INTULONG266.36316.29+18.75%29dsignalCLOSED
112026-07-23ROLLONG42.2537.07-12.27%24dstop_lossCLOSED
102026-07-21DHRLONG190.92166.33-12.88%15dstop_lossCLOSED
92026-07-15CAHLONG201.72225.24+11.66%79dstop_lossCLOSED
82026-06-30IDXXLONG548.70523.54-4.59%61dstop_lossCLOSED
72026-06-29ROLLONG45.0442.53-5.57%26dstop_lossCLOSED
62026-06-26INTULONG308.58268.19-13.09%36dsignalCLOSED
42026-06-10ECLLONG260.07261.84+0.68%40dsignalCLOSED
52026-06-10BDXLONG149.13150.45+0.88%40dsignalCLOSED
32026-06-04TJXLONG156.19159.34+2.02%36dsignalCLOSED
22026-06-01ODFLLONG198.22218.24+10.10%26dsignalCLOSED
12026-05-15HEILONG260.04291.80+12.21%16dsignalCLOSED
05

Build Log

what broke · root cause · fix · lesson

A running record of what has broken and how it was diagnosed and fixed. Paper-traded on purpose — the point is to learn the system end to end in the open, failures included.

2026-07-25
Infra

The monitoring was broken, so nothing else mattered

Impact
Alert delivery had been silently disabled for nearly three weeks. During that window six runs reported failure and none of them reached me — the dead-man’s switch was recording outages correctly and mailing nobody.
What it hid
All six failures were the same blocked-exit defect: the strategy issued sell signals on six separate days and the system could not execute one of them. The bug was already understood by then; what was missing was any signal that it had been happening at all.
Fix
Re-enabled notifications and verified delivery with a live test alert, then moved the check from a naive daily period to an explicit weekday cron schedule in market time — the old schedule false-alarmed every weekend, which is what made the alerts easy to ignore in the first place.
Lesson
This was the most important failure of the project. Every other bug here was found by going and looking; this one decided whether looking was even necessary. An automated system without working alerts isn’t automated, it’s unobserved — and false alarms are how real alerts get trained into noise.
2026-07-24
Infra

Two missed sessions — the “always-on” host wasn’t

Impact
The daily run silently skipped two trading days. Broker-side stops kept the downside protected, but signal-based entries and exits were missed.
Root cause
The always-on Mac slept through the 09:30–10:30 ET window. launchd timers don’t fire in darkwake, so the market-open gate never even ran — no error, no log, just silence.
Fix
Scheduled a guaranteed weekday wake at 09:20 ET and disabled sleep on AC power. A missed run now trips the heartbeat instead of vanishing.
Lesson
“Always-on” is a setting you verify, not an assumption. Silent skips are more dangerous than loud crashes — you don’t find out until you go looking.
2026-07-05
Research

The intuitive stop was deleting the edge

Finding
Backtested the tight 5% stop across the full universe: it removes roughly half of the strategy’s expectancy by cutting mean-reversion positions right before they recover. Trailing-ATR variants failed the same way (Sharpe ~1.3 → ~0.9 across every configuration tested).
Outcome
Exits are now the indicator signal itself plus a single wide 4×ATR disaster stop — nothing tighter.
Lesson
A risk control that feels prudent can quietly destroy the strategy. Measure the control before you trust it.
2026-07-01
Fix

Fixing the stop bug silently broke signal exits

What broke
After moving to persistent GTC stops, every position’s shares were reserved by its resting stop order. The routine close then failed with “available: 0”, so the system quietly degraded to stop-only exits — and signal-based exits are the documented edge.
Fix
Cancel the resting stop and wait for the shares to release before closing.
Lesson
Bug fixes create bugs at the seams. This one was invisible until I traced a close call that returned success but did nothing.
2026-06-26
Bug

A protective stop that had quietly expired

What broke
One position ran to −13% instead of stopping near −5%. Its stop leg had expired and was never re-attached, so the position sat unprotected.
Fix
Persistent GTC stops plus a daily guardrail that re-arms a stop on any naked position. The isolated cost is quantified in Scenario Analysis above.
Lesson
A risk control you don’t check every day isn’t a risk control. This single failure is the most instructive trade on the page.
2026-05-15
Research

In-sample ranking didn’t predict out-of-sample

Finding
Building the walk-forward validator showed backtest ranking had no significant correlation with out-of-sample ranking (p > 0.05 in every window).
Outcome
The live watchlist is sorted by out-of-sample Sharpe from validation, not the raw backtest score. RSI(21) was cut outright for a negative OOS Sharpe.
Lesson
The backtest tells you what worked, not what will work. The validation layer is the actual product.