Sari la conținut

Cum dezvoltam si evaluam statistic o strategie de trading?


Criodi

Postări Recomandate

  • Moderators

Am facut un hobby in ultima vreme din a modifica replici din filme, citate celebre, etc, si a le face relevante trading-ului. Un astfel de citat, care surprinde intocmai spiritul acestui topic, este:

 

The path of the trader is beset on all sides by the pitfalls of strategy development and the tyranny of misleading models. Blessed is he who in the name of science and profit will shepherd the trader through dark market valleys, for he is truly a beacon of objectivity and the finder of winning strategies. - Jules Winnfield (Pulp Fiction)

 

Hai sa vedem deci ce trebuie sa facem pentru a produce strategii intr-un mod cat mai obiectiv si a evalua rezultatele lor intr-un mod cat mai corect.

 

Greseli frecvente facute in faza de conceptie si backtesting

 

Inainte de a evalua rezultatele unei strategii trebuie sa ne asiguram ca am obtinut rezultatele alea intr-un mod cat mai obiectiv. Trebuie sa avem mai intai grija la urmatoarele:

 

Acuratetea datelor

 

Sunt datele noastre istorice corecte? Avem cumva un chart plin de gap-uri spike-uri si alte astfel de nebunii? Cu cat piata cu care lucram este mai decentralizata cu atat sansele ca un sigur sir de date sa nu fie o reprezentare fidela a istoriei sunt mai mari. E adevarat ca in lumea lui mt4 lucrul cu mai multe serii de date nu prea este usor de facut. Se pot lua insa mai multe siruri de date, compara in afara mt4, scoate orice fel de balarii, si apoi transformate intr-un fisier istoric compatibil mt4. Cat de problematic este acest aspect depinde evident de strategia noastra. Una care tranzactionaza rar s-ar putea sa nu fie afectata prea tare.

 

Presupuneri despre executie

 

Am presupus corect slippage-ul cu care ne vom intalni in realitate? Spread-ul? Backtesting-ul in mt4 nu contine spread-ul istoric. Se ia nivelul de bid si i se adauga nivelul de spread curent. Asta n-are insa nicio treaba cu realitatea istorica. Ce sa mai zicem de slippage. In backtester nu exista asa ceva. Numai astea doua combinate pacalesc adesea foarte multi traderi care castiga pe istoric dar o dau in bara in timp real.

 

Half-life

 

Half-life, nu jocul pe calculator, ci celalalt Half-Life reprezinta durata de timp in care o cantitate se reduce la jumate din valoarea initiala. In trading ne referm practic la perioada de timp in care strategia ajunge din profitabila, neprofitabila. Nicio strategie nu tine la infinit. Nicio strategie nu tine nici macar prea mult timp. Nu trebuie sa estimam deci un half-life prea mare. Daca facem astfel de presupuneri s-ar putea sa ne para rau mai tarziu cand strategia incepe sa scartaie.

 

E adevarat ca e greu de estimat cat timp va fi o strategie profitabila de la bun inceput. Ideea insa este sa fim mereu atenti la conditiile din piata si sa ne reevaluam constant rezultatele obtinute spre a decide daca mai merge treaba sau nu.

 

Supra estimarea profitului

 

Cam orice strategie va produce in timp real numai o fractie din profitul produs in backtesting. Asta nu-i vreo teorie stiintifica insa este o prespunure de bun simt. Viitorul este imprevizibil. Nu sti ce volatilitate va fi, ce costuri de trading vor fi, ce evenimente vor misca piata. Oricat de bine ai mers pe trecut e greu de crezut ca vei merge cel putin la fel de bine si in viitor. 

 

Perioada de istoric pe care se fac testele

 

Am testat cumva un trend-following strategy intr-o perioada de trend si apoi ne-am minunat de cat de tare e strategia noastra? Am testat cumva o strategie buna in range intr-o perioada de range? Daca am facut-o s-ar putea sa o patim urat in timp real cand conditiile se schimba. Perioada pe care testele se fac trebuie sa fie reprezentativa pentru un set cat mai amplu de conditii. Chiar si testarea aia facuta in timp real nu poate fi luata in serios daca a fost facuta intr-o perioada tocmai potrivita strategiei. E foarte usor sa ne pacalim singuri testand numai pe perioadele care ne convin noua.

 

Look-ahead bias

 

Cand lucram cu date istorice stim exact ce se va intampla pe urmatoarea candela. Daca cumva aceasta informatie se strecoara in strategia noastra inseamna ca inducem un look-ahead bias strategiei care face ca rezultatele noastre sa nu aiba niciun fel de relvanta statistica. Trebuie deci sa avem grija ca fiecare tranzactie pusa pe istoric nu foloseste decat date aflate la stanga punctului de intrare. Alea aflate la dreapta sunt date care nu ar fi fost cunoscute in acel moment.

 

Out-of-sample testing

 

Testarea pe perioade out-of-sample inseamna testarea pe o portiune de istoric pe care n-am folosit-o in optimizarea si dezvoltarea strategiei noastre. Adica daca avem 10 ani de istoric, impartim datele in doua, cautam pattern-uri, optimizam, testam, etc pe primii cinci ani si apoi dupa ce am obtinut o strategie multumitoare o testam din nou pe ceilalti cinci ani. Doar rezultatele obtinute pe acesti cinci ani pot fi folosite pentru a evalua daca strategia noastra este intradevar buna de ceva sau nu. Vom discuta mai jos cum se evalueaza rezultatele unei strategii de trade. E obligatoriu ca acele metode sa se foloseasca numai pe rezultate obtinute pe perioade out-of-sample.

 

Si apropo. Daca strategia aia optimizata nu merge pe out-of-sample nu va apucati sa o optimizati iar pe out-of-sample ca n-ati rezolvat nimic. Si nici sa nu luati a doua cea mai buna strategie de pe primii cinci ani si sa o testati pe acesti cinci ani out of sample. Daca faceti asa ceva inseamna ca faceti data snooping.

 

Data snooping

 

Daca luati o perioada de istoric si testati strategii pe ea pana cand gasiti ceva care merge e foarte posibil ca aceste rezultate sa fi aparut pur si simplu la noroc. Cand evaluam deci aceste strategii multiple pe aceasi perioada de timp va trebui sa aplicam teste mult mai stringente pentru a fi siguri ca nu ne pacalim singuri. Voi dedica o intreaga postare mai jos acestui element caci este extraordinar de important.

Editat de Criodi
Link spre comentariu
Distribuie pe alte site-uri

  • Moderators

Evaluarea rezultatelor obtinute de o strategie

 

Sa zicem ca avem o strategie de trade care scoate ceva profit. Cum ne dam seama daca profitul asta este intradevar relevant sau nu? Adica cum ne dam seama ca profitul nu a fost castigat pur si simplu la noroc? Retineti ca piata merge in sus si in jos si ca in orice moment exista cel putin un numar de strategii random care vor face profit. Pe termen lung toate strategiile random pierd insa pe termen scurt e posibil sa castige. Trebuie neaaparat sa avem girja ca strategia noastra sa nu fie una dinasta random care pur si simplu a scos profit pe termen scurt la noroc.

 

Detrending

 

Inainte de a evalua daca rezultatele noastre sunt relevante sau nu trebuie sa stabilim mai intai ce rezultate vrem defapt sa testam. E important sa luam trend-ul pietei in considerare si sa il scoatem din rezultatele noastre pentru a putea testa si compara stratgii cu bias-uri long/short diferite. In sensul acesta avem doua optiuni in functie de cum e strategia noastra:

 

1. Benchmarking

 

Aceasta metoda poate fi aplicata foarte usor atunci cand strategia noastra este tranzactionata pe un singur instrument.

 

Ideea e in felul urmator. Daca pe un trend de crestere medie zilnica de 2% strategia noastra a scos 4% cu un procent de 80% tranzactii long si 20% tranzactii short, o strategie absolut random, dar cu acelasi bias ca strategia noastra ar fi scos

 

\[ E(r_{rndm}) = p(long) \cdot d - p(short) \cdot d = 0.8 \cdot 0.02 - 0.2 \cdot 0.02 = 0.012 = 1.2\% \]

 

Cand vom rula mai jos un test de relevanta pentru strategia noastra va trebui sa il comaparam cu medie random de 0%. Daca random-ul insa scoate 1.2% trebuie sa ajustam rezultatele noastre pentru a le putea compara cu zero.

 

Ajustarea e simpla. Din profitul nostru de 4% zilnic scadem 1.2% si apoi cand testam cat de semnificative sunt rezultatele noastre folosim nu 4% ci 4%-1.2% = 2.8%. Astea sunt practic profiturile noastre in excess de s-ar fi putut scoate jucand pur si implu la noroc. La modul general, profiturile noastre, in excess fata de ce se putea scoate la  noroc sunt date de 

 

\[\bar r_{excess} = \bar r_{normal} - E(r_{rndm})\]

 

unde \(E(r_{rndm})\) e dat de formula de mai sus unde \(d\) e miscarea medie zilnica a pietei. Numai daca \(r_{excess}\) este semnificativ putem trage concluzia ca strategia e buna.

 

2. Detrending

 

Benchmarking-ul de mai sus e foarte usor de aplicat daca strategia se aplica numai pe un singur instrument. Daca strategia noastra insa include mult mai multe instrumente e mai greu de stabilit care-i exact \(E(r_{rndm})\) si atunci trebuie sa folosim detrending. 

 

a. Pentru fiecare instrument se iau toate zilele pe care testul s-a facut si se calculeaza miscarea medie zilnica

b. Se ia fiecare zi in parte si din cat s-a miscat piata in ziua aia se scade cifra de mai sus.

c. Profitul tranzactiilor noastre se masoara apoi folosind aceste cifre modificate (detrended data) 

 

Procedura la nivel de tranzactie functioneaza in felul urmator: se ia fiecare tranzactie, se calculeaza numarul de zile pentru care a fost deschisa (n), si din procentul facut de tranzactie se scade n inmultit cu media zilnica facuta de piata.

\[r_{detrend} = r_{normal} - n \cdot \bar r_{mkt}\]

 

Unde \(r_{detrend}\) e profitul facut de tranzactie pe datele modificate (detrended), \(r_{normal}\) e procentul facut de strategie pe datele nemodificate, \(n\) e numarul de zile pentru care tranzactia a fost deschisa, iar \(\bar r_{mkt}\) e miscarea zilnica facuta de piata.

 

Sa zicem ca piata face o miscare medie de 2% pe zi. Daca intr-o zi piata s-a miscat 3% si noi am stat long intocmai o zi, procentul nostru detrended pentru tranzactia respectiva va fi \(r_{detrend} = 3\% - 1 \cdot 2\% = 1\%\). Daca intr-o zi piata s-a miscat -3% iar noi am stat short intocmai o zi si am prins cei 3% pe datele obisnuite, profitul nostru detrended pentru tranzactia respectiva va fi \(r_{detrended} = -(-3\% - 1 \cdot 2\%) = 5\%\).

 

Metoda penalizeaza tranzactiile ce au mers intocmai cu trendul spre a scoate efectul bias-ului strategiei noastre. Profiturile short sunt insa amplificate. Pare un pic contraintuitiv la inceput. Adica de ce sa imi taxez tranzactiile long intr-un trend long? Pai trebuiesc taxate pentru ca o strategie random care ar fi avut acelasi procentaj de tranzactii long ca strategia noastra nu ar fi scos doar 0% ci ar fi facut profit - asa random cum este, dar profit. Trebuie sa luam deci acest lucru in considerare pentru ca pe noi ne intereseaza sa batem profitul unei strategii random. Facand detrending strategiei noastre facem in acelasi timp si detrending strategiei random. Adica daca inainte de detrending strategia noastra a scos 4% pe zi iar randomul 1.2%, dupa detrending strategia noastra va scoate 2.8% pe zi iar randomul 0%. Astfel putem testa cat de relevante sunt rezultatele noastre in comparatie cu zero.

 

Evaluarea rezultatelor

 

Dupa ce am facut detrending si am calculat datele de mai sus putem sa testam daca rezultatele noastre sunt in tradevar semnificative. Prin semnificative ne referim la niste rezultate atat de diferite de zero incat probabilitatea ca ele sa fi fost obtinute la noroc sa fie foarte mica. In acest sens avem doua optiuni:

 

1. t-test

2. bootstrapping

 

In prima metoda presupunem o distributie parametrica a mediei profitului obtinut zilnic de strategie iar in a doua generam noi o distrubtie relevanta folosind un procedeu de resampling. Le vom discuta pe amandoua.

 

t-test

 

Un t-test este un test de locatie. Testul masoara la cate deviatii standard de zero se afla media calculata presupunand ca distributia mediilor este una de tipul Student's t distribution cu n-1 degrees of freedom unde n este numarul de observatii. Daca media calculata este destul de departe de media zero concludem ca profiturile obtinute sunt relevante din punct de vedere statistic.

 

Acest "destul de departe" este un paramentru pe care fiecare este liber sa si-l aleaga. Valori folosite des sunt 1% si 5%. Pentru ca profiturile sa fie semnificative la nivelul de 1% e nevoie ca mai putin de unul la suta din observatiile descrise de distributia lui t sa fie mai mari decat scorul t al mediei noastre de profit.

 

Scorul t al strategiei noastre este dat de formula 

 

\[t = \frac{\bar X - \mu}{s/\sqrt n} \]

 

unde \(\bar X\) este media zilnica de profit a strategiei, \(\mu\) este media pe care vrem sa o batem, in cazul nostru zero, \(s = \sqrt{\frac{\sum_i^n(X_i - \bar X)}{n-1}}\) este sample standard deviation al profiturilor noastre iar \(n\) numarul de observatii (zile, tranzactii, etc, in functie de cum calculam). Astea le puteti calcula si in excel. Aveti acolo =AVERAGE() si =STDEV.

 

Sa luam exemplul unei strategii care am testat-o rapid pe 136 zile de EURUSD. Strategia a facut 0.24% pe zi cu un sample standard deviation de 1.8%. Scorul t ar fi

 

\[t = \frac{0.24\% - 0}{1.8\%/\sqrt{136}} = 1.56 \]

 

Pe graficul distributiei lui t, scorul calculat de noi e reprezentat de linia rosie. Pentru a fi putut declara ca strategia produce intradevar profituri semnificative ar fi trebuit ca linia rosie sa fie la dreapta liniei albastre. Cum nu este nu putem respinge ipoteza ca strategia noastra face profit la noroc.

 

post-3657-0-00501000-1375979867_thumb.png

 

Fiecare t-statistic are o valoare \(p\) asociata. Valoarea lui p reprezinta aria de sub linia neagra de la linia rosie la dreapta. Aceasta valoare se poate gasi pentru fiecare t in tabelele distributiei lui t. Gasiti de asemena calculatoare online. Gasiti un astfel de calculator AICI. Bagati in calculator ce t ati obtinut dupa fomula de mai sus si numarul de n-1 observatii si vedeti care-i valoarea lui p. Daca aceasta valoare p este mai mica ca 0.01 (1%) atunci profiturile sunt relevante.

 

In cazul nostru, pentru t = 1.56 si degrees of freedom = 135, valoarea lui p e 0.06055 ceea ce ne indica ca rezultatele nu sunt relevante. Mai simpla decat calcularea lui p este pur si simplu compararea scorului t obtinut cu 2.3 (valoarea aproximativa a lui t pentru nivelul cheie de 1% atunci cand n este destul de mare n>100). Daca scorul obtinut de noi este mai mare ca 2.3 atunci profiturile strategiei probabil ca nu sunt obtinute la noroc.

 

Bootstrapping

 

In loc sa presupunem aceasta distributie t putem sa ne facem singuri o distributie folosind sample-ul de profituri daily care il avem. Asa arata procentele zilnice ale strategie discutate in exemplul de mai sus

 

post-3657-0-78842800-1375979857_thumb.png

 

Asta e un singur sample pentru care putem construi o singura medie. Pentru a putea construi o distributie a mediilor avem nevoie de mai multe samples. Cum nu avem de unde sa luam altele, o folosim pe cea de mai sus, si prin bootstrapping generam atatea sample-uri cate avem nevoie.

 

Ca sa intelegeti cum functioneaza bootstrapping-ul imaginativa ca avem 50 de bile puse intr-o ordine aleatorie si numerotate cu cifre alese la nimereala intre 1 si 1000. Adica ceva de genul 1,20,900,13, 86,22,180,760 si tot asa pana la a 50-a bila. Seria asta e practic un sample cu o medie \(x_1\). Bootrsapping-ul functioneaza in felul urmator:

 

1. Bagam toate bilele in sac si le amestecam bine.

2. Scoatem o bila, notam ce numar e pe ea si ii dam drumul inapoi in sac.

3. Continuam pasul 2 pana cand am extras 50 de bile si am notat 50 de numere. In momentul asta am obtinut practic inca un sample cu o medie \(x_2\)

4. Reluam pasii 1-3 de \(n\) ori. La sfarsit vom avea \(n\) samples si o colectie de medii \(x_1, x_2, x_3, ..., x_n\) Mediile astea impreuna vor forma o distributie pe care apoi o putem folosi pentru a calcula daca rezultatele noastre sunt relevante sau nu.

 

Hai sa aplicam pasii astia pe seria de venituri zilnice ale strategiei de mai sus intr-un limbaj de programare precum R. Pentru un sample de procente de profit daily ret[] de marime 136, putem genera un set ret.bootstrapped[] care contine mediile a 1000 de sample-uri obtinute prin bootrsapping in felul urmator:

for(i in 1:1000) {
    ret.bootstrapped[i] <- mean(ret[sample(136,136,replace=TRUE)])
}

ret[sample(136,136,replace=TRUE)] baga cele 136 de bile pe care sunt scrise profiturile noastre daily intr-un sac si dupa ce le amesteca bine scoate o bila din sac de 136 de ori spre a genera un nou sample. mean() ne ofera apoi media. Toate astea le salvam in ret.bootstrapped[] pe care apoi il putem desena in felul urmator:

 

post-3657-0-90844200-1375979834_thumb.png

 

In loc sa folosim deci distributia aia a lui t de care vorbeam mai sus folosim distributia asta. Inainte insa de a o folosi trebuie sa o centram pe zero. Calculam media distributiei de mai sus, o scadem apoi din toate valorile distributiei, si dupa ce avem o distributie centrata pe zero, trasam o linie pe verticala acolo unde se afla media noastra de venituri daily. Graficul arata cam asa:

 

post-3657-0-62520400-1375979847_thumb.png

 

Valoarea lui p-value este egala cu numarul de observatii la dreapta liniei verticala supra numarul total de observatii. Observatii in ret.boostrapped[] mai mari ca media zilnica de profit de 0.24% sunt vreo 73 (la dreapta liniei negre). Asta ne da un \(p = 73/1000 = 0.07\). Cum \(p > 0.01\) tragem concluzia ca rezultatele noastre nu sunt relevante.

Editat de Criodi
Link spre comentariu
Distribuie pe alte site-uri

  • Moderators

Data snooping

 

Atunci cand cautam o strategie profitabila sau cand optimizam o anumita strategie pentru anumiti parametri ne expunem intotdeauna riscului de a gasi o strategie profitabila pur si simplu la noroc. Daca rulezi un numar suficient de modele pe un grafic vei gasi in cele din urma un model care prezice graficul pur si simplu la noroc.

 

In postul anterior am testat o strategie individuala pentru un p-value de 0.01. Cum am gasit un p-value de 0.06 si 0.073 am tras concluzia ca profitul obtinut de strategie a fost la noroc. Daca am fi gasit un p-value de 0.005 am fi tras concluzia ca strategia este profitabila si ar fi fost ok caci strategia noastra era singura testata pe acea perioada de timp. Era un out-of-sample testing.

 

Daca am fi rulat insa mai multe strategii pe acelasi sample si am fi gasit-o pe asta cu un p value de 0.005 nu ar mai fi fost corect sa tragem concluzia ca profitul este intradevar relevant. Acel procent de 0.01 trebuie ajustat pentru fiecare strategie testata atunci cand testam mai multe strategii deodata.

 

Sa zicem de exemplu ca rulam 20 de strategii pe aceasi bucata de isoric si incercam sa gasim una care merge. Ne intereseaza un p-value mai mic de 0.01. In aceste conditii probabilitatea ca una dintre strategii sa fie declarata profitabila din punct de vedere statistic desi NU este cu adevarat profitabila este:

 

P(macar o strategie profitabila) = 1 - P(nicio strategie profitabila)

 

P(macar o strategie profitabila) = \(1 - (1-0.01)^{20} = 0.182\)

 

Adica exita o probabilitate de 18.2% sa acceptam o strategie ca avand profituri relevante din punct de vedere statistic desi strategia a facut profiturile pur si simplu la noroc. Pentru a reduce aceasta eroare cumulativa la procentul de 1% dorit avem nevoie ca valoarea fiecarui p-value individual sa fie comparata nu cu 0.01 ci cu o cifra mai mica. Pentru a determina cat de mica avem cateva metode:

 

Metoda Bonferroni

 

Asta e cea mai simpla corectie care o putem aplica. Sa zicem ca testam n strategii pe aceasi perioada din istoric. Pentru fiecare strategie calculam un p-value, \(p_1, p_2, ..., p_n\). Daca ne intereseaza un procent de incredere \(\alpha = 0.01\) atunci vom declara fiecare strategie individuala ca avand profituri semnificative numai daca 

 

\[ p_i < \frac{\alpha}{n}\]

 

Adica nu mai comparam p cu 0.01 asa cum faceam in postarea anterioara ci cu 0.01/20. Asta face ca probabilitatea de a accepta o strategie ca fiind profitabila desi nu este sa scada la doritul nostru 0.01. Adica in loc de P(macar o strategie profitabila) = 0.182 vom avea P(macar o strategie profitabila) = 0.01

 

Metoda asta e usor de aplicat insa atunci cand testam foarte multe strategii \(\alpha/n\) devine foarte mic si vom ajunge sa respingem o gramada de strategii ca fiind neprofitabile desi ele defapt sunt profitabile (ii zice eroare de tip II).

 

Metoda Benjamini-Hochmerg

 

Metoda asta este mai dinamica decat metoda Bonferroni si reduce numarul de erori de tip II. Procedura functioneaza in felul urmator:

 

Sa zicem ca din nou testam n strategii si calculam n valori \(p\), cate una pentru fiecare strategie, \(p_1, p_2, p_3, ..., p_n\). Sa zicem ca ne intereseaza un nivel de relevanta \(\alpha\) (acel 0.01 de care am tot vorbit).

 

1. Aseaza in ordine ascendenta valorile lui \(p\)

2. Atribuiei fiecarei valori \(p\) un rank \(k\). Cel mai mic \(p\) va primi un \(k = 1\) iar cel mai mare \(p\) un \(k = n\). Adica daca \(p_{20}\) e cel mai mic, atunci \(k = 1\). Daca \(p_{84}\) urmeaza dupaia ii dam \(k = 2\) si tot asa pana la \(n\).

3. Tragem concluzia ca strategiile sunt profitabile numai pentru acele valori la lui p unde

 

\[p(k) < \frac{\alpha}{n+k+1}\]

 

Din nou aceasta ajustare mentine nivelul cumulativ de erori de tip I (declaram ca o strategie e profitabila desi nu e) la 0.01 iar fiecare p-value este comparat cu o cifra mai dinamica ceea ce reduce si nivelul de erori de tip II.

 

O metoda mai complicata si mai interesanta este White's reality check insa aia ramane tema pentru acasa pentru cine chiar este interesant. Sunt ceva research papers care folosesc acest test intocmai pentru a vedea cat din profiturile strategiilor tehnice e pe bune si cat e doar datorat data snooping. Dupa ce li se aplica White's reality check nu mai ramane cam nicio strategie tehnica in picioare. Un alte element interesant in astfel de teste e ca pe masura ce trece timpul din ce in ce mai putine strategii merg. Piata devine mai eficienta in timp. Ce mergea acu 30 de ani (clasica analiza tehnica) nu mai merge astazi.

 

Recomand Evidence Based Technical Analysis carte din care de altfel e luat cam tot ce am scris aici si pe care asa cum am mai facut-o prin alte postari o recomand cu avertizarea de rigoare ca daca nu ati incercat niciodata sa cuantificati rezultatele unei analize tehnice s-ar putea sa nu va placa absolut de loc. A se vedea review-urile de o stea de pe amazon scrise in ALL CAPS LOCK.

 

PS: strategia de pe EURUSD care am folosit-o in exemplele de mai sus a scos un profit total de 30% in vreo 6 luni cu drawdown de 25% fara sa treaca vreodata pe minus. Astfel de rezultate ar putea parea impresionante la prima vedere testul nostru riguros ne-a aratat ca nu e deloc asa - ceea ce e si corect caci rezultatele strategiei erau pur si simplu random   ;) E adevarat ca nu le-am facut detrending caci ar fi disparut profitul. Am lasat rezultatele asa cum era tocmai pentru a scoate in evidenta cat de usor pot aparentele sa insele.

Editat de Criodi
Link spre comentariu
Distribuie pe alte site-uri

  • Moderators

Rezumat si aplicatie practica

Hai sa luam un exemplu pas cu pas in care aplicam tot ceea ce am scris mai sus. Calculele statistice sunt facute in R. In afara de bootstrapping insa puteti executa totul in excel.

1. Ne asiguram ca nu comitem vreo eroare din prima postare

2. Calculam rezultele strategiei noastre.

Am testat o strategie pe eurusd pe o perioada de 136 de zile. Asa procentele zilnice facute de strategia noastra:

Offtopic
[1] 0.0035117440 0.0048033670 0.0082018190 0.0102737470 0.0031753530 [6] -0.0049670890 0.0035399960 0.0063966580 -0.0036729220 0.0168887580 [11] 0.0011788070 -0.0001532260 0.0027020270 -0.0048121250 0.0014140480 [16] 0.0035726780 -0.0008514710 0.0025160090 0.0052888100 0.0018049230 [21] 0.0009973400 0.0102631810 0.0045382380 0.0027457620 -0.0040516450 [26] 0.0010549960 0.0052165430 -0.0027220850 -0.0018994870 0.0057332940 [31] 0.0011369420 -0.0020648190 0.0027057350 0.0024206540 -0.0146472000 [36] -0.0044711830 -0.0075324700 0.0034852420 0.0069385220 0.0107017750 [41] -0.0008150830 0.0052985480 -0.0000536509 0.0061235440 0.0008096790 [46] 0.0037446260 0.0022815160 -0.0021239490 0.0031150230 0.0041275590 [51] 0.0021462060 0.0024287100 0.0010759510 0.0087021210 0.0013443750 [56] -0.0051631410 0.0063698200 -0.0008847630 -0.0041480880 0.0017947210 [61] -0.0001235520 0.0080704950 0.0050640090 0.0040399420 0.0032680240 [66] 0.0027412410 0.0055823570 -0.0010549740 -0.0030063830 0.0002164940 [71] -0.0026050930 0.0046270100 0.0004397400 -0.0011114110 -0.0086616550 [76] 0.0026890100 0.0014145600 -0.0033558090 -0.0018871470 -0.0029184480 [81] -0.0000314730 0.0003934250 -0.0024087090 0.0035886760 -0.0030359460 [86] 0.0055880830 -0.0002965830 0.0009519050 0.0041703690 0.0069942010 [91] -0.0000462528 -0.0022819080 0.0007726780 0.0020305740 0.0004700150 [96] 0.0052370540 -0.0031565080 0.0020009780 -0.0076985480 0.0031773450[101] 0.0011295410 0.0049921950 0.0052672860 -0.0002600720 0.0065459940[106] 0.0000683771 0.0049304120 -0.0001587530 0.0013458340 -0.0043341040[111] -0.0000455014 0.0027072120 0.0009604690 0.0015866540 -0.0013848530[116] -0.0008411580 0.0103830110 0.0014714790 -0.0036885970 -0.0026685980[121] -0.0012996450 -0.0158992610 0.0052971850 0.0029456960 -0.0057022000[126] -0.0011875680 0.0065243400 0.0042316490 -0.0005480970 0.0007061560[131] 0.0003002800 0.0044454790 0.0064443300 -0.0006091080 0.0026757640[136] 0.0056189350


Puse pe un chart arata asa:

post-3657-0-82094500-1376035685_thumb.png

In aceasi perioada astea sunt miscarile facute de eurusd:

Offtopic
[1] -0.0035117440 -0.0048033670 0.0082018190 0.0102737470 0.0031753530 [6] -0.0049670890 0.0035399960 -0.0063966580 -0.0036729220 0.0168887580 [11] 0.0011788070 -0.0001532260 -0.0027020270 -0.0048121250 -0.0014140480 [16] 0.0035726780 -0.0008514710 -0.0025160090 0.0052888100 -0.0018049230 [21] 0.0009973400 0.0102631810 0.0045382380 0.0027457620 -0.0040516450 [26] -0.0010549960 0.0052165430 -0.0027220850 -0.0018994870 0.0057332940 [31] 0.0011369420 -0.0020648190 0.0027057350 0.0024206540 0.0146472000 [36] -0.0044711830 0.0075324700 0.0034852420 0.0069385220 0.0107017750 [41] -0.0008150830 -0.0052985480 0.0000536509 -0.0061235440 0.0008096790 [46] -0.0037446260 -0.0022815160 -0.0021239490 0.0031150230 -0.0041275590 [51] 0.0021462060 0.0024287100 -0.0010759510 0.0087021210 0.0013443750 [56] -0.0051631410 -0.0063698200 -0.0008847630 0.0041480880 0.0017947210 [61] -0.0001235520 0.0080704950 0.0050640090 -0.0040399420 -0.0032680240 [66] 0.0027412410 -0.0055823570 -0.0010549740 -0.0030063830 0.0002164940 [71] -0.0026050930 0.0046270100 -0.0004397400 -0.0011114110 -0.0086616550 [76] -0.0026890100 0.0014145600 -0.0033558090 -0.0018871470 -0.0029184480 [81] -0.0000314730 -0.0003934250 0.0024087090 0.0035886760 -0.0030359460 [86] 0.0055880830 0.0002965830 0.0009519050 0.0041703690 0.0069942010 [91] -0.0000462528 -0.0022819080 0.0007726780 0.0020305740 0.0004700150 [96] 0.0052370540 0.0031565080 -0.0020009780 -0.0076985480 -0.0031773450[101] 0.0011295410 0.0049921950 0.0052672860 0.0002600720 0.0065459940[106] 0.0000683771 0.0049304120 -0.0001587530 0.0013458340 -0.0043341040[111] 0.0000455014 0.0027072120 0.0009604690 -0.0015866540 -0.0013848530[116] -0.0008411580 -0.0103830110 0.0014714790 0.0036885970 -0.0026685980[121] -0.0012996450 0.0158992610 0.0052971850 0.0029456960 -0.0057022000[126] -0.0011875680 0.0065243400 -0.0042316490 -0.0005480970 0.0007061560[131] -0.0003002800 0.0044454790 0.0064443300 -0.0006091080 0.0026757640[136] 0.0056189350


Puse pe-un grafic rezultatele arata asa:

post-3657-0-88521000-1376030086_thumb.png

Luam rezultatele strategiei si calculam media si standard deviation-ul.
> mean(strategy) #strategy contine datele de mai sus. mean() ne da media[1] 0.001392158> sd(strategy) #standard deviation[1] 0.004508086
In excel puteti folosi =AVERAGE() si =STDEV().

Luam rezultatele EURUSD si calculam cat s-a miscat perechea in medie pe zi.
> mean(eurusd) #eurusd contine miscarile zilnice eurusd aratate mai sus[1] 0.0008159654
3. Facem detrending

Fiindca nu am testat decat o singura pereche e de ajuns sa folosim metoda benchmarking asa cum este descrisa in a doua postare.

Strategia noastra a avut 98 de tranzactii long (72%) si 38 de tranzactii short(28%). O strategie random cu acelasi bias ar fi produs in medie

\[E(r_{rndm}) = 0.72 \cdot 0.000816 - 0.28 \cdot 0.000816 = 0.00036\]

Profitul in plus scos de strategia noastra fata de strategia random este

\[\bar r_{exces} = \bar r_{normal} - E(r_{rndm}) = 0.00139 - 0.00036 = 0.00103\]

4. Evaluam rezultatele

Metoda I. t-test

Scorul t al strategiei noastre este

\[ t = \frac{r_{excess} - \mu}{s/\sqrt n} = \frac{0.00103 - 0}{0.0045/\sqrt 136} = 2.66\]

Valoarea p pentru \(t = 2.66\) si \(n-1 = 135\) este data de
> pt(-abs(t),df=135)[1] 0.0048
In excel se poate calcula folosind functia =TDIST(). In cazul asta =TDIST(2.66, 135, 1). Ori puteti merge aici si pune 135 si 2.66 in calculator. Cum

\[ p = 0.0048 < 0.01 \]

retzulta ca profiturile obtinute de strategia noastra sunt relevante la un nivel semnificativ de 1%.

Metoda II. bootstapping

Se ia seria de profituri zilnice in excess ale strategiei, se face resampling, si apoi se folosesc rezultatele pentru a calcula relevanta strategiei noastre. In R:
#calculam profitul ce-ar fi putut fi obtinut random > rand.ret <- 0.72 * mean(eurusd) - 0.28 * mean(eurusd)#ajustam profitul mediu zilnic al tranzactiei (calculam profitul in excess)> strategy.excess <- strategy - rand.retstrategy.bootstrap <- numeric(10000)> for(i in 1:10000){ #facem resampling de 10000 ori strategy.bootstrap[i] <- mean(strategy.excess[sample(136,136,replace=TRUE)]) }> plot(density(strategy.bootstrap))
Ne iese graficul asta:

post-3657-0-56568800-1376038580_thumb.png

Pentru a putea testa valoarea mediei noastre zilnice de profit trebuie sa centram distributia pe zero (ne intereseaza ca profitul nostru sa fie destul de diferit de zero).
#centram distributia de mai sus pe zero> strategy.bootstrap.zero <- strategy.bootstrap - mean(strategy.bootstrap)#desenam distributia> plot(density(strategy.bootstrap.zero))#si o linie verticala acolo unde este media profiturlor noastre in excess> abline(v=mean(strategy.excess))
Ne da graficul asta unde linia verticala reprezinta profitul in excess obtinut de strategia noastra.

post-3657-0-25424000-1376039037_thumb.png
#numarul de valori aflate la dreapta liniei verticale> length(which(strategy.bootstrap.zero > mean(strategy.excess)))[1] 40
Cum numarul total de observatii este 10000 rezulta ca

\[ p = \frac{40}{10000} = 0.004 < 0.01 \]

Testul bootstrap ne confirma de asemena rezultatele.

5. Analizam daca am facut data-snooping sau nu

Daca rezultatele au fost obtinute in timp real sau pe un out-of-optimization-sample si nici nu am facut alte erori din alea explicate in prima postare atunci stam bine. Daca strategia noastra insa a fost obtinuta dupa ce am testat 1000 de strategii trebuie sa ne ajustam testul de mai sus dupa metodele descrise in postarea numarul trei. Adica nu mai comparam p cu 0.01 ci cu ceva mai mic in functie de ce metoda de minimizare a data snopping-ului folosim. Vedeti si xkcd daca tot nu vati prins ce e ala data snooping.

Rezultatul de mai sus de exemplu este obtinut pe baza de data snooping. Am rulat vreo 1000 de strategii random pana cand am gasit una care a mers chiar bine. Daca as ajusta p-ul pentru data snooping nu cred ca strategia ar mai fi relevanta. Daca cumva ar scapa si de un test pentru data snooping tot ar trebui apoi sa o rulez pe un out-of-sample test. Ar trebui sa fiu al naibii de ghinionist sa rulez toate testele astea si tot sa imi iau teapa cu strategia pe real. Uite cum arata graficul equity pornind de la un 10k cu leverage 1:1.

post-3657-0-63927800-1376043223_thumb.png

Daca rulati nshpee mi de strategii in backtesting pana cand gasiti una care merge s-ar putea sa vedeti asa un grafic. Daca nu faceti apoi testele relevante si o puneti pe real s-ar putea sa fiti dezamagiti tare de rezultate. Beleaua e ca acelasi fenomen se intampla si pe real daca urmarim foarte multi traderi in acelasi timp. Unii dintre ei vor face profit pur si simplu la noroc.

Fenomenul asta il exploateaza unii manageri de fonduri mai tepari. Isi deschid nshpe mii de fonduri cu bani putini in fiecare, le ruleaza pe fiecare separat o perioada de timp, si apoi le inchid pe alea care nu merg si le pastreaza pe alea bune. Apoi isi fac reclama agresiva tare la investiori, aduna fonduri, incaseaza un comision baban de administrare si apoi, de-o fi profit de n-o fi, dumnezeu cu mila, ca doar nu-s banii lor. Editat de Criodi
Link spre comentariu
Distribuie pe alte site-uri

  • 2 săptămâni mai târziu...
  • Moderators

Uite un exemplu simplu. Prima serie are trend. A doua nu are.

 

post-3657-0-67244700-1376837734_thumb.png

 

Cea mai simpla metoda de a determina un trend e faci un linear regression simplu. Daca linia merge in sus, ai trend pozitiv. Daca linia merge in jos, ai trend negativ. Daca linia este perfect orizontala, nu ai trend. Poti sa faci detrending unei serii de date masurand diferenta intre valorile observate si linia dreapta. Asta am facut de exemplu in poza de mai sus. A doua serie este prima serie minus trend.

 

Un alt mod de a te uita la trend e sa masori schimbarea procentuala de la o observatie la alta. Uite cum arata un grafic al unor astfel de schimbari:

 

post-3657-0-77347600-1376838060_thumb.png

 

Daca media unor astfel de observatii este zero atunci nu ai niciun fel de trend. Daca media este usor pozitiva sau negativa atunci ai trend intr-o directie sau alta. Histograma de mai sus pare a avea medie zero dar defapt are un mic trend pozitiv. Smecheria insa e ca si datele random care defapt nu au trend pot arata trend pe o perioada sau alta. Histograma de mai sus e defapt random, iar media reala este zero. In sensul asta insa poti stabili intervale de incredere si stabili mai apoi daca exista sau nu trend in functie de unde se afla media calculata de tine in raport cu intervalul de incredere. Poti face un t-test similar celui din primele postari. Pentru alte cateva idei vezi http://en.wikipedia.org/wiki/Trend_estimation

 

In practica ideea de trend apare atunci cand iti evaluezi strategia. Am discutat in primele postari despre chestiile astea. Ideea e ca pe niste serii de date cu trend o strategie random cu bias in directia trendului nu va face zero ci ceva pozitiv. Ca sa normalizezi calculele trebuie sa faci detrending pe date atunci cand iti masori performanta. Ma rog, vezi primele postari pentru asta, sau cartea catre care am dat link.

Editat de Criodi
Link spre comentariu
Distribuie pe alte site-uri

In zona ta de range, eu vad numai trenduri. 

 

post-3825-0-95066100-1376852166_thumb.png

 

 

Am ajuns la concluzia ca nu exista o definitie absoluta a trendului, cu alte cuvinte nimeni nu are dreptate cand spune "Asta e trendul" . Definitia clasica a trendului HH+HL si LH+LL se aplica in orice moment, in orice secunda. Si cand stai pe WC si citesti ultima stire despre Bianca Dragusanu, exista trend. De fapt ce e trendul ?  Eu cred ca trendul este o miscare. Eu cred ca piata e compusa numai din miscari, ZIG si ZAG . Daca nu ar fi ZIG si ZAG nu ar exista miscarea si implicit trendul. Ceea ce vedem pe grafic e trend pur. E numai Zig si Zag . Cred ca e gresita teoria conform careia avem range. Cred ca range e de fapt altceva. Simt ca e altceva dar inca nu pot sa formulez enuntul. Range nu inseamna nehotarare. Range la Daily ? Mergi la 1h sa vezi trend frumos, buy si sell . Nup, nu mai inghit gogoasa cu "Range-ul" . 

Editat de Apollo
Link spre comentariu
Distribuie pe alte site-uri

Histograma de mai sus pare a avea medie zero dar defapt are un mic trend pozitiv

 

Tehnic vorbind imaginea ta nu e o histograma. Cel putin nu in sensul uzual al termenului. Aia ar arata ca mai jos. A se observa ca return-urile (schimbarile procentuale cum le-ai spus tu) sunt grupate dupa marime:

 

http://ftcone.alchemytechnolog.netdna-cdn.com/education/wp-content/uploads/2011/09/mc4.png

 

Cat despre trend, eu sunt oarecum de acord cu Apollo. Despre EUR/USD poti spune ca din 2009 incoace nu a avut trend (se invarte in jurul lui 1.3). Sau poti spune ca a avut multiple trenduri, masurate pe diverse TF-uri sau alte metodologii (directional changes).

 

BTW, R-ul e quite awesome. Acum 2 ani l-am combinat cu Python-ul intr-o singura interfata. Astfel puteam usor incarca in R tick-urile mele din data-store-ul meu (scris in Python), le procesam in R, apoi le afisam in chart-display-ul meu facut tot in (Iron)Python. Asta pt ca R-ul nu prea face fata la afisarea si scrollarea in real-time prin timeseries cu milioane de puncte.

 

Ma bucur sa vad ca nu sunt singurul care incearca o abordare stiintifica a problemei.

 

veloce_r_session.png

 

veloce_r.png
Link spre comentariu
Distribuie pe alte site-uri

Criodi

 

Metodele acestea, le-ai invatat la facultate sau se regasesc in carti de profil, daca raspunsul este varianta a doua - as dori si eu cateva titluri? Multam anticipat.

 

gigi

 

Programul folosit este varianta poloneza, caci asta am gasit printre primele rezultate, cand am cautat pe Google? Acel Veloce avand logo asemanator cu cel de la Nike, ca un V, mai mult...

 

Apollo

 

Oricat de mult ai fi in dezacord cu cei doi te rog frumos sa ii lasi sa isi expuna cunostiintele fiindca lucrurile acestea, prezentate de ei, s-ar putea sa fie cele mai valoroase lucruri scrise pe forumul Vamist si nu cred ca abordeaza foarte multi problema in acest mod si eventual deschide un topic separat sau ceva.

 

 

Va multumesc amandurora Criodi si gigi fiindca impartasiti asemenea informatii valoroase pe forum.

Editat de dirzuandreiovidiu
Link spre comentariu
Distribuie pe alte site-uri

gigi

 

Programul folosit este varianta poloneza, caci asta am gasit printre primele rezultate, cand am cautat pe Google? Acel Veloce avand logo asemanator cu cel de la Nike, ca un V, mai mult...

 

Programul acela e scris de mine. Uite o varianta mai veche a lui, cand inca lucram cu candele. Punctul de pe wick arata ce a fost intai, minimul sau maximul din acea candela. Eu am informatia asta, pt ca le construiesc direct din tick-uri:

 

eur_usd_2010_03_18.png

 

Motivul pt care am renuntat la candele a fost printre altele cand am vazut ca depind de timezone-ul broker-ului (ie: la ce ora exacta cand incepe un D1?)

 

Asta poate fi vazut foarte usor in urmatorul gif animat. Timezone-ul se vede in status-bar.

 

https://dl.dropboxusercontent.com/u/190212/ff/timezone.gif

 

Si o varianta mai recenta, dupa ce am renuntat la candele. Seamana, dar nu e acelasi lucru cu line-chart-ul din MT4. Asta pt ca la mine minimele si maximele sunt pastrate si desenate.

 

Linia albastra e pretul, linia rosie e un EMA, linia roz e pozitionarea retail-ului FXCM (SSI), linia verde e recomandarea BULLISH/NEUTRAL/BEARISH din acel moment a UBS-ului.

 

veloce_charting.png

Editat de gigi
Link spre comentariu
Distribuie pe alte site-uri

Alătură-te conversației

Poți posta acum și să te înregistrezi mai târziu. Dacă ai un cont, autentifică-te acum pentru a posta cu contul tău.

Vizitator
Răspunde la acest subiect...

×   Alipit ca text avansat.   Alipește ca text simplu

  Doar 75 emoji sunt permise.

×   Linkul tău a fost încorporat automat.   Afișează ca link în schimb

×   Conținutul tău precedent a fost resetat.   Curăță editor

×   Nu poți lipi imagini direct. Încarcă sau inserează imagini din URL.

  • Navigare recentă   0 membri

    • Nici un utilizator înregistrat nu vede această pagină.
×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.