24 — Market Cycles

Smart Money vs. Dumb Money#

Debated
◆ The Pattern"Smart money" (institutions, insiders) tends to buy during fear and sell during euphoria.

Smart Money vs. Dumb Money — the persistent pattern of institutional (informed) and retail (uninformed) behavior.

Tracking tools:
• COT Report: Commitment of Traders — shows positioning of commercials (hedgers) vs. speculators
• Insider buying/selling: Insider purchases have been followed by above-average returns on average (Lakonishok & Lee 2001); insider sales say much less
• Put/Call ratio: often read as a contrarian gauge — very high readings tend to occur in sell-offs
• Fund flows: Money tends to arrive after strong returns and leave after weak ones; stocks that flows chase go on to underperform (Frazzini & Lamont 2008)

The key insight: smart money acts before the move; dumb money reacts after the move is largely complete.

Worked example

A fund returns +30%, +25%, −20%, −10% and +15%: 6.1% a year. Its investors put in 100, then 200 and 400 after the two good years, and take out 300 and 100 after the bad ones. Their money-weighted return is −3.1% a year, and they end with 247 for a net 300 put in. Same fund, opposite results; the difference is timing the flows. Dichev (2007) found this gap in market-wide data.

Where it misleads
  • “Smart” and “dumb” are labels for after the fact. Institutions herd and chase too; retail flows are not always wrong.
  • Insider purchases are informative on average (Lakonishok & Lee 2001), insider sales much less so — many sales are for diversification or tax.
  • Commercials in the COT report are mostly hedgers; their positions reflect hedging needs as well as views.
In code
r = np.array([0.30, 0.25, -0.20, -0.10, 0.15])   # a fund's return each year, made up
flow = np.array([100, 200, 400, -300, -100])     # money investors put in (+) or take out (-) at each year's start

value = 0.0
for f, x in zip(flow, r):
    value = (value + f) * (1 + x)
fund = np.prod(1 + r) ** (1 / len(r)) - 1        # time-weighted: what the fund earned

cash = np.append(-flow, value)                   # the investors' own cash flows
roots = np.roots(cash[::-1])                     # money-weighted: the IRR of those flows
irr = [z.real - 1 for z in 1 / roots if abs(z.imag) < 1e-9 and z.real > 0]   # per-year rate
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
  • I. D. Dichev, “What Are Stock Investors’ Actual Historical Returns? Evidence from Dollar-Weighted Returns”, American Economic Review 97(1), 2007
  • A. Frazzini & O. A. Lamont, “Dumb Money: Mutual Fund Flows and the Cross-Section of Stock Returns”, Journal of Financial Economics 88(2), 2008
  • J. Lakonishok & I. Lee, “Are Insider Trades Informative?”, Review of Financial Studies 14(1), 2001

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

Pattern bridge: The information asymmetry between sophisticated and retail traders. In ML, KL divergence measures the gap between what one model knows and another doesn’t. In statistics, it’s the difference between the prior and the posterior.
Linked from 2
← Previous
Euphoria & Panic
Open in the full reader, with the topic sidebar