Skip to article frontmatterSkip to article content
Contents
Merton: continue tijd en het ICAPM
Maarten Nies

Merton: continue tijd en het ICAPM

1Overzicht

Belegt een langetermijnbelegger anders, en verandert dat de prijzen? Dat gebeurt alleen als de beleggingskansen in de tijd veranderen. Dan houdt hij naast de marktportefeuille een hedgeportefeuille tegen slechter wordende kansen, en beloont het verwachte rendement naast de marktbèta ook de bèta op de variabelen die die kansen beschrijven. In dit college:

  • rekenen we in een model van twee perioden uit dat een voorspelbaar rendement de vraag naar aandelen verhoogt, en een onvoorspelbaar rendement niet;

  • leiden we af dat de horizon bij onafhankelijke rendementen niet uitmaakt, wat de optimale portefeuille in continue tijd is, en hoe de hedgevraag en de prijsvergelijking van het ICAPM daaruit volgen;

  • simuleren we hoe goed een eeuw data de hedgevraag meet;

  • repliceren we het VAR van Barberis (2000), de horizonallocaties in de geest van Campbell & Viceira (1999) en het effect van parameteronzekerheid.

In 1969 verschenen twee artikelen over hetzelfde probleem: hoe verdeelt iemand die een leven lang belegt zijn vermogen over een veilig en een risicovol activum? Samuelson loste het op in discrete tijd Samuelson (1969), zijn student Merton in continue tijd Merton (1969). Bij onafhankelijke rendementen deed de horizon er in beide gevallen niet toe. In 1973 liet Merton de beleggingskansen zelf bewegen en leidde hij het intertemporal CAPM (ICAPM) af Merton (1973). Met dat werk begon een nieuw tijdvak, omdat het asset pricing dynamisch maakte. Toen de dividendopbrengst rendementen bleek te voorspellen, rekenden Kim & Omberg (1996) en Campbell & Viceira (1999) de hedgevraag uit.

Is het ICAPM theorie of feit? Het is een theorie met een open plek, want het zegt welke vorm een prijsvergelijking heeft, maar niet welke variabelen erin horen. Daardoor laat het elk meerfactormodel toe waarvan de factoren iets over de toekomst voorspellen. De empirie van dit college toetst daarom de vraagkant, de hedgevraag, en niet de prijsvergelijking zelf.

2Intuïtie: waarom zou dit waar zijn?

Een oude volkswijsheid zegt dat wie jong is meer in aandelen moet beleggen, omdat slechte jaren over een lange periode uitmiddelen. Samuelson vond dat een drogreden. Komen de rendementen elk jaar uit dezelfde verdeling, dan staat een belegger elk jaar voor hetzelfde probleem. Vindt hij bovendien een verlies van tien procent even erg, of hij nu rijk of arm is, dan verandert alleen de schaal van dat probleem. Daarom kiest hij elk jaar hetzelfde percentage, hoeveel jaren er ook nog komen.

Merton keek naar wat er gebeurt als rendementen voorspelbaar zijn. Na een koersstijging zijn aandelen duur, is de dividendopbrengst laag en is het verwachte rendement voor de komende jaren lager, terwijl het na een crash omgekeerd is. Een aandeel is dan twee dingen tegelijk. Het is een gok met een positieve verwachting, zoals bij Markowitz, maar ook een verzekering, want het levert veel op in de toestand waarin elke euro daarna weinig kan verdienen.

Een belegger die slechte uitkomsten zwaar weegt, waardeert die verzekering, en daarom koopt hij meer aandelen dan de som voor één periode voorschrijft, de myopische vraag (bijziend: alsof alleen de volgende periode telt). Het extra deel heet de hedgevraag (hedging demand: het deel van de portefeuille dat vermogen levert wanneer de beleggingskansen, kortweg de kansen, verslechteren). Hoe langer de toekomst waartegen hij zich wil indekken, hoe groter de hedgevraag. Een belegger met logaritmisch nut let daarentegen alleen op het groeitempo van zijn vermogen en dekt zich niet in.

Die extra vraag werkt door in de prijzen. Als alle beleggers aandelen extra waarderen omdat ze ermee hedgen, betalen ze er meer voor, zodat het verwachte rendement daalt. Een activum zonder marktrisico dat een goede hedge is, verdient dan minder dan de risicovrije rente, terwijl een activum zonder marktrisico dat juist verliest wanneer de kansen verslechteren, meer verdient. Merton schreef het in zijn abstract: verwachte rendementen kunnen van de rente afwijken, ook zonder enig marktrisico Merton (1973).

We verwachten dus drie dingen. Bij onafhankelijke rendementen is de aandelenfractie gelijk voor elke horizon. Als rendementen dalen na een stijging, stijgt de fractie met de horizon, voor een belegger die risicomijdender is dan iemand met logaritmisch nut. En in evenwicht krijgt een activum een lagere premie naarmate het een betere hedge is tegen slechtere kansen.

3Toy-voorbeeld: twee perioden en een voorspelbaar rendement

Het kleinste geval waarin een hedgevraag kan bestaan, heeft twee perioden, want dan is er één volgende periode waartegen de belegger zich kan indekken. Eerst laden we de pakketten die het hele college gebruikt.

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

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

rng = np.random.default_rng(20240101)

Opzet. Het vermogen na een periode met fractie ww in aandelen is W(1+wRe)W(1 + wR^{e}), met ReR^{e} het overrendement. De tabel geeft de getallen van het voorbeeld.

grootheidwaarde
beginvermogen W0W_01
nut over het eindvermogenu(W2)=W21−γ/(1−γ)u(W_2) = W_2^{1-\gamma}/(1-\gamma) met γ=2\gamma = 2, dus −1/W2-1/W_2
risicovrije rente RfR^{f}0
overrendement in periode 1+36%+36\% of −16%-16\%, elk met kans 12\tfrac12
periode 2, geval A (onafhankelijk)weer +36%+36\% of −16%-16\%
periode 2, geval B, na +36%+36\% (“duur”)+20%+20\% of −20%-20\%, geen premie
periode 2, geval B, na −16%-16\% (“goedkoop”)weer +36%+36\% of −16%-16\%

Periode 1 heeft een verwacht overrendement van 10% en een standaarddeviatie van 26%. In geval B hangen de schok in het rendement en de schok in het verwachte rendement negatief samen, zoals bij aandelen en de dividendopbrengst.

Het recept. Wie in periode 2 optimaal belegt, heeft op t=1t = 1 de waarde −q/W1-q/W_1, met q=E[(1+wRe)−1]q = \E[(1 + wR^{e})^{-1}] bij de optimale ww (Theorie leidt die vorm af). Een lagere qq betekent een betere toekomst. In de eerste-ordevoorwaarde van periode 1 weegt qq elke uitkomst (stap 4 schrijft die voorwaarde uit).

Stap 1, myopisch. De eerste-ordevoorwaarde 0,36 (1+0,36w)−2=0,16 (1−0,16w)−20{,}36\,(1+0{,}36w)^{-2} = 0{,}16\,(1-0{,}16w)^{-2} geeft (1+0,36w)/(1−0,16w)=2,25=1,5(1+0{,}36w)/(1-0{,}16w) = \sqrt{2{,}25} = 1{,}5. Daaruit volgt w=0,50/0,60=0,8333w = 0{,}50/0{,}60 = 0{,}8333.

Stap 2, de waarde van de toekomst. Met w=5/6w = 5/6 is q=12/1,3+12/(13/15)=25/26=0,9615q = \tfrac12/1{,}3 + \tfrac12/(13/15) = 25/26 = 0{,}9615. Dat is minder dan 1, omdat een toekomst met premie beter is dan een toekomst zonder premie.

Stap 3, geval A. Omdat de toekomst in beide toestanden dezelfde qq geeft, valt qq weg uit de eerste-ordevoorwaarde, zodat w0=0,8333w_0 = 0{,}8333.

Stap 4, geval B. Omdat er in de dure toestand geen premie is, houdt de belegger daar w=0w = 0, zodat qduur=1q_{\text{duur}} = 1. In de goedkope toestand is qgoedkoop=25/26q_{\text{goedkoop}} = 25/26. De voorwaarde wordt 0,36 qduur(1+0,36w)−2=0,16 qgoedkoop(1−0,16w)−20{,}36\,q_{\text{duur}}(1+0{,}36w)^{-2} = 0{,}16\,q_{\text{goedkoop}}(1-0{,}16w)^{-2}, dus k=(1+0,36w)/(1−0,16w)=2,25⋅26/25=1,5297k = (1+0{,}36w)/(1-0{,}16w) = \sqrt{2{,}25 \cdot 26/25} = 1{,}5297 en w0=(k−1)/(0,36+0,16k)=0,5297/0,6048=0,8759w_0 = (k-1)/(0{,}36 + 0{,}16k) = 0{,}5297/0{,}6048 = 0{,}8759.

Stap 5, omgekeerd. Laat een stijging de markt goedkoop maken en een daling duur (geval B’). Dan is k=2,25⋅25/26=1,4709k = \sqrt{2{,}25 \cdot 25/26} = 1{,}4709 en w0=0,4709/0,5953=0,7909w_0 = 0{,}4709/0{,}5953 = 0{,}7909.

In geval B houdt de belegger 0,8759−0,8333=0,04260{,}8759 - 0{,}8333 = 0{,}0426 meer in aandelen, ruim vijf procent meer dan de myopische fractie, bij dezelfde verdeling van het rendement in periode 1. Dat verschil is de hedgevraag. Ze ontstaat doordat het aandeel 36% oplevert in de toestand waarin het vermogen daarna niets meer kan verdienen, en daar is een euro het meest waard. De code rekent hetzelfde uit, ook voor log-nut.

def continuation(up, down, w, gamma):
    """q = E[(1 + w R^e)^(1-gamma)] for two equally likely excess returns."""
    return 0.5 * (1 + w * up) ** (1 - gamma) + 0.5 * (1 + w * down) ** (1 - gamma)


def two_state_weight(up, down, q_up=1.0, q_down=1.0, gamma=2.0):
    """Optimal risky share with a zero interest rate, two equally likely excess returns and CRRA.

    q_up and q_down scale the marginal value of wealth in the state that
    follows each outcome; with q_up = q_down the problem is myopic.
    """
    k = (-up * q_up / (down * q_down)) ** (1 / gamma)
    return (k - 1) / (up - k * down)


def toy_table(gamma):
    w_good = two_state_weight(0.36, -0.16, gamma=gamma)
    q_good = continuation(0.36, -0.16, w_good, gamma)
    q_dear = continuation(0.20, -0.20, two_state_weight(0.20, -0.20, gamma=gamma), gamma)
    return {
        "myopisch (een periode)": w_good,
        "A: onafhankelijk": two_state_weight(0.36, -0.16, q_good, q_good, gamma),
        "B: stijging -> duur": two_state_weight(0.36, -0.16, q_dear, q_good, gamma),
        "B': stijging -> goedkoop": two_state_weight(0.36, -0.16, q_good, q_dear, gamma),
        "q goedkoop": q_good,
        "q duur": q_dear,
    }


hand = pd.Series({"myopisch (een periode)": 0.8333, "A: onafhankelijk": 0.8333,
                  "B: stijging -> duur": 0.8759, "B': stijging -> goedkoop": 0.7909,
                  "q goedkoop": 0.9615, "q duur": 1.0})
pd.DataFrame({"met de hand": hand, "code, gamma = 2": toy_table(2.0),
              "code, gamma = 1 (log)": toy_table(1.0)}).round(4)
Loading...

De code geeft tot op vier decimalen de handberekening. In de kolom voor logaritmisch nut is q=1q = 1 in elke toestand, en zijn alle vier de allocaties gelijk aan de myopische 1,7361. Een voorspelbaar rendement verschuift dus de vraag naar aandelen, maar het teken hangt af van hoe rendement en kansen samen bewegen, en bij log-nut verschuift er niets.

4Theorie

We leiden vijf resultaten af. Eerst de stelling van Samuelson: bij onafhankelijke rendementen maakt de horizon niet uit. Daarna volgen de optimale portefeuille in continue tijd en de hedgevraag die erbij komt als de beleggingskansen bewegen. De kern is de vierde stap, waarin het ICAPM volgt zodra we de vraag van alle beleggers optellen. Tot slot rekenen we de hedgevraag uit in een markt met een voorspelbaar rendement.

4.1Opzet en aannames

De belegger maximeert het verwachte nut van zijn eindvermogen WTW_T op horizon TT, met nut W1−γ/(1−γ)W^{1-\gamma}/(1-\gamma). Dat is CRRA-nut (constante relatieve risicoaversie): hij vindt een procentueel verlies even erg bij elk vermogen, en γ\gamma is bijvoorbeeld 2, zoals in het toy-voorbeeld. Consumptie laten we weg, omdat ze bij constante beleggingskansen de Merton-portefeuille niet verandert Merton (1969). Bij bewegende kansen maakt tussentijdse consumptie van de hedgevraag een gewogen gemiddelde over horizonnen, zodat haar teken blijft en alleen haar grootte verandert. In discrete tijd groeit het vermogen met Wt+1=Wt(1+Rf+wtRt+1e)W_{t+1} = W_t(1 + R^{f} + w_tR^{e}_{t+1}).

In continue tijd is rr de continu samengestelde rente, zoals in Black-Scholes-Merton en de CBOE. Het risicovolle activum volgt

dStSt=μ dt+σ dZt.\frac{dS_t}{S_t} = \mu\,dt + \sigma\,dZ_t .

Het aandeel groeit gemiddeld met μ\mu per jaar en schommelt met volatiliteit σ\sigma, in het toy-voorbeeld een premie μ−r\mu - r van 10% bij σ=26%\sigma = 26\%. De schok ZtZ_t is een standaard Brownse beweging, die in Black-Scholes-Merton en de CBOE nog WtW_t heette, maar hier staat WW voor het vermogen. Met fractie wtw_t in aandelen beweegt het vermogen volgens

dWt=[ r+wt(μ−r) ]Wt dt+wt σ Wt dZt.dW_t = \left[\, r + w_t(\mu - r) \,\right] W_t\,dt + w_t\,\sigma\,W_t\,dZ_t .

Het vermogen groeit met de rente plus de premie op het deel in aandelen, en schommelt met dat deel. Dit is de vermogensvergelijking van Merton (1969), in onze symbolen. De waardefunctie is het beste verwachte nut vanaf vermogen WW op tijdstip tt:

J(W,t)=max⁡{ws}s≥tEt ⁣[WT1−γ1−γ].J(W, t) = \max_{\{w_s\}_{s \ge t}} \E_t\!\left[\frac{W_T^{1-\gamma}}{1-\gamma}\right].

4.2Samuelson: wanneer de horizon er niet toe doet

Zolang de rendementen elk jaar uit dezelfde verdeling komen, maakt de horizon niet uit. Een belegger wiens vermogen verdubbelt, verdubbelt dan elke positie en kiest dezelfde procentuele gok, want het probleem van volgend jaar is een geschaalde kopie van dat van dit jaar. Alleen als sommige toestanden van morgen betere kansen bieden dan andere, kan de toekomst de keuze van vandaag verschuiven.

Het bewijs volgt het recept van het toy-voorbeeld en werkt achterwaarts. Op elk tijdstip is de waardefunctie qt+1W1−γ/(1−γ)q_{t+1}W^{1-\gamma}/(1-\gamma), met qt+1q_{t+1} een getal. Omdat een constante factor het maximum niet verandert, vindt de belegger elke periode w∗w^{\ast}. In geval A was q=25/26q = 25/26 in beide toestanden, en daarom bleef de fractie daar gelijk aan de myopische, precies zoals Samuelson tegen de volkswijsheid inbracht.

Proof 1

Noem de waardefunctie in discrete tijd Vt(W)V_t(W); JtJ_t is verderop een afgeleide. Op t=Tt = T is VT(W)=W1−γ/(1−γ)V_T(W) = W^{1-\gamma}/(1-\gamma), dus qT=1q_T = 1. Stel Vt+1(W)=qt+1W1−γ/(1−γ)V_{t+1}(W) = q_{t+1}W^{1-\gamma}/(1-\gamma) met qt+1>0q_{t+1} > 0 een getal. Dan is

Vt(W)=max⁡wEt ⁣[qt+1(W(1+Rf+wRt+1e))1−γ1−γ]=qt+1W1−γ max⁡wE ⁣[(1+Rf+wRe)1−γ]1−γ.V_t(W) = \max_w \E_t\!\left[q_{t+1}\frac{\left(W(1 + R^{f} + wR^{e}_{t+1})\right)^{1-\gamma}}{1-\gamma}\right] = q_{t+1}W^{1-\gamma}\,\max_w \frac{\E\!\left[(1 + R^{f} + wR^{e})^{1-\gamma}\right]}{1-\gamma} .

De tweede gelijkheid gebruikt dat qt+1q_{t+1} geen toevalsvariabele is, en dat de verdeling van Rt+1eR^{e}_{t+1} niet van eerdere uitkomsten afhangt (de aanname van onafhankelijkheid). Het maximum ligt dus in w∗w^{\ast}, los van WW en tt, en qt=qt+1 E[(1+Rf+w∗Re)1−γ]>0q_t = q_{t+1}\,\E[(1 + R^{f} + w^{\ast}R^{e})^{1-\gamma}] > 0. □\square

Het bewijs laat ook zien waar het misgaat. Hangt qt+1q_{t+1} af van een toestand die met Rt+1eR^{e}_{t+1} samenhangt, dan mag qt+1q_{t+1} niet buiten de verwachting en weegt het de uitkomsten, zoals in geval B van het toy-voorbeeld.

4.3De Merton-portefeuille

In continue tijd volgt de optimale fractie uit een afweging over één ogenblik. Een belegger die elk ogenblik mag bijsturen, kijkt namelijk steeds maar een ogenblik vooruit, en over zo’n kort interval tellen alleen de verwachting en de variantie van het rendement. Hij koopt aandelen tot de extra premie niet meer opweegt tegen de extra variantie. Hoe risicomijdender hij is of hoe wilder het aandeel beweegt, hoe minder hij koopt.

Het principe van Bellman zegt dat een optimaal plan ook vanaf elk later moment optimaal is: J(Wt,t)=max⁡wEt[J(Wt+dt,t+dt)]J(W_t,t) = \max_w \E_t[J(W_{t+dt},t+dt)]. Als we J(Wt,t)J(W_t,t) aan beide kanten aftrekken, staat er 0=max⁡wEt[dJ]0 = \max_w \E_t[dJ]. Het lemma van Itô uit Black-Scholes-Merton en de CBOE schrijft dJdJ uit, met JtJ_t, JWJ_W en JWWJ_{WW} de partiële afgeleiden:

dJ=Jt dt+JW dW+12JWW (dW)2,(dW)2=w2σ2W2 dt.dJ = J_t\,dt + J_W\,dW + \tfrac12 J_{WW}\,(dW)^2 , \qquad (dW)^2 = w^2\sigma^2W^2\,dt .

Omdat Et[dZt]=0\E_t[dZ_t] = 0, valt de term met dZtdZ_t in de verwachting weg. Zo ontstaat de Hamilton-Jacobi-Bellman-vergelijking (HJB-vergelijking: de Bellman-vergelijking in continue tijd)

0=max⁡w{Jt+JW W[r+w(μ−r)]+12JWW w2σ2W2},J(W,T)=W1−γ1−γ.0 = \max_{w}\Big\{ J_t + J_W\,W\left[r + w(\mu - r)\right] + \tfrac12 J_{WW}\,w^2\sigma^2 W^2 \Big\}, \qquad J(W,T) = \frac{W^{1-\gamma}}{1-\gamma} .

Bij de beste keuze verandert de waarde gemiddeld niet, want wat rente en premie toevoegen, haalt de variantie via de kromming JWW<0J_{WW} < 0 weer weg. De uitdrukking is kwadratisch in ww, en de eerste-ordevoorwaarde is

w∗=−JWWJWW⋅μ−rσ2.w^{\ast} = -\frac{J_W}{W J_{WW}}\cdot\frac{\mu - r}{\sigma^2} .

De belegger koopt de premie per eenheid variantie, maal de risicotolerantie van zijn waardefunctie. Die tolerantie kan verschillen van die van zijn nut, en in dat verschil zitten alle horizoneffecten.

Voor het bewijs proberen we een waardefunctie van dezelfde vorm als het nut, W1−γW^{1-\gamma} maal een functie van de tijd. Die heeft dezelfde relatieve risicoaversie γ\gamma, zodat (7) dan (8) geeft. Daarna gaan we na dat die proefoplossing de HJB-vergelijking oplost.

Proof 2

Probeer J(W,t)=f(t) W1−γ/(1−γ)J(W,t) = f(t)\,W^{1-\gamma}/(1-\gamma) met f>0f > 0 en f(T)=1f(T) = 1. Dan is JW=f W−γJ_W = f\,W^{-\gamma} en JWW=−γf W−γ−1J_{WW} = -\gamma f\,W^{-\gamma-1}, dus −JW/(WJWW)=1/γ-J_W/(WJ_{WW}) = 1/\gamma en (7) geeft (8). Invullen in (6) en delen door W1−γW^{1-\gamma} geeft

0=f′1−γ+f[r+(μ−r)22γσ2],0 = \frac{f'}{1-\gamma} + f\left[r + \frac{(\mu-r)^2}{2\gamma\sigma^2}\right],

met oplossing f(t)=exp⁡{(1−γ)[r+(μ−r)2/(2γσ2)](T−t)}f(t) = \exp\{(1-\gamma)[r + (\mu-r)^2/(2\gamma\sigma^2)](T-t)\} en f(T)=1f(T) = 1. Dat een gladde oplossing van de HJB-vergelijking ook de waardefunctie is, volgt uit een standaard verificatiestelling. □\square

Met de getallen van het toy-voorbeeld is w∗=0,10/(2⋅0,0676)=0,7396w^{\ast} = 0{,}10/(2 \cdot 0{,}0676) = 0{,}7396. In de wereld met twee uitkomsten was het 0,8333, omdat die uitkomsten scheef verdeeld zijn. Een hogere premie verhoogt w∗w^{\ast}, terwijl een hogere γ\gamma of σ\sigma hem verlaagt. Houdt één representatieve belegger de hele markt (w∗=1w^{\ast} = 1), dan zegt (8) dat μm−r=γσm2\mu_m - r = \gamma\sigma_m^2. De marktpremie is dan risicoaversie maal variantie, 8% bij γ=2\gamma = 2 en σm=20%\sigma_m = 20\%.

Met NN risicovolle activa, verwachte rendementen μ\boldsymbol{\mu} en covariantiematrix Σ\boldsymbol{\Sigma} wordt het w∗=Σ−1(μ−r1)/γ\mathbf{w}^{\ast} = \boldsymbol{\Sigma}^{-1}(\boldsymbol{\mu} - r\mathbf{1})/\gamma. Dat is de separatiestelling uit Markowitz, Roy en Tobin: iedereen houdt twee fondsen, de risicovrije rente en dezelfde tangentportefeuille, in een verhouding die van γ\gamma afhangt. Markowitz had daarvoor normaliteit of kwadratisch nut nodig, terwijl het in continue tijd voor elk CRRA-nut volgt.

4.4De hedgevraag

Zodra de beleggingskansen bewegen, krijgt de vraag naar aandelen een tweede deel. Laat het verwachte rendement afhangen van een toestandsvariabele xtx_t, bijvoorbeeld de dividendopbrengst, zodat de waarde van de toekomst afhangt van vermogen én beleggingskansen. Een belegger die slechte kansen vreest, koopt dan extra van een activum dat stijgt wanneer de kansen verslechteren. Stijgen aandelen juist op dat moment, dan gaat zijn aandelenfractie omhoog.

De premie hangt dus van de toestand af, en de toestand volgt een eigen proces. Laat μt=μ(xt)\mu_t = \mu(x_t) en

dxt=μx(xt) dt+σx(xt) dZtx,dZt dZtx=ρ dt.dx_t = \mu_x(x_t)\,dt + \sigma_x(x_t)\,dZ^{x}_t , \qquad dZ_t\,dZ^{x}_t = \rho\,dt .

De toestand heeft een eigen drift μx\mu_x en volatiliteit σx\sigma_x, en de schokken in xx hangen met correlatie ρ\rho samen met die van het aandeel. Voor de dividendopbrengst is ρ\rho sterk negatief, want een koersstijging verlaagt de opbrengst. De waardefunctie is nu J(W,x,t)J(W,x,t), en de HJB-vergelijking krijgt drie termen erbij:

0=max⁡w{Jt+JWW[r+w(μ−r)]+12JWWw2σ2W2+Jxμx+12Jxxσx2+JWx w σσxρ W}.0 = \max_{w}\Big\{ J_t + J_W W\left[r + w(\mu - r)\right] + \tfrac12 J_{WW}w^2\sigma^2W^2 + J_x \mu_x + \tfrac12 J_{xx}\sigma_x^2 + J_{Wx}\,w\,\sigma \sigma_x\rho\,W \Big\} .

De eerste twee nieuwe termen beschrijven hoe de kansen zelf bewegen, en ze hangen niet van ww af. De laatste wel, want die bevat de covariantie tussen vermogen en kansen, gewogen met hoe de waarde van een euro verandert als de kansen veranderen (JWxJ_{Wx}).

De eerste term is de Merton-portefeuille, en de tweede bestaat uit twee factoren. De factor ρσx/σ\rho\sigma_x/\sigma is de regressiecoëfficiënt van dxdx op het rendement, dus hoeveel de kansen bewegen per procent koersbeweging. De factor −JWx/(WJWW)-J_{Wx}/(WJ_{WW}) zegt hoeveel gewicht de belegger daaraan hecht. Bij CRRA-nut is J=g(x,t)W1−γ/(1−γ)J = g(x,t)W^{1-\gamma}/(1-\gamma) met g>0g > 0, en wordt die factor gx/(γg)g_x/(\gamma g). Bij log-nut is J=log⁡W+h(x,t)J = \log W + h(x,t), dus JWx=0J_{Wx} = 0 en is er geen hedgevraag.

Het teken klopt met de intuïtie, maar alleen voor een belegger die risicomijdender is dan iemand met log-nut. Neem dus γ>1\gamma > 1 en laat een hogere xx betere kansen betekenen. Omdat 1−γ<01 - \gamma < 0, vraagt een hogere JJ dan een lagere gg, zodat gx<0g_x < 0. Bij ρ<0\rho < 0 is de hedgevraag positief, zoals in geval B van het toy-voorbeeld. Wisselt ρ\rho van teken, dan wordt ze negatief, zoals in geval B’ (0,7909 onder 0,8333). Ook bij γ<1\gamma < 1 draait het teken om (oefening 1).

4.5Het kernresultaat: het intertemporele CAPM

Waarom zou dit waar zijn? Elke belegger houdt de twee fondsen van Markowitz plus een hedgeportefeuille, en in evenwicht moet de som van al die portefeuilles gelijk zijn aan de marktportefeuille. Een activum dat een goede hedge is, is daarom gewild. Wat gewild is, wordt duur, en wat duur is, heeft een laag verwacht rendement.

Laat er NN risicovolle activa zijn en één toestandsvariabele xx, met Cov⁡(dR,dx)=σRx dt\Cov(d\mathbf{R}, dx) = \boldsymbol{\sigma}_{Rx}\,dt. Uitgebreid naar NN activa kiest belegger kk met vermogen WkW_k

wk=Tk Σ−1(μ−r1)+Hk Σ−1σRx,Tk=−JWkWkJWWk,Hk=−JWxkWkJWWk.\mathbf{w}_k = T_k\,\boldsymbol{\Sigma}^{-1}(\boldsymbol{\mu} - r\mathbf{1}) + H_k\,\boldsymbol{\Sigma}^{-1}\boldsymbol{\sigma}_{Rx}, \qquad T_k = -\frac{J^k_W}{W_kJ^k_{WW}},\quad H_k = -\frac{J^k_{Wx}}{W_kJ^k_{WW}} .

Elke belegger houdt de tangentportefeuille, geschaald met zijn risicotolerantie TkT_k, en de hedgeportefeuille Σ−1σRx\boldsymbol{\Sigma}^{-1}\boldsymbol{\sigma}_{Rx}, geschaald met zijn hedgebehoefte HkH_k. De hedgeportefeuille is de portefeuille die zo sterk mogelijk met dxdx meebeweegt. Merton noemde dit de drie-fondsenstelling: risicovrije rente, markt en hedgeportefeuille. Met KK toestandsvariabelen zijn het K+2K + 2 fondsen. TkT_k is hier de risicotolerantie, niet de horizon TT.

Het verwachte overrendement is de marktbèta maal de marktpremie plus de toestandsbèta maal de prijs van toestandsrisico. De index mm staat hier voor de markt, zoals in Het CAPM. Het bewijsidee: in evenwicht is de som van alle vragen (13) gelijk aan de markt. Als we die gelijkheid met Σ\boldsymbol{\Sigma} vermenigvuldigen, blijken de verwachte overrendementen een combinatie van twee covarianties, die met de markt en die met dxdx. In bèta’s herschreven geeft dat (14).

Proof 4

Laat M=∑kWkM = \sum_k W_k en wm\mathbf{w}_m de marktgewichten. Omdat vraag en aanbod gelijk zijn, geldt Mwm=∑kWkwkM\mathbf{w}_m = \sum_k W_k\mathbf{w}_k. We vullen (13) in en vermenigvuldigen met Σ\boldsymbol{\Sigma}:

M Σwm=(∑kWkTk)(μ−r1)+(∑kWkHk)σRx.M\,\boldsymbol{\Sigma}\mathbf{w}_m = \Big(\textstyle\sum_k W_kT_k\Big)(\boldsymbol{\mu} - r\mathbf{1}) + \Big(\textstyle\sum_k W_kH_k\Big)\boldsymbol{\sigma}_{Rx} .

Σwm\boldsymbol{\Sigma}\mathbf{w}_m is de vector van covarianties met het marktrendement, σRm\boldsymbol{\sigma}_{Rm}. Met de vermogensgewogen gemiddelden Tˉ=∑kWkTk/M\bar{T} = \sum_kW_kT_k/M en Hˉ=∑kWkHk/M\bar{H} = \sum_kW_kH_k/M volgt

μ−r1=1Tˉ σRm−HˉTˉ σRx.\boldsymbol{\mu} - r\mathbf{1} = \frac{1}{\bar T}\,\boldsymbol{\sigma}_{Rm} - \frac{\bar H}{\bar T}\,\boldsymbol{\sigma}_{Rx} .

Met F=(dRm,dx)′\mathbf{F} = (dR_m, dx)' en b=(1/Tˉ,−Hˉ/Tˉ)′\mathbf{b} = (1/\bar T, -\bar H/\bar T)' is dat μ−r1=Cov⁡(dR,F′) b\boldsymbol{\mu} - r\mathbf{1} = \Cov(d\mathbf{R}, \mathbf{F}')\,\mathbf{b}. Schrijf Cov⁡(dR,F′)=B Var⁡(F)\Cov(d\mathbf{R}, \mathbf{F}') = \mathbf{B}\,\Var(\mathbf{F}), met in de rijen van B\mathbf{B} de meervoudige bèta’s (niet te verwarren met B(τ)B(\tau) hieronder). Dan is μ−r1=Bλ\boldsymbol{\mu} - r\mathbf{1} = \mathbf{B}\boldsymbol{\lambda} met λ=Var⁡(F) b\boldsymbol{\lambda} = \Var(\mathbf{F})\,\mathbf{b}, voor alle activa gelijk. Toegepast op de markt (βm,m=1\beta_{m,m} = 1, βm,x=0\beta_{m,x} = 0) geeft dit λm=μm−r\lambda_m = \mu_m - r. □\square

De covariantiepremie bx=−Hˉ/Tˉb_x = -\bar H/\bar T uit het bewijs heeft een vast teken. Laat een hogere xx betere kansen betekenen en laat de beleggers γ>1\gamma > 1 hebben. Dan is Hˉ<0\bar H < 0, en krijgt een positieve covariantie met dxdx een positieve premie. Een activum dat stijgt wanneer de kansen verbeteren, levert vermogen wanneer de belegger dat het minst nodig heeft, en moet daarom meer opleveren. Een activum dat stijgt wanneer de kansen verslechteren, zoals het aandeel uit het toy-voorbeeld, is een verzekering en brengt minder op, wat de intuïtie aan het begin al verwachtte. De prijs van risico λx\lambda_x mengt bxb_x met de covariantie tussen dxdx en de markt, zodat bij ρ<0\rho < 0 het teken van λx\lambda_x niet vastligt.

Merton nam de rente als toestandsvariabele en een lange obligatie als hedgeportefeuille. In het algemeen zegt het ICAPM niet welke xx het zijn, alleen dat variabelen die de beleggingskansen voorspellen, factoren met een risicopremie opleveren. Breeden (1979) voegde alle toestandsvariabelen samen tot één, de consumptiegroei. Of die ene factor de prijzen verklaart, komt aan bod in Lucas, Breeden en de SDF.

4.6Wat het voorspelt: een mean-reverting Sharpe-ratio

Waarom zou de hedgevraag met de horizon groeien? Stel dat de Sharpe-ratio van de markt terugkeert naar een vast gemiddelde. Na een slechte periode worden de kansen beter, maar niet voor altijd. Hoe langer de horizon, hoe meer toekomstige kansen er zijn waartegen de belegger zich wil indekken, tot de horizon ruim voorbij de terugkeertijd ligt. De hedgevraag stijgt dus met de horizon en vlakt dan af.

Schrijf μt−r=σηt\mu_t - r = \sigma\eta_t, met ηt\eta_t de Sharpe-ratio (premie per eenheid volatiliteit). Kim en Omberg schrijven λ\lambda, maar in dit boek staat die letter voor een prijs van risico. Neem aan dat

dηt=κ(θ−ηt) dt+ση dZtη,dZt dZtη=ρ dt.d\eta_t = \kappa(\theta - \eta_t)\,dt + \sigma_\eta\,dZ^{\eta}_t , \qquad dZ_t\,dZ^{\eta}_t = \rho\,dt .

De Sharpe-ratio keert met snelheid κ\kappa terug naar het gemiddelde θ\theta en schommelt met ση\sigma_\eta. Bij een jaarlijkse persistentie van 0,92 is κ=−log⁡0,92=0,083\kappa = -\log 0{,}92 = 0{,}083, een halfwaardetijd van log⁡2/0,083≈8\log 2/0{,}083 \approx 8 jaar. Met τ=T−t\tau = T - t noteren we de resterende horizon.

De eerste term van (18) is de myopische vraag, de tweede de hedgevraag. De som B+CηB + C\eta meet hoe sterk de waarde van de toekomst meebeweegt met de Sharpe-ratio. BB en CC volgen uit Riccati-vergelijkingen (kwadratisch in de onbekende), die Kim & Omberg (1996) in gesloten vorm oplosten. Bij γ=1\gamma = 1 blijven BB en CC nul, maar bij γ>1\gamma > 1 en θ>0\theta > 0 worden ze negatief, zodat de hedgevraag positief is zodra ρ<0\rho < 0. Omdat BB en CC bij nul beginnen en in absolute waarde naar een grens groeien, groeit de hedgevraag met de horizon en vlakt ze daarna af.

Proof 5

Schrijf J=g(η,τ)W1−γ/(1−γ)J = g(\eta,\tau)W^{1-\gamma}/(1-\gamma). Met x=ηx = \eta, μ−r=ση\mu - r = \sigma\eta en σx=ση\sigma_x = \sigma_\eta geeft Theorem 3 w∗=[η+(gη/g)ρση]/(γσ)w^{\ast} = [\eta + (g_\eta/g)\rho\sigma_\eta]/(\gamma\sigma). Vul w∗w^{\ast} in (11) in en deel door W1−γg/(1−γ)W^{1-\gamma}g/(1-\gamma). Probeer g=exp⁡{A(τ)+B(τ)η+12C(τ)η2}g = \exp\{A(\tau) + B(\tau)\eta + \tfrac12 C(\tau)\eta^2\}, zodat gη/g=B+Cηg_\eta/g = B + C\eta. De vergelijking wordt een kwadratisch polynoom in η\eta dat voor elke η\eta nul is. De coëfficiënten van η2\eta^2 en η\eta geven (19), die van η0\eta^0 bepaalt AA, dat niet in de portefeuille voorkomt. De randvoorwaarde J(W,T)=W1−γ/(1−γ)J(W,T) = W^{1-\gamma}/(1-\gamma) geeft B(0)=C(0)=0B(0) = C(0) = 0.

Het teken: bij γ>1\gamma > 1 is C′(0)=δ<0C'(0) = \delta < 0, en in C=0C = 0 is steeds C′=δ<0C' = \delta < 0, dus CC blijft negatief. Zolang B=0B = 0 is B′=κθC<0B' = \kappa\theta C < 0, dus ook BB wordt negatief en blijft dat. □\square

4.7Numerieke oplossing

We kalibreren op een jaarlijks VAR (vector autoregression, een regressie van elke variabele op de vorige waarden van alle variabelen). Vanaf hier zijn kleine letters logs: ztz_t is de log dividendopbrengst min het gemiddelde, en ℓt+1e\ell^{e}_{t+1} het log overrendement.

ℓt+1e=a+b zt+ε1,t+1,zt+1=ϕ zt+ε2,t+1,Corr⁡(ε1,ε2)=ρ.\ell^{e}_{t+1} = a + b\,z_t + \varepsilon_{1,t+1}, \qquad z_{t+1} = \phi\,z_t + \varepsilon_{2,t+1}, \qquad \Corr(\varepsilon_1,\varepsilon_2) = \rho .

Een hoge dividendopbrengst voorspelt een hoog rendement (b>0b > 0), en een koersstijging verlaagt de dividendopbrengst (ρ<0\rho < 0), zodat het VAR dezelfde structuur heeft als geval B. De illustratieve parameters in de tabel liggen niet ver van de data.

aabbϕ\phiSD⁡(ε1)\SD(\varepsilon_1)SD⁡(ε2)\SD(\varepsilon_2)ρ\rholog risicovrije rente
4,5%0,080,9218%15%−0,92%

Om Theorem 5 te gebruiken, vertalen we naar continue tijd. Het verwachte simpele overrendement is het verwachte log-rendement plus 12σ2\tfrac12\sigma^2 (want E[eℓ]=eE[ℓ]+σ2/2\E[e^{\ell}] = e^{\E[\ell] + \sigma^2/2} bij een normaal ℓ\ell), dus ηt=(a+bzt+12σ2)/σ\eta_t = (a + bz_t + \tfrac12\sigma^2)/\sigma met σ=SD⁡(ε1)\sigma = \SD(\varepsilon_1). Verder is κ=−log⁡ϕ\kappa = -\log\phi, σz=SD⁡(ε2)2κ/(1−ϕ2)\sigma_z = \SD(\varepsilon_2)\sqrt{2\kappa/(1-\phi^2)} en ση=b σz/σ\sigma_\eta = b\,\sigma_z/\sigma. Zo heeft het continue proces dezelfde stationaire variantie als het jaarlijkse: σz2/(2κ)=SD⁡(ε2)2/(1−ϕ2)\sigma_z^2/(2\kappa) = \SD(\varepsilon_2)^2/(1-\phi^2). Met de tabel is θ=(0,045+0,0162)/0,18=0,34\theta = (0{,}045 + 0{,}0162)/0{,}18 = 0{,}34 en ση=0,08⋅0,156/0,18=0,069\sigma_\eta = 0{,}08 \cdot 0{,}156/0{,}18 = 0{,}069. De cel lost (19) op met Runge-Kutta van orde vier, voor vier waarden van γ\gamma.

def var_to_continuous(a, b, phi, s1, s2, rho):
    """Map the annual VAR (log excess return on demeaned log D/P) to Kim-Omberg inputs."""
    kappa = -np.log(phi)
    sigma_z = s2 * np.sqrt(2 * kappa / (1 - phi**2))
    return {"sigma": s1, "kappa": kappa, "theta": (a + 0.5 * s1**2) / s1,
            "sig_l": b * sigma_z / s1, "rho": rho}


def kim_omberg(gamma, horizons, sigma, kappa, theta, sig_l, rho, lam=None, dt=0.02):
    """Myopic and hedging demand from the Kim-Omberg Riccati system (RK4).

    Parameters are floats, or arrays of equal length with one entry per parameter
    set. Returns (myopic, hedge), one row per horizon, evaluated at the Sharpe
    ratio `lam` (default: the long-run mean theta).
    """
    lam = theta if lam is None else lam
    delta = (1 - gamma) / gamma
    B = np.zeros(np.shape(theta))   # one B and one C per parameter set
    C = np.zeros(np.shape(theta))

    def rhs(B, C):
        dB = (delta * rho * sig_l * B * (1 + rho * sig_l * C)
              + kappa * theta * C - kappa * B + sig_l**2 * B * C)
        dC = delta * (1 + rho * sig_l * C) ** 2 - 2 * kappa * C + sig_l**2 * C**2
        return dB, dC

    steps = np.rint(np.asarray(horizons) / dt).astype(int)
    out, step = [], 0
    for target in steps:
        while step < target:
            k1 = rhs(B, C)
            k2 = rhs(B + dt / 2 * k1[0], C + dt / 2 * k1[1])
            k3 = rhs(B + dt / 2 * k2[0], C + dt / 2 * k2[1])
            k4 = rhs(B + dt * k3[0], C + dt * k3[1])
            B = B + dt / 6 * (k1[0] + 2 * k2[0] + 2 * k3[0] + k4[0])
            C = C + dt / 6 * (k1[1] + 2 * k2[1] + 2 * k3[1] + k4[1])
            step += 1
        out.append(rho * sig_l * (B + C * lam) / (gamma * sigma))
    myopic = lam / (gamma * sigma)  # the same at every horizon
    return np.array([myopic] * len(out)), np.array(out)


illustrative = dict(a=0.045, b=0.08, phi=0.92, s1=0.18, s2=0.15, rho=-0.9)
ko_params = var_to_continuous(**illustrative)

horizons = [1, 5, 10, 20, 50]
rows = {}
for gamma in [1, 2, 5, 10]:
    myopic, hedge = kim_omberg(gamma, horizons, **ko_params)
    rows[f"gamma = {gamma}: myopische vraag"] = myopic
    rows[f"gamma = {gamma}: hedgevraag"] = hedge
pd.DataFrame(rows, index=[f"H = {h} jaar" for h in horizons]).T.round(3)
Loading...

Bij γ=1\gamma = 1 is de hedgevraag op elke horizon nul, zoals onder de stelling vastgesteld. Bij γ=5\gamma = 5 is de myopische vraag 0,378 en de hedgevraag op twintig jaar 0,339, zodat de totale vraag bijna verdubbelt. Bij γ=10\gamma = 10 is de hedgevraag op vijftig jaar groter dan de myopische vraag zelf. Campbell & Viceira (1999) vonden dezelfde orde van grootte, want ook bij hen kan de hedgevraag de vraag naar aandelen verdubbelen.

De hedgevraag van 0,339 bij γ=5\gamma = 5 op twintig jaar bepaalt ook hoe groot het ICAPM-effect is. Houdt één representatieve belegger de hele markt, dan zegt (13) met één activum 1=(μm−r)/(γσ2)+h1 = (\mu_m - r)/(\gamma\sigma^2) + h, met hh de hedgefractie. Daaruit volgt μm−r=γσ2(1−h)\mu_m - r = \gamma\sigma^2(1 - h). Met γ=5\gamma = 5, σ=18%\sigma = 18\% en h=0,339h = 0{,}339 is dat 0,162⋅0,661=10,7%0{,}162 \cdot 0{,}661 = 10{,}7\% in plaats van 16,2%16{,}2\%, bij een vaste hh. Het verzekeringsmotief drukt de marktpremie dan met een derde.

In de figuur is de hedgevraag de afstand tussen de getrokken en de gestreepte lijn van dezelfde kleur. De getrokken lijn stijgt met de horizon, en daarmee komt ook de tweede verwachting uit de intuïtie uit.

Source
horizon_grid = np.arange(0.5, 50.01, 0.5)
fig, ax = plt.subplots()
for colour, gamma in zip(hap.plotting.COLORS, [2, 5, 10]):
    myopic, hedge = kim_omberg(gamma, horizon_grid, **ko_params)
    ax.plot(horizon_grid, myopic + hedge, color=colour, label=f"totaal, $\\gamma$ = {gamma}")
    ax.plot(horizon_grid, myopic, color=colour, ls="--", lw=1.1,
            label=f"myopisch, $\\gamma$ = {gamma}")
ax.set_xlabel("Horizon (jaren)")
ax.set_ylabel("Fractie van het vermogen in aandelen")
ax.set_title("Kim-Omberg: de hedgevraag groeit met de horizon")
ax.legend(ncol=3)
plt.show()
<Figure size 990x550 with 1 Axes>
<Figure size 990x550 with 1 Axes>

Figure 1:Optimale aandelenfractie bij de gemiddelde Sharpe-ratio. De gestreepte lijnen zijn de myopische vraag, die niet van de horizon afhangt. Het verschil met de getrokken lijn is de hedgevraag. Die begint bij nul en groeit over de eerste twintig jaar bijna rechtlijnig. Daarna vlakt ze af, maar op vijftig jaar ligt ze nog onder de grens voor een oneindige horizon (oefening 2).

Ter controle lossen we het jaarlijkse probleem ook direct op, want de vertaling naar continue tijd is een benadering, en hetzelfde rooster gebruiken we later voor de replicatie met parameteronzekerheid. Net als Barberis (2000) werken we daarbij achterwaarts op een rooster van 21 punten voor zz:

q(z,k)=max⁡w∈[0, 0,99] E[(er(1−w+w eℓk+1e))1−γ q(zk+1,k+1)],q(⋅,K)=1.q(z, k) = \max_{w\in[0,\,0{,}99]}\ \E\Big[\big(e^{r}(1 - w + w\,e^{\ell^{e}_{k+1}})\big)^{1-\gamma}\,q(z_{k+1}, k+1)\Big], \qquad q(\cdot, K) = 1 .

Dat is de recursie uit het bewijs van Theorem 1 met een qq die van de toestand afhangt.

def solve_rebalancing(gamma, n_years, draw, sd_z, rf=0.02, z0=(0.0,), n_grid=21, n_bisect=20):
    """Backward induction for an annually rebalancing CRRA investor.

    `draw(grid)` returns arrays (log excess return, next state), both of shape
    (n_grid, n_draws), conditional on each grid point. Returns the optimal
    stock share at the states `z0` for horizons 1, ..., n_years.
    """
    grid = np.linspace(-3 * sd_z, 3 * sd_z, n_grid)
    log_excess, z_next = draw(grid)
    gross_excess = np.exp(log_excess)
    Q, shares = np.ones(n_grid), []
    for _ in range(n_years):
        Q_next = np.interp(z_next, grid, Q)
        lo, hi = np.zeros(n_grid), np.full(n_grid, 0.99)
        for _ in range(n_bisect):
            mid = (lo + hi) / 2
            growth = 1 - mid[:, None] + mid[:, None] * gross_excess
            slope = (growth ** (-gamma) * (gross_excess - 1) * Q_next).mean(axis=1)
            lo, hi = np.where(slope > 0, mid, lo), np.where(slope > 0, hi, mid)
        w = (lo + hi) / 2
        growth = np.exp(rf) * (1 - w[:, None] + w[:, None] * gross_excess)
        Q = (growth ** (1 - gamma) * Q_next).mean(axis=1)
        shares.append(np.interp(z0, grid, w))
    return np.array(shares)


def normal_shocks(s1, s2, rho, n_draws):
    cov = np.array([[s1**2, rho * s1 * s2], [rho * s1 * s2, s2**2]])
    return rng.standard_normal((n_draws, 2)) @ np.linalg.cholesky(cov).T

De controlecel trekt 5000 schokken uit het illustratieve VAR, gebruikt ze op elk roosterpunt en zet de roosteroplossing naast Kim-Omberg voor γ=5\gamma = 5 en 10.

p = illustrative
shocks = normal_shocks(p["s1"], p["s2"], p["rho"], 5000)
sd_z = p["s2"] / np.sqrt(1 - p["phi"] ** 2)


def known(grid):
    """Log excess returns and next states at each grid point, parameters known."""
    return (p["a"] + p["b"] * grid[:, None] + shocks[:, 0],
            p["phi"] * grid[:, None] + shocks[:, 1])


check_horizons = [1, 2, 5, 10, 20]
check = {}
for gamma in [5, 10]:
    grid_share = solve_rebalancing(gamma, 20, known, sd_z)[:, 0]
    myopic, hedge = kim_omberg(gamma, check_horizons, **ko_params)
    check[f"rooster, gamma = {gamma}"] = grid_share[np.array(check_horizons) - 1]
    check[f"Kim-Omberg, gamma = {gamma}"] = myopic + hedge
pd.DataFrame(check, index=[f"H = {h}" for h in check_horizons]).T.round(3)
Loading...

Het grootste verschil tussen de twee methoden is 1,6 procentpunt, bij γ=10\gamma = 10 op twintig jaar. De tabel laat γ=2\gamma = 2 weg, omdat de allocatie daar tegen de grens van 0,99 aanloopt.

5Simulatie: wat een eeuw data over de hedgevraag zegt

Alles hierboven veronderstelde dat de belegger bb, ϕ\phi en ρ\rho kent. Hoe goed meet hij zijn hedgevraag met een eeuw jaarcijfers, als de voorspelbaarheid echt is? We trekken 1000 steekproeven van 100 jaar uit het illustratieve VAR en schatten telkens de parameters met OLS. Daarmee rekenen we de hedgevraag uit voor γ=5\gamma = 5 en twintig jaar, alsof de schatting de waarheid is.

# TODO: naar hap.stats
def ols_var(r_next, z):
    """OLS of the two-equation VAR; columns of the inputs are independent samples.

    z has length n (the state at t = 0, ..., n-1); r_next has length n-1 and
    r_next[t] is the return earned between t and t+1. Returns intercepts,
    slopes, residual std devs, residual correlation and the standard error of
    the return slope.
    """
    x, y1, y2 = z[:-1], r_next, z[1:]
    xd = x - x.mean(axis=0)
    sxx = (xd**2).sum(axis=0)
    b = (xd * (y1 - y1.mean(axis=0))).sum(axis=0) / sxx
    phi = (xd * (y2 - y2.mean(axis=0))).sum(axis=0) / sxx
    e1 = y1 - y1.mean(axis=0) - b * xd
    e2 = y2 - y2.mean(axis=0) - phi * xd
    n = len(x)
    s1, s2 = np.sqrt((e1**2).sum(axis=0) / (n - 2)), np.sqrt((e2**2).sum(axis=0) / (n - 2))
    rho = (e1 * e2).sum(axis=0) / ((n - 2) * s1 * s2)
    a = y1.mean(axis=0) - b * x.mean(axis=0)
    c = y2.mean(axis=0) - phi * x.mean(axis=0)
    return {"a": a, "b": b, "c": c, "phi": phi, "s1": s1, "s2": s2, "rho": rho,
            "se_b": s1 / np.sqrt(sxx)}

De steekproeven starten na 200 jaar aanloop, zodat zz uit zijn stationaire verdeling begint.

n_samples, n_years, burn = 1000, 100, 200
z = np.zeros(n_samples)
z_path, r_path = [], []
for t in range(burn + n_years + 1):
    eps = normal_shocks(p["s1"], p["s2"], p["rho"], n_samples)
    r_next = p["a"] + p["b"] * z + eps[:, 0]
    if t >= burn:
        z_path.append(z)
        r_path.append(r_next)
    z = p["phi"] * z + eps[:, 1]
z_path, r_path = np.array(z_path), np.array(r_path)

est = ols_var(r_path[:-1], z_path)
est_cont = var_to_continuous(est["a"] + est["b"] * z_path[:-1].mean(axis=0), est["b"],
                             np.minimum(est["phi"], 0.995), est["s1"], est["s2"], est["rho"])
myopic_hat, hedge_hat = kim_omberg(5, [20], **est_cont)
myopic_true, hedge_true = kim_omberg(5, [20], **ko_params)

Elke steekproef levert nu een eigen hedgevraag op. De tabel vat de 1000 schattingen samen.

pd.DataFrame(
    {
        "waarheid": [p["b"], p["phi"], float(hedge_true[0]), float(myopic_true[0])],
        "gemiddelde schatting": [est["b"].mean(), est["phi"].mean(),
                                 hedge_hat[0].mean(), myopic_hat[0].mean()],
        "5%-kwantiel": [np.quantile(est["b"], 0.05), np.quantile(est["phi"], 0.05),
                        np.quantile(hedge_hat[0], 0.05), np.quantile(myopic_hat[0], 0.05)],
        "95%-kwantiel": [np.quantile(est["b"], 0.95), np.quantile(est["phi"], 0.95),
                         np.quantile(hedge_hat[0], 0.95), np.quantile(myopic_hat[0], 0.95)],
    },
    index=["b", "phi", "hedgevraag (H = 20, gamma = 5)", "myopische vraag (gamma = 5)"],
).round(3)
Loading...

De geschatte hedgevraag is zowel onzeker als vertekend. De ware waarde is 0,339, maar in 90% van de steekproeven ligt de schatting ergens tussen 0,143 en 0,850. Gemiddeld komt de schatting uit op 0,450, en dat is te hoog. De volgende cel telt hoe vaak de helling significant is en hoe vaak de hedgevraag een verkeerd teken krijgt.

pd.Series({
    "fractie steekproeven met t(b) > 1,96": np.mean(est["b"] / est["se_b"] > 1.96),
    "fractie steekproeven met hedgevraag < 0": np.mean(hedge_hat[0] < 0),
}).round(3)
fractie steekproeven met t(b) > 1,96 0.555 fractie steekproeven met hedgevraag < 0 0.001 dtype: float64

De helling is in maar 55,5% van de steekproeven significant, terwijl de voorspelbaarheid per constructie echt is. Een negatieve hedgevraag komt daarentegen vrijwel niet voor, zodat het teken goed te leren is en de grootte niet. Let in het linkerpaneel op de gestreepte lijn, die rechts van de zwarte ligt, en rechts op de breedte van de verdeling.

Source
fig, axes = plt.subplots(1, 2, figsize=(11, 4.2))
axes[0].hist(est["b"], bins=40, edgecolor="white")
axes[0].axvline(p["b"], color="black", lw=1.6, label="ware $b$")
axes[0].axvline(est["b"].mean(), color=hap.plotting.COLORS[1], ls="--", lw=1.6,
                label="gemiddelde schatting")
axes[0].set_xlabel("Geschatte $b$ (helling van rendement op log D/P)")
axes[0].set_ylabel("Aantal steekproeven")
axes[0].set_title("Stambaugh-bias in 100 jaar data")
axes[0].legend()
axes[1].hist(hedge_hat[0], bins=40, edgecolor="white")
axes[1].axvline(float(hedge_true[0]), color="black", lw=1.6, label="ware hedgevraag")
axes[1].set_xlabel("Geschatte hedgevraag ($\\gamma$ = 5, horizon 20 jaar)")
axes[1].set_ylabel("Aantal steekproeven")
axes[1].set_title("Waartegen de belegger denkt zich te moeten indekken")
axes[1].legend()
plt.show()
<Figure size 1210x462 with 2 Axes>
<Figure size 1210x462 with 2 Axes>

Figure 2:Links: de OLS-schatter van bb over 1000 steekproeven van 100 jaar. Het gemiddelde ligt boven de ware 0,08. De schatter van ϕ\phi valt te laag uit, en via de sterk negatieve correlatie tussen de schokken duwt die fout b^\hat b omhoog: de bias van Stambaugh (1999). Rechts: de hedgevraag die een belegger uit zijn eigen steekproef afleidt, van minder dan de helft tot tweeënhalf keer de ware waarde.

Hier keert de standaardfout van 2% terug in dynamische vorm, want ook een eeuw data meet een verwacht rendement maar grof. De spreiding komt van de grootheden die over verwachte rendementen gaan: b^\hat b voor de hedgevraag en a^\hat a voor de myopische vraag. Volatiliteiten en ρ\rho zijn over een eeuw daarentegen goed bepaald.

6Replicatie op echte data

6.1Barberis’ VAR

We schatten het maandelijkse VAR met OLS. Met de vlakke prior van Barberis valt het posterior gemiddelde samen met OLS, zodat de twee kolommen vergelijkbaar zijn.

gw_monthly = hap_data.goyal_welch("monthly")
monthly = pd.DataFrame(
    {
        "excess": np.log1p(gw_monthly["CRSP_SPvw"]) - np.log1p(gw_monthly["Rfree"]),
        "dy": gw_monthly["D12"] / gw_monthly["Index"],
    }
).loc["1952-06":"1995-12"]

# z[t] is the dividend yield at the end of month t, r_next[t] the return over month t+1
mon = ols_var(monthly["excess"].to_numpy()[1:, None], monthly["dy"].to_numpy()[:, None])
mon = {k: float(v[0]) for k, v in mon.items()}
dy_lag = monthly["dy"].to_numpy()[:-1]
se_phi = mon["s2"] / np.sqrt(((dy_lag - dy_lag.mean()) ** 2).sum())

pd.DataFrame(
    {
        "Barberis (2000), tabel II": [0.5118, 0.2129, 0.9774, 0.0091, 0.0017, -0.9351],
        "hier (OLS)": [mon["b"], mon["se_b"], mon["phi"], se_phi, mon["s1"] ** 2, mon["rho"]],
    },
    index=["helling rendement op D/P", "  standaardfout", "phi (D/P op D/P)", "  standaardfout",
           "residuvariantie rendement", "correlatie schokken"],
).round(4)
Loading...

Geslaagd. Alle tekens en ordes van grootte kloppen met wat we vooraf verwachtten. Onze helling ligt (0,5118−0,4058)/0,2129=0,5(0{,}5118 - 0{,}4058)/0{,}2129 = 0{,}5 standaardfout onder die van Barberis, bij een andere index. Dat is weinig, want ook in zijn eigen steekproef is de tt-waarde van de helling maar 0,5118/0,2129=2,40{,}5118/0{,}2129 = 2{,}4.

6.2Horizonallocaties op een eeuw jaarcijfers

Nu schatten we het jaarlijkse VAR over 1927–2025, de invoer voor de horizonallocaties.

gw_annual = hap_data.goyal_welch("annual").loc["1926":"2025"]
log_dp = gw_annual["dp"].to_numpy()
excess_next = (np.log1p(gw_annual["CRSP_SPvw"]) - np.log1p(gw_annual["Rfree"])).to_numpy()[1:]
dp_mean = log_dp[:-1].mean()
z_annual = log_dp - dp_mean

ann = ols_var(excess_next[:, None], z_annual[:, None])
ann = {k: float(v[0]) for k, v in ann.items()}
rf_annual = float(np.log1p(gw_annual["Rfree"]).mean())
ann_cont = var_to_continuous(ann["a"], ann["b"], ann["phi"], ann["s1"], ann["s2"], ann["rho"])

pd.DataFrame(
    {"schatting": [ann["a"], ann["b"], ann["se_b"], ann["b"] / ann["se_b"], ann["phi"],
                   ann["s1"], ann["s2"], ann["rho"], rf_annual, z_annual[-1]]},
    index=["a (gem. log overrendement)", "b", "  standaardfout", "  t-waarde", "phi",
           "sd rendementsschok", "sd D/P-schok", "correlatie schokken",
           "gem. log risicovrije rente", "log D/P eind 2025 min gemiddelde"],
).round(4)
Loading...

Over de hele eeuw voorspelt de dividendopbrengst maar zwak, met een tt-waarde van 1,07 voor de helling. De persistentie (0,924) en de negatieve correlatie tussen de schokken (−0,856) zijn er toch nog. Net als in de simulatie zijn de tweede momenten dus goed bepaald en het verwachte rendement niet. We vullen deze schattingen in Kim-Omberg in, voor drie risicoaversies.

horizons = [1, 5, 10, 20, 50]
cv_table = {}
for gamma in [2, 5, 10]:
    myopic, hedge = kim_omberg(gamma, horizons, **ann_cont)
    cv_table[(f"gamma = {gamma}", "myopische vraag")] = myopic
    cv_table[(f"gamma = {gamma}", "hedgevraag")] = hedge
    cv_table[(f"gamma = {gamma}", "totaal / myopisch")] = (myopic + hedge) / myopic
pd.DataFrame(cv_table, index=[f"H = {h}" for h in horizons]).T.round(3)
Loading...

De volgende tabel vergelijkt de verhouding tussen totale en myopische vraag met de verdubbeling van Campbell en Viceira.

pd.DataFrame(
    {"origineel (Campbell-Viceira)": ["tot 2"],
     "hier": [cv_table[("gamma = 10", "totaal / myopisch")][4]]},
    index=["totaal / myopisch, gamma = 10, H = 50"],
).round(3)
Loading...

Geslaagd. De hedgevraag is positief, groeit met de horizon en blijft bij realistische horizonnen onder de verdubbeling, zoals we vooraf verwachtten. Pas bij vijftig jaar en γ=10\gamma = 10 komt de verdubbeling in zicht.

Dat een zo zwakke helling toch zo’n hedgevraag geeft, komt door twee dingen: de correlatie van −0,86-0{,}86 en een halfwaardetijd van log⁡2/(−log⁡0,924)≈8,8\log 2/(-\log 0{,}924) \approx 8{,}8 jaar. Een klein maar persistent effect telt over een lange horizon namelijk op.

6.3Parameteronzekerheid volgens Barberis

Barberis (2000) liet de belegger het verwachte nut middelen over de posterior verdeling van alle parameters, in plaats van de puntschatting te gebruiken. Met een vlakke prior heeft de posterior een standaardvorm, want de covariantiematrix van de schokken is invers-Wishart (de verdeling van de inverse van een steekproefcovariantiematrix), en de coëfficiënten zijn normaal rond de OLS-schatting. Per trekking is de coëfficiëntenmatrix C^+LXZLΣ′\hat{\mathbf C} + \mathbf L_X\mathbf Z\mathbf L_\Sigma', met Z\mathbf Z standaardnormaal en L\mathbf L de Cholesky-factoren. We trekken 5000 parametersets met elk één schok, en net als bij Barberis leert de belegger onderweg niets bij.

def posterior_predictive(r_next, z, n_draws):
    """Draws of (a, b, c, phi) and one VAR shock per draw under a flat prior (Barberis 2000)."""
    X = np.column_stack([np.ones(len(z) - 1), z[:-1]])
    Y = np.column_stack([r_next, z[1:]])
    C_hat = np.linalg.solve(X.T @ X, X.T @ Y)
    resid = Y - X @ C_hat
    Sigma = stats.invwishart(df=len(Y) - 3, scale=resid.T @ resid).rvs(n_draws, random_state=rng)
    L_sigma = np.linalg.cholesky(Sigma)
    L_x = np.linalg.cholesky(np.linalg.inv(X.T @ X))
    Z = rng.standard_normal((n_draws, 2, 2))
    L_sigma_t = np.transpose(L_sigma, axes=(0, 2, 1))  # L_Sigma' for each draw
    C = C_hat + L_x @ Z @ L_sigma_t                    # matrix-normal around OLS
    e = rng.standard_normal((n_draws, 2))
    eps = (L_sigma @ e[:, :, None])[:, :, 0]          # one VAR shock per draw
    return C, eps


C_draws, eps_draws = posterior_predictive(excess_next, z_annual, 5000)
pd.DataFrame(
    {"gemiddelde": [C_draws[:, 1, 0].mean(), C_draws[:, 1, 1].mean()],
     "standaarddeviatie": [C_draws[:, 1, 0].std(), C_draws[:, 1, 1].std()],
     "kans < 0": [np.mean(C_draws[:, 1, 0] < 0), np.mean(C_draws[:, 1, 1] < 0)],
     "kans > 1": [np.mean(C_draws[:, 1, 0] > 1), np.mean(C_draws[:, 1, 1] > 1)]},
    index=["b (posterior)", "phi (posterior)"],
).round(3)
Loading...

De posterior van bb heeft een standaarddeviatie zo groot als het gemiddelde. In 14,1% van de trekkingen is de helling negatief, en voorspelt een hoge dividendopbrengst dus lage rendementen. In 4,2% is ϕ>1\phi > 1, en keert de dividendopbrengst niet terug. De volgende cel lost het probleem op met de parameters vast en met de posterior, vanaf een gemiddelde dividendopbrengst en vanaf die van eind 2025.

shocks_ann = normal_shocks(ann["s1"], ann["s2"], ann["rho"], 5000)
sd_z_ann = ann["s2"] / np.sqrt(1 - ann["phi"] ** 2)
start_states = (0.0, z_annual[-1])

def point(grid):
    """Draws with the VAR parameters fixed at their OLS estimates."""
    return (ann["a"] + ann["b"] * grid[:, None] + shocks_ann[:, 0],
            ann["c"] + ann["phi"] * grid[:, None] + shocks_ann[:, 1])


def predictive(grid):
    """Draws from the posterior predictive: one parameter set and one shock per draw."""
    return (C_draws[:, 0, 0] + C_draws[:, 1, 0] * grid[:, None] + eps_draws[:, 0],
            C_draws[:, 0, 1] + C_draws[:, 1, 1] * grid[:, None] + eps_draws[:, 1])


share_point = solve_rebalancing(5, 20, point, sd_z_ann, rf=rf_annual, z0=start_states)
share_bayes = solve_rebalancing(5, 20, predictive, sd_z_ann, rf=rf_annual, z0=start_states)

show = np.array([1, 2, 5, 10, 15, 20])
pd.DataFrame(
    {
        ("D/P op gemiddelde", "parameters bekend"): share_point[show - 1, 0],
        ("D/P op gemiddelde", "parameteronzekerheid"): share_bayes[show - 1, 0],
        ("D/P zoals eind 2025", "parameters bekend"): share_point[show - 1, 1],
        ("D/P zoals eind 2025", "parameteronzekerheid"): share_bayes[show - 1, 1],
    },
    index=[f"H = {h}" for h in show],
).round(3)
Loading...

Met parameteronzekerheid ligt de allocatie op elke horizon lager. De figuur zet de vier kolommen uit, en de afstand tussen de getrokken en de gestreepte lijn van dezelfde kleur is het effect van parameteronzekerheid.

Source
years = np.arange(1, 21)
fig, ax = plt.subplots()
for j, (label, colour) in enumerate([("D/P op gemiddelde", hap.plotting.COLORS[0]),
                                     ("D/P zoals eind 2025", hap.plotting.COLORS[1])]):
    ax.plot(years, share_point[:, j], color=colour, label=f"{label}, parameters bekend")
    ax.plot(years, share_bayes[:, j], color=colour, ls="--",
            label=f"{label}, parameteronzekerheid")
ax.set_xlabel("Horizon (jaren), jaarlijkse herbalancering")
ax.set_ylabel("Fractie van het vermogen in aandelen")
ax.set_title("Horizonallocaties, $\\gamma$ = 5, VAR op 1927–2025")
ax.legend()
plt.show()
<Figure size 990x550 with 1 Axes>
<Figure size 990x550 with 1 Axes>

Figure 3:Optimale aandelenfractie bij jaarlijkse herbalancering, met de parameters vast (getrokken) of met de posterior verdeling (gestreept), vanaf een gemiddelde dividendopbrengst (blauw) of vanaf de lage dividendopbrengst van eind 2025 (rood). In alle vier de gevallen stijgt de lijn met de horizon. Parameteronzekerheid verlaagt de allocatie en haalt een klein deel van de stijging weg.

De eerste tabel vat de verschillen per beginstand samen, over alle twintig horizonnen.

gap = share_point - share_bayes  # parameters fixed minus parameter uncertainty
pd.DataFrame(
    {"kleinste verschil": gap.min(axis=0), "grootste verschil": gap.max(axis=0),
     "fractie H = 1, parameters bekend": share_point[0],
     "D/P in standaarddeviaties": [0.0, z_annual[-1] / sd_z_ann]},
    index=["D/P op gemiddelde", "D/P zoals eind 2025"],
).round(3)
Loading...

Het verschil is vanaf een gemiddelde dividendopbrengst twee à drie procentpunt en vanaf eind 2025 ruim één à twee. De tweede tabel zet de overallocatie op tien jaar naast die van Barberis.

pd.DataFrame(
    {"origineel (Barberis)": ["> 30%"],
     "hier": [share_point[9, 0] / share_bayes[9, 0] - 1]},
    index=["H = 10: overallocatie zonder onzekerheid (relatief)"],
).round(3)
Loading...

Gedeeltelijk geslaagd. Teken en ordening zijn zoals verwacht, maar de veel vlakkere lijnen van Barberis zien we niet. Zijn overallocatie van meer dan dertig procent voor een buy-and-hold-belegger met risicoaversie 10 (Barberis (2000), p. 246) is hier 4,5%. Die 4,5% geldt wel voor γ=5\gamma = 5 met jaarlijkse herbalancering, zodat de vergelijking alleen een orde van grootte geeft.

Ook dit verschil volgt uit de standaardfout van 2%, want hoe korter de steekproef, hoe breder de posterior. Barberis’ dynamische figuur 5 gebruikt de tienjaarssteekproef 1986–1995, en zijn buy-and-hold-getal komt uit 44 jaar maanddata, terwijl wij honderd jaar hebben en daarmee een smallere posterior. Op dertig jaar data is het effect wel groot, zoals oefening 3 laat zien.

Vanaf de lage dividendopbrengst van eind 2025, bijna twee standaarddeviaties onder het gemiddelde, is de allocatie op één jaar ongeveer half zo groot. Een lage dividendopbrengst voorspelt immers een laag verwacht rendement, zodat de myopische vraag kleiner is.

7Wat er brak, en wat daarna kwam

Wat het model verklaart. Merton maakte van portefeuillekeuze een dynamisch probleem en van asset pricing een theorie met meer dan één bron van risico. Uit Theorem 1 volgt dat jong zijn op zich geen reden is voor meer aandelen. Uit Theorem 3 volgt wat wel een reden is, namelijk zich indekken tegen veranderende beleggingskansen. Het ICAPM gaf elk later meerfactormodel een theoretische grond, want volgens het ICAPM krijgt een factor een risicopremie als hij de beleggingskansen voorspelt.

Waar het breekt. Het model breekt niet in de wiskunde, maar in de invoer. De hedgevraag hangt af van de helling van het rendement op een voorspeller, een uitspraak over een verwacht rendement. Over 1927–2025 heeft die helling een tt-waarde van 1,07, en toch zegt de theorie dat een belegger met γ=5\gamma = 5 op twintig jaar 0,223 extra in aandelen houdt. De simulatie liet zien hoe ver een eeuw data ernaast kan zitten. Een verwacht rendement is alleen te leren uit een lange kalenderperiode, hoe vaak er ook gemeten wordt Merton (1980). Daarnaast noemt het ICAPM zijn toestandsvariabelen niet, en een model dat elke voorspeller als factor toelaat, is moeilijk te verwerpen.

Risico of vergissing? De hele hedgevraag berust op het feit dat de dividendopbrengst rendementen voorspelt, en dat feit laat twee lezingen toe. Volgens de Chicago-lezing (de prijs is juist en beloont risico) varieert de prijs van risico. Na een crash zijn beleggers armer en risicomijdender en eisen ze een hogere premie. De langetermijnbelegger die dan bijkoopt, draagt risico waarvoor hij een premie krijgt, en zijn hedgevraag is Mertons verzekering. Volgens de Yale-lezing (de prijs zit ernaast) schieten prijzen door, en voorspelt de dividendopbrengst omdat de vergissing zich herstelt. Dan is dezelfde extra positie een weddenschap dat de belegger meer weet dan de prijs. Het VAR scheidt de twee niet, want beide geven b>0b > 0 en ρ<0\rho < 0. Om ze te scheiden, moeten we weten of verwachte rendementen meebewegen met consumptie en recessies, en dat valt met de data van dit college niet te beslissen.

Wat er daarna kwam. Merton liet open welke factoren het zijn, en Ross liet in 1976 zien dat een factormodel ook zonder voorkeuren volgt, alleen uit de eis dat er geen arbitrage bestaat (zie Ross, APT en de fundamentele stelling).

8Oefeningen

Solution to Exercise 1

(1) De voorwaarde 0,36/(1+0,36w)=0,16/(1−0,16w)0{,}36/(1+0{,}36w) = 0{,}16/(1-0{,}16w) geeft 0,20=0,1152 w0{,}20 = 0{,}1152\,w, dus w=1,7361w = 1{,}7361. Bij γ=1\gamma = 1 is q=E[(1+wRe)0]=1q = \E[(1+wR^{e})^{0}] = 1 in elke toestand, zodat qq wegvalt en w0w_0 gelijk is aan de myopische fractie.

(2)

records = []
for gamma in [0.5, 1.0, 2.0, 5.0, 10.0]:
    row = toy_table(gamma)
    records.append({
        "gamma": gamma,
        "myopisch": row["myopisch (een periode)"],
        "w0 voorspelbaar": row["B: stijging -> duur"],
        "hedgevraag": row["B: stijging -> duur"] - row["myopisch (een periode)"],
        "hedge / myopisch": row["B: stijging -> duur"] / row["myopisch (een periode)"] - 1,
        "q goedkoop": row["q goedkoop"],
        "q duur": row["q duur"],
    })
pd.DataFrame(records).set_index("gamma").round(4)
Loading...

Bij γ=0,5\gamma = 0{,}5 is de hedgevraag negatief, want dan is 1−γ>01 - \gamma > 0 en betekent een betere toekomst een hogere qq: qgoedkoop=1,0833>1=qduurq_{\text{goedkoop}} = 1{,}0833 > 1 = q_{\text{duur}}. Het marginale nut van vermogen is dan het hoogst in de goedkope toestand. Omdat het aandeel daar weinig oplevert, houdt de belegger er minder van. Bij γ>1\gamma > 1 is het teken positief, en ten opzichte van de myopische vraag groeit de hedgevraag met γ\gamma. De hedgevraag is dus geen eigenschap van het activum alleen, maar van het activum samen met de manier waarop de belegger zijn toekomst weegt.


:::{exercise}
:label: ex-merton-icapm-2

**Afleiding: de lange horizon in gesloten vorm.** Neem [](#eq-merton-icapm-riccati).

1. Laat zien dat de stationaire waarde $C_\infty = \lim_{\tau\to\infty} C(\tau)$ een
   wortel is van
   $\sigma_\eta^2(1 + \delta\rho^2)\,C^2 + 2(\delta\rho\sigma_\eta - \kappa)\,C + \delta = 0$,
   en leid $B_\infty$ af in termen van $C_\infty$.
2. Welke wortel is de limiet voor $\gamma > 1$?
3. Bereken de hedgevraag op oneindige horizon voor de illustratieve parameters en
   $\gamma = 5$, en vergelijk met Runge-Kutta bij $\tau = 200$ jaar.
Solution to ex-merton-icapm-2

(1) Stel C′=0C' = 0 en groepeer naar machten van CC. Stel B′=0B' = 0 en los op:

B∞=κθC∞κ−ση2C∞−δρση(1+ρσηC∞).B_\infty = \frac{\kappa\theta C_\infty}{\kappa - \sigma_\eta^2 C_\infty - \delta\rho\sigma_\eta(1 + \rho\sigma_\eta C_\infty)} .

(2) Bij γ>1\gamma > 1 is δ<0\delta < 0, zodat het product van de wortels negatief is zolang 1+δρ2>01 + \delta\rho^2 > 0. Er is dan één negatieve en één positieve wortel. Omdat CC in nul begint en negatief blijft, is de limiet de negatieve wortel.

(3)

gamma = 5
delta = (1 - gamma) / gamma
kp = ko_params
quad_a = kp["sig_l"] ** 2 * (1 + delta * kp["rho"] ** 2)
quad_b = 2 * (delta * kp["rho"] * kp["sig_l"] - kp["kappa"])
C_inf = (-quad_b - np.sqrt(quad_b**2 - 4 * quad_a * delta)) / (2 * quad_a)
B_inf = kp["kappa"] * kp["theta"] * C_inf / (
    kp["kappa"] - kp["sig_l"] ** 2 * C_inf
    - delta * kp["rho"] * kp["sig_l"] * (1 + kp["rho"] * kp["sig_l"] * C_inf))
hedge_inf = kp["rho"] * kp["sig_l"] * (B_inf + C_inf * kp["theta"]) / (gamma * kp["sigma"])
myopic_200, hedge_200 = kim_omberg(gamma, [200], **kp)

pd.DataFrame(
    {"waarde": [C_inf, B_inf, hedge_inf, float(hedge_200[0]), float(myopic_200[0])]},
    index=["C oneindig", "B oneindig", "hedgevraag, oneindige horizon",
           "hedgevraag, Runge-Kutta bij 200 jaar", "myopische vraag"],
).round(4)
Loading...

Op oneindige horizon is de hedgevraag groter dan de myopische vraag, maar ze blijft eindig. Het horizoneffect is dus begrensd, en de grens hangt af van θ\theta en ση\sigma_\eta, twee grootheden over verwachte rendementen.


:::{exercise}
:label: ex-merton-icapm-3

**Uitbreiding van de replicatie: een kortere steekproef.** Herhaal de replicatie op
de jaarlijkse Goyal-Welch-data met rendementen over 1996–2025, met $\gamma = 10$ (bij
$\gamma = 5$ loopt de allocatie hier tegen de grens van 0,99).

1. Schat het VAR en rapporteer $\hat b$, zijn $t$-waarde en $\hat\phi$.
2. Bereken de aandelenfractie bij een gemiddelde dividendopbrengst op 1, 5 en 10
   jaar, met parameters vast en met parameteronzekerheid, voor deze steekproef en
   voor 1927–2025.
Solution to ex-merton-icapm-3
recent = hap_data.goyal_welch("annual").loc["1995":"2025"]
dp_recent = recent["dp"].to_numpy()
z_recent = dp_recent - dp_recent[:-1].mean()
excess_recent = (np.log1p(recent["CRSP_SPvw"]) - np.log1p(recent["Rfree"])).to_numpy()[1:]

rec = {k: float(v[0]) for k, v in ols_var(excess_recent[:, None], z_recent[:, None]).items()}
shocks_rec = normal_shocks(rec["s1"], rec["s2"], rec["rho"], 5000)
sd_z_rec = rec["s2"] / np.sqrt(1 - min(rec["phi"], 0.995) ** 2)
rf_recent = float(np.log1p(recent["Rfree"]).mean())

def point_rec(grid):
    return (rec["a"] + rec["b"] * grid[:, None] + shocks_rec[:, 0],
            rec["c"] + rec["phi"] * grid[:, None] + shocks_rec[:, 1])


C_rec, eps_rec = posterior_predictive(excess_recent, z_recent, 5000)

def bayes_rec(grid):
    return (C_rec[:, 0, 0] + C_rec[:, 1, 0] * grid[:, None] + eps_rec[:, 0],
            C_rec[:, 0, 1] + C_rec[:, 1, 1] * grid[:, None] + eps_rec[:, 1])


h = np.array([1, 5, 10])
short = {
    "1996-2025, parameters bekend": solve_rebalancing(10, 10, point_rec, sd_z_rec, rf=rf_recent)[h - 1, 0],
    "1996-2025, parameteronzekerheid": solve_rebalancing(10, 10, bayes_rec, sd_z_rec, rf=rf_recent)[h - 1, 0],
    "1927-2025, parameters bekend": solve_rebalancing(10, 10, point, sd_z_ann, rf=rf_annual)[h - 1, 0],
    "1927-2025, parameteronzekerheid": solve_rebalancing(10, 10, predictive, sd_z_ann, rf=rf_annual)[h - 1, 0],
}
print(f"1996-2025: b = {rec['b']:.3f}, t = {rec['b'] / rec['se_b']:.2f}, phi = {rec['phi']:.3f}")
pd.DataFrame(short, index=[f"H = {k}" for k in h]).T.round(3)
1996-2025: b = 0.358, t = 2.60, phi = 0.647
Loading...

De laatste dertig jaar lijken voorspelbaarder: b^=0,358\hat b = 0{,}358 met een tt-waarde van 2,60, maar een veel minder persistente dividendopbrengst (ϕ^=0,647\hat\phi = 0{,}647). Dat is geen tegenspraak met onze verwachting vooraf, want die ging over de helling over de hele eeuw. Op tien jaar loopt de belegger met de puntschatting tegen de grens van 0,99 aan.

Op vijf jaar houdt de belegger met parameteronzekerheid zeventien procentpunt minder dan de belegger die de puntschatting gelooft (0,649 tegen 0,817). Op de eeuwsteekproef is dat verschil ruim één procentpunt, want met honderd waarnemingen is de posterior veel smaller. Hoe korter de geschiedenis, hoe groter dus het deel van het horizoneffect dat een illusie van de puntschatting is.


<!-- Referenties verschijnen automatisch onderaan de pagina. -->
References
  1. Barberis, N. (2000). Investing for the Long Run when Returns Are Predictable. The Journal of Finance, 55(1), 225–264. 10.1111/0022-1082.00205
  2. Campbell, J. Y., & Viceira, L. M. (1999). Consumption and Portfolio Decisions when Expected Returns are Time Varying. The Quarterly Journal of Economics, 114(2), 433–495. 10.1162/003355399556043
  3. Samuelson, P. A. (1969). Lifetime Portfolio Selection by Dynamic Stochastic Programming. The Review of Economics and Statistics, 51(3), 239–246. 10.2307/1926559
  4. Merton, R. C. (1969). Lifetime Portfolio Selection under Uncertainty: The Continuous-Time Case. The Review of Economics and Statistics, 51(3), 247–257. 10.2307/1926560
  5. Merton, R. C. (1973). An Intertemporal Capital Asset Pricing Model. Econometrica, 41(5), 867–887. 10.2307/1913811
  6. Kim, T. S., & Omberg, E. (1996). Dynamic Nonmyopic Portfolio Behavior. Review of Financial Studies, 9(1), 141–161. 10.1093/rfs/9.1.141
  7. Breeden, D. T. (1979). An Intertemporal Asset Pricing Model with Stochastic Consumption and Investment Opportunities. Journal of Financial Economics, 7(3), 265–296. 10.1016/0304-405X(79)90016-3
  8. Stambaugh, R. F. (1999). Predictive Regressions. Journal of Financial Economics, 54(3), 375–421. 10.1016/S0304-405X(99)00041-0
  9. Merton, R. C. (1980). On Estimating the Expected Return on the Market: An Exploratory Investigation. Journal of Financial Economics, 8(4), 323–361. 10.1016/0304-405X(80)90007-0

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.