ABONAMENTE VIDEO REDACȚIA
RO
EN
NOU
Numărul 150
Numărul 149 Numărul 148 Numărul 147 Numărul 146 Numărul 145 Numărul 144 Numărul 143 Numărul 142 Numărul 141 Numărul 140 Numărul 139 Numărul 138 Numărul 137 Numărul 136 Numărul 135 Numărul 134 Numărul 133 Numărul 132 Numărul 131 Numărul 130 Numărul 129 Numărul 128 Numărul 127 Numărul 126 Numărul 125 Numărul 124 Numărul 123 Numărul 122 Numărul 121 Numărul 120 Numărul 119 Numărul 118 Numărul 117 Numărul 116 Numărul 115 Numărul 114 Numărul 113 Numărul 112 Numărul 111 Numărul 110 Numărul 109 Numărul 108 Numărul 107 Numărul 106 Numărul 105 Numărul 104 Numărul 103 Numărul 102 Numărul 101 Numărul 100 Numărul 99 Numărul 98 Numărul 97 Numărul 96 Numărul 95 Numărul 94 Numărul 93 Numărul 92 Numărul 91 Numărul 90 Numărul 89 Numărul 88 Numărul 87 Numărul 86 Numărul 85 Numărul 84 Numărul 83 Numărul 82 Numărul 81 Numărul 80 Numărul 79 Numărul 78 Numărul 77 Numărul 76 Numărul 75 Numărul 74 Numărul 73 Numărul 72 Numărul 71 Numărul 70 Numărul 69 Numărul 68 Numărul 67 Numărul 66 Numărul 65 Numărul 64 Numărul 63 Numărul 62 Numărul 61 Numărul 60 Numărul 59 Numărul 58 Numărul 57 Numărul 56 Numărul 55 Numărul 54 Numărul 53 Numărul 52 Numărul 51 Numărul 50 Numărul 49 Numărul 48 Numărul 47 Numărul 46 Numărul 45 Numărul 44 Numărul 43 Numărul 42 Numărul 41 Numărul 40 Numărul 39 Numărul 38 Numărul 37 Numărul 36 Numărul 35 Numărul 34 Numărul 33 Numărul 32 Numărul 31 Numărul 30 Numărul 29 Numărul 28 Numărul 27 Numărul 26 Numărul 25 Numărul 24 Numărul 23 Numărul 22 Numărul 21 Numărul 20 Numărul 19 Numărul 18 Numărul 17 Numărul 16 Numărul 15 Numărul 14 Numărul 13 Numărul 12 Numărul 11 Numărul 10 Numărul 9 Numărul 8 Numărul 7 Numărul 6 Numărul 5 Numărul 4 Numărul 3 Numărul 2 Numărul 1
×
▼ LISTĂ EDIȚII ▼
Numărul 62
Abonament PDF

Algorithmic Trading și Machine Learning. O vedere de ansamblu (II)

Ioan Moldovan
Software Engineer @ TORA



PROGRAMARE

Partea I-a articolului

Algoritmii folosiți cel mai des în sistemele de trading sunt cei de regresie (logistică pentru clasificare de uptick / downtick, least squares, local curve fitting, robust regressions sau, când există constrângeri legate de viteză, algoritmi de online regression, KWIK sau Locally weighted projection). În comunitatea machine learning există o oarecare reticență în a folosi metode "clasice" precum regresia liniară, fiind privită ca "elementară", însă este o unealtă foarte importantă și cu potențial foarte mare.

Una din obiecțiile aduse folosirii acestei regresii este că nu detectează decât combinații liniare ale datelor de intrare, însă adăugând metrici derivate din înmulțiri între features, ridicări la putere sau aplicarea de funcții periodice sau de altă natură, pot fi detectate interacțiuni între variabilele de intrare sau se poate chiar face fitting la funcții complexe (de menționat că și rețelele neuronale au nevoie de cel puțin 2 nivele ascunse pentru a putea detecta interacțiuni între input features). Regresiile liniare nu doar că generează modele interpretabile ce explică datele (acesta fiind un lucru foarte important în momentul în care se iau decizii de a risca bani cu un anumit model), ci pot ajunge și la performanțe comparabile cu algoritmii "la modă". Aceasta însă cu prețul unui efort mai mare de analiză a distribuției variabilelor care intră în predictor, eventual transformarea lor, analiză de residuals și leverage, construire de extra-features, adică mai mult decât "dăm date algoritmului și așteptăm rezultatele magice". Evident, se recomandă utilizarea a tot ce e disponibil, atât a metodelor "tradiționale" cât și a algoritmilor nou apăruți, toate fiind doar unelte la dispoziția celor care fac trading automat. Indiferent de algoritmul folosit, se recomandă analizarea fiecărui feature, verificând histograma, Q-Q plots etc., iar dacă distribuția o necesită, transformarea prin logaritm sau alte funcții și apoi normalizarea prin rescaling sau standardizare.

Figura 3. Exemplu de regresie liniară și analiză de residuals

În cazul în care datele disponibile pentru analiză sunt puține, se recomandă regresii liniare și Decision Trees, forțând regularizarea lor prin limitarea adâncimii la un număr mic de nivele. Acești algoritmi se comportă de altfel bine și la tranzacționare, unde se mai pot folosi SVM-uri (eventual variante adaptative, Online Kernel SVM din Vowpal Wabbit sau StreamSVM), Naive Bayes, iar dacă milisecundele nu contează foarte mult și strategia are "holding period" (timp mediu pentru a păstra o poziție deschisă) mai mare se pot folosi k-Nearest Neighbor, Random Forests, Boosted Trees (XGBoost), Random Ferns etc. . Dacă datele sunt abundente sau se dorește descoperirea de features, se pot încerca și Neural Networks, asupra cărora vom reveni ulterior. Există o menajerie uriașă de algoritmi de machine learning și variante de rețele neuronale, prezentarea chiar și doar a celor mai folosite sau interesante într-un spațiu redus va fi o enumerare de cuvinte cheie și referințe de investigat de către cititor, dar ideea de la care trebuie să pornim e că toți algoritmii sunt simple "building blocks", la fel ca un hash table, un arbore de căutare sau ca algoritmii de sortare. Contextul problemei și natura datelor va determina care va fi mai eficient.

Dintre algoritmii care se pot folosi în timpul analizei primare, Random Forests (ori Weighted Subspace RF în cazul în care datele de intrare conțin foarte multe variabile) și Boosted Trees sunt printre cei care pot da foarte rapid o imagine "în mare" a predictibilității setului de date și duce la o decizie "fail fast". Pot fi priviți ca un fel de "instant coffee": foarte buni pentru abordarea în care "se aruncă date să vedem ce iese". Ambii algoritmi dau rezultate similare și foarte bune, necesitând puțin tuning comparat cu alți algoritmi, ambii sunt ansambluri de Decision Trees, diferența dintre cele două abordări fiind cum se construiește ansamblul și cum se face handling la trade-offul "bias vs. variance" inerent oricărui algoritm de predicție: Random Forests fac "bagging", se construiesc mulți DT complicați și independent antrenați pentru a avea bias scăzut și dispersie mare, reducându-se ulterior dispersia ansamblului, iar Boosted Trees fac "boosting", se construiesc mulți DT, deseori mai simpli, cu dispersie scăzută și bias ridicat, optimizând ansamblul prin reducerea biasului. Random Forests şi unele variante de Boosted Trees pot primi la intrare chiar date categoriale, se descurcă și când feature-urile nu sunt normalizate, fac subsampling și la nivel de features, și la nivel de training data, practic făcând transparent pentru noi feature selection și training data subsetting, iar ca bonus țin cont fără intervenția noastră de "class imbalances" (tratând ponderea diferită a claselor țintă în setul de date, care în cazul altor algoritmi poate crea probleme sau necesită specificarea unui cost matrix custom). Aplicând acești algoritmi (cu cross-validation și un minim de tuning), putem să ne facem o imagine despre predictibilitatea setului de date. Orice alt algoritm am aplica, creșterea în performanță va fi de obicei marginală, îmbunătățirile vin mai întotdeauna de la mai multe date sau mai multe features purtătoare de informație. În plus, ansamblurile de Decision Trees sunt interpretabile și pot fi "trimmed" în funcție de contribuția fiecărui DT individual.

În cazul în care algoritmii se centrează pe anomalii, se folosesc algoritmi de clustering și detectare de outliers, se pot folosi rețele neuronale recursive, Isolation Forests, sau se compară un trend temporal (rezultat al unei regresii sau al unui spline interpolation) și distribuția de returns cu șabloane de comportament predefinite. Compararea de distribuții se face folosind fie teste întâlnite și în științele sociale, precum Kolmogorov-Smirnov sau Anderson-Darling (mai sensibil la diferențe în tails), fie Maximum Mean Discrepancy (MMD), fie folosind metrici din teoria informației, precum Kullback-Leibler divergence (numită și Information Gain) sau, preferabil, fiind simetrică și întotdeauna definită, Jensen-Shannon divergence (JSD). De remarcat că information gain e întâlnită și la antrenarea de Decision Trees sau autoencoders, iar MMD și JSD sunt distanțe între distribuții, lucru care le face dezirabile în multe alte contexte.

Un alt set de algoritmi la care antrenarea și evaluarea sunt rapide și se pretează la online learning sunt Hidden Markov Models (OnlineHMM), Kalman Filters și Particle Filters (care nu au constrângerea de liniaritate a KF), și cu care se încearcă învățarea unui set de probabilități condiționale (via Expectancy Maximization sau MCMC) și a unor stări ascunse. În acest mod, pe baza stării curente, se produc probabilitățile de tranziție în starea următoare (în cazul HMM) sau o valoare "smoothed", așa-zis "reală", din care se exclude zgomotul mișcărilor care nu influențează direcția prețului. În practică, aceste metode nu sunt comune ca predictori, fiind folosite chiar mai rar decât modelarea timeseriesurilor prin tehnici "clasice" de genul ARIMA/GARCH, dar aplicându-le, putem construi un feature nou ce conține extra-informație, chiar dacă "estimată", care poate fi intrare pentru alți algoritmi de predicție.

Comparativ cu alți algoritmi amintiți, antrenarea Neural Networks este mai dificilă, rețelele necesitând volume de date mai mari pentru convergență. Alte probleme ale folosirii Neural Networks sunt, în ciuda disponibilității frameworkurilor ce mută ușor calculele pe GPU, timpii mai mari de antrenare, timpii mai mari de predicție și, mai ales, lipsa interpretabilității. E adevărat, există și rețele de tip autoencoders (de menționat Sparse Autoencoders și VAE) care pot fi folosite la descoperirea de structură în date, însă interpretarea e dificilă și în cazul lor. Principalul atribut al acestor autoencodere este reconstruirea inputului reducând dimensionalitatea, deci pot produce ieșiri "care seamană cu market activity", iar activările din hidden layer-ul latent ("din mijloc") ca "features" și folosite ca date de intrare în alți algoritmi sau rețele.

Ce tipuri de rețele se pretează atunci predicției? Rețelele clasice feed-forward ar fi primul lucru care ne vine în minte și sunt relativ rapid de antrenat chiar și pe multe date folosind algoritmi de gradient descent recenți, însă suferă de o limitare majoră prin faptul că pornesc doar de la starea curentă a sistemului (oarecum similar HMM-urilor, diferența majoră fiind că HMM-urile sunt modele generative, în timp ce rețelele neuronale sunt modele discriminative).

Al doilea tip de rețele ușor de antrenat și care ne-ar veni în minte sunt cele convoluționale, care prin natura lor fac o asumpție implicită de relație spațială în datele de intrare, însă ele nu păreau până de curând să se aplice prea bine datelor financiare. Există totuși încercări de combinare a unor layere de convoluție 1D și pooling în rețele mixte pentru downsampling inteligent și rezultate promițătoare chiar și în forecasting folosind arhitecturi recente cum ar fi WaveNet.

Al treilea tip de rețele ar fi cele recursive, a căror folosire este cumva "naturală" în cazul unui stream de date. Însă RNN-urile au o problemă majoră în faza de învățare din cauza "vanishing gradient problem", nereușind să detecteze dependințe temporale după câteva zeci de samples (în funcție de date). Soluția este folosirea rețelelor de tip Long Short-Term Memory networks (LSTM) sau Gated Recurrent Unit networks (GRU, teoretic un caz particular de LSTM), care introduc o arhitectură mai specială ce include (printre altele) un forget/ reset gate ce controlează ce informație din trecut este păstrată și afectează atât starea cât și ieșirea curentă. Aceste rețele au cunoscut o explozie în ultimii ani, depășind rezultatele "state of the art" în mai multe domenii, notorie fiind înlocuirea în toamna 2016 a Google Translate cu o rețea deep de tip LSTM care surclasează toate sistemele de traducere automată existente în prezent. Însă, în practică, și aceste rețele au dificultăți în a păstra dependințe față de evenimente care s-au întâmplat cu câteva sute de sample-uri mai devreme (bineînțeles, numărul depinde de date, de puterea semnalului și de inițializare). Rețelele de tip LSTM au un domeniu de aplicabilitate mult mai larg, dar se mai folosesc în special pentru Natural Language Processing, o utilizare comună fiind "sentiment analysis" pe rețele sociale și procesarea știrilor. Textul este transformat în reprezentări numerice (cu GloVe sau word2vec), iar ieșirea unei rețele LSTM aplicată pe date în timp real (de exemplu, tweets) este folosită ca intrare pentru algoritmul de trading.

În cele din urmă, mai menționăm Deep Belief Networks, până acum câțiva ani preferate pentru financial timeseries în fața altor tipuri de rețele, pretându-se atât la descoperirea de features cât și la predicție. Acestea însă nu au cunoscut explozia rețelelor de tip LSTM sau autoencoders și par a fi mai puţin folosite în prezent. Dar sunt şanse ca ele să revină în lumina reflectoarelor în urma studiilor recente care le combină cu tehnicile de reservoir computing.

De menționat că toate rețelele neuronale fac o asumpție implicită de ierarhizare a deciziei și a modului în care se construiesc feature-uri la nivele diferite de abstractizare, și rezultatele pot fi îmbunătățite adăugând legături și de la nivele mai puțin procesate către nivele superioare, construind o topologie care interconectează layere diferite între ele, pe modelul DenseNet. Însă prin aceasta interconectare crește numărul de parametri ai modelului și întotdeauna există un trade-off între această creștere și overfitting (cu cât numărul de parametri al unui algoritm este mai mare, cu atât e mai ușor să ajungem la overfitting și sunt necesare mai multe date pentru antrenament). Pentru evitarea acestui lucru este importantă folosirea unor metode de regularizare, tehnicile de Dropout și DropConnect fiind dintre cele mai de succes: excluderea aleatorie de noduri sau legături în timpul trainingului duce indirect și la obținerea de reprezentări sparse și la specializarea neuronilor astfel încât să extragă features independent, reducând co-adaptările. DropConnect este o generalizare a dropout și pare să dea rezultate mai bune în practică în general, însă ambele tehnici pot avea efect negativ asupra procesului de învățare și feature extraction, fiind necesară o abordare mai specială în cazul rețelelor recursive folosite pentru predicția de timeseries.

Un alt considerent practic ce merită menționat este că întotdeauna folosirea unui ansamblu de predictori va aduce rezultate mai bune. Combinarea unor predictori dintr-un ansamblu cu un set de ponderi este o problemă de optimizare în sine. Această combinare nu e obligatoriu să fie liniară, dimpotrivă, ea poate merge până la a fi adaptativă, favorizând anumiți predictori în funcție de natura datelor de intrare. Se recomandă și a se face folosind crossvalidation la stabilirea funcției care combina ansamblul, existând și aici pericolul de overfitting. Uneori se folosesc și ansambluri de rețele neuronale, însă în cazul rețelelor antrenate pe date de la bursă pe mai mulți ani apare și impedimentul timpului necesar pentru convergență, antrenarea unui epoch durând foarte mult timp. De aceea, o practică utilă este crearea unui ansamblu luând snapshots din aceeași rețea la epochs diferite (lucru care, deși neintuitiv, produce predicții mai bune). De notat că ansamblurile vin cu prețul complexității, al timpului crescut de antrenament și al timpului de predicție. Ca și în cazul competiției Netflix din 2009, algoritmul cu cele mai bune rezultate s-ar putea dovedi un ansamblu de predictori, însă implementarea lui să nu fie fezabilă, necesitând un compromis și recurgerea la tehnici mai simple.

Machine Learning poate fi folosit și pentru clasificarea datelor de intrare, împărțirea setului de date în secvențe etichetate ușurând procesul de predicție și chiar de înțelegere a datelor. Ca exemplu de use cases ar fi detectarea de "market regimes" la nivel macro sau transformarea de timeseries într-un stream de price behaviors pre-clasificate. Nu doar secvențele temporale din timeseries pot fi clusterizate: deseori instrumentele au dinamici foarte diferite, de exemplu în funcție de prețul la care se tranzacționează, lucru foarte vizibil pe Tokyo Stock Exchange unde există o regulă complexă legată de tick size (cu ce valoare diferă prețurile între două nivele în orderbook), iar regimul de tranzacționare se schimbă radical la trecerea de la un tick size la altul (la boundary existând chiar ciudățenii). La ce sunt utile clusterizările la nivel de comportament? Împărțirea instrumentelor tranzacționate în categorii poate fi benefică la parametrizarea strategiilor de trading, thresholds sau modele diferite putând să producă rezultate sau nu în funcție de dinamica lor diferită. Aceste schimbări pot face dificilă și generalizarea unui algoritm, dar cunoscând aceste "moduri de funcționare" putem să le folosim ca input pentru algoritmii de predicție, putem antrena predictori diferiți pentru fiecare regim sau putem împărți datele pentru training și test "mai în cunoștință de cauză", lucru ce ne poate ajuta la dezvoltarea unei strategii robuste.

Analiza exploratorie a comportamentului poate fi făcută folosind algoritmi de unsupervised learning, schimbând între k-means și k-medoids (mai robust la outliers), affinity propagation clustering, HDBScan (de obicei un fel de "magic bullet", cum sunt Random Forests și XGBoost pentru predicție), Self-Organizing Maps (care poate fi un foarte bun ajutor vizual pentru detectarea semnalului) etc. . Deseori înainte de a face clustering se recomandă reducerea dimensionalității, care este un alt subiect complex și util în foarte multe contexte. Pe lângă Principal Component Analysis (PCA), este folositoare încercarea Independent Component Analysis (ICA) și Partial Least Squares (PLS), deoarece există cazuri când aplicarea PCA exclude dimensiuni cu variabilitate mică, dar care pot fi importante în calitate de criteriu de separare. Reducerea dimensionalității este utilă nu doar în faza de analiză (și ar trebui să menționăm aici și t-SNE, util pentru vizualizări), ci și pentru generarea de features și utilizarea lor în timpul tranzacționării, însă este o operație costisitoare și ori este făcută sporadic, ori se folosesc și aici algoritmi mai impreciși dar care pot fi folosiți în timp real, cum ar fi Incremental SVD și Online PCA sau PLS. De menționat și că există o multitudine de tehnici de non-linear dimensionality reduction care pot fi folosite cu succes în locul metodelor clasice, autoencoderele fiind una dintre ele.

Şi inversul, "more from less", e întâlnit. Folosirea de date financiare simulate e un subiect delicat, dar augmentarea datelor e utilă în unele contexte (să nu uităm că o sursă importantă a "revoluției" Deep Learning a fost succesul AlexNet[^28], care, pentru a obține acele rezultate, folosea această tehnică). Este posibilă utilizarea algoritmilor de machine learning pentru data augmentation, pricing și simulări de risc, pe lângă tehnicile clasice cum ar fi historical bootstrapping (care constă într-o amestecare a datelor din trecut, generând multe istorii alternative în care doar ordinea evenimentelor diferă) sau Monte Carlo simulations (care generează returns aleatorii păstrând un anumit drift și volatilitate extrapolate din date istorice și reproducând corelațiile dintre instrumente). Dintre modelele care pot fi explorate, algoritmi care se pretează la generarea de timeseries sunt rețelele recursive LSTM, Variational Recurrent Auto-Encoders (care sunt utili și pentru reducerea dimensionalității sau smoothing) și Recurrent Generative Adversarial Networks. În fine, după trecerea în revistă a atâtor tipuri de rețele neuronale, mai merită amintit că există studii recente și un avans spre interpretabilitate și în cazul rețelelor generative (amintim aici InfoGAN), și în cazul autoencoderelor (beta-VAE). Extragerea de factori robuști și ortogonali așa-ziși "cu sens" (pentru că ceea ce are sens pentru AI nu e neapărat interpretabil uman) fiind probabil "the next big thing" în Deep Learning. În acest context, merită amintiţi dintre algoritmii recenţi care sunt utili pentru interpretarea oricărui model, inclusiv a reţelelor neuronale, vizualizarea folosind ICE plots şi analiza predicţiilor cu LIME sau Influence Functions.

Validarea strategiilor

Un algoritm de trading poate încerca să prezică mai multe lucruri, fie direcția prețului (de exemplu "next move is up" sau " up at least X ticks"), fie o valoare numerică (expected return peste T secunde/minute), fie ce fel de șabloane de activitate ale prețului ne așteptăm să avem în perioada următoare (unde aceste patterns sunt un set de comportamente mai complexe pre-clasificate).

Este comună construirea unui predictor care are o precizie semnificativ mai mare decât random choice, chiar și peste 70%, dar care nu poate fi monetizată din cauză că tranzacțiile necesare implementării algoritmului nu pot fi obținute la prețul teoretic. Exchange-ul funcționează pe principiul FIFO, la orice nivel de preț, o cerere de execuție este pusă într-o coadă în funcție de timpul la care ajunge la matching engine, iar o problema majoră în algorithmic trading este obținerea unei poziții avantajoase în coada de execuție. O altă problemă ține de "holding period", timpul cât o poziție este păstrată de un algoritm HFT înainte de a încasa profitul (sau a accepta pierderea) și de traiectoria prețurilor în acel interval. Dacă pierderile depășesc o anumită limită, strategiile acționează pentru a limita impactul sau a nu pierde oportunitățile (fie verificând nivele de pierderi absolute, așa-numitul "stop loss", sau relative la un maxim istoric, așa-numitul "draw-down"). Din cauza acestor factori, validările teoretice ale algoritmilor de machine learning par a fi insuficiente și devine obligatorie testarea algoritmilor nu doar ca nivel de acuratețe a predicțiilor, ci și ca rezultat al activității pe market.

Ajungem astfel la una din etapele cele mai importante în implementarea sistemelor de trading automat și care are cel mai mult de câștigat de pe urma abundenței de date și a puterii de procesare din ultimii ani: validarea strategiilor. Metodele de validare ale unui algoritm de trading pot fi împărțite în patru categorii:

Backtestingul este o unealtă foarte importantă în validarea strategiilor, iar calitatea lui depinde de foarte mulți factori: în primul rând de date, de calitatea simulatorului și de corectitudinea a ceea ce se simulează (de aceea, fiind recomandat ca exact același cod să ruleze atât în backtesting cât și live, incluzând cât mai multe din restricționările din viața reală, cum ar fi limitele de risc care eventual pot suprascrie deciziile făcute de signal engines sau chiar pot opri tranzacționarea).

Figura 4. Exemplu de raportare a performanței pentru o parametrizare oarecare a unui algoritm

Datorită oportunităților oferite de "big data", backtestingul strategiilor poate fi îmbunătățit folosind o tehnică similară cu k-fold cross validation, împărțind (secvențial în timp) setul de date pentru parametrizare de k ori și rulând simulări în căutarea unei configurații optime a strategiei. Fiindcă spațiul de căutare crește odată cu complexitatea strategiei și apariția de noi parametri, și deoarece orice simulare pe mai mulți ani de date istorice necesită resurse considerabile, căutarea parametrizărilor optime se face folosind euristici iar nu prin rularea unui "full grid" al parametrilor, apelându-se la Gradient Descent (care nu este întotdeauna pretabil), la Simulated Annealing și algoritmi genetici. Pentru cele k parametrizări obținute ca optime locale se obține o distribuție a metricilor de performanță din care selectăm o configurație câștigătoare, urmărind din nou mai multe criterii de performanță simultan. Ca exemplu, un mod simplu de selecție (însă nu cel mai bun) ar fi configurația care are cel mai bun trade-off între mediana valorilor de Sortino Ratio și media profitului. Pentru alegeri mai informate putem vizualiza "frontiera de eficiență" Markowitz, similar ca la portfolio selection, reprezentând grafic expected return din backtest versus risc (exprimat ca standard deviation al câștigurilor zilnice), sau putem aplica metode de selecție mai complexe bazate pe imbalances în distribuția de daily returns din backtest. După selectarea unei strategii câștigătoare pe care o dorim implementată "live" se recomandă și rularea unui test de stabilitate la modificările parametrilor, variind pe rând doar câte unul singur și analizând curba performanței algoritmului (pentru mai multe metrici) pe o perioadă de timp recentă. Un parametru foarte important de verificat în acest stadiu este sensibilitatea la latența cu exchange-ul sau, în cazul algoritmilor ce necesită tranzacționare la open sau close, un test al stabilității performanței în funcție de prețul obținut.

Figura 5. Vizualizare "performanță versus risc" pentru rezultatele câtorva sute de parametrizări

Nu orice tip de algoritm poate fi testat prin backtesting standard, algoritmii HFT la market open sau cei care exploatează anomalii și evenimente sunt cazuri speciale, efectul oricărei tranzacții fiind amplificat în acele momente și orice simulare care ne-ar adăuga orderul generat în coada de execuție devine foarte imprecisă. Dar, uneori, testarea poate fi făcută prin identificarea unor cazuri cunoscute din trecut și asumpția că acțiunile noastre sunt cele ale unui actor deja prezent în datele istorice, urmărind (indentificând orderul dacă e posibil din date, dacă nu în simulare) acțiuni pe market care fac ceva similar a ceea ce dorim să implementăm.

În ciuda tuturor limitărilor și constrângerilor, backtestingul rămâne o unealtă foarte importantă și își justifică efortul asociat pentru că oferă un cadru de testare de ipoteze, ajutându-ne să luăm decizii informate la construirea strategiilor. Backtestingul, alături de verificarea în detaliu a zilelor cu pierderi sau câștiguri mari și replay-ul în simulare "tick-by-tick" al momentului în care se realizează tranzacțiile sunt tehnicile care duc la înțelegerea strategiei, îmbunătățirea ei și descoperirea erorilor.

Găsirea unui algoritm de trading care să aducă profit nu este ceva comun, rata de eșec este mare și probabilitatea ca cineva să inventeze ceva "revoluționar" este foarte mică, și - în plus - este foarte posibil ca același semnal să fie deja prins sub altă formă de cineva. Nici un algoritm și tehnică, oricât de specială, nu vor putea să producă rezultate nemaivăzute, însă folosind Machine Learning și backtesting putem încerca măcar să obținem rezultate reproductibile. Dar trebuie să rămânem conștienți că informația este o resursă limitată, iar dacă algoritmul nu are suficientă informație de pe market sau din exterior, sarcina lui devine foarte dificilă, pentru că nici un algoritm, oricât de spectaculos ar fi, chiar "True AI" dacă ar apărea, nu poate produce predicții valide în lipsa semnalului. Renunțând la teorie, încheiem cu un considerent practic, puteți urmări cât de puternic este semnalul existent în prețul unui instrument verificând lipsa informației prin: lipsa autocorelației (la mai multe rezoluții și laguri), lipsa unui trend temporal, simetria distribuției de returns și verificarea volatilității măsurată ca standard deviation pe multiple intervale de timp. În ipoteza în care mișcarea prețului e "random walk"- nu putem face predicții mai bune decât "random choice" pornind doar de la preț- , volatilitatea va scala cu sqrt(time).

Succes în construirea de strategii și detectarea semnalului!


NUMĂRUL 149 - Development with AI

Sponsori

  • Accenture
  • BT Code Crafters
  • Accesa
  • Bosch
  • Betfair
  • MHP
  • BoatyardX
  • .msg systems
  • P3 group
  • Ing Hubs
  • Cognizant Softvision
  • Colors in projects