★ S&P 500 Bull and Bear Markets
Total Returns, June 1949 – August 2026
Loading data…
Drag = pan · shift+drag = box-zoom · scroll = zoom X · Y-axis drag/scroll = zoom Y · dblclick = reset
Methodology — what counts as a bull or a bear
Episodes are detected on daily total-return data using the standard convention: a bear starts when the index falls ≥20% from a running peak, a bull starts when it rises ≥20% from a running trough, and episodes strictly alternate. Each episode is rebased to 0 at its own start, so every mountain hangs off the same baseline and the chart tiles the timeline with no gaps.

Why daily, and why total return

A monthly series cannot see the March 2020 COVID collapse (-34% in about one month), which is why the series is built daily. Dividends matter too: total return = price return + reinvested dividends. Prices come from Yahoo ^GSPC; dividends come from Robert Shiller's ie_data.xls column D (the 12-month moving average of the annual dividend per share). Daily total return is then TR[i] = TR[i-1] × (P[i] + D/252) / P[i-1]. Shiller's published copy currently ends 2023-06, so the dividend is carried forward and grown 4%/yr beyond that.

The vertical scale (measured off the reference chart)

The reference does not use one shared linear axis. Measuring its two global maxima directly from the published PNG: the +841% bull is 500px tall (0.5945 px/%) while the -55% bear is 183px deep (3.3273 px/%) — bears are drawn ~5.6× amplified. On a shared axis a -55% bear would be only 6% of an +841% bull's height and would vanish. So the deepest bear is drawn at 36.6% of the tallest bull's height (183/500), i.e. negatives are scaled by amp = 0.366 × maxBull / |minBear|. The y-axis is labelled with the real percentages (inverse-transformed), so the amplification never distorts a printed number — only the picture.

Where this differs from the reference

Headline statistics match closely: 13 bulls / 12 bears, bull average 5.2y +258% (reference 5.3y +254%), bear average 0.8y -32% (reference 1.0y -31%), and most individual episodes are identical to the year (2.1y +58%, bear 1.5y -33%, 2.6y +89%, 5.0y +304%, 10.9y +525% vs 11.0y +527%, 0.1y -34%, 1.8y +121%). Three differences remain, all from the reference using an undisclosed house rule rather than a uniform 20%:
  • it splits 1949-1961 into a 7.1y bull + 1.2y -18% bear + 4.1y bull (that decline is under 20% on closing data, so the standard rule keeps it as one 12.5y bull);
  • it merges multi-leg declines into one episode (2000-02 as a single 2.5y -47% bear; 2007-09 as one 1.4y -55% bear) where the standard rule splits them on the intermediate +20% bounces;
  • its final -19% dip (below 20%) is counted, so its tail reads 2.4y +78% / 0.1y -19% / 1.4y +56% where this page shows one 3.8y bull.

Data & caveats

Fetched daily by sp500-bull-bear-update.py. Episode boundaries are exact for the stated rule and this dataset, but will shift slightly versus any vendor using intraday extremes or a different threshold. Not investment advice.