Skip to content

Sector Performance Quilt ​

The performance quilt sits next to the fundamentals heatmap on the Sectors page and answers a different question. Fundamentals tells you how each sector is currently positioned — margins, returns on capital, leverage. The quilt tells you how each sector has actually performed, month by month, across the last year. Together they let you ask "is this sector cheap because it's been beaten up, or beaten up because it's structurally weaker?"

The chart shows 11 GICS sectors as rows and 13 columns: the trailing twelve full months plus the current month-to-date. Each cell is one number — that sector's monthly return — colored on a brick-to-forest diverging scale anchored at zero.

The cell value ​

For a single ticker in a single month:

ri,m=Pi,m,lastPi,m,first−1

where Pi,m,first and Pi,m,last are the first and last trading-day closes for ticker i in month m. The MTD column substitutes "today" (or the most recent trading day available) for Pi,m,last, so it answers "what's happened so far this month."

The return type toggle picks which price column to use:

  • Total return (default) reads adj_close — yfinance's dividend- and split-adjusted close. Reinvested dividends are baked in, so the ratio above is the true total return without a separate dividend roll-up step.
  • Price return reads the unadjusted close. It understates real performance, especially for high-yield sectors (Utilities, Energy, Financials), but it's useful when you want to isolate price action from cash distributions.

Aggregating to the sector ​

For a given sector S and month m, with constituents i∈S that have a computable ri,m:

Equal-weighted: every contributor counts the same.

RS,mequal=1|Sm|∑i∈Smri,m

Cap-weighted (default): weighted by current market_cap.

RS,mcap=∑i∈Smri,m⋅wi∑i∈Smwi

where wi is the constituent's current market capitalization. Cap-weighted matches what an SPDR sector ETF would do; equal-weighted gives small-cap moves the same voice as the megacaps.

If fewer than two constituents in the sector have a non-null cap available, the cap-weighted formula falls back to the equal-weighted calculation rather than returning a misleading two-stock approximation. This mirrors the same minimum-N rule the fundamentals heatmap uses for weighted_mcap.

Suppression: if fewer than three constituents have a computable monthly return for the cell, the cell renders as a hatched block with no number — the sample is too small to be representative. This matches the minimum-N rule on the fundamentals heatmap.

Coloring ​

The diverging scale is anchored at exactly 0% — green above, red below — and clipped at ±max|RS,m| across the visible quilt. So the cell with the most extreme return in either direction sits at the edge of the scale, and everything else is shaded relative to it. A single-month outlier won't wash out the rest of the grid because the clip is symmetric and computed per render.

The legend strip below the quilt shows the active range. Toggling between cap- and equal-weighted, or between TR and PR, recomputes the visible max and re-shades the cells live.

Simplifications applied in v1 ​

Two deliberate simplifications, both flagged so a reader knows what to discount:

Current SP500 membership applied across all 13 months. A company added to the index three months ago appears in every column of the quilt, including months when it wasn't in the index. The bias is small at the SP500 scale (membership is sticky) but the quilt isn't a survivorship-corrected backtest — it's a current-membership look at trailing performance. Same simplification the rest of the Sectors page already makes.

Current market_cap used as the cap weight across all months. A more honest cap-weighted aggregation would use each ticker's market cap as of that month-end, which would let high-volatility sectors look more or less concentrated as their composition shifted. The current approach keeps the weights stable, which produces correct ordering but slight bias for sectors that rotate hard during stress regimes.

Both are tracked in the backlog as v2 candidates if the bias starts to matter for the kind of comparison Sean is making.

What the quilt is good for ​

  • Spotting leadership rotation. If Tech is dark green for three months and then suddenly red while Energy lights up, that's a regime shift — exactly the kind of thing a single-sector chart would obscure.
  • Reading macro stress. Months where every sector is red (or every sector green) tell you the market moved together — a beta event, not a stock-picker's market.
  • Cross-checking a fundamentals story. A sector with great fundamentals but a long red streak is either an opportunity (mispriced) or a warning (something the fundamentals don't yet capture).

What it is not good for ​

  • A backtest. The membership and cap simplifications make this current-look-back analysis, not a what-if-I-bought-this strategy.
  • A point-in-time comparison. Quilt months use today's sector classifications and today's index membership. A company that switched from "Industrials" to "Technology" in 2023 appears under its current sector for every cell, including months when it was classified differently.
  • High-frequency timing. The granularity is monthly. Intraday or weekly trends won't show.

EquityTrack methodology reference. Data from SEC EDGAR.