Inlämningsuppgift 2 Portföljteori, fördjupningskurs Farid Bonawiede fabo02@kth.se 2 februari 2006 Inledning Denna uppgift går ut på att skatta kovariansmatriser för aktier. Datan jag arbetat med är autentisk, och tagen ur S&P500. Jag har valt ut de 50 första aktierna ifrån S&P500. Fyra olika metoder har jag använt mig av för att kunna analysera datan på ett tillförlitligt och intressant sätt. Analysen avslutades med att plocka fram de effektiva fronterna för respektive metod samt de förväntade avkastningarna för min-varians portföljerna. Genomgående arbetade jag med log-returns av aktierna.
Innehåll 1 Log-returns 3 1.1 Hur är log-return fördelad?................... 3 1.2 Förväntad log-return?...................... 4 2 Skattning av kovariansmatriser 4 2.1 Good Times and Bad...................... 5 2.1.1 Hur avgör man om data är turbulent?......... 5 2.1.2 Måste man använda samma riskaversion?....... 5 2.2 En-faktor............................. 6 2.3 Multi-faktor / PCA....................... 6 2.3.1 Hur många faktorer ska vi välja?............ 8 2.4 Bayesiansk............................ 9 3 Resultat 10 3.1 Good Times and Bad...................... 10 3.2 En-faktor............................. 12 3.3 Multi-faktor/PCA........................ 13 3.4 Bayesiansk............................ 14 3.5 Stickprovsskattning........................ 15 4 Slutsatser 16 5 Appendix: Matlab-koder 17 5.1 index.m.............................. 17 5.2 logga.m.............................. 19 5.3 goodbad.m............................ 20 5.4 onefact.m............................. 21 5.5 multifact.m............................ 21 5.6 covmarket.m........................... 22 2
1 Log-returns Eftersom jag sitter med 2010 priser av vardera aktie så kan vi anta att vi har ett fler-period problem. De sammansatta avkastningarna blir enklast att betrakta om vi övergår till log-return istället. Framförallt eftersom vi får en summa av log-returns istället för en produkt av avkastningarna. Skapar således en matris av log-returns för mina 50 aktiers priser. Se 5.2 för Matlabkoden för denna procedur. 1.1 Hur är log-return fördelad? Innan vi börjar analysen så är det intressant att ta reda på hur vår data är fördelad. Normalfördelningen känns naturlig att anta Vi börjar därför med en kvantil-plot (QQ-plot). Vi plottar helt enkelt kvantilerna för normalfördelningen, med väntevärde µ = 0 samt variansen σ 2 = 1, mot kvantilerna för vår datamängd. Se figur 1. Vi ser att de följer varandra ganska bra så länge som kvantilerna är små. Avvikelsen kännetecknar det typiska beteendet för tjocksvansade fördelningar. Kvantilerna för log returns av första tillgången 0.3 0.2 0.1 0 0.1 0.2 0.3 0.4 0.5 4 2 0 2 4 Standard normal kvantilerna Figur 1: Kvantil-plot för N(0, 1)-fördelningen samt första aktiens fördelning För att tydliggöra detta så plottar vi fördelningen för vår datamängd samt normalfördelningskurvan med aktiens skattade varians och skattade väntevärde i samma plot. Se figur 2. Detta bekräftar vår hypotes om att fördelningen är tjocksvansad. Vi observerar även att runt medelvärdet så är den faktiska tätheten högre än normalfördelningen. Även detta är ett typiskt beteende för tjocksvansade fördelningar. 3
P(r) 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0 0.6 0.5 0.4 0.3 0.2 0.1 0 0.1 0.2 r Figur 2: Plot av fördelningen för log-returns av första aktien samt normalfördelningskurvan med aktiens skattade varians och skattade väntevärde 1.2 Förväntad log-return? Vi ska nu ta fram väntevärdet av avkastningen per period för varje aktie. Eftersom vi använder oss av log-returns och skattar väntevärdet med det aritmetiska medelvärdet av våra log-returns så blir det ett rätt så intressant resultat. Låter r = log(x i /X i 1 ) och n vara antalet log-returns. E[r] = log( x 1 x 0 ) + log( x 2 x 1 ) + + log( xn x n 1 ) = log( x 1 x 2 x 0 x 1 n n x n x n 1 ) = log( xn x 0 ) n Man kan givetvis göra andra typer av skattningar. Man kan delvis tänka sig att man tar väntevärdet av alla differenser först och sedan logaritmerar det värdet. Men detta ger inte ett väntevärdesriktigt värde eftersom det inte tar hänsyn till det sammansatta väntevärdet. 2 Skattning av kovariansmatriser Vi ska nu försöka skatta en kovariansmatris som vi senare ska göra minvarians analys på. Anledningarna till varför man kan skatta en kovariansmatris på flera sätt är många. Bland annat kan man tänka sig att man kanske har en viss tro på en viss aktie eller marknad. Och då vill man att detta ska återspeglas i vår portfölj. Detta sker då på ett rättframt sätt om man modifierar kovariansmatrisen på ett sådant sätt så att denne återspeglar det önskade beteendet. 4
2.1 Good Times and Bad I denna del ska vi använda en metod som tar hänsyn till stabiliteten hos portföljens parametrar. Erfarenheten har nämligen gett oss informationen om att perioder med hög volatilitet inte jämt följer det mönstret som den gemensamma datan beskriver. Man tänker sig att man delar in datan i två olika mängder. Där den ena innehåller datan som håller sig inom en viss varians. Och där den ena får bestå av data som har hög varians. Genom att sedan tilldela områdena en sannolikhet för att de ska uppträda så kan man byta ut vår kovariansmatris för hela datamängden med följande, och Där Σ = p l Σ l + p t Σ t p l = sannolikheten för lugnt beteende p t = 1 p l = sannolikheten för turbulent beteende Vi gör därefter uppdelning och utnyttjar att våra logreturns är normalfördelade. Enligt Optimal Portfolios in Good Times and Bad 1 är 25% ett bra värde för sannolikheten att vi hamnar i ett turbulent område. 2.1.1 Hur avgör man om data är turbulent? Man kan tänka sig att man rakt av antar att de 25% av de största avkastningarna är turbulenta. Detta är dock inte statistiskt ett bra val. Vi väljer därför att införa ett avstånd d t som beskriver avståndet ifrån medelvärdet av aversionen. Den beräknas på följande sätt, d t = (r t µ)σ 1 (r t µ) Eftersom r t är normalfördelad så kommer d t att vara χ 2 -fördelad. Vi kan nu införa följande definition, om d t > χ 2 p=0.75 så är r t turbulent. 2.1.2 Måste man använda samma riskaversion? Nu måste vi dessutom dela upp riskaversionen för de två olika områdena, annars avspeglar sig inte uppdelningen nämnvärt. Det känns naturligt att man är mer aversibel emot ett turbulent beteende än ett lugnt beteende. Inför man λ l och λ t och skalar sedan om de så att summan av de blir 2 får man istället följande kovariansmatris, Σ = λ l p lσ l + λ t p t Σ t Där λ l = 2λ l λ i + λ t och λ t = 2λ t λ i + λ t 1 Publicerad i Journal of Finance (May/June) 1999 av Chow G., Jacquier E., Kritzman M. och Lowry K. 5
2.2 En-faktor I denna del ska vi undersöka om vi kan beskriva datan med hjälp av enbart en faktor. Detta leder till att antalet skattade parametrar blir 2N +1 istället för kvadratiskt. Man kan tänka sig flertalet saker som bra faktorer. Generellt kan man brukar man använda index för den börsen som tillgångarna tillhör. I denna laboration har jag använt mig av medelvärdet över alla tillgångarna och skapat ett index för de. Vi vill alltså kunna skriva avkastningen på följande form, r i = a i + b i f m + ɛ i för i = 1,..., 50 Där ɛ kan betraktas som residualen. Vi kräver dock att följande ska gälla för vår residual, Cov(ɛ i, ɛ j ) = 0, i j Vi gör sedan följande skattningar, Cov(ɛ i, f m ) = 0 V ar(ɛ i ) = σ 2 ɛ i V ar(f m ) = σ 2 m β i = Cov(r i, f m ) σ 2 m Vår slutgiltiga kovariansmatris får då följande utseende, 2.3 Multi-faktor / PCA Cov(r i, r j ) = β i β j σ 2 m + 1 [i=j] σ 2 ɛ i Denna uppgift bygger på samma tanke som en-faktor modellen. Rent tekniskt är denna metod svårare. Vi väljer dock en rätt enkel metod som kallas PCA. Den metoden går nämligen ut på att man använder principalkomponenterna som faktorer. Problemet blir som sådant: Givet att vi har avkastningarna r, så vill vi hitta en linjärkombination y 1 = c 1 r, där c c = 1, som ger maximal varians hos y 1. När vi sedan var hittat detta c 1 så söker vi c 2 som maximerar variansen hos y 2 med bivillkoret att Cov(y 1, y 2 ) = 0. Med andra ord ska c 1 vara ortogonal med c 2. Vi fortsätter sedan på detta vis tills vi har fått så många faktorer vi önskar. Detta ger oss följande LP-problem, max c 1 V ar(y 1 ) = V ar(c 1r) = c 1Cov(r)c 1 = c 1Σc 1 6
Lagrangefunktionen blir, s.a. c 1c 1 = 1 Derivering ger L = c 1Σc 1 λ 1 (c 1c 1 1) L c 1 = (Σ + Σ )c 1 2λ 1 c 1 = 2Σc 1 2λ 1 c 1 Sätter vi ovanstående till noll så får vi egenvärdesekvationen, (Σ λ 1 )c 1 = 0 Eftersom vi vill maximera variansen får vi följande max c 1Σc 1 = c 1λ 1 c 1 = λ 1 Sammanfattningsvis kan vi dra följande slutsatser. λ 1 motsvarar största egenvärdet och c 1 representeras av motsvarande egenvektor till Σ. Vi önskar nu att applicera denna kunskap när vi ska skatta vår kovariansmatris. Vi skriver avkastningen på följande sätt, r i = βf + ɛ Där F är vår faktorvektor som består av m st komponenter samt att ɛ ses som ett felvärde. β blir vår viktmatris. Följande antaganden gör vi, E[ɛ] = 0 E[F ] = 0 Cov(ɛ) = diag[σ 2 ɛ i ] = Ψ Coc(F, ɛ) = 0 Cov(F ) = I Kovariansmatrisen får följande utseende, Cov(r) = β β + Ψ Vi beräknar λ i och c i med hjälp av Matlab-kommandot eig. Dessa är alltså egenvärden respektive egenvektorer till stickprovskovarianserna S. Vi skattar därefter β för m st faktorer på följande sätt, ˆβ = ( λ 1 c 1 λ m c m ) Avslutningsvis skattar vi Ψ med följande ˆΨ = diag[s ˆβ ˆβ ] 7
2.3.1 Hur många faktorer ska vi välja? Man måste nu avgöra hur många faktorer måste vi ta med för att vår kovariansmatris ska kunna ge en bra representation av vår ursprungliga data. Man kan helt enkelt betrakta storleken hos varje egenvärde som hur mycket information av den totala information som ges av respektive egenvärde. Vi skapar därför en funktion som beror av m som ger oss andelen av variansen som vår kovariansmatris beskriver. m i=i f(m) = λ i n i=i λ i En plot av ovanstående funktion ses i figur 3. Studerar man en figuren så ser man att sju faktorer av femtio möjliga räcker för att återgiva 50% av informationen. Vi ska i senare del pröva hur olika antal faktorer på verkar resultatet (avsnitt 3.3). Procent av variansen som representeras % 100 90 80 70 60 50 40 30 20 0 5 10 15 20 25 30 35 40 45 50 Antal faktorer m Figur 3: Plot av hur många procent som m st faktorer representerar Man kan även studera egenvärdena direkt och välja så många faktorer att derivatan blir någorlunda konstant. Se figur 4. λ i 0.01 0.008 0.006 0.004 0.002 0 0 10 20 30 40 50 i Figur 4: Plot av egenvärdena i storleksordning 8
2.4 Bayesiansk Till grund för denna metod ska vi använda oss av följande artikel, Improved Estimation of the Covariance Matrix of Stock Returns With an Application to Portfolio Selection 2. Jag har valt att utlämna en del av härledningarna för denna metod för att istället koncentrera mig på resultaten den åstadkommer. Denna metod kan liknas Good Times and Bad med avseende på att vi söker en viktning mellan två olika kovariansmatriser. Denna vikt brukar man kalla shrinkage. Det vi vill vikta ihop är dels stickprovskovariansmatrisen och dels en en-faktor modell. Det vill säga följande två, S = 1 T r r F = ˆ σ 2 m ˆβ ˆβ + ˆΨ Vi söker nu en optimal linjärkombination mellan dessa två kovariansmatriser. Denna linjärkombination ska ha så litet förväntat avstånd som möjligt till den verkliga(okända) kovariansmatrisen Σ. Man brukar kalla F får vår prior, det vill säga vår tro på marknaden. Eftersom vi här använder oss av en en-faktormodell känns det rätt naturligt att marknadsindex får vara vår prior. Observera att vår prior och vår stickprovsskattning är oberoende. I artikeln så använder de Frobeniusnormen, varpå jag också gör det. Som defineras på följande sätt för symmetriska matriser, Z 2 F = n n zij 2 = i=1 j=1 n λ 2 i, där λ i är i:e egenvärdet till Z. i=1 Vi söker α så att αf +(1 α)s blir optimal. Detta får vi om vi minimerar följande funktion, R(α) = E[L(α)] = E[ αf + (1 α)s Σ 2 F ] Genom att derivera R(α), sätta den till noll och låta antalet observationer gå emot oändligheten får vi följande vikt α = 1 T π p γ + O( 1 T 2 ) Nu blir det till att förklara parametrarna. α är alltså vår optimala vikt/shrinkage. π beskriver osäkerheten i skattningen S och γ beskriver osäkerheten i skattningen av F. p är ett mått på kovariansen mellan skattningsosäkerheten till S och F. Studerar man ekvationen för α så ser man att då π blir större så blir minskar vikten på S. På samma sätt ser man att då γ blir större så blir minskar vikten på F. Detta känns rätt naturligt. 2 Skriven oktober 2001 av Olivier Ledoit och Michael Wolf 9
Se avsnitt 5.6 för detaljer om hur beräkningarna för den bayesianska skattningarna ser ut i Matlab. 3 Resultat Nu antar jag att du som läser detta har förstått vad metoderna går ut på och således är vi redo att ta en titt på vad de ger för resultat. Det vi nu ska ta fram är den effektiva fronten för alla metoder och vikterna för minvariansportföljen samt dess egenvärde och varians. Det LP-problem vi har är följande, max w ˆµ 1 w 2λ w ˆΣw s.a. w i = 1 i Vi ställer upp Lagrange-funktionen och deriverar den med avseende på vikterna samt Lagrange-multiplikatorn. Det ger oss följande ekvationssystem. [ Σ e ] [ µλ w = 1 Löser man detta i Matlab så får man ut vikterna w. Vi kan dessutom generera den effektiva fronten genom att variera riskaversionen λ. Under analysen har vi antagit att endast 1800 av avkastningarna är kända. Genom att anta detta kan vi slutligen kontrollera hur väl vår portfölj beter sig när den utsätts för verklig data. ] 3.1 Good Times and Bad Denna metod kräver att vi analyserar flera olika effektiva fronter eftersom det finns flertalet parametrar att justera. Vi börjar med att kontrollera fallet då vi är lika riskaversibla till de olika utfallen. Vi gör detta för olika sannolikheter för turbulens. Se figur 5. I figuren ser vi då att P = 0 och P = 1 sammanfaller. Detta förklaras av att vi då har samma kovariansmatris eftersom riskaversionen är lika. Faktum är att den effektiva fronten som dessa två kurvor genererar inte är något annat än den effektiva fronten som stickprovsskattningen genererar. Avvikelser har vi dock om P 0, 1. Detta beror på att vi då får en uppdelning av våra utfall. Vi ser även att P = 0.2 har en lägre varians vid min-varianspunkten. Medan P = 0.8 har en något högre. Vi antar nu istället att vi är mer riskaversibla till det turbulenta området och genererar de effektiva fronterna på samma sätt som tidigare. Vi använder oss av λ H = 2 och λ L = 1. Se figur 6. 10
Väntevärde µ 6 x 10 3 5 4 3 2 1 0 P=0 P=0.2 P=0.8 P=1 1 0.01 0.02 0.03 0.04 0.05 0.06 Standardavvikelse σ Figur 5: Effektiva fronterna för olika P då vi har samma riskaversion för det turbulenta och det lugna området. 7 x 10 3 6 5 Väntevärde µ 4 3 2 1 0 P=0 P=0.2 P=0.8 P=1 1 0.01 0.02 0.03 0.04 0.05 0.06 Standardavvikelse σ Figur 6: Effektiva fronterna för olika P då vi har olika riskaversion för det turbulenta och det lugna området. Vi får nu en uppdelning som är desto mer spridd än tidigare. Detta beror på att vi prioriterar högre avkastning gentemot risk. P = 1 har högre varians än P = 0, detta beror på att trots att de är baserade på all data så har de ändå olika riskaversioner. För att tydliggöra detta plottar vi den effektiva fronten för P = 0.25 med dels skild riskaversion samt lika riskaversion. Se figur 7. Vi ser här att detta i princip innebär en förflyttning i sidled. Om vi då ska avsluta analysen för denna metod måste vi bestämma oss för parametrar som är vettiga. Enligt artikeln som ligger till grund för denna metod så är P = 0.25 ett bra val. Detta ger oss att 30.9% av vår data klassas som turbulent. Vi sätter dessutom vår riskaversion olika för de olika 11
6 x 10 3 Väntevärde µ 5 4 3 2 1 0 λ H =λ L =1 λ H =2, λ L =1 1 0.01 0.02 0.03 0.04 0.05 0.06 Standardavvikelse σ Figur 7: Effektiva fronterna för P = 0.25 med olika riskaversion. områdena, jag väljer λ H = 2 och λ L = 1. Med λ tot = 2 får vi då följande resultat om vi löser vårt LP-problem, ˆµ = 0.0183 ˆσ 2 = 0.0430 De faktiska värdena för vår portfölj är dock följande, µ = 0.0156 σ 2 = 0.0212 Jag väljer att diskutera dessa resultat när vi har fått fram data för alla metoderna. 3.2 En-faktor På samma sätt som tidigare så varierar jag λ för att få fram den effektiva fronten. Se figur 8. Väntevärde µ 5 x 10 3 4 3 2 1 0 En faktor Stickprovsskattning 1 0 0.01 0.02 0.03 0.04 0.05 Standardavvikelse σ Figur 8: Effektiva fronterna för en-faktormodellen och stickprovsmodellen. 12
Det man bör observera är att vår en-faktormodell verkar underskatta risken. Detta gäller generellt för hela fronten, men är desto tydligare vid området kring min-varianspunkten. Det här är ingen önskvärd egenskap eftersom vi då kanske investerar i en portfölj som kanske har betydligt högre varians än vi tror. Detta beror delvis på de antaganden vi gör angående oberoendet. Som vi nämnde tidigare så gör vi här enbart 2n + 1 skattningar istället för n 2. Detta innebär i sin tur att vi har tagit bort information som kanske är nödvändig. Avslutningsvis löser vi vårt LP-problem för λ = 2 och får då följande resultat, ˆµ = 0.0179 ˆσ 2 = 0.0398 De faktiska värdena för vår portfölj är dock följande, 3.3 Multi-faktor/PCA µ = 0.0100 σ 2 = 0.0185 Vi börjar med att ta fram de effektiva fronterna för vår multifaktormodell med ett flertal olika antal faktorer m. Se figur 9. 6 x 10 3 5 Väntevärde µ 4 3 2 1 0 m=1 m=5 m=20 m=50 1 0 0.01 0.02 0.03 0.04 0.05 0.06 Standardavvikelse σ Figur 9: Effektiva fronterna för multifaktormodellen med olika antal faktorer. Till att börja med kan jag kommentera att då vi använder oss av alla faktorerna (m = 50) så representerar vår multifaktormodell enbart stickprovsskattningen. I figuren ser vi att min-varianspunkten flyttar sig till snett ner åt vänster då vi plockar bort faktorer. Detta betyder inte att vi får en bättre portfölj om vi tar bort faktorer. Istället beror det helt enkelt på att vi har tagit bort information som beskriver det fulla beroendet, precis på samma sätt som med en-faktormodellen. 13
En sak man nu kan fråga sig är ifall vår en-faktormodell skiljer sig ifrån vår multifaktormodell i det fallet då vi endast har en faktor (m = 1). I figur 10 har jag plottat de effektiva fronterna för respektive modell. 5 x 10 3 4 Väntevärde µ 3 2 1 0 En faktor Multifaktor, m=1 1 0 0.01 0.02 0.03 0.04 0.05 Standardavvikelse σ Figur 10: Effektiva fronterna för en-faktormodellen och multifaktormodellen med m = 1. Man ser att dessa kurvor följer varandra relativt bra, men dock skiljer det sig runt min-varianspunkten. Således är skiljer sig vår en-faktormodell ifrån vår multifaktormodell med m = 1. Om vi ska ta fram jämförelsedata för vår multifaktormodell så måste vi bestämma hur många faktorer vi ska ta med. Efter m = 7 så verkar det vara rätt så linjärt emellan återstående egenvärdena. Räknar man fram kvoten så får vi att med 7 stycken faktorer ändå lyckas återspegla 49% av vår totala information. Med λ = 2 och m = 7 får vi följande resultat om vi löser vårt LP-problem, ˆµ = 0.0198 ˆσ 2 = 0.0442 De faktiska värdena för vår portfölj är dock följande, 3.4 Bayesiansk µ = 0.0152 σ 2 = 0.0186 Vi börjar med att ta fram den effektiva fronten för denna metod. Se figur 11. Man ser att vår bayesianskamodell ligger något snett ner åt vänster om stickprovsskattningen. Men en bra bit ifrån en-faktormodellen. Detta är inte så konstigt eftersom i denna metod så använder vi oss som sagt av en optimal vikt mellan stickprovsskattningen och en en-faktormodell. Med våra log-returns så får vi α 0.13. Med andra ord ger vi stickprovskattningen 13% av vikten och en-faktormodellen 87% av vikten. Detta avspeglas tydligt i figuren. 14
8 x 10 3 Väntevärde µ 6 4 2 0 En faktor Bayesiansk Stickprovsskattning 2 0 0.02 0.04 0.06 0.08 Standardavvikelse σ Figur 11: Effektiva fronterna för en-faktormodellen, bayesianska modellen och stickprovsmodellen. Avslutningsvis så löser vi LP-problemet med λ = 2 och vi får följande resultat, ˆµ = 0.0164 ˆσ 2 = 0.0384 De faktiska värdena för vår portfölj är dock följande, 3.5 Stickprovsskattning µ = 0.0130 σ 2 = 0.0167 Avslutar resultatdelen med att ta fram jämförelsedata för stickprovsskattningen med λ = 2 och får då följande resultat när vi löser vårt LP-problem, ˆµ = 0.0167 ˆσ 2 = 0.0392 De faktiska värdena för vår portfölj är dock följande, µ = 0.0140 σ 2 = 0.0174 15
4 Slutsatser Om man plottar de effektiva fronterna som gäller för våra jämförelsedata (se figur 12) så ser man att en-faktormodellen och multifaktormodellen har betydligt lägre min-varianspunkt än de övriga. 6 x 10 3 5 Väntevärde µ 4 3 2 1 0 Stickprovsskattning Good and Bad, p=0.25 En faktor Multifaktor, m=7 Bayesiansk 1 0.005 0.01 0.015 0.02 0.025 0.03 0.035 0.04 0.045 0.05 0.055 Standardavvikelse σ Figur 12: Effektiva fronterna för alla modellerna. Om man istället studerar de numeriska resultaten av våra portföljer (se tabell 1) så är det faktiskt en-faktormodellen som har den högsta avkastningen (minsta förlusten, ty alla resulterade i negativa resultat). En sak som är anmärkningsvärd är att de modeller som hade högst skattade varianser var de som gav sämst resultat (Multifaktor och Good Times and Bad). ˆµ µ ˆσ 2 σ 2 Stickprovsskattning 0.0167 0.0140 0.0392 0.0174 En-faktor 0.0179 0.0100 0.0398 0.0185 Multifaktor 0.0198 0.0152 0.0442 0.0186 Good Times and Bad 0.0183 0.0156 0.0430 0.0212 Bayesiansk 0.0164 0.0152 0.0384 0.0167 Tabell 1: Sammanfattning av de numeriska resultaten av väntevärdena och varianserna. 16
5 Appendix: Matlab-koder 5.1 index.m clear clc close all %%%%%%%%%%%%%%%%%%%%%% % Beräknar fram logreturn matrisen för de 50 första aktierna % Obeservera att denna data är baserad på att börsen har 251 "öppet-dagar" % per år. logga % Kvantilplot samt fördelningsplot medel = mean(logreturns(:,1)); varians = var(logreturns(:,1)); x = min(logreturns(:,1)):0.015:max(logreturns(:,1)); P = normr(normpdf(x,medel,sqrt(varians))); Y = hist(logreturns(:,1),length(x)); Y = normr(y); bar(x,y), hold on; plot(x,p, k ) shading flat xlabel( r ) ylabel( P(r) ) figure qqplot(logreturns(:,1)) title( ) xlabel( Standard normal kvantilerna ) ylabel( Kvantilerna för log-returns av första tillgången ) figure %%%%%%%%%%%%%%%%%%%%%% % % GOOD-BAD % sigma_gb = goodbad(0.25,3,2); % % One-Factor % sigma_of = onefact; % % Multi-Factor % sigma_mf = multifact(6); % % Bayesian sigma_ba = covmarket(logreturns); %%%%%%%%%%%%%%%%%%%%%% 17
sigma = cov(logreturns); % Skattar avkastningen som medelvärdet av alla logreturns mu = mean(logreturns) ; % mu=1/n*log(r_n/r_0); % mu = log(mean(data_diff)) ; lambda = -0.1:0.05:0.8; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %lambda = 2 sigma_gb = onefact; for i=1:length(lambda) % Löser markowitzproblemet %A*w=b; A = [sigma_gb; ones(1,length(mu))]; b = [mu*lambda(i); 1]; w_gb = A\b; % Väntevärde vant(i) = w_gb *mu; % Standardavvikelse var(i)=sqrt(w_gb *sigma_gb*w_gb); end plot(var,vant,.- ), hold on sigma_gb = sigma_ba; for i=1:length(lambda) % Löser markowitzproblemet %A*w=b; A = [sigma_gb; ones(1,length(mu))]; b = [mu*lambda(i); 1]; w_gb = A\b; % Väntevärde vant(i) = w_gb *mu; % Standardavvikelse var(i)=sqrt(w_gb *sigma_gb*w_gb); end plot(var,vant, r ), hold on sigma_gb = sigma; for i=1:length(lambda) % Löser markowitzproblemet %A*w=b; A = [sigma_gb; ones(1,length(mu))]; b = [mu*lambda(i); 1]; w_gb = A\b; 18
% Väntevärde vant(i) = w_gb *mu; % Standardavvikelse var(i)=sqrt(w_gb *sigma_gb*w_gb); end plot(var,vant, -- ), hold on %Beräknar väntevärde och varians för den framtida och den historiska datan. vv_pre = w_gb *mu vv_act = w_gb *mean(logreturns_real) var_pre = w_gb *sigma_gb*w_gb var_act = w_gb *cov(logreturns_real)*w_gb xlabel( Standardavvikelse - \sigma ) ylabel( Väntevärde - \mu ) legend( En-faktor, Bayesiansk, Stickprovsskattning ) % Egenvärdesanalys för multifaktormedtoden figure egen=flipud(eig(cov(logreturns))); for i=1:length(egen) E(i)=sum(egen(1:i))/sum(egen); end plot(e*100) xlabel( Antal faktorer - m ) ylabel( Procent av variansen som representeras - % ) 5.2 logga.m % Läser in datan load SP500W.mat % Väljer ut de 50 första raderna DATA_raw = SP500(:,1:50); % Tar fram de relativa avkastningarna DATA_diff = DATA_raw(2:end,:)./DATA_raw(1:end-1,:); % logaritmerar resultatet logreturns = log(data_diff(1:1800,:)); logreturns_real = log(data_diff(1801:end,:)); 19
5.3 goodbad.m function [ sigma ] = goodbad(p,t,l) %GOODBAD beräknar fram sigma med sannolikheten p för ett volatilt område. %Riskaversionen T till turbulenta området och L till lugna området. % Beräknar fram logreturn matrisen för de 50 första aktierna logga % Väljer ut 25% som högrisk dagar samt bestämmer sannolikheten för de två % olika utfallen p_high = p; p_low = 1-p_high; % Skapar olika riskaversionen för de två utfallen lamb_high_o = T; lamb_low_o = L; % Tar fram vectorn som ger avståndet till det multivariata medelvärdet mu = mean(logreturns); sigma_tmp = cov(logreturns); diff = logreturns-(mu *ones(1,length(logreturns))) ; d_t = diag(diff*inv(sigma_tmp)*diff ); test_stat = chi2inv(p_low,length(mu)); high = find(d_t>test_stat); low = find(d_t<=test_stat); % Skapar två olika vektorer baserade på vardera område logreturns_high = logreturns(high,:); logreturns_low = logreturns(low,:); % Skattar två olika kovariansmatriser sigma_high = cov(logreturns_high); sigma_low = cov(logreturns_low); % Skalar om riskaverionen lamb_high = 2*lamb_high_o/(lamb_low_o + lamb_high_o); lamb_low = 2*lamb_low_o/(lamb_low_o + lamb_high_o); % Slår ihop de med sannolikheten för vardera som vikt samt med olika % riskaversion. sigma = lamb_high*p_high*sigma_high + lamb_low*p_low*sigma_low; 20
5.4 onefact.m function [ sigma ] = onefact( ) %ONEFACT beräknar fram sigma med att anta att marknaden kan beskrivas med %avseende på endast en faktor. % Beräknar fram logreturn matrisen för de 50 första aktierna logga % Börjar med att skapa en marknadsportfölj som baseras på ett index jag % skapar över de 50 olika tillgångarnas medelavkastning. fm = mean(logreturns,2); % Skattar variansen för marknaden var_fm = cov(fm); for i=1:50 temp = cov(logreturns(:,i),fm) / var_fm; beta(i) = temp(2,1); end % Skattar felets varians sigma_epsilon = diag(diag(cov(logreturns)-beta *beta*var_fm)); sigma = beta *beta*var_fm + sigma_epsilon; 5.5 multifact.m function [ sigma ] = multifact(m) %MULTIFACT beräknar fram sigma med att anta att marknaden kan beskrivas med %m antal faktorer än det finns aktier. % Beräknar fram logreturn matrisen för de 50 första aktierna logga % Skattar variansen hos våra parametrar sigma_temp = cov(logreturns); % Tar fram egenvärdena och egenvektorerna [EM EV] = eig(sigma_temp); % Skapar en matris av egenvärdena som går att multiplicera komponentvis EV = rot90(flipud(diag(ev))*ones(1,50)); 21
% Flippar egenvektor-matrisen för att de ska överensstämma EM = fliplr(em); % Detta är hela beta som tar hänsyn till alla egenvärden beta = sqrt(ev).*em; % Väljer ut m st faktorer beta = beta(:,1:m); % Skattar variansen hos avvikelsen phi = diag(diag(sigma_temp - beta*beta )); sigma = beta*beta +phi; 5.6 covmarket.m Denna fil är hämtad ifrån http://www.ledoit.net/ function sigma=covmarket(x) % function sigma=covmarket(x) % x (t*n): t iid observations on n random variables % sigma (n*n): invertible covariance matrix estimator % % This estimator is a weighted average of the sample % covariance matrix and a "prior" or "shrinkage target". % Here, the prior is given by a one-factor model. % The factor is equal to the cross-sectional average % of all the random variables. % de-mean returns t=size(x,1); n=size(x,2); meanx=mean(x); x=x-meanx(ones(t,1),:); xmkt=mean(x ) ; % compute sample covariance matrix and prior sample=cov([x xmkt]); covmkt=sample(1:n,n+1); varmkt=sample(n+1,n+1); sample(:,n+1)=[]; sample(n+1,:)=[]; 22
prior=covmkt*covmkt./varmkt; prior(logical(eye(n)))=diag(sample); % compute shrinkage parameters (as per theorem 10) d=1/n*norm(sample-prior, fro )^2; y=x.^2; r2=1/n/t^2*sum(sum(y *y))... -1/n/t*sum(sum(sample.^2)); % phi from section B.4 is divided into diagonal % and off-diagonal terms, and the off-diagonal term % is itself divided into smaller terms phidiag=1/n/t^2*sum(sum(y.^2))... -1/n/t*sum(diag(sample).^2); z=x.*xmkt(:,ones(1,n)); v1=1/t^2*y *z-1/t*covmkt(:,ones(1,n)).*sample; phioff1=1/n*sum(sum(v1.*covmkt(:,ones(1,n)) ))/varmkt... -1/n*sum(diag(v1).*covmkt)/varmkt; v3=1/t^2*z *z-1/t*varmkt*sample; phioff3=1/n*sum(sum(v3.*(covmkt*covmkt )))/varmkt^2... -1/n*sum(diag(v3).*covmkt.^2)/varmkt^2; phioff=2*phioff1-phioff3; phi=phidiag+phioff; % compute the estimator shrinkage=max(0,min(1,(r2-phi)/d)) sigma=shrinkage*prior+(1-shrinkage)*sample; 23