Ar veikia slankieji vidurkiai? Bandymas pasiknaisioti su programavimo kalba R
Įspėjimas: tai labai techniškas ir programiškas dienoraščio įrašas, toks, kokio jau nebuvo gerus septynetą metų. Bet net ir programuotojams jo vertė ribota, nes dar tik mokausi susigyventi su programavimo kalba R, bet jau jaučiu, kad mano programavimo įgūdžiai ganėtinai atšipę ir užrūdiję. Jeigu ir toliau esate pasiryžę imti ir gaišti laiką skaitant ką prirašiau, nesiskųskite, jog nebuvote įspėti.
Testavimui pasirinkau paprastą kolegos Donato pasiūlytą (pasiūlytą ištestuoti, o ne investuoti :) techninės analizės strategiją: jeigu indekso paprastas slenkantis 250 dienų vidurkis užsidarė žemiau nei indekso paprastas slenkantis 3 dienų vidurkis, tai kitą dieną ryte perkame indeksą, o jeigu 250 vidurkis buvo aukščiau, tai parduodame ir laikome pinigus (nerizikinga grąža laikoma lygi nuliui). Testavimui naudojau S&P 500 duomenys nuo 1980 sausio 1-os iki vakar dienos.
R kalboje yra galybė visokių naudingų bibliotekų bei modulių, kurie padeda net ir nelabai ką suprantant apie šią kalbą nemažai nuveikti. Testavimui naudojau quantmod
ir PerformanceAnalytics
paketus.
R kodas, kuriuo sukuriamos dvi laiko eilutės (mūsų strategijos grąžos bei S&P 500 indekso dienos grąžos) atrodo taip:
library(quantmod)
library(PerformanceAnalytics)
getSymbols("^GSPC", from="1980-01-01")
sig <- lag(
ifelse(
SMA(Ad(GSPC), 250) < SMA(Ad(GSPC), 3),
1,
0
)
)
testas <- na.omit(
merge(
sig * ROC(Ad(GSPC)),
ROC(Ad(GSPC))
)
)
# sukuriame normalius laiko eilučių pavadinimus
colnames(testas) <- c("SMA strategija", "S&P 500")
Tada nusipiešiam, kaip atrodo strategijos grąža, lyginant su indeksu:
charts.PerformanceSummary(testas, lwd=1)
Vizualiai grąža visai patenkinama, nors nemažai periodų, kai indeksas šią strategiją lengvai aplenkia (daugiausiai buliaus rinkos metu, mat strategija dažnai išeina į pinigus, “bijodama”, jog atėjo buliaus rinkos pabaiga), nors pastarąjį dešimtmetį ji galėjo išsaugoti nemažai pinigų (ir nervų). Tiesa, 1987-ųjų rinkos kracho ji nebūtų išvengusi. Panašias išvadas galima padaryti ir iš sąlyginės grąžos (relative performance) grafiko, kurį galima sugeneruoti su chart.RelativePerformance(testas[,1], testas[,2], lwd=1, legend.loc="topleft")
:
Nesunkiai galima paskaičiuoti ir įvairiausius strategijos rodiklius, kurie gal geriau galėtų nušviesti padėtį:
table.CAPM(testas[,1], testas[,2])
SMA strategija to S&P 500
Alpha 0.0001
Beta 0.4667
Beta+ 0.2787
Beta- 0.4246
R-squared 0.4666
Annualized Alpha 0.0331
Correlation 0.6831
Correlation p-value 0.0000
Tracking Error 0.1344
Active Premium 0.0026
Information Ratio 0.0195
Treynor Ratio 0.1297
Beta ganėtinai maža, kad natūralu, nes dažnai strategija yra laikyti pinigus. Alfa gana didelė (3,3 metiniai procentai), kas rodo, jog tai gal ir nebloga strategija: iš tiesų, grąža pasiekta beveik tokia pati kaip ir tiesiog investuojant į indeksą, bet su mažesniais svyravimais. Įvedus nenulinę nerizikingos grąžos normą, alfa žymiai sumažėja (prie 5% nerizikingos grąžos metinė alfa tėra 0,5%), o ir ji pati turėtų būti suvalgoma prekybos kaštų, mat per vis laikotarpį strategija siūlė padaryti 88 sandorius (beveik po tris kasmet).
Trumpai tariant, po šios analizės į šią strategiją kol kas savų pinigų nedėčiau. Bet dar nesijaučiu labai stiprus šiose analizėse : )