Minimivarianssiportfolio Seligsonin rahastoilla

Bloggerissa on ovelasti nimetty blogi Astro-hamppi 3000 joka harmillisesti ei ole päivittynyt aikoihin. Aivan kuin kirjoittaja olisi ollut aloittaessaan opiskelija ja valmistuttuaan sekä työelämään siirryttyään lopettanut pseudonyymillä kirjoittamisen.

Harmillista, mutta onneksi blogi on edelleen luettavissa.

Yksi parhaista teksteistä käsittelee Helsingin pörssin minimivarianssisalkun tuottoa. Tai oikeastaan aiheena on sektorirotaatio S&P 500 Sector SPRD -ETF:llä, mutta niiden painot valitaan ratkaisemalla minimivarianssiportfolio.

Kirjoituksen aikoihin suomalaisten piensijoittajien oli vielä mahdollista sijoittaa suoraan amerikkalaisiin ETF:iin, mutta Mifid 2:n myötä tämä ei enää läheskään aina onnistu. Rahastoista sinänsä ei ole pulaa, pikemmin päinvastoin sillä erilaisia rahastoja on enemmän tarjolla kuin Helsingin pörssissä on listattuja osakkeita.

Kiinnostavaa olisi testata miten sektorirotaatio toimisi soveltamalla minimivarianssiportfoliota Seligsonin rahastoihin. Tällaisen strategian testaaminen on melko helppoa koska kyseinen firma tarjoaa rahastojensa historialliset arvot kenen hyvänsä ladattaviksi. Muutoin tämä kirjoitus ei ole mainos eikä myöskään suositus sijoittaa heidän rahastoihin.

Ensiksi pitää ladata hintadata. Tämä onnistuu vaikkapa seuraavalla R-koodilla:

library(dplyr)
library(readr)
library(rvest)

html <- read_html('https://www.seligson.fi/sco/suomi/rahastot/rahastojen-arvojen-historia/')

hrefs <- html_nodes(html, 'a') %>% html_attr('href')

csvs <- hrefs[grepl('\\.csv$', hrefs)]

download <- function(url) {
  prc <- read_delim(url,
                    locale = locale(date_format = '%d.%m.%Y', decimal_mark = ','),
                    col_names = c('date', 'prc'),
                    col_types = cols(date = col_date(), prc = col_double()),
                    delim = ';') %>%
    mutate(fund = tools::file_path_sans_ext(basename(url)))
  prc
}

prices <- bind_rows(lapply(csvs, download))

dir.create('static/data', showWarnings = FALSE, recursive = TRUE)

write_rds(prices, 'static/data/seligson.rds')

Koodi lataa hinta-aikasarjat R-kielenkäytössä long format -dataframeen. Sarake date on hinnan päivämäärä, prc hinta euroina ja fund on rahaston nimi.

Tähän analyysiin käytetyn datan voi ladata tästä R-formaatissa.

Ennen analysointia lienee paikallaan kerrata mitä minimivarianssiportfolio tarkoittaa. Oletataan, että meillä on tuottoaikasarjat \(N\):lle osakkeelle matriisissa \(T \times N\)-matriisissa \(R\) ja osakkeiden painot portfoliossa ovat vektori \(w\) siten, että \(\sum_{i=1}^{N} w_i=1\). Tällöin portfolion varianssi on \(w^\prime V w\), missä \(V\) on osakkeiden tuottojen kovarianssimatriisi.

Minimivarianssiportfolion (MV) painot ratkaistaan minimoimalla portfolion varianssi budjettirajoite huomioiden. Lisäksi, koska datan rahastoja ei voi myydä lyhyeksi, on myös rajoituttava ratkaisuun missä painot ovat positiivisia. R:llä tämän tyylisten optimointitehtävien numeerinen ratkaiseminen on helpointa nloptr-paketilla.

Formaalimmin on ratkaistava tehtävä \[ w_{MV} = \text{arg min} \; w^\prime V w \] siten, että \[ \sum_{i=1}^{N} w_i=1 \] ja \[ 0 \le w_i \le 1 \qquad i = 1, \ldots, N. \]

Simulaatiossa on ehkä kiinnostavampaa testata, minkälainen tuotto minimivarianssistrategialla saavutetaan, jos sitä sovelletaan pidemmän aikaa salkku kerran kuussa uudelleen painottaen. Käytännössä valitaan sopiva otoksen pituus, vaikkapa 36 kuukautta eli kolme vuotta, estimoidaan siitä kovarianssimatriisi ja ratkaistaan salkun painot seuraavan kuun ajaksi sekä lasketaan salkun tuotto. Tätä prosessia jatketaan kunnes päästään datan loppuun.

Strategiaa voi verrata esimerkiksi yksinkertaista tasapainotettua salkkua (EW) vastaan, missä kukin osake saa saman painon, toisin sanoen \[ w_{EW,i} = 1/N \qquad i=1,\ldots, N. \]

Toinen tapa toteuttaa pienen varianssin tai volatiliteetin strategia on skaalata osakkeiden painoja niiden varianssien tai volatiliteettien käänteisluvulla (IV): \[ w_{IV,i} = \frac{1/\sigma_i}{\sum_{j=1}^N 1/\sigma_j}, \qquad i=1,\ldots,N. \]

Tämä on helpompi, koska yksittäisen osakkeen varianssin voi estimoida eripituisista aikasarjoista ja ei myöskään tarvitse ratkaista optimointitehtävää.

Katsotaanpa seuraavaksi dataa. Osa rahastoista on aloitettu melko hiljattain, mutta pitkäikäisimmät jo 90-luvun puolella.

Rahasto Aloituspäivä
rahamarkkina_exc 1998-04-01
suomi_exc 1998-04-01
eurooppa_exc 1998-06-15
global-brands_exc 1998-06-18
euroobligaatio_exc 1998-10-14
pharos_exc 1999-11-24
aasia_exc 1999-12-29
global-pharma_exc 2000-01-17
russia_exc 2000-03-08
phoenix_exc 2000-09-25
eurocorporate_exc 2001-09-14
phoebus_exc 2001-10-10
omxh25_exc 2002-02-08
russiak_exc 2004-11-22
pohjoisamerikka_exc 2006-12-29
kehittyva_exc 2010-09-03
latam_exc 2016-05-12

Tässä kuvassa on Suomi- ja rahamarkkinarahastojen hintojen koko historia:

Rahamarkkinarahasto ei ole kovin kiinnostava sijoituskohde. Käytännössä sen sijoitukset ovat erilaisia lyhyitä talletuksia, joten tuotto on hyvin samankaltainen tavallisen talletustilin kanssa. Otetaanpa sen sijaan salkkuun malliksi Suomi-, Eurooppa-, Global Brands- ja Euro-obligaatiorahastot. Näin saadaan altistus sekä osake- että valtionvelkakirjariskeille.

Seuraava kuva esittää minimivarianssiportfolion (MV) painot testausperiodin aikana.

Strategia painottaa vahvasti obligaatioita, koska niillä on matala korrelaatio osakerahastojen kanssa. Oletettavasti portfolion tuotto jää tällöin osakerahastoja matalammaksi, mutta sentään varianssi minimoituu.

Katsotaanpa myös yksinkertaisempaa strategiaa missä painot skaalataan rahastojen volatiliteeteilla (IV).

Tämäkin strategia pitää velkakirjapainon suurena, mutta osakeriskiä otetaan huomattavasti enemmän.

Tasapainotetussa salkussa (EW) kaikkien rahastojen paino on sama 25%.

Viimeinen kuva esittää strategioiden kumulatiiviset tuotot testausperiodillla.

Tasapainotettu salkku päihittää helposti varianssin minimointiin tähtäävät strategiat, mutta paikoin (esimerkiksi viime finanssikriisin aikoihin) kyyti olisi ollut sijoittajalle kylmää. Kaksi muuta strategiaa surffivat kriisin yli melko vähällä volatiliteetilla. Ehkäpä ne sopivat paremmin sijoittajalle, joka ei siedä suurta salkun arvon heiluntaa.

Strategia Keskituotto Volatiliteetti Arvo lopussa
EW 7.02 10.86 3.06
IV 5.95 6.00 2.73
MV 4.46 3.69 2.15

Annualisoituja lukuja katsoen on jälkikäteen on toki helppo viisastella, että vajaat 20 vuotta markkinoilla mukana olleen varallisuus on kolminkertaistunut osakeriskiä sietämällä, kun taas varianssi minimoivan vain hieman yli kaksinkertaistunut. Yllättäen yksinkertaisempikin IV-strategia pärjää hyvin vaikka volatiliteetti on huomattavasti tasapainotettua salkkua matalampi.

Tämän tyylisissä analyyseissä on se huono puoli, että tulokset ovat herkkiä käytetylle datalle, erityisesti mille periodille se sijoittuu ja mistä salkun tuoton simulointi alkaa. Lisäksi analyysi ei ota huomioon kaupankäyntikuluja tai veroja, ja myöskin olettaa että kaikki lunastukset ja myynnit voidaan toteuttaa kuun viimeisen kaupankäyntipäivän hinnoin. Todellisuudessa toimeksiannoissa on 2-3 päivän viive.

Analyysikoodit saa halutessaan ladattua tästä.