Nazaj finance R

Uvod

V tem prispevku bomo poskušali povprečneme vlagatelju razložiti vidike izbire naložbene stategije in analizo podatkov, ki vplivajo na izbiro ustrezne strategije.

Dolgoročne strategije

Naložbenih strategij in stilov vlaganja je veliko - od tistih, ki temeljijo na temeljnih analizah (angl. fundamental analysis), do tistih, ki se zanašajo na kvantitativno analizo (angl. quantitative analysis) in tehnično analizo (angl. technical analysis). Pri profesionalnih vlagateljih na izbiro analize vplivajo različni dejavniki - izobrazba, usposabljanje, delodajalec, odprtost in oportunitetni stroški. Pri nepoučenem vlagatelju je oportunitetni strošek razumevanja vseh različnih strategij in presoja njihovi prednosti ter slabosti izredno visok.

Kaj je naložbena strategija (angl. investment strategy)? V osnovi gre za opredelitev načrta za doseganje določenega naložbenega cilja. Jasno je, da moramo cilj dobro razumeti, preden lahko takšno strategijo ovrednotimo. Kljub temu večino naložbenih strategij, ki jih najdemo v medijih ali spletu, pogosto nima na voljo podrobnega opisa, kaj dejansko je cilj strategije. Zagotovo si z vidika implicitne predpostavke naložbene strategije predstavljamo maksimiziranje donosa. Primerjava strategije, kjer vlagamo v delnice manjših podjetij biotehnološkega sektorja in strategije, kjer nas zanimajo dolgoročne obveznice, bi lahko z vidika donosa prinesla zelo podobne rezultate, vendar to ni pomembno, če prej ne razumemo naložbenih ciljev.

Pri naložbeni strategiji moramo najprej določiti cilj:

Ko enkrat opredelimo, kaj želi vlagatelj doseči (cilj je določen), bo v nadaljevanju sledilo tehtanje med prednostmi različnih naložbenih strategij, kot je npr. prej omenjen primer delnic in obveznic. Zdaj je treba ugotoviti, katera izmed številnih strategij (npr. izbrani vzajemni sklad), ki so na voljo, bo z največjo verjetnostjo dosegla željeni cilj? Kako se odločimo med različnimi strategijami in kako jih medsebojno primerjamo? Kako vemo, da delujejo za daljše časovno obdobje?

Enostaven pristop ovrednotenja strategij

Najbolj preprost pristop ovrednotenja naložbene strategije je primerjava z najbolj naivno strategijo, kjer podobno priporočilo velja tudi pri napovednih modelih. Na podlagi povprečne ali naivne napovedi vzpostavimo referenčno vrednost, ki jo nato primerjamo z rezultati napovedi izbrane naložbene strategije. Naivna napoved bi lahko predstavljala napovedovanje zadnje vrednosti, ki jo imamo na voljo.

Pri finančnih naložbah je verjetno najbolj naivna strategija, poleg shranjevanja denarja pod žimnico, kupi in drži (angl. buy & hold). Pri tem pristopu delnico ali kakšen drug finančni inštrument kupimo in ga obdržimo neomejeno časa. Kljub temu, da je pristop kupi in drži naiven, še ne pomeni, da je slab ali neučinkovit. Dejansko je največja težava naložbenih strategij, da dosežejo boljše rezultate, kot strategija kupi in drži pred oz. po obračunanih transakcijskih stroških. Večina strategij je namreč pri tem osnovnem testu neuspešna.

V nadaljevanju si bomo na primerih pogledali nekaj primerjav naložbenih strategij.

Primerjava vrednosti in donosov

Običajno pri vsaki analizi želimo najprej raziskati podatke. Pri delnicah to ponavadi pomeni grafični prikaz časovne vrste cene. V našem primeru bomo na sliki 1 začeli s preučevanjem časovnih vrst cen oz. vrednosti indeksov S&P 500 (velika podjetja) in Russell 2000 (majhna podjetja) za obdobje od 10. september, 1987 do 14. januar, 2021.

podatki %>%
  ggplot(aes(x = Date, y = Vrednost, color = Simbol)) +
  geom_line() +
  geom_text_repel(
    data = podatki %>% filter(Date == to.min), 
    nudge_y = c(0.1, -1400), min.segment.length = 2000,
    aes(label = Simbol), size = 3
  ) +
  theme_classic() +
  theme(legend.position = "none") +
  scale_color_tq() +
  scale_y_continuous(labels = dollar_format(big.mark = ".", decimal.mark = ",")) +
  xlab("") + ylab("Vrednost indeksa")
**Vrednost** indeksov S&P 500 in Russell 2000

Slika 1: Vrednost indeksov S&P 500 in Russell 2000

Na prvi pogled izgleda, da se je indeks S&P 500 odrezal bolje od indeksa Russell 2000. A pri primerjavi moramo biti previdni, saj izhodišči nista enaki. Če želimo izvesti korektno primerjavo, moramo podatke na nek način preoblikovati oz. normalizirati. Eden izmed načino je prikaz vrednosti na logritemski lestvici, kot prikazuje slika 2. Na ta način so spremembe bolj primerljive, vendar skupne uspešnosti na ta način ne moremo najbolje primerjati.

podatki %>%
  ggplot(aes(x = Date, y = log(Vrednost), color = Simbol)) +
  geom_line() +
  geom_text_repel(
    data = podatki %>% filter(Date == to.min), 
    nudge_y = c(0.1, -1), min.segment.length = 2000,
    aes(label = Simbol), size = 3
  ) +
  theme_classic() +
  theme(legend.position = "none") +
  scale_y_continuous(labels = dollar_format(big.mark = ".", decimal.mark = ",")) +
  scale_color_tq() +
  xlab("") + ylab("Log vrednost indeksa")
**Log vrednost** indeksov S&P 500 in Russell 2000

Slika 2: Log vrednost indeksov S&P 500 in Russell 2000

Spremembe cen v določenem obdobju (npr. dnevu) so običajno najboljši način primerjave, saj so neodvisne od izhodiščne točke primerjave, zato bomo v nadaljevanju izračunali aritmetične dnevne spremembe ter jih kumulativno združili v skupni donos od začetnega datuma primerjave.

Aritmetični donos investicije (angl. Return on Investment (ROI)) v času \(t\) (npr. dan), glede na predhodno časovno obdobje \(t - 1\) (npr. prejšnji dan) določimo z enačbo (1).

\[ \begin{equation} \textbf{donos}_{\ t} = \begin{cases} 0 & ; & t = t_{\ min} \\ \frac{\text{vrednost}_{\ t} - \text{vrednost}_{\ t-1}}{\text{vrednost}_{\ t-1}} & ; & \text{sicer} \end{cases} \tag{1} \end{equation} \] Skupni donos za vsako časovno enoto \(t \in [t_{\ min}, t_{\ max}]\) lahko določimo kumulativno z enačbo (2)

\[ \begin{equation} \textbf{skupni donos}_{\ t} = 100 \cdot \prod_{i\ =\ t_{\ min}}^{t} \Big(1 + \text{donos}_{\ i}\Big) \tag{2} \end{equation} \]

ali rekurzivno z enačbo (3).

\[ \begin{equation} \textbf{skupni donos}_{\ t} = \begin{cases} 100 & ; & t = t_{\ min} \\ \text{skupni donos}_{\ t-1} \cdot \big(1 + \text{donos}_{\ t}\big) & ; & \text{sicer} \end{cases} \tag{3} \end{equation} \]

podatki.sprememba.aritmeticna <-
  podatki %>%
  group_by(Simbol) %>%
  tq_transmute(
    select = Vrednost, mutate_fun = periodReturn, period = "daily", 
    type = "arithmetic", col_rename = "Donos"
  ) %>%
  mutate(SkupniDonos = cumprod(Donos + 1) * 100)
Tabela 1: Vrednosti, donosi in skupni donosi izbranih indeksov S&P 500 in Russell 2000

Omenjene podatke nato prikažemo na sliki 3, kjer jih indeksiramo na začetno vrednost \(100\ \%\). Opazimo lahko, da sta dolgoročni uspešnosti obeh indeksov zelo podobni, z nekaj razlikami med izbranimi časovnimi obdobju (npr. okrog leta \(2000\)).

podatki.sprememba.aritmeticna %>%
  ggplot(aes(x = Date, y = SkupniDonos, color = Simbol)) +
  geom_line() +
  geom_text_repel(
    data = podatki.sprememba.aritmeticna %>% filter(Date == to.min), 
    min.segment.length = 2000,
    aes(label = Simbol), size = 3
  ) +
  theme_classic() +
  theme(legend.position = "none") +
  scale_color_tq() +
  xlab("") + ylab("Aritmetični donos indeksa (%)")
**Aritmetični donos** indeksov S&P 500 in Russell 2000

Slika 3: Aritmetični donos indeksov S&P 500 in Russell 2000

Če v tem trenutku zanemarimo priporočila glede diverzifikacije sredstev ali privlačnosti enega načina investiranja pred drugim, katero izmed omenjenih naložb, velika podjetja (S&P 500) ali majhna podjetja (Russell 2000), bi izbrali na podlegi slike 3?

podatki.sprememba.skupaj <-
  podatki.sprememba.aritmeticna %>%
  filter(Date == max(Date)) %>%
  select(Simbol, SkupniDonos) %>%
  arrange(desc(SkupniDonos))
Tabela 2: Skupni aritmetični donos na celotnem časovnem intervalu
Indeks Donos (%)
Russell 2000 1.275,58
S&P 500 1.196,84

Če upoštevamo skupni aritmetični donos v tabeli 2, je večji donos \(1.275,58\ \%\) dosegel indeks Russell 2000, v primerjavi z donosom \(1.196,84\ \%\) indeksa S&P 500.

podatki.analiza.letna <- 
  podatki.sprememba.aritmeticna %>%
  group_by(Simbol) %>%
  tq_performance(Ra = Donos, Rb = NULL, performance_fun = table.AnnualizedReturns) %>%
  ungroup() %>%
  rename(
    "Donos" = "AnnualizedReturn",
    "Tveganje" = "AnnualizedStdDev",
    "Donos_tveganje" = "AnnualizedSharpe(Rf=0%)"
  ) %>%
  mutate_if(is.numeric, .funs = funs(. * 100)) %>%
  select(Simbol, Donos, Tveganje, Donos_tveganje) %>%
  arrange(desc(Donos_tveganje))

Še bolj ustrezna je primerjava povprečnega letnega donosa (angl. Compound Annual Growth Rate (CAGR)), ki jo izračunamo z enačbo (4) in povprečnega letnega tveganja obeh indeksov.

\[ \begin{equation} \textbf{povprečni letni donos} = \Bigg(\frac{\text{vrednost}_{\ t_{\ max}}}{\text{vrednost}_{\ t_{\ min}}}\Bigg)^{\frac{1}{t_{\ max}\ -\ t_{\ min}\ (\text{v letih})}} - 1 \tag{4} \end{equation} \]

Iz teh dveh metrik lahko izračunamo koliko donosa je bilo doseženo na enoto tveganja. V tabeli 3 lahko opazimo, da ima indeks Russell 2000 boljši povprečni letni donos \(7,93\ \%\), kot indeks S&P 500 z donosom \(7,73\ \%\). Tveganje \(18,67\ \%\), povezano z indeksom S&P 500 pa je manjše, kot tveganje \(21,34\ \%\), povezano z indeksom Russell 2000.

Tabela 3: Povprečni letni aritmetični donos na celotnem časovnem intervalu
Indeks Donos (%) Tveganje (%) Donos / tveganje (%)
S&P 500 7,73 18,67 41,38
Russell 2000 7,93 21,34 37,18

Ko primerjamo, kako smo bili pri posameznem indeksu nagrajeni k določenemu tveganju, ugotovimo, da je indeks S&P 500 boljši. Zadnji stolpec v tabeli 3 lahko preprosto interpretiramo, koliko dodatnega denarja (npr. \(\text{USD}\)) ustvarimo, za vsak \(1\ \text{USD}\), ki ga tvegamo. Pri indeksu S&P 500 povprečno na letni ravni ustvarimo \(0,41\ \text{USD}\), medtem ko pri indeksu Russell 2000 \(0,37\ \text{USD}\).

Katero naložbo bi izbrali na podlagi pravkar izvedene analize? Vprašanje je ali se ta nekoliko večji povprečni letni donos pri indeksu Russell 2000 splača? Indeks S&P 500 deluje kot boljša izbira, vendar ne z zelo veliko razliko. Pomembno pa je poudarati, da je analiza izvedena na zgodovinskih podatkih. Ali verjamemo, da se bodo takšni trendi nadaljevali tudi v prihodnje? Časovni obseg naših podatkov je nekoliko večji kot \(30\) let. Kaj če je naše naložbeno obdobje le \(10\) ali \(5\) let? Bi se lahko v tem primeru bolj suvereno odločili za določeno strategijo? Če se vrnemo na sliko 3, lahko vidimo, da obstajajo določena obdobja, ko en indeks preseže drugega. Kaj če bi analizo začeli v kakšnem drugem letu?

Vidimo, da je analiza odprla še več vprašanj, kot pa ponudila odgovorov. Odgovori na prej izpostavljena vprašanja so seveda povezana z naložbenimi cilji in časovnimi obdobji. V nadaljevanju si bomo pogledali določene taktične metode, ki jih lahko uporabimo za izboljšanje rezultatov strategij.

Simulacija donosov

V nadaljevanju si bomo pogledali, kaj pomenita osrednji omejitvi naložbene strategije, donos in tveganje. Recimo, da smo izbrali naložbeno strategijo, kjer vlagamo v indeks delnic, npr. nekaj podobnega, kot je S&P 500. Predvidevajmo, da je zahtevani donos \(7\ \%\) (podobno dolgoročnemu donosu indeksa S&P 500) in da je povprečni letni odmik od povprečja največ \(16\ \%\) (zopet zelo blizu dolgoročni volatilnosti indeksa S&P 500).

Za lažjo predstavo bomo simulirali \(9\) takšnih delniških indeksov pri prej omenjenih omejitvah v časovnem obdobju \(20\) let, kot prikazuje slika 4.

set.seed(123)
delnice <- matrix(nrow = 20, ncol = 9)
for (i in 1:9) {
  delnice[, i] <- rnorm(20, .07, .16)
}
delnice <- data.frame(leto = 1:20, delnice)
colnames(delnice)[-1] <- toupper(letters[1:9])
delnice <- delnice %>% gather(delnica, donos, -leto)
Simulacija $9$ delniških indeksov s povprečnim donosom $7\ \%$ in tveganjem $16\ \%$

Slika 4: Simulacija \(9\) delniških indeksov s povprečnim donosom \(7\ \%\) in tveganjem \(16\ \%\)

Na sliki 4 se zdi, da je pri vseh indeksih prisoten pozitiven trend rasti. Ko rezultate prikažemo v obliki tabele 4, lahko na podlagi donosov in tveganj opazimo, kako zelo se rezultati razlikujejo. Pri simulaciji smo zahtevali približno \(7\ \%\) letni donos, kar po \(20\) letih znaša \(1,07^{\ 20} - 1 \approx 287\ \%\). Le štirje simulirani indeksi (\(A\), \(C\), \(E\) in \(I\)) so dosegli mejno vrednost, medtem ko sta se dva (\(F\) in \(H\)) odrezala močno podpovprečno.

Tabela 4: Tabela simuliranih donosov in tveganj \(9\) delniških indeksov
Indeks Donos (%) Tveganje (%)
A 382,01 15,56
B 184,56 13,28
C 340,07 15,32
D 117,27 15,57
E 912,66 13,26
F 13,80 11,22
G 166,83 17,37
H 80,21 16,51
I 412,07 17,17

Seveda je teh \(9\) scenarij zgolj manjša podmnožica vseh možnih rezultatov. Če velja predpostavka o pričakovanem donosu in tveganju, bi se pri večjem številu simulacij povprečni letni donos gibal okrog \(7\ \%\), medtem ko bi bil pričakovani donos okrog \(287\ \%\). Kakšen pa je obseg vseh možnih izidov okrog tega povprečja?

Ko izvedemo \(100.000\) simulacij pri omejitvah donosa in tveganja, rezultate prikažemo na sliki 5, kjer je povprečje prikazano s pokončno rdečo črto. S črtkanima rdečima črtama sta prikazani meji ene standardne deviacije \(\sigma\) levo in desno od povprečja, kar predstavlja \(\approx 68\ \%\) vseh možnih izidov. Graf na sliki 5 zaradi preglednosti prikazuje zgolj donose do \(1.500\ \%\).

set.seed(123)
izracunaj_donos <- function(leta, donos, tveganje){
  indeks <- rnorm(leta, donos, tveganje)
  skupniDonos <- Return.cumulative(indeks)
  return(skupniDonos)
}
rezultat <- replicate(100000, izracunaj_donos(20, .07, .16))
rezultat <- rezultat * 100 
rezultat <- rezultat %>% data.frame()
names(rezultat) <- "donos"
Porazdelitev povprečnih donosov pri $100.000$ simulacijah

Slika 5: Porazdelitev povprečnih donosov pri \(100.000\) simulacijah

Graf na sliki 5 bi lahko optimistično interpretirali v smeri, da imamo na voljo še veliko prostora na zgornji meji za potencialno še boljši rezultat. Vendar točno tu je ključna težava – pri dosegu cilja imamo samo \(1\) priložnost in ne \(100.000\), kot pri simulaciji.

Kako sedaj upoštevamo tveganje, da bo izbrana strategija uspešna? Ena možnost je določitev spodnje meje, ki je naša naložbena strategija ne sme preseči in nato izračunamo, kakšna je verjetnost da to spodnjo mejo kljub temu dosežemo. Zahtevamo lahko npr. da je zahtevani letni donos \(7\ \%\), kar pomeni \(287\ \%\) kumulativnega donosa, ne dovolimo pa kumulativnega donosa, manjšega od \(230\ \%\). Omenjena zahteva se sicer zdi zelo konzervativna – pripravljeni smo sprejeti \(\approx 60\ \%\) nižji donos od povprečnega.

Verjetnost, da se to zgodi, na podlagi teh simulacij, je kar \(54\ \%\). To je zelo slabo, saj imamo občutek, kot da svoje naložbene cilje prepuščamo metu kovanca.

Tudi če spodnjo mejo kumulativnega donosa zmanjšamo na \(200\ \%\), bo še vedno obstajala \(48\ \%\) verjetnost, da bo rezultat slabši od te meje. To je tudi ena izmed največjih težav vseh “poznavalcev finančnih inštrumentov”, ki svoja priporočila temeljijo na podatkih daljšega časovnega obdobja. Pri tem napačno obravnavajo veliko količino podatkov in veliko število pojavitev. Zgodovina je zgolj en scenarij izbire iz neskončne množice pojavov. Takšni grafi zgodovinskih podatkov predstavljajo točno to – zgolj en možen scenarij.

Kako pa lahko obvladujemo tveganje za dosego naložbenega cilja? Če imamo zgolj dve omejitvi – donos in tveganje – lahko poskusimo različne kombinacije, da zmanjšamo verjetnost, kjer naložbenega cilja ne dosežemo. Druga možnost je diverzifikacija strategij, ki medsebojno niso povezane. Do sedaj smo uporabljali zgolj eno naložbeno strategijo, ki je poenostavljena glede na to, kako so zasnovani dejanski portfelji. Vendar nam diverzifikacija poveča kompleksnost z novim parametrom – korelacijo.

Tretja možnost je uporaba določenih taktičnih omejitev pri izvajanju strategije. Npr. sredstva vložimo le takrat, ko je izpolnjen vnaprej določen pogoj ali je prisoten trend. Če uporabimo takšen pristop, pa je treba upoštevati ali smo sposobni identificirati takšne ugodne vstopne pogoje? V drugih prispevkih bomo pregledali nekaj taktičnih strategij, ki bi lahko bile koristne.

Taktične odločitve pri naložbeni strategiji

Če je naša naložbena strategija vlaganje v delnice večjih podjetij, kjer pričakujemo \(7\ \%\) letni donos pri največjem letnem tveganju \(16\ \%\), se zelo približamo indeksu S&P 500. V prejšnjem poglavju smo ugotovili, da obstaja kar \(54\ \%\) verjetnost, da nam ne bo uspelo doseči naložbenega cilja. Ko smo naša pričakovanja znižali, je še vedno obstajala \(48\ \%\) verjetnost, da cilja ne dosežemo, kar ni preveč obetavno. Mogoče pa obstaja kakšen pristop, kjer omejimo gibanje navzdol, kar pogosto imenujemo omejevanje izgub in puščanje pozitivnim donosom prosto pot.

Za izvedbo omenjene taktike obstaja kar nekaj možnosti. Letne izgube bi lahko omejili na vnaprej določeno vrednost ali uporabili kakšno metriko volatilnosti. Spet drug pristop je z uporabo indikatorjev trenda. Indikator na podlagi določene logike prepozna vstopne in izstopne točke naložbe. Eden izmed najbolj preprostih in pogosto uporabljenih indikatorjev je \(\boldsymbol{200}\)-dnevno drseče povprečje, ki temelji na naslednji konceptih:

Z indikatorjem je sicer povezana težava, kjer lahko izgubimo sredstva ob prodaji, ker se trend oz. signal hitro obrne, medtem ko bi bilo bolje, da bi naložbo držali. Prav tako ga je zaradi psiholoških dejavnikov tudi težko vpeljati.

Kljub temu si poglejmo, kako se omenjen indikator obnese na konkretnem primeru indeksa S&P 500. Za lažji prikaz se bomo osredotočili na časovni interval od vključno leta \(1990\) naprej, kar prikazuje slika 6.

SP500.SMA200 <- 
  SP500 %>%
  rename("Vrednost" = "GSPC") %>%
  mutate(SMA200 = SMA(Vrednost, n = 200)) %>%
  filter(Date >= "1990-01-01") %>%
  pivot_longer(cols = c(Vrednost, SMA200))
$200$-dnevno povprečje in vrednost S&P 500 indeksa od leta $1990$ naprej

Slika 6: \(200\)-dnevno povprečje in vrednost S&P 500 indeksa od leta \(1990\) naprej

Sedaj bomo opredelili strategijo, kjer indeks S&P 500 kupimo le, če je vrednost nad \(200\)-dnevnim drsečim povprečjem in ga prodamo, če je pod njim. Na sliki 7 prikažemo kumulativne donose omenjenega pristopa in strategije kupi in drži.

SP500.SMA200.strategija.all <-
  SP500 %>%
  rename("Vrednost" = "GSPC") %>%
  mutate(SMA200 = SMA(Vrednost, n = 200)) %>%
  filter(!is.na(SMA200)) %>%
  pivot_longer(cols = c(Vrednost, SMA200)) %>%
  pivot_wider(names_from = name, values_from = value) %>%
  tq_mutate(
    select = Vrednost, mutate_fun = periodReturn, period = "daily", 
    type = "arithmetic", col_rename = "Donos"
  ) %>%
  mutate(
    Signal = Lag(ifelse(SMA200 < Vrednost, 1, 0)),
    Signal = ifelse(is.na(Signal), 1, Signal),
    SkupniDonos.BH = cumprod(Donos + 1),
    SkupniDonos.SMA200 = cumprod(Donos * Signal + 1)
  )
Strategija $200$-dnevnega povprečja ter kupi in drži nad indeksom S&P 500 od leta $1928$ naprej

Slika 7: Strategija \(200\)-dnevnega povprečja ter kupi in drži nad indeksom S&P 500 od leta \(1928\) naprej

Rezultat na sliki 7 je zelo obetaven, saj se naša enostavna strategija izkaže kot izrazito boljša od pristopa kupi in drži. Poglejmo si sedaj porazdelitev dnevnih donosov na sliki 8.

Porazdelitev dnevnih donosov

Slika 8: Porazdelitev dnevnih donosov

Na sliki 8 težko opazimo kakšno bistveno razliko v porazdelitvi, kljub temu, da smo odstranili podatke, ko strategija ni bila prisotna na trgu. To je približno \(7.580\) dni, kar predstavlja \(32,7\ \%\) celotnega obdobja.

Če pogledamo še razmerje med povprečnim donosom in tveganjem v tabeli 5, vidimo da strategija SMA200 deluje opazno bolje, saj smo za privzeto tveganje z donosom bolj nagrajeni.

Tabela 5: Donos / tveganje strategije kupi in drži ter strategije SMA200 v celotnem obdobju
data.frame(
  Strategija = c("Kupi in drži", "Strategija SMA200"),
  Donos_na_tveganje = c(
    (
      mean(SP500.SMA200.strategija.all$Donos) / 
      sd(SP500.SMA200.strategija.all$Donos)
    ) * sqrt(252),
    (
      mean(SP500.SMA200.strategija.all$Donos * SP500.SMA200.strategija.all$Signal) / 
      sd(SP500.SMA200.strategija.all$Donos * SP500.SMA200.strategija.all$Signal)
    ) * sqrt(252)
  )
) %>%
  kbl(
    align = c("l", "r"), booktabs = TRUE, escape = FALSE,
    format.args = list(decimal.mark = ',', big.mark = "."),
    digits = 2,
    col.names = c("Strategija", "Donos / tveganje")
  ) %>%
  kable_styling(
    font_size = 11, 
    bootstrap_options = c("condensed", "hover"),
    full_width = FALSE
  ) %>%
  column_spec(1, bold = TRUE)  
Strategija Donos / tveganje
Kupi in drži 0,39
Strategija SMA200 0,59

Vendar to še ne pomeni, da je uporaba takšne taktike tudi smiselna. Spomnimo se, da smo omenjeno strategijo preučevali na podatkih v skoraj \(100\) letih, in sicer od leta \(1928\) naprej. Bolj realno bi bilo npr. časovno obdobje okrog \(20\) ali \(30\) let.

V zadnjih \(30\) letih, z začetkom leta \(1991\), so rezultati prikazani na sliki 9 in tabeli 6.

SP500.SMA200.strategija.30 <-
  SP500 %>%
  filter(Date >= "1991-01-01") %>%
  rename("Vrednost" = "GSPC") %>%
  mutate(SMA200 = SMA(Vrednost, n = 200)) %>%
  filter(!is.na(SMA200)) %>%
  pivot_longer(cols = c(Vrednost, SMA200)) %>%
  pivot_wider(names_from = name, values_from = value) %>%
  tq_mutate(
    select = Vrednost, mutate_fun = periodReturn, period = "daily", 
    type = "arithmetic", col_rename = "Donos"
  ) %>%
  mutate(
    Signal = Lag(ifelse(SMA200 < Vrednost, 1, 0)),
    Signal = ifelse(is.na(Signal), 1, Signal),
    SkupniDonos.BH = cumprod(Donos + 1),
    SkupniDonos.SMA200 = cumprod(Donos * Signal + 1)
  )
Strategija $200$-dnevnega povprečja ter kupi in drži nad indeksom S&P 500 od leta $1991$ naprej (zadnjih $30$ let

Slika 9: Strategija \(200\)-dnevnega povprečja ter kupi in drži nad indeksom S&P 500 od leta \(1991\) naprej (zadnjih \(30\) let

Absolutni rezultat uporabljene strategije \(200\)-dnevnega povprečja je razočaranje, sa je slabši od pristopa kupi in drži. Povprečni donos na tveganje v tabeli 6 je pri uporabljeni strategiji sicer še vedno boljši od pristopa kupi in drži, vendar je razlika tokrat veliko manjša.

Tabela 6: Donos / tveganje strategije kupi in drži ter strategije SMA200 v zadnjih \(30\) letih
data.frame(
  Strategija = c("Kupi in drži", "Strategija SMA200"),
  Donos_na_tveganje = c(
    (
      mean(SP500.SMA200.strategija.30$Donos) / 
      sd(SP500.SMA200.strategija.30$Donos)
    ) * sqrt(252),
    (
      mean(SP500.SMA200.strategija.30$Donos * SP500.SMA200.strategija.30$Signal) / 
      sd(SP500.SMA200.strategija.30$Donos * SP500.SMA200.strategija.30$Signal)
    ) * sqrt(252)
  )
) %>%
  kbl(
    align = c("l", "r"), booktabs = TRUE, escape = FALSE,
    format.args = list(decimal.mark = ',', big.mark = "."),
    digits = 2,
    col.names = c("Strategija", "Donos / tveganje")
  ) %>%
  kable_styling(
    font_size = 11, 
    bootstrap_options = c("condensed", "hover"),
    full_width = FALSE
  ) %>%
  column_spec(1, bold = TRUE)  
Strategija Donos / tveganje
Kupi in drži 0,51
Strategija SMA200 0,57

Preverimo še obdobje zadnjih \(20\) let, ki se začne leta \(2001\) in je prikazano na sliki 10 in tabeli 7.

SP500.SMA200.strategija.20 <-
  SP500 %>%
  filter(Date >= "2001-01-01") %>%
  rename("Vrednost" = "GSPC") %>%
  mutate(SMA200 = SMA(Vrednost, n = 200)) %>%
  filter(!is.na(SMA200)) %>%
  pivot_longer(cols = c(Vrednost, SMA200)) %>%
  pivot_wider(names_from = name, values_from = value) %>%
  tq_mutate(
    select = Vrednost, mutate_fun = periodReturn, period = "daily", 
    type = "arithmetic", col_rename = "Donos"
  ) %>%
  mutate(
    Signal = Lag(ifelse(SMA200 < Vrednost, 1, 0)),
    Signal = ifelse(is.na(Signal), 1, Signal),
    SkupniDonos.BH = cumprod(Donos + 1),
    SkupniDonos.SMA200 = cumprod(Donos * Signal + 1)
  )
Strategija $200$-dnevnega povprečja ter kupi in drži nad indeksom S&P 500 od leta $2001$ naprej (zadnjih $20$ let

Slika 10: Strategija \(200\)-dnevnega povprečja ter kupi in drži nad indeksom S&P 500 od leta \(2001\) naprej (zadnjih \(20\) let

Tabela 7: Donos / tveganje strategije kupi in drži ter strategije SMA200 v zadnjih \(20\) letih
data.frame(
  Strategija = c("Kupi in drži", "Strategija SMA200"),
  Donos_na_tveganje = c(
    (
      mean(SP500.SMA200.strategija.20$Donos) / 
      sd(SP500.SMA200.strategija.20$Donos)
    ) * sqrt(252),
    (
      mean(SP500.SMA200.strategija.20$Donos * SP500.SMA200.strategija.20$Signal) / 
      sd(SP500.SMA200.strategija.20$Donos * SP500.SMA200.strategija.20$Signal)
    ) * sqrt(252)
  )
) %>%
  kbl(
    align = c("l", "r"), booktabs = TRUE, escape = FALSE,
    format.args = list(decimal.mark = ',', big.mark = "."),
    digits = 2,
    col.names = c("Strategija", "Donos / tveganje")
  ) %>%
  kable_styling(
    font_size = 11, 
    bootstrap_options = c("condensed", "hover"),
    full_width = FALSE
  ) %>%
  column_spec(1, bold = TRUE)  
Strategija Donos / tveganje
Kupi in drži 0,43
Strategija SMA200 0,47

Trend donosa obdobja zadnjih \(20\) let je podoben kot trend donosov obdobja zadnjih \(30\) let. Razmerje med donosom in tveganjem je tudi tokrat boljše pri strategiji SMA200 v primerjavi s pristopom kupi in drži. Opazimo pa lahko, da se uspešnost strategije SMA200 z manjšim časovnim obdobjem zmanjšuje. V celotnem obdobju je bilo razmerje med donosom in tveganjem strategije SMA200 v primerjavi s strategijo kupi in zadrži boljše za \(20\ \%\), v obdobju zadnjih \(30\) let \(6\ \%\) in v zadnjih \(20\) letih zgolj \(4\ \%\).

Metrika donosa proti tveganju se v splošnem znižala, kar lahko delno pripišemo tudi trem večjim recesijam v obdobju zadnjih \(20\) let. Ključno vprašanje zato ostaja, ali se na podlagi teh rezultatov splača uporabiti strategijo \(200\)-dnevnega povprečja? Ogledali smo si le dve časovni rezini; kaj če bi pogledali vse obdobja \(20\) let od začetka, ko so podatki na voljo?

obdobja <- data.frame(
  zacetek = seq(as.Date("1930-01-01"), length = 72, by = "years"), 
  konec = seq(as.Date("1949-12-31"), length = 72, by = "years")
)
                    
# Izračun 20-letnega donosa
izracunaj_donos <- function(zacetek, konec) {
  podatki <- 
    SP500 %>%
    rename("Vrednost" = "GSPC") %>%
    mutate(SMA200 = SMA(Vrednost, n = 200)) %>%
    filter(Date >= zacetek, Date <= konec) %>%
    tq_mutate(
      select = Vrednost, mutate_fun = periodReturn, period = "daily",
      type = "arithmetic", col_rename = "Donos"
    ) %>%
    mutate(
      Signal = Lag(ifelse(SMA200 < Vrednost, 1, 0)),
      Signal = ifelse(is.na(Signal), 1, Signal),
      SkupniDonos.BH = cumprod(Donos + 1),
      SkupniDonos.SMA200 = cumprod(Donos * Signal + 1)
    ) %>%
    top_n(1, Date) %>%
    select(starts_with("SkupniDonos")) %>%
    t()
  return(as.numeric(podatki))
}

donosi <- data.frame(
  Donos.BH = rep(0, 72), 
  Donos.SMA200 = rep(0, 72)
)
for (i in 1:72) {
  donosi[i, ] <- izracunaj_donos(obdobja[i, 1], obdobja[i, 2])
}
donosi <- 
  donosi %>%
  mutate(leto = year(obdobja$konec))
?

Slika 11: ?

Na sliki 11 lahko opazimo, da se taktični pristop \(200\)-dnevnega drsečega povprečja izkaže bolje predvsem v začetnem časovnem obdobju, nekje do leta \(1990\), nato pa se učinkovitost močno poslabša. Pri izbiri taktičnega pristopa v okviru naložbene strategije moramo predvsem razmisliti o naslednjih vprašanjih: