S&P Trade 5 Study
The strategy itself, and how to read each tab.
Synopsis
This is an experiment to see what would happen over time if a portfolio held 1 share of each stock in the S&P 500, then, when the value of that share drops 1% or more below its purchase price (cost basis), five more shares are bought at market at that lower price. In reverse, once that stock (now a 6-share position in two lots) has a return of 1% or greater against its most recently opened lot's cost basis, five shares are sold and realized gains are recorded — the actual realized gain is calculated across the true FIFO split of those five shares, and must itself clear 1% as well before the sell goes through. It starts with $200,000. On Aug 1, 2024 the sum of one share of all 503 S&P 500 tickers (dual share classes like GOOG/GOOGL count separately) was $94,782.61, leaving $105,217.39 in buying power to trade with.
Index changes (additions, removals, splits, renames, exchange transfers) are applied at the start of each trading day, before that day's sell/buy scan. A removal fully liquidates the position via an administrative trade, which is excluded from strategy stats since it isn't a strategy decision.
Order of Operations at the end of the day:- Apply any confirmed index-change events dated today.
- Sell all stocks clearing the sell rule below, biggest day-gainer first.
- Buy all stocks clearing the buy rule below, biggest day-loser first.
- Stock must be a 6-share position, up >= 1% both today and against its most recently opened lot's cost basis.
- The realized gain from actually FIFO-selling 5 shares must itself be >= 1% of the cost basis of those specific shares (a safety guard beyond rule 1's check).
- Stock must drop 1% or more in value from its one-share cost basis.
- Stock price must be going down for both today and all-time (total G/L).
- Buys are processed biggest day-loser first.
- If funds are not available for a buy, move on to the next available stock.
Holdings
Reading the Holdings Data
Heat Map:
What the data reflects:
Two grids of tiles, one tile per held ticker (up to 503): Day Change (colored by today's price move vs. yesterday's close) and Total Gain/Loss (colored by lifetime position gain vs. FIFO cost basis). Both use the same diverging scale -- red for down/loss, gray "purgatory" for near-breakeven (+/-1%), green for up/gain -- and a ring around a tile marks a ticker currently meeting the Sell or Buy Rule. Hover a tile for the exact $ and % behind its color.
What is useful for market observation:
Fastest way to read the breadth of the book at a glance -- how many positions are up vs. down right now (Day), and separately, which positions have compounded well vs. poorly over their lifetime (Total), without reading a single number. The ring markers are the most actionable thing on the page: they surface which tickers are sitting right at the edge of triggering tonight's Sell/Buy scan before it actually runs.
Allocation:
What the data reflects:
Two horizontal bars (Day Change, Total Gain/Loss), each built from equal-width segments -- one per held ticker, colored the same way as the Heat Map above. Unlike the Heat Map's fixed grid, every segment here is the same width regardless of position size, and the bar's left-to-right order always mirrors whatever the Ledger below is currently sorted by. Hover a segment for ticker, $ value, % of book, and day/total change.
What is useful for market observation:
Because every segment is equal width, you can eyeball roughly what fraction of the book is red vs. green without counting tiles. And because it tracks the Ledger's live sort, sorting the Ledger by Total G/L (for example) turns this into a ranked gradient, best to worst, left to right -- not just a random-order breadth strip.
Ledger:
Adjustable view options (impacts Allocation view):
Filter chips (All, Exit Point, Entry Point, Purgatory Today/Total, Winners Today/Total, Losers Today/Total), a ticker search box, and clicking any column header to sort. All of these also drive the Allocation bars above -- narrowing the Ledger to e.g. "Losers (Total)" narrows Allocation to just those tickers too.
What the data reflects:
The full sortable table, one row per held position: Symbol (colored by sector/ industry -- hover for company name, sector, industry, and employee count), current Shares (1 or 6), Price, Day Chg, Value, Cost Basis / Share Cost, Total G/L, and % Shown (that position's share of total portfolio value). A green left-stripe on a row means it currently meets the Sell Rule; an indigo left-stripe means the Buy Rule.
What is useful for market observation:
The single most complete, ground-truth table on the page -- where you'd actually go to answer "what's really going on with ticker X" (its real cost basis, real $ value, real day and lifetime performance) rather than just its color on a tile. The filter chips let you jump straight to the actionable subset -- e.g. "Exit Point" is exactly what will sell tonight if nothing changes before the close -- instead of scanning all 503 rows by eye.
Index Changes
Reading the Index Changes Data:
Event Log:
Adjustable view options:Added / Removed / Split / Renamed / Exchange Transfer filter chips, a ticker search box, and "Sort by" buttons (Ticker, Action, Date, Reason, Ratio, Realized Gain) above the event cards. Only confirmed events are shown -- nothing appears here until it's been researched and verified against a primary source. The one-time Aug 1, 2024 baseline seed (503 tickers, the study's starting roster) is excluded entirely -- this log is about real changes to the index since the study started, not the initial universe.
What the data reflects:One card per confirmed event, two per row, newest first: ticker (colored by sector/industry, same as the other tabs, hover for company name/sector/ industry/employee count), the related ticker where one exists (acquirer, rename target, or replacement), an action badge (Added, Removed, Split, Renamed, Exchange Transfer), the event date, a humanized reason (Market Cap Change, Acquisition, Spinoff, Stock Split, etc.), the split/conversion ratio where applicable, and the realized gain from any administrative trade the event triggered (a split's excess-share sell, or a removal's full liquidation). Clicking a card reveals the full researched narrative and its source citation.
What is useful for market observation:The ground-truth record of what actually happened to the index and why -- not sp5's reaction to it (that's the portfolio policy question, a separate decision). Filtering to Removed surfaces every position that was force-exited for reasons outside the Sell/Buy Rules; Split surfaces every share-count adjustment that had to be reconciled. Expanding a card's narrative is the fastest way to sanity-check a number elsewhere in the app against the real corporate action that produced it.
Performance
Reading the Performance Data:
Performance by Period:
Adjustable view options:Weekly / Monthly / Quarterly / Semi-Annual / Annual / All Time chips — buckets the net-worth history into that granularity and redraws the bar chart. Granularities longer than the study actually spans are hidden rather than left active-but-empty.
What the data reflects:
A bar chart of net worth at the end of each period, straight off the daily net-worth snapshot history (no simulation) — one bar per week/month/quarter/ etc. depending on the chip selected.
What is useful for market observation:
The zoomed-out "is this working" view. Weekly/Monthly for recent momentum, All Time for the full arc from the $200,000 start. Switching granularity on the same underlying data is a fast way to tell a real trend from short-term noise.
Allocation Over Time:
Adjustable view options:
Follows the same period selector as Performance by Period above — no separate chips here, changing granularity up there also redraws this section (it's lazy-loaded on first open, since it's the heaviest query on the page: ~500 tickers x every period-end date).
What the data reflects:
Two views for the same period breakdown: a breadth chart (a trend line of what % of the book was Winner/Purgatory/Loser at each period's end) sitting above a grid of one row per period, one equal-width segment per ticker, colored by that ticker's Total G/L as of that period's end date. Color is a last-buy-price proxy (ticker's price then vs. its most recent Buy fill on record as of that date), not full lot-tracked cost basis — a simplification worth knowing when comparing this to the Ledger's exact numbers.
What is useful for market observation:
The breadth chart answers "was the book broadly winning or losing at any given point in the study," independent of any one ticker. The segment grid below it answers the follow-up "winning/losing across the WHOLE book, or concentrated in a few names" — a period where segments are evenly mixed red/green reads very differently from one where a few large losers are dragging an otherwise-green period down.
Gain/Loss by Ticker:
Adjustable view options:
Month / Quarter / Semi-Annual / Annual / Bi-Annual / All Time chips — a trailing window measured back from the latest processed trading day (not the calendar's real today, since the study is mid-backtest). Click any column header to sort. Click a ticker row to expand its own trade list for the same window.
What the data reflects:
One row per currently-held ticker: Last Close price, Last Close $/% G/L (today's move in dollar and cost-basis-relative terms), Realized $ (exact, off the real engine's FIFO lot consumption — not simulated), Unrealized $/% (always as of right now, since an open lot has no "3 months ago" value), Total G/L $/%, Cost Basis $, Stock Value $, and each of those as a % of the whole account. Expanding a row lists that ticker's individual buy/sell fills for the selected window, with realized gain per sell.
What is useful for market observation:
The most granular per-ticker accounting view in the app — where you'd go to answer "exactly how has this specific position performed, both realized and still-open, over this specific window." Sorting by Realized $ surfaces which tickers have actually paid off the rotation strategy the most; sorting by Unrealized % surfaces which open positions are furthest from their next Sell Rule trigger. Expanding a row is the fastest way to sanity-check a number against the actual fills that produced it.