Wat vertellen wisselkoersen over de SDF’s van twee landen? Een wisselkoers is de verhouding
van die twee SDF’s, zodat gladde wisselkoersen betekenen dat marginaal nut in landen bijna
gelijk op beweegt, en een renteverschil zonder bijbehorende depreciatie een risicopremie is.
In dit college:
leiden we af dat de wisselkoersverandering het verschil is van twee log-SDF’s, en wat dat
zegt over internationale risk sharing;
leiden we uit dezelfde identiteit de UIP-regressie van Fama af, en een carry-premie voor
de
munt van het land met de rustigste SDF;
simuleren we hoe onzeker de ondergrens voor risk sharing is als de Sharpe-ratio geschat
moet
worden;
repliceren we voor negen G10-valuta’s de Fama-regressie, de carry-portefeuilles met hun
crash
van 2008, de index van Brandt, Cochrane en Santa-Clara, en kort momentum en value.
Dat de wisselkoers de verhouding van twee SDF’s is, lieten Bekaert en Backus, Foresi en
Telmer
zien Bekaert (1996)Backus et al. (2001). Brandt, Cochrane en Santa-Clara maakten
er in 2006 een meetinstrument van Brandt et al. (2006), zodat twee
standaarddeviaties, die van de wisselkoers en die van de SDF, volstaan om de oude macrovraag
te beantwoorden of landen hun risico delen. De
uncovered interest
parity (UIP, ongedekte rentepariteit: de verwachte depreciatie van een valuta is gelijk aan
het renteverschil) was toen al lang verworpen, meestal met het verkeerde teken
Hansen & Hodrick (1980)Fama (1984). Daardoor is de carry trade (lenen in een valuta met
lage rente, beleggen in een valuta met hoge rente) winstgevend. Zo werd een verworpen
theorie een vast feit waarvoor pas achteraf verklaringen werden gezocht, en bij carry ging
het feit dus zuiver aan de theorie vooraf. Die verklaringen zijn consumptierisico
Lustig & Verdelhan (2007), een
gemeenschappelijke factor Lustig et al. (2011), volatiliteitsrisico
Menkhoff et al. (2012), crashrisico
Brunnermeier et al. (2008)
en peso problems Burnside et al. (2011). Barroso en Santa-Clara
voegden momentum en value toe en vroegen welke combinatie een belegger zou moeten aanhouden
Barroso & Santa-Clara (2015).
Denk aan een Amerikaanse en een Zwitserse belegger. Een SDF is een lijst van waarderingen,
namelijk hoeveel een extra eenheid van de eigen munt in elke toekomstige toestand waard is.
Stel dat het de Amerikaanse economie in een bepaalde toestand slecht gaat, terwijl het in
Zwitserland meevalt. Een dollar is dan voor de Amerikaan veel waard en een frank voor de
Zwitser niet bijzonder, zodat de dollar in die toestand duurder wordt ten opzichte van de
frank. De wisselkoers beweegt dus met het verschil tussen hoe hard de twee beleggers hun
eigen
munt nodig hebben.
Hoe sterk die samenhang moet zijn, volgt uit een telling. Om een Sharpe-ratio van een half
te verklaren, moet marginaal nut in elk land met minstens de helft per jaar schommelen. De
koers van de dollar tegenover de frank
beweegt echter maar met ongeveer tien procent per jaar. Twee grootheden die elk met vijftig
procent schommelen en waarvan het verschil met tien procent schommelt, moeten vrijwel altijd
samen bewegen. Als landen hun risico’s slecht deelden, zouden wisselkoersen zeven keer zo
volatiel zijn. Consumptiegroei is tussen landen toch maar matig gecorreleerd, dus ofwel
meet consumptie marginaal nut slecht, ofwel zijn wisselkoersen te glad.
Bij de rente gaat het leerboek ook mis. Als de Australische rente vier procent hoger is
dan de
Japanse, zou de Australische dollar volgens UIP vier procent per jaar moeten dalen. In de
data
daalt hij gemiddeld veel minder, of stijgt hij zelfs. Een belegger die in yen leent en in
Australische dollars belegt, verdient daardoor het renteverschil en houdt het meestal.
Toch is dat geen gratis geld. Hoge-rentevaluta’s horen bij landen waar weinig uit voorzorg
wordt gespaard, terwijl yen en frank als toevluchtsoord dienen. In een wereldwijde paniek,
zoals
in oktober 2008, stijgen yen en frank en vallen de Australische en de Nieuw-Zeelandse
dollar.
Handelaren zeggen dat valuta’s met de trap omhoog gaan en met de lift omlaag. Een
strategie die
juist in de slechtste tijden verliest, draagt risico waarvoor een SDF een hoge premie
vraagt.
Maar als dertig jaar data geen crash bevatten, lijkt dezelfde strategie gratis geld. Dat
heet
een peso problem (risico dat wel in de prijzen zit maar niet in de steekproef).
Zo komen we bij risico of vergissing, een vraag die Santa-Clara zo stelt: draagt
de
belegger risico waarvoor een premie wordt betaald, of denkt hij iets te weten wat de prijs
niet weet Santa-Clara (2026)? Als het risico is, verwachten we twee dingen. De munt
van het land met het rustigste marginale nut heeft de hoogste rente en levert een premie
op, en die premie gaat juist in crises verloren, zodat het carry-rendement links scheef
verdeeld is.
Eerst laden we de bibliotheken die het hele college gebruikt.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
import hap
from hap import data as hap_data
hap.plotting.setup()
rng = np.random.default_rng(20240101)
Opzet. Er zijn twee toestanden op t+1, elk met kans 21. De Amerikaanse SDF m
waardeert payoffs in dollars en de Zwitserse SDF m∗ payoffs in franken:
toestand
kans
m (dollar)
m∗ (frank)
goed
0{,}5
0{,}80
0{,}88
slecht
0{,}5
1{,}20
1{,}08
Het recept. Laat St de dollarprijs van één frank zijn. De wisselkoers is de
verhouding van de twee SDF’s, zodat St+1/St=m∗/m in elke toestand. Dat is de enige
formule die de theorie pas later afleidt, want de premieformule in stap 5 kennen we al en de
index in stap 6 is een definitie.
Rentes.Rf=1/E[m]=1/1,00=1,00 en Rf∗=1/E[m∗]=1/0,98=1,0204
(Rf staat in dit college kortheidshalve voor het bruto risicovrije rendement, 1+Rf
in de notatie van de setup).
De Zwitserse E[m∗] is hier lager gekozen, zodat het land met de rustigere SDF ook de
hogere rente heeft. Of dat in het algemeen zo is, bepaalt in de theorie de parameter b.
Wisselkoers.St+1/St is 0,88/0,80=1,10 in de goede en 1,08/1,20=0,90 in de slechte toestand, dus de frank stijgt als het goed gaat en daalt als het slecht
gaat.
Controle. Een dollar in de frankobligatie levert Rf∗St+1/St op, dat is
1,1224
of 0,9184 dollar. De Amerikaanse SDF waardeert dat op
21(0,80⋅1,1224+1,20⋅0,9184)=1,0000 dollar.
UIP en carry. De frank stijgt gemiddeld niet, want 21(1,10+0,90)=1,00,
terwijl UIP een daling tot Rf/Rf∗=0,98 voorspelt. Een dollar lenen en in de
frankobligatie beleggen levert daardoor +12,24% of −8,16% op, gemiddeld
+2,04%.
Premie. Een premie is min de covariantie met m, gedeeld door E[m]. De afwijkingen
zijn ∓0,20 voor m en ±0,102 voor het carry-rendement, zodat Cov=−0,0204
en
de premie 0,0204 is, het hele renteverschil.
Risk sharing. Omdat Δs=logm∗−logm, is Var(Δs) de som van de
twee log-SDF-varianties min twee keer hun covariantie. Brandt, Cochrane en Santa-Clara
definiëren de risk-sharing-index als het deel van die som dat de covariantie wegwerkt.
Met standaarddeviaties 0,2027, 0,1024 en 0,1003 is dat
1−0,01007/(0,04110+0,01049)=0,8048.
De twee log-SDF’s zijn hier perfect gecorreleerd, maar de index blijft onder één omdat hij
ook een verschil in grootte bestraft. De cel hieronder rekent dezelfde getallen na.
De twee kolommen zijn gelijk. Een frank die in slechte tijden daalt, is voor een Amerikaan
dus
riskant en levert het hele renteverschil als premie op. Een wisselkoers die met tien procent
schommelt, geeft naast SDF’s van tien en twintig procent al een index van 0,8048.
De theorie volgt uit één identiteit, namelijk dat de wisselkoers de verhouding van twee
SDF’s
is. Daaruit volgen twee voorspellingen. Bij gladde wisselkoersen moeten de SDF’s van landen
sterk samenbewegen, en de munt van een land met rustig marginaal nut levert een premie op.
Daarna zien we hoe de UIP-regressie die premie meet, en wat de literatuur over carry,
crashes,
momentum en value vond.
Het binnenland is de VS, en St is de dollarprijs van één eenheid buitenlandse munt. Met
st=logSt betekent een positieve Δst+1 dat de buitenlandse munt stijgt, en
bij de G10-valuta’s schommelt Δs met zeven tot twaalf procent per jaar. De SDF
mt+1 waardeert dollarpayoffs en mt+1∗ payoffs in buitenlandse munt, waarbij de
ster
“buitenland” betekent en niet “optimaal”. De log risicovrije rentes it en it∗ voldoen
aan eit=1/Et[mt+1] en eit∗=1/Et[mt+1∗]. Wie dollars leent en één
periode in de buitenlandse obligatie belegt, verdient het log overrendement
Dat rendement is het renteverschil plus de koerswinst op de buitenlandse munt. Het is nul
als
de munt precies zoveel daalt als het renteverschil, en in het toy-voorbeeld was het
renteverschil ongeveer twee procent en de koerswinst plus of min tien procent.
Zodra de twee SDF’s vastliggen, ligt ook de wisselkoersverandering vast, want die is hun
verhouding. Een
Amerikaan kan een buitenlandse payoff kopen door dollars om te wisselen en de opbrengst
later
terug te wisselen. Voor hem is dat een dollarpayoff maal de wisselkoersverandering, en zijn
eigen SDF moet die goed waarderen. Daardoor is m maal de wisselkoersverandering een
geldige
buitenlandse SDF. Als er maar één buitenlandse SDF is, moet het deze zijn.
De buitenlandse munt stijgt dus in precies die toestanden waarin marginaal nut in het
buitenland hoog is ten opzichte van thuis. Bij onvolledige markten is mt+1St+1/St
nog
steeds een geldige buitenlandse SDF, zodat de rest van de theorie ook dan bruikbaar is.
Met de twee SDF’s liggen ook de rentes vast, want it−it∗=logEt[mt+1∗]−logEt[mt+1].
Hoe sterk moeten de SDF’s van twee landen samenbewegen als de wisselkoers maar met tien
procent
per jaar schommelt? De variantie van een verschil is de som van de varianties min twee
keer de
covariantie. Links in (2) staat iets kleins en rechts het
verschil
van twee zeer volatiele grootheden, zodat alleen een grote covariantie dat verschil kan
wegwerken.
Proof 2
De eerste vergelijking is de variantie van logm∗−logm. De tweede volgt door beide
kanten te delen door Var(logm)+Var(logm∗). □
De index is één als de twee log-SDF’s gelijk zijn en nul als ze ongecorreleerd zijn. Omdat
we de SDF’s niet waarnemen, hebben we een ondergrens nodig. Als beide log-SDF’s een
standaarddeviatie van minstens a hebben, geldt
Dezelfde uitdrukking begrenst ook de index, omdat de noemer Var(logm)+Var(logm∗)
minstens 2a2 is. Bij SD(logm)=SD(logm∗)=a vallen index, correlatie en
grens samen. Het toy-voorbeeld laat zien dat ze daarbuiten verschillen, want daar is de
correlatie één en de index 0,8048. Vanaf hier heet 1−Var(Δs)/(2a2) kortweg de
grens. Die stijgt met a en daalt met de wisselkoersvariantie, zoals de tweede oefening
laat
zien.
De waarde van a komt uit de Hansen-Jagannathan-grens
(5), die zegt dat SD(m)/E[m] minstens gelijk is aan de
hoogste Sharpe-ratio. Die grens gaat over het niveau van m, en als m lognormaal is met
log-standaarddeviatie σ, is SD(m)/E[m]=eσ2−1. Daaruit volgt
zodat een hogere Sharpe-ratio een volatielere SDF vraagt, met a=0,47 bij een
Sharpe-ratio van een half.
Brandt, Cochrane en Santa-Clara rekenden met ronde getallen. Een wisselkoersvolatiliteit van
10% en een SDF-volatiliteit van 50% geven een grens van 1−0,12/(2⋅0,52)=0,98, en zonder risk sharing zou de wisselkoers met 2⋅0,5=71% moeten
schommelen. Hun eigen schattingen voor de VS tegenover Engeland, Duitsland en Japan
bevestigen die orde van grootte, met wisselkoersvolatiliteiten van 11,5 tot 12,9% (tabel
en ondergrenzen voor de index van 0,98 of hoger (tabel 2). De telling uit de intuïtie
komt dus uit, want
de SDF’s van landen bewegen bijna perfect samen.
Tegenover die 0,98 staan consumptiedata. Consumptiegroei is tussen landen maar matig
gecorreleerd, en reële wisselkoersen bewegen nauwelijks met relatieve consumptie
Backus & Smith (1993). Welke kant het mis heeft, zegt de grens niet.
Een gedekte valutabelegging moet de dollarrente opleveren, maar over de verwachte
wisselkoers
zegt arbitrage niets. Wie dollars in franken wisselt, frankrente ontvangt en de franken op
termijn terugverkoopt, heeft een risicovrije dollarbelegging gebouwd. Laat Ft de
termijnkoers zijn en ft=logFt. Eén dollar levert dan eit op, of
eit∗Ft/St
via de gedekte frankbelegging. Omdat arbitrage niet mag bestaan, geldt dan covered interest
parity (CIP, gedekte rentepariteit):
De termijnpremie is dus gelijk aan het renteverschil, en het carry-rendement is de koers op
t+1 min de termijnkoers. UIP voegt daar de hypothese aan toe dat
Et[Δst+1]=it−it∗, oftewel Et[rxt+1]=0, zodat valutarisico geen
premie krijgt. De standaardtoets is de regressie
Onder UIP zijn α=0 en β=1, zodat een renteverschil van één procentpunt een
verwachte depreciatie van één procentpunt geeft. Hansen en Hodrick Hansen & Hodrick (1980)
toetsten of de termijnkoers een zuivere voorspeller is, met de standaardfouten voor
overlappende waarnemingen uit Voorspelbaarheid van rendementen. Fama Fama (1984) vond
hellingen
onder nul. In het overzicht van Engel Engel (1996) is de zuiverheid van de
termijnkoers in
de periode van zwevende koersen verworpen, en Froot en Thaler namen het resultaat op in hun
reeks over anomalieën Froot & Thaler (1990).
Een negatieve helling in (7) zegt iets over de risicopremie, zonder
dat
we een model van die premie nodig hebben. Het renteverschil is de som van een verwachte
depreciatie en een premie, en de helling meet hoe sterk de verwachte depreciatie met die som
meebeweegt. Is de helling negatief, dan moet de premie harder bewegen dan de verwachte
depreciatie en er tegenin gaan. Definieer daarom qt=Et[Δst+1] en
pt=ft−Et[st+1]=−Et[rxt+1], zodat ft−st=pt+qt. Net als bij
Fama staat pt dus voor de premie.
Proof 3
Schrijf Δst+1=qt+ut+1 met Et[ut+1]=0, zodat u ongecorreleerd is
met pt+qt. Dan is β=Cov(q,p+q)/Var(p+q), en dat is
(8). Gevolg 1. De noemer is positief, dus β<0
precies als Var(q)+Cov(p,q)<0. Gevolg 2.β<21 geldt precies als
2Var(q)+2Cov(p,q)<Var(p)+Var(q)+2Cov(p,q), dus als Var(q)<Var(p).
Gevolg 3. Omdat rx=(i∗−i)+Δs en de helling van Δs op i∗−i gelijk
is aan −β, is de helling van rx op i∗−i gelijk aan 1−β. □
Om de eerste twee gevolgen staat het artikel van Fama bekend, en het derde vertaalt de
helling naar beleggen. Bij β=1 verdient carry niets voorspelbaars en bij β=0
het renteverschil. Bij β=−1 verdient carry het dubbele, omdat de hoge-rentevaluta
er dan ook nog bij stijgt. De gepoolde schatting in de replicatie ligt met −0,62
tussen β=0 en β=−1.
4.6Carry als risicopremie in een lognormaal model¶
In een lognormaal model levert de munt van het land met de rustigste SDF een premie op.
Een land
waar marginaal nut sterk schommelt, spaart uit voorzorg en heeft daardoor een lage rente.
Zijn
munt wordt bovendien duur precies wanneer marginaal nut daar hoog is. Een belegger die
zo’n munt
aanhoudt, heeft dus een verzekering en betaalt ervoor, terwijl de munt van een land met
rustig
marginaal nut een premie oplevert. Laat (logmt+1,logmt+1∗) conditioneel
normaal
zijn met varianties vt en vt∗ en covariantie ct. In het toy-voorbeeld zijn de
varianties 0,0411 en 0,0105.
Proof 4
Onder normaliteit is Et[m]=exp(Et[logm]+21vt), zodat
it=−Et[logmt+1]−21vt, en hetzelfde geldt in het buitenland. Met
(2) is dan
Et[rx]=i∗−i+Et[logm∗]−Et[logm]=21(v−v∗). Omdat rx
conditioneel normaal is met variantie v+v∗−2c, is
logEt[erx]=21(v−v∗)+21(v+v∗−2c)=v−c, en
Covt(logm,logm∗−logm)=c−v. □
Een Amerikaan verdient dus een premie op de munt van een land met een minder volatiele
SDF.
In het toy-voorbeeld is 21(v−v∗)=21(0,04110−0,01049)=0,0153,
dicht
bij de exacte log-premie log1,0204+E[Δs]=0,0202−0,0050=0,0152.
Het
teken uit de intuïtie klopt dus. Of die munt ook de hogere rente heeft, hangt af van hoe
de rente met de variantie beweegt, en de parameter b hieronder meet precies dat.
Proof 5
Nu is it−it∗=b(vt−vt∗) en Et[Δs]=(b+21)(vt−vt∗). De
verwachte depreciatie is dus een vast veelvoud (b+21)/b van het renteverschil.
□
Een negatieve helling vraagt dus een rente die daalt met de SDF-variantie, maar niet te
hard.
Daar hangt een prijs aan. Volgens Backus, Foresi en Telmer Backus et al. (2001)
vraagt de anomalie in affiene modellen asymmetrische landen of rentes die met positieve kans
negatief worden, en in het model hierboven wordt it met b<0 en een onbegrensde vt
inderdaad vroeg of laat negatief. Bekaert Bekaert (1996) vond het spiegelbeeld: zelfs
zijn
meest complexe model leverde geen voldoende variabele premies zonder te volatiele
wisselkoersen.
4.7Carry-portefeuilles en een gemeenschappelijke factor¶
Als valuta’s verschillen in hun gevoeligheid voor een gemeenschappelijke SDF, ligt het
voor de
hand om ze op renteverschil te sorteren, zoals aandelen in Fama-French 1992/1993. Lustig en
Verdelhan Lustig & Verdelhan (2007) deden dat vanaf 1953 met acht portefeuilles op
jaardata.
Ze vonden een verschil van tot vijf procentpunt per jaar tussen lage en hoge rente, dat ze
met
consumptiegroeirisico verklaarden, maar wel bij een risicoaversie rond 100.
Lustig, Roussanov en Verdelhan Lustig et al. (2011) zochten de factor in de
rendementen zelf. Met zes portefeuilles uit 37 valuta’s over 1983–2008 haalde het verschil
tussen hoge- en lage-rentevaluta na kosten een Sharpe-ratio van 0,54 per jaar. Hun factor
HMLFX, de portefeuille met de hoogste rente min die met de
laagste,
verklaart ongeveer 70% van de verschillen in gemiddeld rendement.
Menkhoff, Sarno, Schmeling en Schrimpf Menkhoff et al. (2012) vonden
dat
hoge-rentevaluta’s verliezen als de wereldwijde valutavolatiliteit onverwacht stijgt. Die
volatiliteit verklaart meer dan 90% van de verschillen tussen vijf carry-portefeuilles,
zodat
de carry trade volatiliteitsverzekering verkoopt, net als de strategieën uit
Opties en crashrisico.
Als slechte toestanden zeldzaam en extreem zijn, zit het risico niet in de standaarddeviatie
maar in de staart. Neem een overrendement per maand r=μ+σε+JB, met
ε∼N(0,1), een sprong J<0 en een B die met kans π gelijk is aan
één,
alle onafhankelijk. Dan is
E[r]=μ+πJ,E[(r−Er)3]=π(1−π)(1−2π)J3<0(π<21),Pr(geen sprong in T)=(1−π)T.
Het gemiddelde daalt met de verwachte sprong, en de scheefheid is negatief zolang crashes
zeldzaam zijn, omdat alleen de sprongterm een derde moment heeft. De kans op een steekproef
zonder crash daalt exponentieel met de lengte T. In zo’n steekproef is de verdeling
normaal,
zodat het gemiddelde dan niet E[r] schat maar μ=E[r]+π∣J∣.
Brunnermeier, Nagel en Pedersen Brunnermeier et al. (2008) vonden met dagdata
voor
acht valuta’s over 1986–2006 een R2 van 81% tussen gemiddelde scheefheid en gemiddeld
renteverschil (hun figuur 2). Zij verklaren crashes uit het plotseling afbouwen van
carry-posities als financieringsliquiditeit opdroogt, het mechanisme van
VaR, RiskMetrics en LTCM.
Burnside en coauteurs Burnside et al. (2011) vroegen of een peso
problem de winst verklaart. Over 1976 tot 2009 had hun gelijkgewogen
carry-portefeuille van twintig valuta’s een Sharpe-ratio van 0,911 (tabel 2). Volgens hen
is er
een peso problem, maar heeft de zeldzame toestand vooral een zeer hoge SDF en geen zeer
groot
verlies. De peso-simulatie aan het eind van de Simulatie laat zien waarom sprongen in het
rendement alleen niet genoeg zijn.
Carry is niet het enige kenmerk dat valutarendementen voorspelt. In een tweede artikel
vonden Menkhoff en coauteurs Menkhoff et al. (2012) een verschil van
tot 10% per jaar tussen
valuta’s die in het verleden wonnen en valuta’s die verloren. Asness, Moskowitz en Pedersen
Asness et al. (2013) namen valuta’s op in hun acht markten
(Jegadeesh-Titman, Carhart en momentum crashes), met als value-signaal minus de verandering van de reële wisselkoers
(de afwijking van koopkrachtpariteit) over vijf jaar. Over 1979–2011 hadden hun
valutafactoren voor value en momentum Sharpe-ratio’s van
0,44
en 0,32 (tabel I).
Barroso en Santa-Clara Barroso & Santa-Clara (2015) schatten portefeuillegewichten als
functie van gestandaardiseerde kenmerken, met de techniek van Brandt, Santa-Clara en
Valkanov
Brandt et al. (2009). Volgens hen dragen carry, momentum, value en reversal
bij, terwijl de reële wisselkoers en de lopende rekening dat niet doen. Valuta verhoogde de
Sharpe-ratio van hun portefeuilles gemiddeld met een half, terwijl het crashrisico daalde.
5Simulatie: de grens met een geschatte Sharpe-ratio¶
Hoe onzeker is de grens als de Sharpe-ratio uit de data geschat moet worden? De grens
gebruikt een goed gemeten tweede moment, de wisselkoersvolatiliteit, en een slecht gemeten
Sharpe-ratio.
We nemen een ware Sharpe-ratio van een half, een aandelenvolatiliteit van 16% en een
wisselkoersvolatiliteit van 10%, zoals die van Δs in het toy-voorbeeld. De
aandelenvolatiliteit bepaalt hoe ver het geschatte gemiddelde, en daarmee de geschatte
Sharpe-ratio, van de ware waarde afligt. De ware grens is dan
1−0,01/(2log1,25)=0,978. Per steekproef van T jaar maanddata trekken we
een normaal steekproefgemiddelde en een
geschaalde χ2-variantie, omdat de maandrendementen onafhankelijk en normaal verdeeld
zijn.
De mediaan van de geschatte grens ligt op de ware waarde, en de wisselkoersvolatiliteit is
nauwelijks onzeker, want bij dertig jaar ligt ze met 90% kans tussen 9,4 en 10,6%. In de
figuur
gaat het om de linkerstaart, die langer wordt naarmate de steekproef korter is.
Source
fig, ax = plt.subplots()
bins = np.linspace(0.5, 1.0, 101)
for k, (years, draws) in enumerate(bcs_draws.items()):
ax.hist(np.clip(draws, 0.5, 1.0), bins=bins, histtype="step", lw=1.6, density=True,
color=hap.plotting.COLORS[k], label=f"{years} jaar maanddata")
ax.axvline(rho_true, color="black", ls="--", lw=1, label="ware ondergrens")
ax.set_xlabel("Geschatte ondergrens voor Corr(log m, log m*) (afgekapt op 0,5)")
ax.set_ylabel("Dichtheid")
ax.set_title("De grens voor risk sharing als de Sharpe-ratio geschat moet worden")
ax.legend(loc="upper left")
plt.show()
Figure 1:De verdeling van de geschatte ondergrens voor de SDF-correlatie. De massa ligt dicht bij de
ware waarde, omdat de grens ongevoelig is voor de SDF-volatiliteit zolang die groot is ten
opzichte van de wisselkoers. De linkerstaart komt van steekproeven waarin de Sharpe-ratio
toevallig laag uitvalt.
Ook met dertig jaar data valt de grens in 93% van de steekproeven boven de 0,9. De
onzekerheid
zit in de Sharpe-ratio, en de grens is daar sterk niet-lineair in. Een Sharpe-ratio van 0,2,
bij dertig jaar ongeveer het 5%-kwantiel, geeft nog een grens van 0,87. Bij een Sharpe-ratio
van 0,1 zakt de grens naar 0,50, en onder 0,07 wordt hij negatief. De puzzel verdwijnt dus
pas
als de ware Sharpe-ratio veel lager is dan we denken, net als bij de aandelenpremie.
Hoe vaak ziet dertig jaar carry er gratis uit?
We nemen een strategie zonder risicopremie. In normale maanden verdient ze μ=−πJ met
een volatiliteit van 2,5% per maand, ongeveer die van een G10-carry-portefeuille. Met kans
π=1/360 per maand crasht ze met J=−30%, gemiddeld één keer per dertig jaar.
P(geen crash), simulatie 0.369
P(geen crash), (1-pi)^T 0.367
gem. Sharpe-ratio zonder crash 0.115
theorie: pi|J| sqrt(12) / sigma 0.115
P(t > 2 | geen crash) 0.085
P(t > 2), alle steekproeven 0.035
mediane scheefheid zonder crash -0.001
mediane scheefheid met crash -3.331
dtype: float64
In 37% van de steekproeven valt geen crash. Het gemiddelde is dan naar boven vertekend en de
scheefheid nul, zodat de onderzoeker het risico niet ziet. De schijnbare Sharpe-ratio is echter
klein, π∣J∣12/σ=0,115, en maar 8,5% van die steekproeven haalt t>2. De
figuur toont links de Sharpe-ratio met en zonder crash, en rechts wat er gebeurt als crashes
vaker komen.
Source
pis = np.array([1 / 1200, 1 / 720, 1 / 480, 1 / 360, 1 / 240, 1 / 180, 1 / 120])
sim_nc, sim_sr = [], []
for pi in pis:
draw = peso_samples(pi, n=4_000)
sim_nc.append(draw["no_crash"].mean())
sim_sr.append(draw["sharpe"][draw["no_crash"]].mean() if draw["no_crash"].any() else np.nan)
pi_grid = np.linspace(1 / 1500, 1 / 100, 200)
fig, axes = plt.subplots(1, 2, figsize=(11, 4.3))
bins = np.linspace(-0.6, 0.8, 57)
axes[0].hist(peso["sharpe"][nc], bins=bins, alpha=0.6, label="steekproeven zonder crash")
axes[0].hist(peso["sharpe"][~nc], bins=bins, alpha=0.6, label="steekproeven met crash")
axes[0].axvline(0, color="black", lw=0.8)
axes[0].set_title("(a) Sharpe-ratio over 30 jaar, ware premie nul")
axes[0].set_xlabel("Geschatte Sharpe-ratio (per jaar)")
axes[0].set_ylabel("Aantal steekproeven")
axes[0].legend()
axes[1].plot(360 * pi_grid, (1 - pi_grid) ** T_peso, color="C0", label="P(geen crash in 30 jaar)")
axes[1].plot(360 * pi_grid, pi_grid * abs(JUMP) * np.sqrt(12) / SIGMA_PESO, color="C1",
label="Sharpe-ratio zonder crash (theorie)")
axes[1].scatter(360 * pis, sim_nc, color="C0", s=18, zorder=3)
axes[1].scatter(360 * pis, sim_sr, color="C1", s=18, zorder=3, label="simulatie")
axes[1].set_title("(b) De afruil van een peso problem, J = −30%")
axes[1].set_xlabel("Verwacht aantal crashes per 30 jaar")
axes[1].set_ylabel("Kans respectievelijk Sharpe-ratio")
axes[1].legend()
fig.tight_layout()
plt.show()
Links ziet een strategie zonder premie er in ruim een derde van de steekproeven winstgevend en
symmetrisch uit. Rechts stijgt de schijnbare Sharpe-ratio met de kans op een crash, terwijl de
kans op een steekproef zonder crash daalt. Voor de Sharpe-ratio van 0,44 uit de replicatie is
π=0,44⋅0,025/(0,3012)=0,0106 per maand nodig, één crash per acht
jaar. De kans op dertig jaar zonder crash is dan (1−0,0106)360≈2%. Een peso
problem zit dus in de prijs van de slechte toestand, een zeer hoge SDF, en niet in een
onwaarschijnlijk grote sprong in het rendement.
We laden de spotkoersen op maandeinde en de korte rentes, en berekenen per valuta het
renteverschil en het carry-rendement van de maand erna.
FX_CODES = { # FRED id, True if quoted as USD per foreign unit
"GBP": ("DEXUSUK", True), "JPY": ("DEXJPUS", False), "CHF": ("DEXSZUS", False),
"CAD": ("DEXCAUS", False), "AUD": ("DEXUSAL", True), "NZD": ("DEXUSNZ", True),
"NOK": ("DEXNOUS", False), "SEK": ("DEXSDUS", False), "EUR": ("DEXUSEU", True),
}
CURRENCIES = list(FX_CODES)
MONTHS = pd.date_range("1976-01-31", "2025-12-31", freq="ME")
def fred_month_end(code):
"""Last available observation of each month."""
return hap_data.fred(code)[code].dropna().resample("ME").last()
def fred_rate(code):
"""Monthly OECD short rate as a decimal per year, stamped at month end."""
return hap_data.fred(code)[code].dropna().resample("ME").mean() / 100
log_spot = pd.DataFrame(
{c: (1 if usd_per_unit else -1) * np.log(fred_month_end(code)) for c, (code, usd_per_unit) in FX_CODES.items()}
).reindex(MONTHS)
rates = pd.DataFrame({
"USD": fred_rate("IR3TIB01USM156N"),
"GBP": fred_rate("IR3TIB01GBM156N"),
"JPY": fred_rate("IR3TCD01JPM156N").loc[:"2002-03"].combine_first(fred_rate("IR3TIB01JPM156N")),
"CHF": fred_rate("IRSTCI01CHM156N").loc[:"1999-06"].combine_first(fred_rate("IR3TIB01CHM156N")),
"CAD": fred_rate("IR3TIB01CAM156N"),
"AUD": fred_rate("IR3TIB01AUM156N"),
"NZD": fred_rate("IR3TIB01NZM156N"),
"NOK": fred_rate("IR3TIB01NOM156N"),
"SEK": fred_rate("IR3TIB01SEM156N"),
"EUR": fred_rate("IR3TIB01DEM156N").loc["1999":],
}).reindex(MONTHS)
rate_diff = rates[CURRENCIES].sub(rates["USD"], axis=0) / 12 # i*_t - i_t per month, known at t
ds_next = log_spot.diff().shift(-1) # Delta s_{t+1}, stored at t
rx_next = (rate_diff + ds_next).where(ds_next.notna()) # carry excess return t -> t+1, stored at t
pd.DataFrame({
"eerste maand": rx_next.apply(lambda x: x.first_valid_index()).dt.strftime("%Y-%m"),
"maanden": rx_next.notna().sum(),
"gem. renteverschil (%/jr)": 1200 * rate_diff.mean(),
"vol. wisselkoers (%/jr)": 100 * np.sqrt(12) * log_spot.diff().std(),
}).round(2)
Loading...
De wisselkoersvolatiliteiten liggen tussen ongeveer 7% (Canada) en 12% (Nieuw-Zeeland),
dezelfde orde van grootte als bij Brandt, Cochrane en Santa-Clara en in het toy-voorbeeld.
We schatten (7) op maanddata met Newey-West-standaardfouten. De
gepoolde
schatting haalt per valuta het gemiddelde eraf en clustert de standaardfouten per maand,
omdat
alle valuta’s tegen dezelfde dollar bewegen.
fama_rows = {}
for c in CURRENCIES:
fit = hap.stats.newey_west(ds_next[c], -rate_diff[c], lags=3)
b, se = fit.params.iloc[1], fit.bse.iloc[1]
fama_rows[c] = {"helling": b, "SE": se, "t (helling = 0)": b / se, "t (helling = 1)": (b - 1) / se,
"R2 (%)": 100 * fit.rsquared, "maanden": int(fit.nobs)}
panel = pd.DataFrame({"ds": ds_next.stack(), "fwd": (-rate_diff).stack()}).dropna()
panel_dm = panel - panel.groupby(level=1).transform("mean")
pooled = sm.OLS(panel_dm["ds"], panel_dm[["fwd"]]).fit(
cov_type="cluster", cov_kwds={"groups": panel_dm.index.get_level_values(0).factorize()[0]}
)
b, se = pooled.params.iloc[0], pooled.bse.iloc[0]
fama_rows["gepoold"] = {"helling": b, "SE": se, "t (helling = 0)": b / se, "t (helling = 1)": (b - 1) / se,
"R2 (%)": 100 * pooled.rsquared, "maanden": int(pooled.nobs)}
fama_table = pd.DataFrame(fama_rows).T
fama_table.round(2)
Loading...
Acht van de negen hellingen zijn negatief, en alleen de Zweedse kroon heeft een kleine
positieve helling (0,16) met een grote standaardfout (1,11). Voor zeven valuta’s verwerpt
de toets
β=1
op het 5%-niveau. De gepoolde helling is −0,62, met een t-waarde van −4,2 tegen
β=1. In het lognormale model van Corollary 2 hoort daarbij een
b van ongeveer min een derde, binnen het vereiste bereik tussen −21 en nul.
Tegen β=0 haalt echter geen enkele valuta ∣t∣>2, en de yen komt met −1,96
het
dichtst bij. Het renteverschil verklaart minder dan één procent van de maandelijkse
variantie
van wisselkoersen. Vijftig jaar data zijn dus genoeg om UIP te verwerpen, maar nauwelijks
om het
teken vast te leggen. Dat is de standaardfout van 2% in valutavorm,
want
een klein gemiddeld effect naast veel ruis is slecht te meten. Toch zegt de puntschatting
via Proposition 3 iets scherps, namelijk dat de premie volatieler
dan de verwachte
depreciatie en er negatief mee gecorreleerd is, en dat carry 1,62 keer het
renteverschil verdient.
Elke maand sorteren we de beschikbare valuta’s, minstens zes, op it∗−it in drie
gelijkgewogen portefeuilles. HMLFX is P3 min P1, en het rendement is
(1).
def sort_portfolios(signal, returns_next, n_groups=3, min_assets=6):
"""Equal-weighted portfolios sorted on a signal at t; returns earned t -> t+1, indexed at t+1."""
ranks = signal.where(returns_next.notna()).rank(axis=1, method="first")
count = ranks.notna().sum(axis=1)
group = np.ceil(ranks.mul(n_groups).div(count, axis=0)) # group g: rank share in ((g-1)/n, g/n]
out = pd.DataFrame({f"P{g}": returns_next.where(group == g).mean(axis=1) for g in range(1, n_groups + 1)})
out = out[count >= min_assets].copy()
out["HML"] = out[f"P{n_groups}"] - out["P1"]
out.index = out.index + pd.offsets.MonthEnd(1)
return out
def portfolio_table(frame):
"""Annualised statistics with the standard error of the mean and of the Sharpe ratio."""
stats = hap.stats.summary_stats(frame).astype({"nobs": int})
years = stats["nobs"] / 12
sharpe = stats["sharpe_ann"].astype(float)
return pd.DataFrame({
"gem. (%/jr)": 100 * stats["mean_ann"], "SE gem.": 100 * stats["se_mean_ann"],
"vol. (%/jr)": 100 * stats["std_ann"], "Sharpe": sharpe,
"SE Sharpe": np.sqrt((1 + sharpe**2 / 2) / years),
"scheefheid": stats["skew"], "slechtste maand (%)": 100 * stats["min"],
"maanden": stats["nobs"],
}).astype(float)
carry = sort_portfolios(rate_diff, rx_next)
print(f"carry-portefeuilles {carry.index[0]:%Y-%m} t/m {carry.index[-1]:%Y-%m}")
portfolio_table(carry).round(2)
carry-portefeuilles 1979-02 t/m 2025-12
Loading...
De portefeuilles beginnen in februari 1979, de eerste maand met zes valuta’s, en de
rangorde is monotoon, want het gemiddelde rendement stijgt van P1 naar P3. HMLFX haalt
een Sharpe-ratio van 0,44 met een standaardfout van 0,15, en de overige waarden staan in de
tabel. De negatieve scheefheid van HMLFX komt van de hoge-rentekant, want P3 is links
scheef en P1 rechts. De volgende cel
kijkt naar de crisis van 2008 en naar de slechtste maanden.
HML_FX aug-dec 2008: -26.6% (log, cumulatief)
grootste drawdown 2007-06 t/m 2009-12: -28.0%, dal in 2009-01
grootste drawdown volledige steekproef: -29.7%
Loading...
Van augustus tot en met december 2008 verloor HMLFX 26,6% in logs, en tot januari 2009
liep de drawdown op tot 28%. Oktober 2008 was met −11,2% de slechtste maand, gelijk met
juli 1986, en ook oktober 1987 staat in de lijst. Een handvol maanden bepaalt zo het
risicoprofiel van 47 jaar. In de figuur gaat het om de dikke lijn van HMLFX in het
grijze
najaar van 2008.
Source
fig, ax = plt.subplots()
labels = {"P1": "P1 (lage rente)", "P2": "P2", "P3": "P3 (hoge rente)", "HML": "HML$_{FX}$"}
for k, col in enumerate(["P1", "P2", "P3", "HML"]):
ax.plot(carry.index, 100 * carry[col].cumsum(), color=hap.plotting.COLORS[k], label=labels[col],
lw=2.2 if col == "HML" else 1.4)
ax.axvspan(pd.Timestamp("2008-08-01"), pd.Timestamp("2008-12-31"), color="grey", alpha=0.25, lw=0)
ax.axhline(0, color="black", lw=0.8)
hap.plotting.timeline_axis(ax)
ax.set_xlabel("Jaar")
ax.set_ylabel("Cumulatief log overrendement (%)")
ax.set_title("Carry-portefeuilles van G10-valuta's tegenover de dollar")
ax.legend()
plt.show()
Figure 2:Cumulatieve log overrendementen van drie portefeuilles gesorteerd op renteverschil.
Lage-rentevaluta’s verliezen gestaag en hoge-rentevaluta’s winnen gestaag, maar in het grijze
najaar van 2008 gaat een groot deel van het verschil in een paar maanden verloren. Zo zijn de
trap en de lift uit de intuïtie in de data terug te zien.
We nemen de Sharpe-ratio van de Amerikaanse markt als grens voor beide SDF’s, zetten die met
(5) om en berekenen (4) per valuta. Ter
controle doen we dat ook met de Sharpe-ratio min twee standaardfouten, en met de maximale
Sharpe-ratio van de 25 portefeuilles en de markt, die in de steekproef overschat is.
Met de Sharpe-ratio van de markt over 1976–2025 ligt de grens per valuta tussen 0,975 voor
de Nieuw-Zeelandse en 0,991 voor de Canadese dollar. Een Sharpe-ratio die twee
standaardfouten lager ligt, trekt de grens omlaag, en de maximale Sharpe-ratio duwt hem
dichter naar één. In alle drie de kolommen blijft het G10-gemiddelde boven de 0,9.
Eén grens voor beide landen is verdedigbaar. Brandt, Cochrane en Santa-Clara vonden lokale
Sharpe-ratio’s van 0,26 (Japan) tot 0,63 (VS), maar minimum-variantie-SDF’s van
vergelijkbare
volatiliteit, doordat alle beleggers in wezen dezelfde activa kunnen kopen. Het resultaat is
robuust omdat de wisselkoersvariantie klein is ten opzichte van de SDF-variantie, zoals de
simulatie al liet zien.
Momentum is het cumulatieve carry-rendement over maand t−11 tot en met t−1, zoals de
12-1-regel van Jegadeesh-Titman, Carhart en momentum crashes. Value is minus de verandering van de reële wisselkoers
over vijf jaar, omdat een munt die reëel goedkoper is geworden als ondergewaardeerd geldt,
net als bij Asness, Moskowitz en Pedersen. We laten de hele reële wisselkoers drie
maanden achterlopen, zodat de prijsindices op dat moment gepubliceerd zijn.
Over 1981–2025 haalt value de hoogste Sharpe-ratio van de drie kenmerken, terwijl momentum
vrijwel niets doet. Momentum en value zijn negatief gecorreleerd, en carry hangt met beide
nauwelijks samen. Een gelijkgewogen mix van de drie haalt daardoor met 0,52 een hogere
Sharpe-ratio dan elk kenmerk alleen. De crash van carry verdwijnt niet, want de scheefheid
blijft −0,71, maar hij wordt verdund. Barroso en Santa-Clara bouwen precies zo’n
portefeuille uit kenmerken die elk een ander risico dragen.
De tabel zet de belangrijkste getallen naast de gepubliceerde waarden. Voor de Fama-helling
geeft de eerste rij alleen het teken uit het origineel, omdat Fama per valuta rapporteerde.
Geslaagd. De data gedragen zich zoals we vooraf verwachtten. De hellingen liggen onder
één en zijn op één na negatief, de carry-portefeuilles zijn monotoon, en HMLFX verloor
van augustus tot en met december 2008 26,6%. Voor elke valuta ligt de grens boven de 0,9.
Momentum blijft als enige achter bij het origineel, maar het verschil is kleiner dan twee
keer de standaardfout van 0,15.
Wat het model verklaart. De identiteit (2) koppelt het
SDF-raamwerk rechtstreeks aan data. Ze verklaart waarom rentes, wisselkoersen en
risicopremies
samenhangen, en waarom de munt van een land met volatiel marginaal nut een lage rente
heeft en
in crises stijgt. Ook een UIP-helling onder nul wordt zo een mogelijke risicopremie in
plaats
van irrationaliteit. De uitspraak van Brandt, Cochrane en Santa-Clara over risk sharing
komt op
onze G10-data terug met hetzelfde getal, 0,98.
Waar het breekt. Het model breekt op dezelfde data. De gepoolde Fama-helling is
−0,62
in plaats van één, en HMLFX verloor in het najaar van 2008 ruim een kwart, waarna de
Sharpe-ratio zakte naar 0,13
(derde oefening). Het lognormale model geeft dat teken alleen als de rente daalt met de
SDF-variantie, en dat kost volgens Backus, Foresi en Telmer negatieve rentes of
asymmetrische
landen. Een SDF-correlatie van 0,98 staat bovendien haaks op consumptiedata. De theorie
voorspelde het feit dus niet, maar maakte er achteraf ruimte voor.
Risico of vergissing? In de Chicago-lezing is carry een beloning voor wereldwijd
risico. Hoge-rentevaluta’s verliezen als de wereldwijde volatiliteit onverwacht stijgt
Menkhoff et al. (2012), laden op één gemeenschappelijke factor
Lustig et al. (2011), en hun peso problem is een toestand waarin een dollar
extreem veel waard is Burnside et al. (2011). In de Yale-lezing
is de winst een vergissing die blijft bestaan door limits of arbitrage (arbitrageurs met
beperkt kapitaal kunnen niet alles corrigeren). Valutamomentum komt dan uit onder- en
overreactie Menkhoff et al. (2012), crashes uit gedwongen afbouw
Brunnermeier et al. (2008) en de winst deels uit schaars speculatief kapitaal
Barroso & Santa-Clara (2015). Om de kampen te scheiden
is de
SDF in zeldzame crisistoestanden nodig, en die is met een handvol crises niet te meten.
Wat er daarna kwam. Barroso en Santa-Clara pasten op valuta’s de methode toe die het
sorteren op
één kenmerk vervangt door gewichten die rechtstreeks als functie van kenmerken worden
geschat. Die parametrische
portefeuilles zijn het onderwerp van Parametrische portefeuilles en idiosyncratisch risico.
(1) Nu is E[m∗]=1,00, dus Rf∗=Rf=1,00. De frank stijgt met factor
0,90/0,80=1,125 in de goede toestand en daalt tot 1,10/1,20=0,9167 in de
slechte. Het carry-rendement is daardoor +12,5% of −8,33%, gemiddeld +2,08%.
(2) De premie komt uit de covariantie met de Amerikaanse SDF en niet uit het
renteverschil. De frank daalt nog steeds in de slechte toestand, omdat marginaal nut in
Zwitserland daar minder stijgt dan in de VS. De lognormale benadering geeft 0,0155 tegen een
exacte log-premie van 0,0154. Een renteverschil is dus een symptoom en geen oorzaak, want de
premie hoort bij het verschil in SDF-volatiliteit.
(1) Uit (3) volgt Corr=(σ2+σ∗2−V)/(2σσ∗),
en σ2+σ∗2=(σ−σ∗)2+2σσ∗. De eerste term is
niet-negatief, dus Corr≥1−V/(2σσ∗)≥1−V/(2a2), omdat
σσ∗≥a2. Gelijkheid geldt precies bij σ=σ∗=a.
(2) en (3) De cel rekent het voorbeeld van Brandt, Cochrane en Santa-Clara na en zoekt
de Sharpe-ratio die bij de gemiddelde G10-volatiliteit een grens van een half geeft.
grens BCS-voorbeeld: 0.98
wisselkoersvolatiliteit bij correlatie nul: 0.707
G10-vol 0.103: grens 0.5 vraagt log-SDF-vol 0.103, dus een Sharpe-ratio van 0.103
Ongecorreleerde SDF’s vragen wisselkoersen die met 71% per jaar schommelen. Een grens van een
half vraagt een Sharpe-ratio van ongeveer 0,1 per jaar. De conclusie van Brandt, Cochrane en
Santa-Clara volgt dus uit de orde van grootte van twee getallen en niet uit randgevallen van
hun aannames.
Eind 2007 zag carry eruit als een gevestigde regelmaat. De gepoolde helling was −1,01, bijna
het dubbele renteverschil uit Proposition 3, en de Sharpe-ratio 0,60
(standaardfout 0,20). Na 2008 is de helling positief (1,39, standaardfout 1,38), in een periode
waarin de renteverschillen binnen de G10 jarenlang bijna nul waren, en de Sharpe-ratio is 0,13
(standaardfout 0,24). Een premie die met dertig jaar data zeker leek, is na één crash dus niet
meer aantoonbaar. Dat past bij een uitbetaalde risicopremie en bij een weggearbitreerde
anomalie, want met deze standaardfouten zijn de twee niet uit elkaar te houden.
(1) Er geldt rp,t+1=∑iwi,trxi,t+1=θ′Ft+1,
dus E[rp]−2γVar(rp)=θ′μF−2γθ′ΣFθ. De
eerste-ordevoorwaarde geeft θ=γ−1ΣF−1μF,
zodat het een mean-variance-probleem met drie kenmerkportefeuilles is.
(2) De cel schat de gewichten in de eerste helft en evalueert ze in de tweede.
signals = {"carry": rate_diff, "momentum": momentum_signal, "value": value_signal}
available = rx_next.notna()
for sig in signals.values():
available &= sig.notna()
n_avail = available.sum(axis=1)
def cross_section_z(signal):
"""Cross-sectional z-score over currencies with all signals and a next-month return."""
x = signal.where(available)
return x.sub(x.mean(axis=1), axis=0).div(x.std(axis=1), axis=0)
char_returns = pd.DataFrame(
{k: (cross_section_z(sig) * rx_next).sum(axis=1, min_count=1) / n_avail for k, sig in signals.items()}
)[n_avail >= 6].dropna()
char_returns.index = char_returns.index + pd.offsets.MonthEnd(1)
train, test = char_returns.loc["1981":"2002"], char_returns.loc["2003":"2025"]
theta = np.linalg.solve(train.cov().to_numpy(), train.mean().to_numpy())
policies = {"optimaal (geschat in de steekproef)": theta, "alleen carry": np.array([1.0, 0.0, 0.0]),
"gelijke gewichten": np.ones(3)}
rows_pp = {}
for name, th in policies.items():
scale = 0.10 / (np.sqrt(12) * (train @ th).std()) # 10% volatility in the training sample
for label, sample in {"1981-2002": train, "2003-2025": test}.items():
r_p = scale * (sample @ th)
rows_pp[(name, label)] = {"Sharpe": float(hap.stats.sharpe(r_p)), "vol. (%/jr)": 100 * np.sqrt(12) * r_p.std(),
"scheefheid": r_p.skew()}
print("theta (genormeerd):", dict(zip(char_returns.columns, (theta / np.abs(theta).sum()).round(2))))
pd.DataFrame(rows_pp).T.round(2)
In de schattingsperiode legt de optimale portefeuille het meeste gewicht op value, met een
Sharpe-ratio van 1,02. Buiten de steekproef is dat 0,24, iets onder gelijke gewichten (0,26) en
boven carry alleen (0,18). Dat is het bekende effect uit Markowitz, Roy en Tobin, waarbij
ΣF−1μF de schattingsfout in μF
versterkt. De winst zit dus in het combineren van kenmerken met verschillend risico, en
geschatte gewichten helpen pas als de schattingsfout wordt ingetoomd, zoals in
Parametrische portefeuilles en idiosyncratisch risico.
Bekaert, G. (1996). The Time Variation of Risk and Return in Foreign Exchange Markets: A General Equilibrium Perspective. The Review of Financial Studies, 9(2), 427–470. 10.1093/rfs/9.2.427
Backus, D. K., Foresi, S., & Telmer, C. I. (2001). Affine Term Structure Models and the Forward Premium Anomaly. The Journal of Finance, 56(1), 279–304. 10.1111/0022-1082.00325
Brandt, M. W., Cochrane, J. H., & Santa-Clara, P. (2006). International Risk Sharing Is Better Than You Think, or Exchange Rates Are Too Smooth. Journal of Monetary Economics, 53(4), 671–698. 10.1016/j.jmoneco.2005.02.004
Hansen, L. P., & Hodrick, R. J. (1980). Forward Exchange Rates as Optimal Predictors of Future Spot Rates: An Econometric Analysis. Journal of Political Economy, 88(5), 829–853. 10.1086/260910
Fama, E. F. (1984). Forward and Spot Exchange Rates. Journal of Monetary Economics, 14(3), 319–338. 10.1016/0304-3932(84)90046-1
Lustig, H., & Verdelhan, A. (2007). The Cross Section of Foreign Currency Risk Premia and Consumption Growth Risk. American Economic Review, 97(1), 89–117. 10.1257/aer.97.1.89
Lustig, H., Roussanov, N., & Verdelhan, A. (2011). Common Risk Factors in Currency Markets. The Review of Financial Studies, 24(11), 3731–3777. 10.1093/rfs/hhr068
Menkhoff, L., Sarno, L., Schmeling, M., & Schrimpf, A. (2012). Carry Trades and Global Foreign Exchange Volatility. The Journal of Finance, 67(2), 681–718. 10.1111/j.1540-6261.2012.01728.x
Brunnermeier, M. K., Nagel, S., & Pedersen, L. H. (2008). Carry Trades and Currency Crashes. NBER Macroeconomics Annual, 23(1), 313–348. 10.1086/593088
Burnside, C., Eichenbaum, M., Kleshchelski, I., & Rebelo, S. (2011). Do Peso Problems Explain the Returns to the Carry Trade? The Review of Financial Studies, 24(3), 853–891. 10.1093/rfs/hhq138
Barroso, P., & Santa-Clara, P. (2015). Beyond the Carry Trade: Optimal Currency Portfolios. Journal of Financial and Quantitative Analysis, 50(5), 1037–1056. 10.1017/S0022109015000460
Backus, D. K., & Smith, G. W. (1993). Consumption and Real Exchange Rates in Dynamic Economies with Non-Traded Goods. Journal of International Economics, 35(3–4), 297–316. 10.1016/0022-1996(93)90021-O
Engel, C. (1996). The Forward Discount Anomaly and the Risk Premium: A Survey of Recent Evidence. Journal of Empirical Finance, 3(2), 123–192. 10.1016/0927-5398(95)00016-X
Froot, K. A., & Thaler, R. H. (1990). Anomalies: Foreign Exchange. Journal of Economic Perspectives, 4(3), 179–192. 10.1257/jep.4.3.179
Show all 18 references
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.