Skip to article frontmatterSkip to article content
Contents
Demand systems en inelastische markten
Maarten Nies

Demand systems en inelastische markten

1Overzicht

Hoeveel stijgt de waarde van de aandelenmarkt als beleggers zonder enig nieuws één dollar extra in aandelen stoppen? Volgens Gabaix en Koijen ongeveer vijf dollar, omdat de vraag naar aandelen nauwelijks op de prijs reageert. Dat getal is wel zo moeilijk te meten dat een kwart eeuw data alles tussen twee en acht toelaat, zoals de simulatie in dit college laat zien.

In de standaardtheorie van deze reeks bestaat die vraag niet eens. Daar bepaalt de stochastische discontofactor mm (SDF) de prijs, en speelt de hoeveelheid die iemand wil kopen geen rol, omdat arbitrageurs elke prijsafwijking zonder nieuws meteen wegkopen. De vraagcurve voor aandelen is dan vlak. Dit college gaat over het onderzoek dat die vlakke curve mat en verwierp. Het college toetst dus geen theorie, maar volgt een reeks metingen die nog op een verklaring wachten. Het gaat om elasticiteiten, inclusie-effecten en de prijsimpact van flows (geldstromen van beleggers in of uit een markt).

In dit college doen we het volgende.

  • In een markt met een mandaatfonds en een actieve belegger rekenen we met de hand uit hoeveel één dollar de prijs opdrijft.

  • We leiden de multiplier M=1/ζM = 1/\zeta af en zien waarom standaardmodellen een elasticiteit van tientallen voorspellen.

  • We behandelen het vraagsysteem van Koijen en Yogo en granular instrumental variables (instrumenten uit de eigen schokken van grote beleggers).

  • We simuleren hoe goed OLS en GIV de elasticiteit meten in steekproeven zo lang als die van Gabaix en Koijen.

  • Op echte data regresseren we kwartaalrendementen op de netto aandelenaankopen per sector, en meten we het effect van veertien recente S&P 500-toevoegingen.

In 1986 liet Shleifer zien dat aandelen bij de aankondiging van hun opname in de S&P 500 in koers stegen, terwijl hun kasstromen niet veranderden Shleifer (1986). Koijen en Yogo Koijen & Yogo (2019) schatten per institutionele belegger een vraagsysteem uit de posities die fondsbeheerders elk kwartaal aan de SEC melden. Gabaix en Koijen Gabaix & Koijen (2021) tilden die aanpak naar de hele markt, en met hun artikel werden flows een eigen verklaring voor koersbewegingen, naast discontovoeten en vergissingen. Volgens Santa-Clara hoort de vraag wat de markt beweegt bij de grote open vragen van dit decennium Santa-Clara (2026).

2Intuïtie: waarom zou dit waar zijn?

Op 16 november 2020 maakte S&P Dow Jones Indices bekend dat Tesla op 21 december in de S&P 500 zou worden opgenomen. Er was geen nieuws over auto’s, winst of rente. Wel stond vast dat elk indexfonds op die dag Tesla-aandelen zou moeten kopen, ongeacht de prijs. Als de vraagcurve vlak is, maakt dat voor de koers niets uit. Daalt de curve, dan moeten de indexfondsen de prijs opdrijven tot iemand bereid is te verkopen.

Shleifer onderzocht in 1986 precies die situatie. Aandelen die na 1976, toen indexfondsen opkwamen, in de index kwamen, behaalden bij de aankondiging een significant abnormaal rendement van ongeveer 3%, terwijl dat effect daarvoor ontbrak Shleifer (1986). Omdat een inclusie de kasstromen niet verandert, kan de prijs alleen stijgen doordat de vraag groter is dan de markt tegen de oude prijs opvangt. Dat bedoelen onderzoekers met een dalende vraagcurve.

Voor één aandeel is dat nog te begrijpen, want aandelen zonder goed substituut springen bij opname sterker Wurgler & Zhuravskaya (2002). Voor de markt als geheel is er nog minder substituut. Een belegger die aandelen verkoopt aan iemand die geld in de markt stopt, gaat zelf meer obligaties of kas houden. Een pensioenfonds met een mandaat van zestig procent aandelen doet dat niet, en een indexfonds evenmin. Als bijna iedereen aan zo’n mandaat vastzit, moet de prijs ver bewegen voordat de weinige flexibele beleggers willen verkopen.

Gabaix en Koijen maken daar een getal van. Stel dat de totale vraag naar aandelen met één procent daalt als de prijs vijf procent stijgt. De prijselasticiteit van de vraag (de procentuele daling van de gevraagde hoeveelheid per procent prijsstijging) is dan 0,2. Een flow van één procent van de marktwaarde moet de prijs in dat geval vijf procent opdrijven, zodat één dollar erin vijf dollar marktwaarde oplevert. Volgens Gabaix en Koijen voorspellen de meeste modellen een honderd keer kleinere prijsimpact Gabaix & Koijen (2021).

Meten is lastig, en daarvoor zijn twee redenen. Beleggers stoppen geld in aandelen als ze optimistisch zijn, en optimisme duwt ook de prijzen omhoog, zodat samenhang tussen instroom en rendement nog geen oorzaak bewijst. Bovendien is elk gekocht aandeel door iemand verkocht. De prijs beweegt dus niet doordat er gekocht wordt, maar doordat de kopers minder op de prijs reageren dan de verkopers.

We verwachten daarom dat een instroom de prijs meer opdrijft naarmate meer vermogen aan vaste mandaten gebonden is. Een verschuiving naar passief beleggen zou de markt dus gevoeliger maken voor flows. Omdat optimisme prijzen en flows tegelijk beweegt, verwachten we ook dat een gewone regressie de vraag inelastischer laat lijken dan ze is.

3Toy-voorbeeld: een passief fonds, een actieve belegger en één dollar

In deze kleine markt rekenen we uit hoeveel één dollar instroom de prijs opdrijft, eerst met een inelastische en daarna met een elastische actieve belegger. Er zijn S=100S = 100 aandelen tegen een prijs P0=1P_0 = 1, en twee beleggers houden ze.

fondsactieve beleggermarkt
aandelen bij P0=1P_0 = 14060100
obligaties10––
vraaggedragvaste fractie θ=0,8\theta = 0{,}8 in aandelenQA=60−60 ζAlog⁡PQ_A = 60 - 60\,\zeta_A \log Pvast aanbod
elasticiteit1−θ=0,21 - \theta = 0{,}2 (stap 1)ζA\zeta_Agewogen gemiddelde

De prijselasticiteit uit de intuïtie heet voor de actieve belegger ζA\zeta_A, zodat een prijsstijging van één procent zijn vraag met ζA\zeta_A procent verlaagt. Voor de procentuele prijsstijging xx gebruiken we een recept dat de theorie later afleidt, namelijk de extra vraag bij de oude prijs gedeeld door de som over de beleggers van elasticiteit maal positie.

Stap 1, de elasticiteit van het fonds. Stijgt de prijs met één procent, dan groeit het vermogen van het fonds naar 50,4. Volgens het mandaat hoort het dan 0,8×50,4=40,320{,}8 \times 50{,}4 = 40{,}32 in aandelen te houden, terwijl zijn aandelen 40,4 waard zijn. Het verkoopt dus voor 0,08, oftewel 0,2% van zijn positie, en zijn elasticiteit is 1−θ=0,21 - \theta = 0{,}2.

Stap 2, de instroom. Een spaarder stort 1 in het fonds. Bij de oude prijs wil het fonds dan 0,8×51=40,80{,}8 \times 51 = 40{,}8 in aandelen, en die extra 0,8 is de flow naar aandelen. Omdat het aanbod vast is, stijgt de prijs tot beide beleggers samen weer 100 aandelen willen, en in eerste orde geeft dat

0,8=(0,2×40+ζA×60) x.0{,}8 = (0{,}2 \times 40 + \zeta_A \times 60)\, x .

Stap 3, geval 1 met ζA=0,2\zeta_A = 0{,}2. De haakjes zijn 8+12=208 + 12 = 20, dus x=0,8/20=4%x = 0{,}8/20 = 4\%. De marktwaarde stijgt met 0,04×100=40{,}04 \times 100 = 4. De multiplier telt per dollar vraagverschuiving naar aandelen, niet per dollar in het fonds, en is dus 4/0,8=54/0{,}8 = 5. De marktelasticiteit is 20/100=0,220/100 = 0{,}2, en 5=1/0,25 = 1/0{,}2.

Stap 4, geval 2 met ζA=5\zeta_A = 5. De haakjes zijn 8+300=3088 + 300 = 308, dus x=0,8/308=0,26%x = 0{,}8/308 = 0{,}26\%, en de multiplier is 0,26/0,8=0,320{,}26/0{,}8 = 0{,}32, gelijk aan 1/3,081/3{,}08. Eén elastische belegger met drie vijfde van de markt maakt de prijsimpact dus vijftien keer kleiner.

Stap 5, een verschuiving naar passief. Blijf in geval 2, maar laat het fonds nu 70 aandelen houden (vermogen 87,5) en de actieve belegger 30. De marktelasticiteit daalt naar (0,2×70+5×30)/100=1,64(0{,}2 \times 70 + 5 \times 30)/100 = 1{,}64. Dezelfde instroom verhoogt de prijs dan met 0,8/164=0,49%0{,}8/164 = 0{,}49\%, een multiplier van 0,61.

De code hieronder rekent de drie gevallen na, zowel in eerste orde als met de exacte evenwichtsprijs, en zet de uitkomsten naast de handberekening.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import optimize

import hap
from hap import data as hap_data
hap.plotting.setup()

rng = np.random.default_rng(20240101)
def toy_market(zeta_active, equity_fund=40.0, equity_active=60.0, theta=0.8, inflow=1.0):
    """First-order solution of the two-investor toy market (shares = value at P0 = 1)."""
    market = equity_fund + equity_active
    zeta = ((1 - theta) * equity_fund + zeta_active * equity_active) / market
    price_change = theta * inflow / (zeta * market)
    multiplier = price_change * market / (theta * inflow)
    return zeta, 100 * price_change, multiplier


def toy_market_exact(zeta_active, equity_fund=40.0, equity_active=60.0, theta=0.8, inflow=1.0):
    """Exact clearing price: mandate fund Q = theta*W/P and active demand Q = a - b log P."""
    wealth = equity_fund / theta

    def excess_demand(log_p):
        price = np.exp(log_p)
        fund = theta * (wealth + inflow + equity_fund * (price - 1)) / price
        active = equity_active - zeta_active * equity_active * log_p
        return fund + active - (equity_fund + equity_active)

    return 100 * (np.exp(optimize.brentq(excess_demand, -0.5, 0.5)) - 1)


toy_cases = {
    "geval 1: zeta_A = 0,2": {"zeta_active": 0.2},
    "geval 2: zeta_A = 5": {"zeta_active": 5.0},
    "geval 2, fonds met 70 aandelen": {"zeta_active": 5.0, "equity_fund": 70.0, "equity_active": 30.0},
}
by_hand = {  # (price change in %, multiplier) from steps 3 to 5
    "geval 1: zeta_A = 0,2": (0.8 / 20 * 100, 4 / 0.8),
    "geval 2: zeta_A = 5": (0.8 / 308 * 100, 1 / 3.08),
    "geval 2, fonds met 70 aandelen": (0.8 / 164 * 100, 1 / 1.64),
}
toy_rows = {}
for name, case in toy_cases.items():
    zeta, price_change, multiplier = toy_market(**case)
    hand_price, hand_multiplier = by_hand[name]
    toy_rows[name] = {"zeta markt": zeta,
                      "prijsstijging, hand (%)": hand_price, "prijsstijging, code (%)": price_change,
                      "multiplier, hand": hand_multiplier, "multiplier, code": multiplier,
                      "exact evenwicht (%)": toy_market_exact(**case)}
pd.DataFrame(toy_rows).T.round(4)
Loading...

Code en handberekening geven dezelfde getallen, en het exacte evenwicht (laatste kolom) wijkt nauwelijks af van de eerste-ordebenadering. Voor een multiplier van vijf hoeft dus niet iedereen aan een mandaat vast te zitten, als ook de actieve belegger even inelastisch is als het fonds. Bij de verschuiving naar passief verdubbelt de multiplier bijna zonder dat iemand zijn gedrag verandert. In geval 1 maakt dezelfde verschuiving niets uit, omdat beide beleggers daar even elastisch zijn.

4Theorie

De theorie leidt naar één formule en naar de vraag hoe die te meten is. Uit het evenwicht bij een vast aanbod volgt dat de prijs beweegt met de instroom gedeeld door de marktelasticiteit. Daarna zien we waarom een mean-variance-belegger een elasticiteit van tientallen heeft, terwijl Koijen en Yogo er een onder één meten. Tot slot blijkt dat een gewone regressie de elasticiteit niet meet en een granular instrument wel.

4.1Opzet: mandaten, elasticiteiten en evenwicht

Waarom zou dit waar zijn? Als bij een vast aanbod één belegger meer aandelen wil, moet een ander er minder willen. Alleen een hogere prijs kan die ander daartoe bewegen. Hoe ver de prijs moet stijgen, hangt af van hoe sterk de rest op de prijs reageert.

We volgen de eenvoudigste vorm van het model van Gabaix & Koijen (2021), in eigen notatie. In afwijking van de setup schrijven we de prijs als PtP_t en is p=Δlog⁡Pp = \Delta \log P de procentuele prijsverandering, terwijl andere kleine letters, zoals de flows fi,tf_{i,t} en later ctc_t, fracties van een positie of van de marktwaarde zijn en geen logs. Er zijn NN beleggers ii en een vast aantal aandelen SS. Belegger ii vraagt Qi(Pt)Q_i(P_t) aandelen ter waarde van Ei=PtQiE_i = P_t Q_i, met marktaandeel si=Ei/∑jEjs_i = E_i/\sum_j E_j. Zijn prijselasticiteit is

ζi=−∂log⁡Qi∂log⁡P.\zeta_i = -\frac{\partial \log Q_i}{\partial \log P}.

Een elasticiteit van 0,2, zoals die van het fonds in het toy-voorbeeld, betekent dat een prijsstijging van 1% de gevraagde hoeveelheid met 0,2% verlaagt. De elasticiteit van de markt is het waardegewogen gemiddelde ζ=∑isiζi\zeta = \sum_i s_i \zeta_i. Een flow ΔFi\Delta F_i is de verandering in de dollarvraag van belegger ii bij ongewijzigde prijs, bijvoorbeeld de 0,8 uit het toy-voorbeeld.

Proof 1

Na een prijsverandering en een instroom, maar vóór het herbalanceren, is het vermogen W(P)=B0+ΔF+Q0PW(P) = B_0 + \Delta F + Q_0 P. Het mandaat vraagt Q(P)=θW(P)/PQ(P) = \theta W(P)/P, zodat ∂Q/∂P=−θ(B0+ΔF)/P2\partial Q/\partial P = -\theta (B_0 + \Delta F)/P^2. In het uitgangspunt (ΔF=0\Delta F = 0, P=P0P = P_0, B0=(1−θ)W0B_0 = (1-\theta) W_0, P0Q0=θW0P_0 Q_0 = \theta W_0) is dan

ζ=−P0Q0∂Q∂P=θB0P0Q0=θ(1−θ)W0θW0=1−θ.\zeta = -\frac{P_0}{Q_0}\frac{\partial Q}{\partial P} = \frac{\theta B_0}{P_0 Q_0} = \frac{\theta (1-\theta) W_0}{\theta W_0} = 1 - \theta .

Verder is ∂Q/∂ΔF=θ/P0\partial Q/\partial \Delta F = \theta / P_0, dus P0 ΔQ=θ ΔFP_0\,\Delta Q = \theta\,\Delta F. □\square

Het lemma bevestigt stap 1 van het toy-voorbeeld. Een puur aandelenindexfonds (θ=1\theta = 1) heeft elasticiteit nul, terwijl een 60/40-fonds op 0,4 uitkomt. Gabaix en Koijen laten toe dat fondsen hun aandelenfractie naar het verwachte rendement bijsturen, en toch schatten ze de elasticiteit van instellingen rond 0,2 Gabaix & Koijen (2021).

4.2Het kernresultaat: de flow-multiplier

Een instroom verhoogt de prijs met de instroom als fractie van de marktwaarde, gedeeld door de marktelasticiteit. Iedere belegger vermindert zijn vraag als de prijs stijgt, en de prijs stijgt precies zo ver dat die verminderingen samen de instroom opvangen.

Proof 2

Vermenigvuldig de vraag van belegger ii met P0Qi=EiP_0 Q_i = E_i en tel op, dan is P0∑iΔQi=−p∑iζiEi+∑iΔFiP_0 \sum_i \Delta Q_i = -p \sum_i \zeta_i E_i + \sum_i \Delta F_i. Het vaste aanbod maakt de linkerkant nul, dus p∑iζiEi=ΔFp \sum_i \zeta_i E_i = \Delta F en p=ΔF/(ζE)p = \Delta F/(\zeta E) met ζ=∑isiζi\zeta = \sum_i s_i \zeta_i. De marktwaarde verandert in eerste orde met Δ(PS)=p E\Delta(PS) = p\,E, dus Δ(PS)/ΔF=1/ζ\Delta(PS)/\Delta F = 1/\zeta. □\square

Volgens (4) stijgt de prijs meer naarmate de markt minder elastisch is. Bij ζ=0,2\zeta = 0{,}2 maakt een instroom van 1% van de marktwaarde de aandelen 5% duurder, bij ζ=20\zeta = 20 nog maar 0,05%. In het toy-voorbeeld gaf een instroom van 0,8% bij ζ=0,2\zeta = 0{,}2 precies p=4%p = 4\%. Een instroom drijft de prijs dus op, en harder naarmate meer vermogen aan een mandaat vastzit, precies zoals de Tesla-inclusie deed vermoeden.

Voor de replicatie zijn twee kanttekeningen van belang. Netto aankopen tellen over alle beleggers op tot de netto uitgifte, omdat elk gekocht aandeel verkocht is. In het toy-voorbeeld kwam er 1 in het fonds en verschoof de vraag naar aandelen bij de oude prijs met 0,8, terwijl de markt per saldo niets kocht. De prijs beweegt door die 0,8, de verschuiving ΔF\Delta F, en juist die is niet waarneembaar. Verder kunnen een paar zeer elastische hedgefondsen ζ\zeta groot maken, als ze groot genoeg zijn.

4.3Waarom standaardmodellen een elasticiteit van tientallen geven

Een belegger die volgens mean-variance kiest, reageert ongeveer honderd keer sterker op de prijs dan Gabaix en Koijen meten. Stijgt de prijs van een claim op een uitbetaling over een jaar zonder nieuws met één procent, dan daalt het verwachte rendement met ongeveer één procentpunt. Bij een premie van vijf procent is dat een vijfde van de premie. Omdat zijn positie evenredig is met de premie, wil de belegger dan een vijfde minder houden.

Proof 3

Het eindvermogen is W0(1+Rf)+Q(xt+1−(1+Rf)P)W_0 (1+R^{f}) + Q(x_{t+1} - (1+R^{f}) P) en normaal verdeeld, dus de belegger maximaliseert Q(μx−(1+Rf)P)−γ2Q2σx2Q(\mu_x - (1+R^{f})P) - \tfrac{\gamma}{2}Q^2\sigma_x^2, met oplossing Q=(μx−(1+Rf)P)/(γσx2)Q = (\mu_x - (1+R^{f}) P)/(\gamma\sigma_x^2). Dan is −∂log⁡Q/∂log⁡P=(1+Rf)P/(μx−(1+Rf)P)-\partial \log Q/\partial \log P = (1+R^{f}) P/(\mu_x - (1+R^{f}) P), en delen van teller en noemer door PP geeft de formule. □\square

In de noemer van (5) staat de premie. Met een premie van vijf procent per jaar en 1+Rf≈11 + R^{f} \approx 1 is ζ≈1/0,05=20\zeta \approx 1/0{,}05 = 20, honderd keer de waarde van Gabaix en Koijen. Hoe kleiner de premie, hoe groter de elasticiteit, omdat dezelfde prijsstijging dan een groter deel van de premie wegneemt. De waarde 20 geldt alleen voor een prijsafwijking die binnen het jaar terugloopt, omdat alleen dan de hele stijging uit het rendement van dat ene jaar komt. Een permanente afwijking spreidt het verlies over veel jaren en geeft daardoor een veel lagere elasticiteit.

Ook de prijsformule uit Fama, Shiller en “Discount Rates” geeft een volledig vlakke vraagcurve. De prijs is Pt=Et[mt+1xt+1]P_t = \E_t[m_{t+1} x_{t+1}], en bij een representatieve belegger hangt mt+1m_{t+1} af van consumptie, niet van wie welk aandeel houdt. Een model waarin flows prijzen bewegen, laat de SDF dus afhangen van de posities van specifieke beleggers, of laat hun verwachtingen met hun flows meebewegen. Dat laatste is de dichtheid ξ\xi uit Proposition 1, die objectieve in subjectieve verwachtingen omzet.

4.4Het vraagsysteem van Koijen en Yogo

Koijen en Yogo meten elasticiteiten per belegger door aan te nemen dat elke belegger zijn portefeuille kiest op kenmerken van aandelen, zoals grootte en bèta, plus een eigen voorkeur. De gewichten zijn dan per belegger uit zijn posities te schatten. De gevoeligheid van een gewicht voor de eigen marktwaarde van het aandeel is de helling van de vraagcurve van die belegger.

Koijen & Yogo (2019) gebruiken de kwartaalposities van instellingen die meer dan $100 miljoen beheren en daarom hun posities elk kwartaal moeten melden. Belegger ii heeft vermogen AiA_i en kiest uit een universum van aandelen nn. Alles daarbuiten, zoals kas, heet het buitenactivum 0, en het gewicht van aandeel nn ten opzichte daarvan is

wi(n)wi(0)=exp⁡ ⁣(β0,i me(n)+∑kβk,i xk(n)+βK,i) εi(n),\frac{w_i(n)}{w_i(0)} = \exp\!\Big(\beta_{0,i}\, \mathrm{me}(n) + \sum_{k} \beta_{k,i}\, x_k(n) + \beta_{K,i}\Big)\, \varepsilon_i(n),

met me(n)\mathrm{me}(n) de log-marktwaarde, xk(n)x_k(n) kenmerken zoals de boekwaarde-marktwaardeverhouding, en εi(n)≥0\varepsilon_i(n) \ge 0 de latente vraag (latent demand). Die latente vraag is de voorkeur die de kenmerken niet verklaren. De vergelijking heeft de vorm van een logit, waarin de gewichten met het buitenactivum optellen tot één.

Proof 4

Schrijf δ(n)\delta(n) voor de rechterkant van (6). Omdat de gewichten inclusief het buitenactivum optellen tot één, is wi(n)=δ(n)/(1+∑mδ(m))w_i(n) = \delta(n)/(1 + \sum_m \delta(m)), en dus ∂log⁡wi(n)/∂log⁡δ(n)=1−wi(n)\partial \log w_i(n)/\partial \log \delta(n) = 1 - w_i(n). De log-marktwaarde is me(n)=log⁡P(n)+log⁡S(n)\mathrm{me}(n) = \log P(n) + \log S(n), zodat ∂log⁡δ(n)/∂log⁡P(n)=β0,i\partial \log \delta(n)/\partial \log P(n) = \beta_{0,i}. Het aantal gevraagde aandelen is Qi(n)=Aiwi(n)/P(n)Q_i(n) = A_i w_i(n)/P(n), dus ∂log⁡Qi(n)/∂log⁡P(n)=β0,i(1−wi(n))−1\partial \log Q_i(n)/\partial \log P(n) = \beta_{0,i}(1 - w_i(n)) - 1. □\square

Met β0,i=1\beta_{0,i} = 1 belegt iemand als een indexfonds, met elasticiteit nul bij een klein gewicht. Met β0,i=0\beta_{0,i} = 0 houdt hij een vast dollarbedrag, met elasticiteit één. Een elasticiteit van twintig vraagt een sterk negatieve β0,i\beta_{0,i}, en die vinden de schattingen niet. Met dit systeem vinden Koijen et al. (2024) elasticiteiten die daar ver onder blijven, want zelfs hedgefondsen, de meest elastische instellingen, komen gewogen naar vermogen uit op ongeveer een half. Het gaat bovendien om de korte termijn, en volgens Beck (2026) is de prijsimpact op lange termijn kleiner.

De latente vraag is zelf een vraagschok, en daarin zit het identificatieprobleem. Een hogere vraag drijft me(n)\mathrm{me}(n) op, zodat een gewone schatting van β0,i\beta_{0,i} naar boven vertekend is en de vraag inelastischer lijkt dan ze is. Koijen en Yogo instrumenteren daarom met de universa van andere beleggers. Het instrument is de marktwaarde die een aandeel zou hebben als die anderen gelijkgewogen binnen hun universum zouden beleggen. Dat werkt zolang hun universa niet samenhangen met de latente vraag van belegger ii.

Veranderingen in de latente vraag verklaren bij hen het grootste deel van de variantie van rendementen tussen aandelen, veranderingen aan de aanbodkant maar een klein deel Koijen & Yogo (2019). De meeste koersbewegingen van individuele aandelen zijn dus vraagverschuivingen die geen kenmerk uit de factor zoo verklaart.

4.5Granular instrumental variables

Voor de hele markt bestaat geen instrument uit universa, maar de markt bestaat wel uit een paar zeer grote spelers, en hun eigen schokken kunnen als instrument dienen. Verkoopt één groot pensioenfonds na een herzien mandaat, dan komt die verkoop niet uit het sentiment en beweegt ze toch de prijs. Het verschil tussen de groottegewogen en de gelijkgewogen flow isoleert zulke schokken, omdat een gemeenschappelijke schok in beide gemiddelden even groot is.

Gabaix & Koijen (2024) formaliseren dat idee. In de eenvoudigste versie heeft sector ii, bijvoorbeeld de pensioenfondsen, marktaandeel SiS_i met ∑iSi=1\sum_i S_i = 1. Zijn flow in procenten van zijn positie is

fi,t=−ζ pt+ηt+ui,t,f_{i,t} = -\zeta\, p_t + \eta_t + u_{i,t},

met ηt\eta_t een gemeenschappelijke vraagschok (sentiment, macronieuws) en ui,tu_{i,t} idiosyncratische schokken met variantie σu2\sigma_u^2, onafhankelijk over ii en van ηt\eta_t. Het aanbod is vast, zodat ∑iSifi,t=0\sum_i S_i f_{i,t} = 0. We schrijven fE,t=1N∑ifi,tf_{E,t} = \tfrac1N \sum_i f_{i,t} voor de gelijkgewogen flow, en uE,tu_{E,t} en uS,t=∑iSiui,tu_{S,t} = \sum_i S_i u_{i,t} voor de gelijkgewogen en groottegewogen schok. De Herfindahl-index H=∑iSi2H = \sum_i S_i^2 is 1/N1/N bij even grote sectoren en groeit naarmate een paar sectoren domineren.

Proof 5

Stap 1: het instrument bevat alleen idiosyncratische schokken. Het evenwicht geeft 0=−ζpt+ηt+uS,t0 = -\zeta p_t + \eta_t + u_{S,t}, dus pt=(ηt+uS,t)/ζp_t = (\eta_t + u_{S,t})/\zeta. Het gelijkgewogen gemiddelde van (8) is fE,t=−ζpt+ηt+uE,tf_{E,t} = -\zeta p_t + \eta_t + u_{E,t}, en omdat −ζpt+ηt=−uS,t-\zeta p_t + \eta_t = -u_{S,t}, is zt=uS,t−uE,tz_t = u_{S,t} - u_{E,t}.

Stap 2: het instrument is exogeen en relevant. Met onafhankelijke ui,tu_{i,t} is Cov⁡(uS,uE)=σu2∑iSi/N=σu2/N=Var⁡(uE)\Cov(u_S, u_E) = \sigma_u^2 \sum_i S_i/N = \sigma_u^2/N = \Var(u_E), dus Cov⁡(z,uE)=0\Cov(z, u_E) = 0, en η\eta is onafhankelijk van zz. Verder is Cov⁡(z,p)=(Var⁡(uS)−Cov⁡(uE,uS))/ζ=σu2(H−1/N)/ζ\Cov(z, p) = (\Var(u_S) - \Cov(u_E, u_S))/\zeta = \sigma_u^2(H - 1/N)/\zeta.

Stap 3: GIV meet ζ\zeta. Er geldt Cov⁡(z,fE)=−ζCov⁡(z,p)+Cov⁡(z,η+uE)=−ζCov⁡(z,p)\Cov(z, f_E) = -\zeta \Cov(z, p) + \Cov(z, \eta + u_E) = -\zeta\Cov(z,p), en Cov⁡(z,p)≠0\Cov(z,p) \neq 0 zodra H>1/NH > 1/N.

Stap 4: OLS is vertekend. Uit p=(η+uS)/ζp = (\eta + u_S)/\zeta volgt Var⁡(p)=(ση2+σu2H)/ζ2\Var(p) = (\sigma_\eta^2 + \sigma_u^2 H)/\zeta^2. Omdat Cov⁡(uS,uE)=σu2/N\Cov(u_S, u_E) = \sigma_u^2/N uit stap 2, is Cov⁡(p,η+uE)=(ση2+σu2/N)/ζ\Cov(p, \eta + u_E) = (\sigma_\eta^2 + \sigma_u^2/N)/\zeta, dus −Cov⁡(p,fE)/Var⁡(p)=ζ−Cov⁡(p,η+uE)/Var⁡(p)-\Cov(p, f_E)/\Var(p) = \zeta - \Cov(p, \eta + u_E)/\Var(p), en dat is de formule. □\square

Als iedereen tegelijk optimistisch wordt, stijgt de prijs, maar koopt per saldo niemand extra, omdat het aanbod vast is. De gemeten flow is volgens stap 1 van het bewijs fE,t=uE,t−uS,tf_{E,t} = u_{E,t} - u_{S,t}, zonder de gemeenschappelijke schok, zodat een regressie een prijsbeweging zonder bijbehorende flow ziet, en dus vraag die nauwelijks op de prijs reageert. Volgens (9) gaat de OLS-schatter daarom naar nul als zulke gemeenschappelijke schokken domineren (ση2≫σu2\sigma_\eta^2 \gg \sigma_u^2). Neem ση=σu=1%\sigma_\eta = \sigma_u = 1\%, twintig sectoren met Zipf-groottes (H−1/N=0,073H - 1/N = 0{,}073) en ζ=0,2\zeta = 0{,}2. De kansgrens is dan 0,013, een schijnbare multiplier van bijna 80 terwijl de ware 5 is. Een gewone regressie laat de vraag dus te inelastisch lijken, zoals verwacht, maar met een factor van ruim vijftien.

Het instrument werkt dankzij het vaste aanbod. Omdat de groottegewogen flow altijd nul is, geldt zt=−fE,tz_t = -f_{E,t}, en volgens stap 1 van het bewijs blijven daarin alleen idiosyncratische schokken over. GIV haalt zijn kracht uit H−1/NH - 1/N, de mate waarin de markt granular is (gedomineerd door een paar grote spelers), en bij even grote sectoren is het instrument nul. Omdat sectoren in de praktijk verschillend op gemeenschappelijke schokken reageren, halen Gabaix en Koijen die reacties eerst met hoofdcomponenten uit de flows. Op de Flow of Funds van 1993 tot 2018 vinden ze zo, afhankelijk van de specificatie, multipliers tussen 3 en 8 Gabaix & Koijen (2021).

4.6Wat een lage elasticiteit verandert

Een lage elasticiteit maakt koersen beweeglijk en voorspelbaar, en geeft passief beleggen en inkoop van eigen aandelen een koerseffect. Zolang flows traag terugdraaien, draaien ook de prijsafwijkingen traag terug. De prijs-dividendverhouding voorspelt dan rendementen zonder dat iemand een hogere premie eist.

Excess volatility. Vanaf hier is ℓt+1\ell_{t+1} het log rendement. We schrijven de log-prijs als fundamentele waarde plus opgebouwde vraagdruk, log⁡Pt=vt+ct/ζ\log P_t = v_t + c_t/\zeta, met ctc_t de cumulatieve netto flow in procenten van de marktwaarde. Als ctc_t een stationair AR(1)-proces is met persistentie ϕ\phi, onafhankelijk van vtv_t, dan geldt

Var⁡(ℓt+1)=Var⁡(Δvt+1)+Var⁡(Δct+1)ζ2,Et[ℓt+1]−Et[Δvt+1]=−1−ϕζ ct.\Var(\ell_{t+1}) = \Var(\Delta v_{t+1}) + \frac{\Var(\Delta c_{t+1})}{\zeta^2}, \qquad \E_t[\ell_{t+1}] - \E_t[\Delta v_{t+1}] = -\frac{1-\phi}{\zeta}\, c_t .

De eerste term is de volatiliteit die Shiller gerechtvaardigd noemde. De tweede is de excess volatility uit Shiller en LeRoy-Porter: excess volatility, en die groeit met 1/ζ21/\zeta^2. Zijn dividenden evenredig aan de fundamentele waarde, dan is de log prijs-dividendverhouding ct/ζc_t/\zeta plus een constante, en voorspelt ze rendementen met helling −(1−ϕ)-(1-\phi). Zo ontstaat de voorspelbaarheid van Cochrane, en een onderzoeker die alleen prijzen en dividenden ziet, noemt die een tijdvariërende discontovoet, net als in Fama, Shiller en “Discount Rates”.

Passief beleggen. Met een aandeel sPs_P van indexfondsen met elasticiteit nul en een actieve rest met elasticiteit ζA\zeta_A is ζ=(1−sP)ζA\zeta = (1 - s_P)\zeta_A. Een verschuiving naar passief verlaagt de marktelasticiteit dus mechanisch, zoals in stap 5 van het toy-voorbeeld. Eind 2019 bezaten indexfondsen al evenveel van de Amerikaanse beurs als actieve fondsen Investment Company Institute (2020), zoals we in De industrie als financier: indexfondsen, DFA, AQR zagen. Actieve beleggers kunnen daarop agressiever gaan handelen, maar volgens Haddad et al. (2025) compenseren ze maar twee derde van het effect. De groei van passief maakte de vraag naar individuele aandelen zo in twintig jaar 11 procent inelastischer.

Inkoop van eigen aandelen. Een onderneming die voor ΔF\Delta F eigen aandelen inkoopt, werkt in (4) als een instroom van ΔF\Delta F, zolang de verkopers de opbrengst niet herbeleggen. De prijs per aandeel stijgt dan met ΔF/(ζE)\Delta F/(\zeta E), en de marktwaarde verandert met ongeveer (1/ζ−1)ΔF(1/\zeta - 1)\Delta F. Bij oneindige elasticiteit daalt de marktwaarde met de uitbetaling, zoals bij Miller en Modigliani Miller & Modigliani (1961), maar bij ζ=0,2\zeta = 0{,}2 stijgt ze met 4ΔF4\Delta F.

De tegenhanger. Het klassieke tegenargument staat in Fama en de efficiënte markt en bij Grossman & Stiglitz (1980). Als flows prijzen van hun fundamentele waarde wegduwen, loont het om geïnformeerd tegen die flows in te handelen, en juist die handelaren maken de vraag elastisch. Een lage elasticiteit vraagt dus een verklaring waarom zo weinig kapitaal die rol speelt. Kandidaten zijn de limits of arbitrage uit Behavioral finance en limits of arbitrage, de kapitaalbeperkingen van intermediairs uit 2008 en intermediary asset pricing en mandaten die ook professionals binden. De elasticiteit is daarmee geen natuurconstante maar een uitkomst van het evenwicht.

5Simulatie: de elasticiteit meten met OLS en GIV

Hoe dicht komen OLS en GIV bij de ware elasticiteit in een steekproef zo lang als die van Gabaix en Koijen? We simuleren (8) met ζ=0,2\zeta = 0{,}2, de waarde uit het toy-voorbeeld, en dus met een ware multiplier van 5. Beide soorten schokken hebben een standaarddeviatie van 1% per kwartaal. De sectoren zijn verdeeld volgens Zipf (Si∝1/iS_i \propto 1/i) of, ter vergelijking, bijna even groot (Si∝i−0,1S_i \propto i^{-0{,}1}). We variëren het aantal sectoren NN en het aantal kwartalen TT, waarvan 104 de steekproef van Gabaix en Koijen is.

def demean(a):
    """Subtract the time-series mean of each simulated sample."""
    return a - a.mean(axis=1, keepdims=True)


def simulate_giv(n_sim, T, N, zeta=0.2, sd_common=0.01, sd_idio=0.01, zipf=1.0):
    """OLS and GIV estimates of the elasticity in the granular flow model, one per simulated sample."""
    sizes = np.arange(1, N + 1, dtype=float) ** -zipf
    sizes /= sizes.sum()
    common = rng.normal(0.0, sd_common, (n_sim, T, 1))
    idio = rng.normal(0.0, sd_idio, (n_sim, T, N))
    price = (common[..., 0] + idio @ sizes) / zeta
    flows = -zeta * price[..., None] + common + idio
    flow_eq = flows.mean(axis=2)
    giv = flows @ sizes - flow_eq
    ols = -(demean(price) * demean(flow_eq)).sum(1) / (demean(price) ** 2).sum(1)
    iv = -(demean(giv) * demean(flow_eq)).sum(1) / (demean(giv) * demean(price)).sum(1)
    return ols, iv, (sizes**2).sum()


giv_rows, giv_draws = {}, {}
for T in (40, 104, 400):
    for N in (5, 20):
        for zipf in (1.0, 0.1):
            ols, iv, herfindahl = simulate_giv(4000, T, N, zipf=zipf)
            giv_draws[(T, N, zipf)] = (ols, iv)
            bias = 0.2 * (1 - (0.01**2 + 0.01**2 / N) / (0.01**2 + 0.01**2 * herfindahl))
            giv_rows[(T, N, "Zipf" if zipf == 1.0 else "bijna gelijk")] = {
                "H - 1/N": herfindahl - 1 / N, "OLS mediaan": np.median(ols), "OLS plim (formule)": bias,
                "GIV mediaan": np.median(iv),
                "GIV 5e-95e pct": f"{np.percentile(iv, 5):.2f} tot {np.percentile(iv, 95):.2f}",
                "P(3 < M < 8)": np.mean((iv > 1 / 8) & (iv < 1 / 3))}
pd.DataFrame(giv_rows).T.rename_axis(["T", "N", "groottes"]).round(3)
Loading...

In de tabel ligt de mediaan van OLS bij elke TT en NN op de kansgrens uit (9), ongeveer 0,013 met Zipf-groottes en 0,0001 met bijna gelijke sectoren. Meer data helpt dus niet, omdat het om een vertekening gaat en niet om ruis. GIV heeft met Zipf-groottes een mediaan van 0,20 zodra T≥104T \ge 104, en het aantal sectoren maakt weinig uit, omdat H−1/NH - 1/N steeds ongeveer even groot is. Met bijna gelijke sectoren is het instrument zwak. De mediaan zakt dan naar 0,01 tot 0,07, en de multiplier valt in hoogstens een op de vijf steekproeven tussen 3 en 8.

Links in de figuur is de afstand tussen de histogrammen van OLS en GIV de vertekening, en rechts wordt de verdeling van de multiplier smaller naarmate TT groeit.

Source
fig, axes = plt.subplots(1, 2, figsize=(11, 4.2))
bins = np.linspace(-0.3, 0.8, 56)
ols_104, iv_104 = giv_draws[(104, 20, 1.0)]
axes[0].hist(ols_104, bins=bins, alpha=0.6, label="OLS")
axes[0].hist(iv_104, bins=bins, alpha=0.6, label="GIV")
axes[0].axvline(0.2, color="black", lw=1.2, label="ware $\\zeta$ = 0,2")
axes[0].set_title("104 kwartalen, 20 sectoren (Zipf)")
axes[0].set_xlabel("Geschatte elasticiteit $\\hat\\zeta$")
axes[0].set_ylabel("Aantal steekproeven")
axes[0].legend()
for i, T in enumerate((40, 104, 400)):
    implied = 1 / giv_draws[(T, 20, 1.0)][1]
    axes[1].hist(np.clip(implied, -5, 20), bins=np.linspace(-5, 20, 51), histtype="step", lw=1.6,
                 color=hap.plotting.COLORS[i], label=f"T = {T}")
axes[1].axvline(5, color="black", lw=1.2)
axes[1].set_title("Geïmpliceerde multiplier $1/\\hat\\zeta^{GIV}$ (afgekapt op -5 en 20)")
axes[1].set_xlabel("Multiplier $M$")
axes[1].set_ylabel("Aantal steekproeven")
axes[1].legend()
plt.show()
<Figure size 1210x462 with 2 Axes>
<Figure size 1210x462 with 2 Axes>

Figure 2:Links ligt de OLS-schatter bij 104 kwartalen vlak bij nul, terwijl GIV rond de ware 0,2 ligt. Rechts is de multiplier uit GIV scheef verdeeld, vaak negatief of enorm bij 40 kwartalen en bijna altijd tussen 3 en 8 bij 400 kwartalen.

Met 104 kwartalen ligt het 90%-interval van ζ^GIV\hat\zeta^{\mathrm{GIV}} tussen 0,12 en 0,51, een multiplier tussen ongeveer 2 en 8, en dat is ongeveer de spreiding van 3 tot 8 over de specificaties van Gabaix en Koijen. Hun vijf dollar is dus het midden van een breed interval, dat pas met 400 kwartalen krimpt tot 0,15 à 0,29.

6Replicatie op echte data

6.1Netto aankopen en rendementen in de Financial Accounts

We lezen de netto aankopen per sector in als fractie van de marktwaarde, en tellen beleggingsfondsen en ETF’s op tot één reeks fondsaankopen.

FOF_SERIES = {
    "huishoudens": "HNOCESQ027S",
    "beleggingsfondsen": "BOGZ1FA653064100Q",
    "ETF's": "BOGZ1FA563064100Q",
    "pensioenfondsen": "BOGZ1FA593064105Q",
    "verzekeraars": "BOGZ1FA523064105Q",
    "buitenland": "ROWCEAQ027S",
    "uitgifte niet-fin. bedrijven": "NCBCEBQ027S",
    "alle sectoren": "BOGZ1FA893064105Q",
}
raw_flows = pd.concat({name: hap_data.fred(sid)[sid] for name, sid in FOF_SERIES.items()}, axis=1, sort=True)
market_value = hap_data.fred("BOGZ1LM893064105Q")["BOGZ1LM893064105Q"]
raw_flows.index = raw_flows.index + pd.offsets.QuarterEnd(0)          # FRED stamps the quarter start
market_value.index = market_value.index + pd.offsets.QuarterEnd(0)

# annual rate / 4 = flow in the quarter, as a fraction of the market value at the start of the quarter
flows = raw_flows.div(4 * market_value.shift(1), axis=0)
flows["fondsen"] = flows["beleggingsfondsen"] + flows["ETF's"]

monthly_market = hap_data.market_monthly()["Mkt"]
quarterly_return = ((1 + monthly_market).resample("QE").prod() - 1).where(
    monthly_market.resample("QE").count() == 3).rename("rendement")
panel = pd.concat([quarterly_return, flows], axis=1, sort=True).loc["1952-03-31":"2026-06-30"]
panel = panel.dropna(subset=["rendement", "fondsen"])

first_etf_quarter = panel.index[panel["ETF's"].ne(0).argmax()]
print(f"{panel.index[0]:%Y-%m} t/m {panel.index[-1]:%Y-%m}: {len(panel)} kwartalen; "
      f"eerste kwartaal met ETF-aankopen: {first_etf_quarter:%Y-%m}")
(100 * panel.drop(columns="rendement").describe().loc[["mean", "std", "min", "max"]]).T.round(3)
1952-03 t/m 2026-06: 298 kwartalen; eerste kwartaal met ETF-aankopen: 1993-03
Loading...

De steekproef telt 298 kwartalen, en de eerste ETF-aankopen vallen in 1993. Huishoudens zijn in deze cijfers grotendeels de sluitpost, zodat hun reeks de meetfouten van de andere sectoren erft. Daarna regresseren we het kwartaalrendement van de markt op elke reeks afzonderlijk, met Newey-West-standaardfouten.

def flow_regression(frame, regressor, lags=4):
    """Contemporaneous regression of the quarterly market return on one flow series (Newey-West)."""
    fit = hap.newey_west(frame["rendement"], frame[[regressor]], lags=lags)
    used = frame[["rendement", regressor]].dropna()
    return {"helling": fit.params[regressor], "t (NW)": fit.tvalues[regressor], "R2": fit.rsquared,
            "sd flow (% MV)": 100 * used[regressor].std(), "kwartalen": int(fit.nobs),
            "vanaf": f"{used.index[0]:%Y}"}


regressors = ["fondsen", "beleggingsfondsen", "ETF's", "pensioenfondsen", "verzekeraars", "buitenland",
              "huishoudens", "uitgifte niet-fin. bedrijven", "alle sectoren"]
flow_table = pd.DataFrame({x: flow_regression(panel, x) for x in regressors}).T
flow_table.loc["fondsen, 1993-2018"] = flow_regression(panel.loc["1993":"2018"], "fondsen")
flow_table.loc["ETF's, 2000-2026"] = flow_regression(panel.loc["2000":], "ETF's")
flow_table.infer_objects().round(3)
Loading...

De fondsaankopen hebben de duidelijkste positieve helling, en ook de beleggingsfondsen afzonderlijk zijn significant. Pensioenfondsen en verzekeraars hebben een negatieve, niet significante helling, wat past bij herbalanceren tegen de markt in. De aankopen van alle sectoren samen, de totale netto uitgifte, verklaren niets (t=1,0t = 1{,}0). Links in de figuur staat de puntenwolk met de stippellijn van helling 5 ernaast, en rechts volgen de netto aankopen per sector in de tijd, zodat te zien is welke sectoren kopen als andere verkopen.

Source
fig, axes = plt.subplots(1, 2, figsize=(11, 4.3))
ok = panel[["fondsen", "rendement"]].dropna()
axes[0].scatter(100 * ok["fondsen"], 100 * ok["rendement"], s=14, alpha=0.6)
slope, intercept = np.polyfit(ok["fondsen"], ok["rendement"], 1)
grid_f = np.linspace(ok["fondsen"].min(), ok["fondsen"].max(), 50)
axes[0].plot(100 * grid_f, 100 * (intercept + slope * grid_f), color="black", lw=1.2,
             label=f"OLS, helling {slope:.1f}")
axes[0].plot(100 * grid_f, 100 * (ok["rendement"].mean() + 5 * (grid_f - ok["fondsen"].mean())),
             color=hap.plotting.COLORS[1], ls="--", lw=1.2, label="helling 5 (Gabaix-Koijen)")
axes[0].set_title("Kwartaalrendement tegen netto aankopen door fondsen")
axes[0].set_xlabel("Netto aankopen beleggingsfondsen + ETF's (% van de marktwaarde)")
axes[0].set_ylabel("Rendement van de markt (%)")
axes[0].legend()
for i, name in enumerate(["fondsen", "pensioenfondsen", "buitenland", "huishoudens", "uitgifte niet-fin. bedrijven"]):
    axes[1].plot(panel.index, 100 * panel[name].rolling(4).sum(), color=hap.plotting.COLORS[i], lw=1.2, label=name)
axes[1].axhline(0, color="black", lw=0.6)
axes[1].set_title("Netto aankopen per sector, voortschrijdend over vier kwartalen")
axes[1].set_xlabel("Jaar")
axes[1].set_ylabel("% van de marktwaarde per jaar")
axes[1].legend()
plt.show()
<Figure size 1210x473 with 2 Axes>

Links is de OLS-lijn steiler dan de lijn met helling 5, maar de punten liggen er breed omheen. Rechts nemen de fondsen vanaf de jaren negentig de rol van koper over van de pensioenfondsen, die tot de jaren tachtig kochten en daarna per saldo verkopen. Sinds de jaren tachtig kopen ook ondernemingen per saldo eigen aandelen in, terwijl huishoudens meestal verkopen. De tabel zet onze hellingen naast de schattingen van Gabaix en Koijen.

Gabaix en Koijen (GIV)hier (OLS op fondsaankopen)
1993–20185,28 (SE 1,10) en 7,08 (SE 1,86)16,4 (t=3,6t = 3{,}6)
1952–2026–7,3 (t=2,8t = 2{,}8), R2R^2 = 3%

Gedeeltelijk geslaagd. Het teken is positief, zoals we vooraf verwachtten, maar de helling hangt af van de periode, van 7,3 over alle jaren tot 16,4 over die van Gabaix en Koijen. Een OLS-helling van 7 of 16 is bovendien geen multiplier, omdat fondsflows ook op het rendement zelf reageren, zoals oefening 3 laat zien.

6.2Veertien S&P 500-toevoegingen

De gepubliceerde inclusie-effecten zijn in de loop van de tijd gekrompen, zoals de gemiddelden in de tabel laten zien, al meet elke studie over een ander venster.

published_index_effect = pd.DataFrame(
    [["Shleifer (1986), volgens Petajisto (2011)", "1976-1983", "S&P 500", "aankondiging", 3.0],
     ["Petajisto (2011), tabel 1", "1990-2000", "S&P 500", "aankondiging tot opname", 10.3],
     ["Petajisto (2011), tabel 1", "2001-2005", "S&P 500", "aankondiging tot opname", 4.6],
     ["Greenwood-Sammon (werkversie 2022)", "1980-1989", "S&P 500", "dag voor aankondiging tot dag na opname", 3.42],
     ["Greenwood-Sammon (werkversie 2022)", "1990-1999", "S&P 500", "dag voor aankondiging tot dag na opname", 7.6],
     ["Greenwood-Sammon (werkversie 2022)", "2000-2009", "S&P 500", "dag voor aankondiging tot dag na opname", 5.21],
     ["Greenwood-Sammon (werkversie 2022)", "2010-2020", "S&P 500", "dag voor aankondiging tot dag na opname", 0.8],
     ["Chang-Hong-Liskovich (werkversie 2013)", "1996-2012", "Russell 2000", "junirendement na herindeling", 5.0]],
    columns=["bron", "periode", "index", "venster", "gem. rendement toevoeging (%)"],
)
published_index_effect
Loading...

Het effect groeit tot in de jaren negentig en verdwijnt daarna bijna. De decenniagetallen van Greenwood en Sammon komen uit hun NBER-werkversie (w30748, 2022), en de gepubliceerde versie noemt 7,4% voor de jaren negentig. Chang, Hong en Liskovich vergelijken aandelen vlak boven en vlak onder de grens tussen de Russell 1000 en de Russell 2000, waar veel meer indexgeld volgt. Die regression discontinuity (een vergelijking rond een grens) is de schoonste meting van een vraagcurve die we hebben.

Nu berekenen we het abnormale rendement, het rendement min dat van de markt, voor de veertien aandelen uit De event study die tussen 2012 en 2024 werden toegevoegd.

EVENT_TICKERS = ["AAPL", "ADBE", "AMZN", "ANET", "APH", "AVGO", "BAC", "BRK-B", "CMG", "CPRT", "CRM", "CSX",
                 "CTAS", "CVX", "DE", "DHR", "DXCM", "EW", "FAST", "FTNT", "GILD", "GOOGL", "IDXX", "ISRG",
                 "KO", "LRCX", "MA", "MNST", "NFLX", "NKE", "NOW", "NVDA", "ODFL", "ORLY", "PANW", "PG",
                 "QCOM", "ROST", "SBUX", "SHW", "SMCI", "TJX", "TSCO", "TSLA", "UNH", "UNP", "V", "WFC",
                 "WMT", "WRB"]
# S&P Dow Jones Indices press releases: (announcement date, first trading day as a constituent)
INCLUSIONS = {
    "MNST": ("2012-06-21", "2012-06-29"), "TSCO": ("2014-01-16", "2014-01-24"),
    "AVGO": ("2014-05-05", "2014-05-08"), "IDXX": ("2017-01-03", "2017-01-05"),
    "CPRT": ("2018-06-25", "2018-07-02"), "ANET": ("2018-08-23", "2018-08-28"),
    "FTNT": ("2018-10-04", "2018-10-11"), "NOW": ("2019-11-19", "2019-11-21"),
    "WRB": ("2019-11-27", "2019-12-05"), "ODFL": ("2019-12-02", "2019-12-09"),
    "DXCM": ("2020-05-06", "2020-05-12"), "TSLA": ("2020-11-16", "2020-12-21"),
    "PANW": ("2023-06-02", "2023-06-20"), "SMCI": ("2024-03-01", "2024-03-18"),
}

prices_daily = hap_data.yahoo(EVENT_TICKERS, start="2002-01-01", end="2026-08-01")
market_daily = hap_data.market_daily()["Mkt"]
common_days = prices_daily.index.intersection(market_daily.index)
abnormal = prices_daily.pct_change(fill_method=None).loc[common_days].sub(market_daily.loc[common_days], axis=0)

event_rows = {}
for ticker, (announced, effective) in INCLUSIONS.items():
    day_one = common_days.searchsorted(pd.Timestamp(announced), side="right")   # announced after the close
    day_effective = common_days.searchsorted(pd.Timestamp(effective))
    ar = abnormal[ticker].to_numpy()
    event_rows[ticker] = {"aankondiging": announced, "opname": effective,
                          "handelsdagen tot opname": day_effective - day_one,
                          "AR dag +1 (%)": 100 * ar[day_one],
                          "CAR tot opname (%)": 100 * ar[day_one:day_effective].sum(),
                          "CAR 20 dagen vanaf opname (%)": 100 * ar[day_effective:day_effective + 20].sum()}
event_table = pd.DataFrame(event_rows).T
event_table.round(2)
Loading...

Tesla springt eruit met 51% van aankondiging tot opname, over 23 handelsdagen. Daarom vatten we de drie vensters samen over alle veertien aandelen en over de dertien zonder Tesla.

def event_summary(frame):
    """Cross-sectional mean, standard error, t-value and median of event returns."""
    se = frame.std(ddof=1) / np.sqrt(len(frame))
    return pd.DataFrame({"gemiddelde": frame.mean(), "SE": se, "t": frame.mean() / se, "mediaan": frame.median()})


event_returns = event_table[["AR dag +1 (%)", "CAR tot opname (%)", "CAR 20 dagen vanaf opname (%)"]].astype(float)
pd.concat({"alle 14": event_summary(event_returns),
           "zonder Tesla": event_summary(event_returns.drop("TSLA"))}).round(2)
Loading...

Op de eerste handelsdag na de aankondiging is het abnormale rendement gemiddeld 3,1%, en zonder Tesla loopt het in de twintig dagen na opname deels terug, al is die daling niet significant. De tabel zet het rendement van aankondiging tot opname naast de gepubliceerde getallen.

periodeaankondiging tot opname (%)SE
Petajisto (2011)1990–20058,8–
Greenwood en Sammon (werkversie)2010–20200,8–
hier, alle veertien2012–20245,74,0
hier, zonder Tesla2012–20242,22,2

Geslaagd wat het teken en het ontbreken van een groot effect betreft, maar een multiplier levert deze proef niet op. Het aankondigingsrendement is positief, en zonder Tesla ligt het rendement tot opname op één standaardfout van nul, dichter bij Greenwood en Sammon dan bij Petajisto. Met veertien gebeurtenissen is de standaardfout wel zo groot als het effect dat de literatuur zoekt. Dat het effect verdween terwijl het indexgeld sterk groeide Greenwood & Sammon (2025), is zelf een puzzel voor de hypothese van inelastische markten.

7Wat er brak, en wat daarna kwam

Wat het model verklaart. Eén parameter, de elasticiteit van de vraag, verbindt feiten die elk een eigen verklaring hadden. Inclusies verhogen prijzen zonder nieuws, van Shleifers eerste metingen tot de regression discontinuity van Chang, Hong en Liskovich. Flows op een inelastische markt maken excess volatility en voorspelbaarheid tegelijk, zonder dat iemand zijn discontovoet verandert. Ook passief beleggen en inkoop van eigen aandelen krijgen een prijseffect dat de standaardtheorie niet kent.

Waar het breekt. Het model breekt op de meting. Een gewone regressie laat de vraag extreem inelastisch lijken, en zelfs GIV geeft met een kwart eeuw kwartaaldata een multiplier die ergens tussen 2 en 8 ligt. Onze OLS-helling op fondsflows ligt tussen 7 en 16, maar is geen multiplier, omdat flows ook op rendementen reageren. Het schoonste natuurlijke experiment wijst bovendien de verkeerde kant op. Het inclusie-effect verdween terwijl het indexgeld groeide, en onze toevoegingen zonder Tesla geven 2,2% met een even grote standaardfout.

Risico of vergissing? In de Chicago-lezing is een flow een verandering in iemands risicobereidheid of verwachtingen, dus een discontovoetschok onder een andere naam. De multiplier meet dan hoe schaars risicodragend kapitaal is, zoals bij de intermediairs van 2008 en intermediary asset pricing, en mandaten zijn een rationele institutionele keuze. In de Yale-lezing bewegen prijzen om redenen buiten de fundamentele waarde, en zijn inelastische markten de limits of arbitrage van Behavioral finance en limits of arbitrage op de schaal van de hele markt. Posities en flows van de beleggers die de prijs zetten, met instrumenten voor hun eigen schokken, zouden de lezingen kunnen scheiden. Die gegevens bestaan echter alleen voor instellingen. Voor een belegger die tegen een flow in koopt, blijft dus open of hij een risicopremie verdient of iets denkt te weten wat de prijs niet weet.

Wat er daarna kwam. Als flows het niveau van de markt zetten en indexfondsen niet op informatie handelen, wie maakt prijzen dan nog informatief? Santa-Clara vermoedt dat machines de markt als geheel niet efficiënter maken, omdat dat niveau wordt gezet door flows op een inelastische markt Santa-Clara (2026). Wat taalmodellen dan wel met prijzen doen, onderzoekt LLM’s, advies en efficiëntie.

8Oefeningen

Solution to Exercise 1

(1) Met (4) is ζ=(1−sP)ζA\zeta = (1 - s_P)\zeta_A en M=1/((1−sP)ζA)M = 1/((1 - s_P)\zeta_A). Bij sP=0,2s_P = 0{,}2 is ζ=0,8\zeta = 0{,}8 en M=1,25M = 1{,}25, en bij sP=0,5s_P = 0{,}5 is ζ=0,5\zeta = 0{,}5 en M=2M = 2.

(2) Zonder reactie zou ζ\zeta met 0,3 dalen. Wordt twee derde daarvan gecompenseerd, dan daalt ze maar met 0,1 tot 0,7. Dan is ζA=0,7/0,5=1,4\zeta_A = 0{,}7/0{,}5 = 1{,}4 en M=1/0,7=1,43M = 1/0{,}7 = 1{,}43.

(3) De inkoop werkt als een instroom van 1% van de marktwaarde, zodat de prijs per aandeel met 1%/ζ1\%/\zeta stijgt en de marktwaarde met (1/ζ−1)×1%(1/\zeta - 1) \times 1\% verandert. De code rekent de drie antwoorden na.

def passive_market(s_passive, zeta_active):
    """Aggregate elasticity and multiplier with zero-elasticity index funds."""
    zeta = (1 - s_passive) * zeta_active
    return zeta, 1 / zeta


print("s_P = 0.2:", passive_market(0.2, 1.0), " s_P = 0.5:", passive_market(0.5, 1.0))
zeta_after = passive_market(0.2, 1.0)[0] - (1 / 3) * (passive_market(0.2, 1.0)[0] - passive_market(0.5, 1.0)[0])
zeta_active_new = zeta_after / 0.5
print(f"met strategische reactie: zeta_A = {zeta_active_new:.2f}, M = {1 / zeta_after:.3f}")
for zeta in (zeta_after, 20.0):
    print(f"zeta = {zeta:5.2f}: prijs per aandeel +{1 / zeta:.3f}%, marktwaarde {1 / zeta - 1:+.3f}% van de marktwaarde")
s_P = 0.2: (0.8, 1.25)  s_P = 0.5: (0.5, 2.0)
met strategische reactie: zeta_A = 1.40, M = 1.429
zeta =  0.70: prijs per aandeel +1.429%, marktwaarde +0.429% van de marktwaarde
zeta = 20.00: prijs per aandeel +0.050%, marktwaarde -0.950% van de marktwaarde

In de markt uit (2) stijgen de prijs per aandeel en de marktwaarde met 1,43% en 0,43%, hoewel er 1% is uitgekeerd. Bij ζ=20\zeta = 20 stijgt de prijs met 0,05% en daalt de marktwaarde met 0,95%. De strategische reactie dempt het effect van passief dus maar heft het niet op, en of inkoop waarde creëert, hangt in een inelastische markt af van de elasticiteit.

Solution to Exercise 2

(1) Uit het bewijs van Proposition 4 volgt ζ^GIV−ζ=−Cov⁡^(z,η+uE)/Cov⁡^(z,p)\hat\zeta^{\mathrm{GIV}} - \zeta = -\widehat{\Cov}(z, \eta + u_E)/\widehat{\Cov}(z, p). De teller heeft verwachting nul en, omdat zz onafhankelijk is van η+uE\eta + u_E, variantie Var⁡(z)Var⁡(η+uE)/T\Var(z)\Var(\eta + u_E)/T, met Var⁡(z)=Var⁡(uS−uE)=σu2(H−2/N+1/N)=σu2(H−1/N)\Var(z) = \Var(u_S - u_E) = \sigma_u^2(H - 2/N + 1/N) = \sigma_u^2(H - 1/N) en Var⁡(η+uE)=ση2+σu2/N\Var(\eta + u_E) = \sigma_\eta^2 + \sigma_u^2/N. De noemer convergeert naar σu2(H−1/N)/ζ\sigma_u^2(H - 1/N)/\zeta, en delen geeft de formule.

(2) en (3) De cel berekent de formule en zet de uitkomst naast de robuuste spreiding van de simulatie.

sizes_20 = 1 / np.arange(1, 21)
sizes_20 /= sizes_20.sum()
excess_h = (sizes_20**2).sum() - 1 / 20
rows_se = {}
for sd_idio in (0.005, 0.01, 0.02):
    se_formula = 0.2 * np.sqrt(0.01**2 + sd_idio**2 / 20) / (sd_idio * np.sqrt(excess_h * 104))
    _, iv_draws, _ = simulate_giv(4000, 104, 20, sd_idio=sd_idio)
    q25, q75 = np.percentile(iv_draws, [25, 75])
    rows_se[sd_idio] = {"SE formule (T=104)": se_formula, "IQR/1.349 simulatie": (q75 - q25) / 1.349,
                        "T voor SE = 0.05": int(np.ceil(104 * (se_formula / 0.05) ** 2))}
pd.DataFrame(rows_se).T.rename_axis("sigma_u").round(3)
Loading...

Formule en simulatie liggen dicht bij elkaar. We gebruiken de interkwartielafstand gedeeld door 1,349, omdat een verhouding van twee schattingen dikke staarten heeft. Bij σu=1%\sigma_u = 1\% zijn ongeveer 230 kwartalen nodig, bijna zestig jaar, en bij grotere idiosyncratische schokken veel minder. GIV haalt zijn informatie dus uit de eigen schokken van grote spelers, die niet met de gemeenschappelijke vraag samenhangen.

Solution to Exercise 3

De cel schat de drie regressies met Newey-West-standaardfouten.

lead_lag = panel[["rendement", "fondsen"]].assign(
    rendement_vorig=panel["rendement"].shift(1), fondsen_vorig=panel["fondsen"].shift(1))
specs_ll = {"fondsen op rendement vorig kwartaal": ("fondsen", ["rendement_vorig"]),
            "rendement op fondsen vorig kwartaal": ("rendement", ["fondsen_vorig"]),
            "rendement op fondsen + fondsen vorig": ("rendement", ["fondsen", "fondsen_vorig"])}
rows_ll = {}
for label, (y, xs) in specs_ll.items():
    fit = hap.newey_west(lead_lag[y], lead_lag[xs], lags=4)
    rows_ll[label] = {**{f"b({x})": fit.params[x] for x in xs}, **{f"t({x})": fit.tvalues[x] for x in xs},
                      "R2": fit.rsquared, "N": int(fit.nobs)}
pd.DataFrame(rows_ll).T.round(3)
Loading...

Fondsflows volgen het rendement van het vorige kwartaal (t=2,1t = 2{,}1). Met de vorige flow erbij stijgt de gelijktijdige helling naar 14,0, en is die van de vorige flow −10,5-10{,}5 (t=−3,0t = -3{,}0). Dat past bij prijsdruk die deels terugloopt, maar ook bij flows die rendementen najagen. OLS scheidt die twee lezingen niet, en daarvoor is een instrument als GIV nodig.

References
  1. Shleifer, A. (1986). Do Demand Curves for Stocks Slope Down? The Journal of Finance, 41(3), 579–590. 10.1111/j.1540-6261.1986.tb04518.x
  2. Koijen, R. S. J., & Yogo, M. (2019). A Demand System Approach to Asset Pricing. Journal of Political Economy, 127(4), 1475–1515. 10.1086/701683
  3. Gabaix, X., & Koijen, R. S. J. (2021). In Search of the Origins of Financial Fluctuations: The Inelastic Markets Hypothesis (NBER Working Paper No. 28967). National Bureau of Economic Research. 10.3386/w28967
  4. Santa-Clara, P. (2026). What I Learned About Asset Pricing. LinkedIn post. https://www.linkedin.com/pulse/what-i-learned-asset-pricing-pedro-santa-clara-apjce/
  5. Wurgler, J., & Zhuravskaya, E. (2002). Does Arbitrage Flatten Demand Curves for Stocks? The Journal of Business, 75(4), 583–608. 10.1086/341636
  6. Koijen, R. S. J., Richmond, R. J., & Yogo, M. (2024). Which Investors Matter for Equity Valuations and Expected Returns? The Review of Economic Studies, 91(4), 2387–2424. 10.1093/restud/rdad083
  7. van der Beck, P. (2026). Short- versus Long-run Demand Elasticities in Asset Pricing. Journal of Financial Economics, 184, 104337. 10.1016/j.jfineco.2026.104337
  8. Gabaix, X., & Koijen, R. S. J. (2024). Granular Instrumental Variables. Journal of Political Economy, 132(7), 2274–2303. 10.1086/728743
  9. Investment Company Institute. (2020). 2020 Investment Company Fact Book. 60th edition. https://www.ici.org/system/files/attachments/pdf/2020_factbook.pdf
  10. Haddad, V., Huebner, P., & Loualiche, E. (2025). How Competitive Is the Stock Market? Theory, Evidence from Portfolios, and Implications for the Rise of Passive Investing. American Economic Review, 115(3), 975–1018. 10.1257/aer.20230505
  11. Miller, M. H., & Modigliani, F. (1961). Dividend Policy, Growth, and the Valuation of Shares. The Journal of Business, 34(4), 411–433. 10.1086/294442
  12. Grossman, S. J., & Stiglitz, J. E. (1980). On the Impossibility of Informationally Efficient Markets. American Economic Review, 70(3), 393–408.
  13. Petajisto, A. (2011). The Index Premium and Its Hidden Cost for Index Funds. Journal of Empirical Finance, 18(2), 271–288. 10.1016/j.jempfin.2010.10.002
  14. Greenwood, R., & Sammon, M. (2025). The Disappearing Index Effect. The Journal of Finance, 80(2), 657–698. 10.1111/jofi.13410

Deze onafhankelijke site is niet verbonden aan of onderschreven door QuantEcon. De vormgeving is gebaseerd op het MIT-gelicentieerde QuantEcon MyST-thema. Zie THIRD_PARTY_NOTICES.md voor de licentie-informatie.