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)
Per 30 metų grąža gal ir panaši, bet toli gražu ne stabili

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"):

Nelabai aišku ar ši strategija veikia ilguoju laikotarpiu

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 : )

Comments Closed

5 Comments

  1. Nesupratau ??

    Ar čia tas pats Petras, kuris dešimtmetį iki šiol juokėsi iš TA-ščikų ?

    Negi FA strategijos nebepadeda uždirbt ? :)

    1. 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 :)

  2. 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ų.

  3. 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.

Comments are closed.