Į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 : )
Nesupratau ??
Ar čia tas pats Petras, kuris dešimtmetį iki šiol juokėsi iš TA-ščikų ?
Negi FA strategijos nebepadeda uždirbt ? :)
Taip, čia tas pats :)
Aš ir toliau netikiu TA, nes nesu radęs mokslinių įrodymų, kad ji veikia :) Su R galima ir FA visokius skrynus testuotis, bet mokymuisi ir pasibandymui lengviausia TA kokius nors indikatorius paimti.
Beje, seniai girdėtas, akvara :)
Labai įdomu, tik reik skirt greičiausiai nemažai laiko kai esu visiškai žalias programavime :) Ačiū už atskleistus paketus.
Nenorėtum, Petrai, dar vieną strategiją patestuoti įgudžiams? :) Tai ne vien MA’s būtų, o paremta ir rinkos global view. Kaip tik SP500 tiktų.
Labai idomu! Gal galima toki paprasta testuka butu pasiulyt: jei indeksas/akcija kilo dvi dienas is eiles, koks vidutiniskai rezultatas trecia diena?
Mintis tokia, kad TA=trendai, ir jei trendai egzistuoja, tai TA teoriskai turi sansa veikt. Is kitos puses, jei akciju rinkas valdo random walk, tai 3’ia diena judejimo kryptis up/down turetu but 50/50. Efektyvi rinka teoriskai iskart turetu adjustintis i naujienas, nepalikdama vietos trendui.
Na cia toks paprastas trendas butu, bet labai idomu kokie rezultatai tokio testo iseitu.
Petrai, pamiršai paminėti, kas gaunasi, jei vietoj cash laikymo short’ini. ;)