21 — Market Cycles

Market Sentiment Cycle#

Heuristic
◆ The PatternMarkets cycle through emotional phases: Disbelief → Hope → Optimism → Euphoria (buy here at maximum risk) → Anxiety → Denial → Panic → Capitulation (sell here at maximum opportunity) → Depression → Relief → back to Hope.

The market sentiment cycle — the emotional journey investors collectively experience through a full market cycle.

The phases:
Bottoming: Disbelief → Hope → Relief
Rising: Optimism → Excitement → Thrill
Topping: Euphoria ← Maximum financial risk
Falling: Anxiety → Denial → Fear → Panic
Bottoming: Capitulation ← Maximum financial opportunity → Depression

Maximum risk arrives at the point of maximum emotional comfort. Maximum opportunity arrives at maximum discomfort.

Worked example

A mechanical version of the cycle: price above or below its six-month average, and rising or falling. On 22 made-up months it reads optimism from the 6th month (130), anxiety for one month at 132, panic from the 10th month (129) all the way down, hope for one month at 85, and optimism again from 88. The eleven-phase chart collapses to four, and the in-between phases last a single month — which is why they are so hard to spot live.

Where it misleads
  • The popular cycle chart is an illustration, not a finding; no study fixes the phases, their order or their length.
  • Real cycles skip phases, repeat them, and stall for years. Labelling the present is far harder than labelling the past.
  • Survey-based sentiment does carry some information about returns (Baker & Wurgler 2007), but as a tilt, not as a clock.
In code
close = pd.Series([100, 104, 109, 115, 123, 130, 133, 134, 132, 129, 124, 116,
                   106, 96, 88, 84, 83, 85, 88, 93, 99, 106])   # 22 months, made up
trend = close.rolling(6).mean()
rising = close.diff() > 0
phase = np.select([(close > trend) & rising, (close > trend) & ~rising,
                   (close <= trend) & ~rising, (close <= trend) & rising],
                  ['optimism-euphoria', 'anxiety-denial', 'panic-capitulation', 'hope-relief'], '')
starts = [(i, ph) for i, ph in enumerate(phase) if ph and phase[i - 1] != ph]   # month each phase begins
Python, in your browser — edit the code and run it again

Assumes import numpy as np and import pandas as pd. Each snippet carries its own example numbers; the comments say which are made up.

Sources
  • Irrational Exuberance, R. J. Shiller, Princeton University Press, 2000
  • Manias, Panics, and Crashes: A History of Financial Crises, C. P. Kindleberger (later editions with R. Z. Aliber), 1978
  • M. Baker & J. Wurgler, “Investor Sentiment in the Stock Market”, Journal of Economic Perspectives 21(2), 2007

Last reviewed October 2026 · How this site checks its content · Report a mistake

Pattern bridge: The emotional arc from optimism to euphoria to panic to hope is a distribution cycle. In ML, cyclic learning rates deliberately walk through this arc.
Linked from 6
← Previous
Status Quo Bias
Open in the full reader, with the topic sidebar