Professional Documents
Culture Documents
Backtesting
Backtesting
Tornyi Tamás
tamas.tornyi@egroup.hu
June 2022
1 Mi az a backtest?
Backtestnek nevezünk egy olyan kı́sérletet, amely egy befektetési stratégia out-
of-sample teljesı́tményét értékeli múltbéli adatokon. A backtest elsődleges célja
a stratégia paramétereinek adekvátságának vizsgálata. Nyilván a jövőbeli várható
teljesı́tményre lennénk kiváncsiak, de nincs olyan backtest, ami garantáltan
mutatná a jövőre vonatkozó teljesı́tményét a stratégiának. A backtest során
kapott teljesı́tményekkel egy körülbelüli képet, egy közelı́tést kaphatunk. Vis-
zont a backtest által kapott közelı́tések alapján könnyen hasonlı́thatunk össze
stratégiákat, és ı́gy választhatjuk ki a legjobbat. Fontos megjegyezni, hogy back-
testelni csak akkor érdemes, ha már minden modulja a rendszernek (labeling, in-
dikátorok, modell stb.) eljutott egy olyan szintre, amivel meg vagyunk elégedve.
Ha backtestelés eredményét használjuk fel, valamely modul javı́tására, akkor
hamis eredményeket kaphatunk, hiszen fennáll a backtest overfitting valószı́nűsége
(erről majd még később ı́rok). Ahhoz, hogy a következő fejezetek egyértelműek
legyenek, ezért itt leı́rom a szóhasználatot, amit a következőkben használni fo-
gok.
Stratégia alatt értem azokat a kereskedési szabályok halmazát, amelyeket
követve a kereskedést folytatjuk. Ez általában röviden azt jelenti, hogy van egy
szabály, ami alapján belépünk egy pozı́cióba és van egy szabály, ami alapján
kilépünk adott pozı́cióból. A mi esetünkben jelenleg ez a triple barrier method
és az erre tanı́tott machine learning algoritmus: a modell megmondja, hogy
mikor lépünk be egy pozı́cióba és ha valamelyik barriert eléri az árfolyam akkor
kilépünk a pozicı́óból.
Modell-nek nevezem a betanı́tott machine learning algoritmust.
Megjegyzem, hogy a backtest során a modellt és a stratégiát is vizsgálhatjuk,
tehát azt is, hogy a modell mennyire jól általánosı́t olyan adatokon, amiket még
nem látott, és hogy a stratégiával milyen profitot érhetünk el megközelı́tőleg. A
továbbiakban leginkább adott stratégia értékeléséről lesz szó.
A machine learning modell tanı́tásánál három intervallumot különböztetek
meg: training data-nak nevezem azt az adathalmazt, amelyen az algoritmus
tanul. Testing data-nak nevezem azt az adathalmazt, amelyet arra használunk,
hogy a modell paramétereit és a feature-öket optimalizáljuk. A training és
1
test set(s) unióját validation-nek nevezem. Minden olyan adatot, amely a
validation-nek eleme, in-sample (IS) adatnak nevezünk, és a validation kom-
plementerét out-of-sample (OOS) adathalmaznak nevezzük. Ennek az OOS
adathalmaznak egy részhalmazán történik a backtestelés, ez a részhalmaz a
backtest data.
(Megjegyzem a Prado könyvben - ha jól értem - a backtestről szóló fejezetek
esetében ő training setnek hı́vja az egész validationt és testing setnek a backtest
időszakot.)
• Mivel a testing data mindig a training data után van, a testing data
garantáltan OOS, azaz nem lesz a training és a test data között leakage,
amennyiben a purging jól van implementálva
Viszont a módszernek egyértelmű hátrányai is vannak:
2
olyan információkra tanult, ami 2008-ban még nem volt elérhető. Viszont nem
is a historikus pontosság a cél, hanem az, hogy egy olyan modellt, ami nem
látta még a 2008-as év adatait, leteszteljük egy olyan ”stresszhelyzetben”, mint
a 2008-as válság.
Ehhez hasonlóan a backtestelésnél használt cross-validation célja nem a his-
torikus szimuláció, hogy mi történt volna a múltban, hanem hogy a jövőbeli tel-
jesı́tményre tudjunk következtetni, az alapján, hogy különböző out-of-sample es-
etekben leteszteljük. A Prado által javasolt combinatorial purged cross-validation
(CPCV) módszer pontosan ezt csinálja, azzal a plusz előnnyel, hogy nem csak
egy backtest útvonalat ad, hanem tetszőleges sokat, ı́gy az overfitting és a sz-
erencse valószı́nűségét csökkenti, pontosabb következtetéseket vonhatunk le a
jövőbeli teljesı́tményre vonatkozóan.
A módszer a következő: Felosztjuk az adatot N egyenlő részre (mint ahogy
sima k-fold cross-validation-nél is csinálnánk), viszont a hagyományos cross-
validationtől eltérően nem 1 fold lesz mindig a backtest data, hanem k. Ez azt
jelenti, hogy az N fold közül kiválasztunk k-t ami a backtest data-t fogja adni,
mı́g a többi N − k darab fold adja majd a validation halmazt, ı́gy tehát összesen
N
k iteráció lesz. Egy példa a Prado könyvből: Az baloldalon G1, ..., G6 a 6
foldot jelenti, a fenti S1, ..., S15 a különböző kombinációkra utal. Az x-el jelölt
foldok adják az adott kombinációban a backtest adatot, ahol nincs semmi azok
adják a validation adatot. Így mindegyik adatpontra 5 predikció lesz, tehát
ezzel 5 különböző backtest ”útvonalat” kapunk. Például egy útvonal lehet a
(G1, S1), (G2, S1), (G3, S2), (G4, S3), (G5, S4), (G6, S5). Mindegyik útvonalon
kiszámolható egy-egy Sharpe ratio és ı́gy a stratégia valódi Sharpe ratio-ját job-
ban közelı́thatjük (mint hogyha egy Sharpe ratio-t számolnánk ki walk forward
módszerrel). Jelöljük a backtest útvonalak számát φ szimbólummal. A backtest
útvonalak száma a következőképp alakul:
k N
φ[N, k] =
N N −k
Fontos, hogy a purginget és az embargot jól használjuk, hogy a backtest adat
valóban out-of-sample legyen.
3
2.3 A trading szimulációja
A backtest során nyilván le kell szimulálnunk a kereskedést, ahhoz, hogy értékelni
tudjuk a stratégiát. A kereskedést tökéletesen szimulálni lehetetlen, megpróbálhatunk
minél több mindent figyelembe venni, hogy minél valósághűbb legyen a sz-
imuláció (tranzakciós költségek, order teljesı́tés ideje, adatok késése stb.), de
az irodalomban több helyen inkább azt ajánlják, hogy ne foglalkozzon az em-
ber ezen aspektusok tökéletes szimulációjával, mert a valóságban úgyis más
lesz a random zajok miatt, ergo inkább nézzük csak a stratégiát ideális sz-
ituációban, és fogadjuk el, hogy a live trading során lehet, hogy rosszabb lesz
a teljesı́tmény. Tehát szerintem felesleges túl sok időt abba fektetni, hogy a
kereskedés szimulációját tökéletesı́tsük, viszont az egyszerű dolgokat, mint pl
a tranzakciós költség, amivel eddig is számoltunk, azokat benn hagyhatjuk.
Összeségében szerintem, ahogy jelenleg az evaluationben történik a trading sz-
imuláció az megfelel a kereskedés szimulációjára, de akár azt is megtehetjük,
hogy feltételezzük, hogy minden orderünk az általunk várt árfolyamon teljesül,
tehát nem ellenőrizzük a tick adatokat, hogy mikor teljesült volna.
2.4 Metrikák
A stratégia kiértékeléséhez nyilván az is szükséges, hogy megmondjuk mi alapján
akarjuk értékelni a stratégiát. Az irodalomban rengeteg metrika található, amit
figyelembe vesznek egy-egy backtest során, de ezek közül sok olyan, amik inkább
csak információk (pl. hányszor kereskedett a modell, abból mennyit nyert,
átlagosan mennyit nyert a nyerő kereskedéseken stb.), amik nem alkalmasak
arra, hogy stratégiákat hasonlı́tsunk össze.
A stratégiák objektı́v összehasonlı́tására olyan metrikát érdemes figyelembe
venni, ami a profitot és a kockázatot is figyelembe veszi. Ilyen metrika például
a Sharpe ratio és a Sortino ratio. Ezeken kı́vül is több ilyen metrika található
az irodalomban, de a leggyakrabban használt egyértelműen a Sharpe ratio.
Tegyük fel, hogy egy stratégia returnjei (amikből a risk-free rate-t levonjuk)
{rt }t=1,...,T IID normál eloszlásúak µ átlaggal és σ 2 varianciával. Ekkor a Sharpe
ratio a következőképp van definiálva:
µ
SR =
σ
Mivel µ és σ általában nem ismert, ezért a stratégia valós Sharpe ratioját nem
lehet biztosan kiszámolni csak közelı́teni tudjuk. Prado a könyvében a Sharpe
ratio két érdekes változatát adja:
A probabilistic Sharpe ratio (PSR) az SR korrigált becslését adja, eltávolı́tva
a ferdeség és/vagy a fat-taillel rendelkező returnök okozott ’hibát’. Ha adott egy
általunk elvárt Sharpe ratio (SR∗ ) (ez lehet nulla is), és egy ”megfigyelt” (tesz-
telés során kapott) Sharpe ratio SR,ˆ akkor a PSR megadja annak valószı́nűségét,
4
c > SR∗ . PSR a következőképp becsülhető:
hogy SR
√
( c − SR∗ ) T − 1
SR
P[
SR = Z q ,
γˆ4 −1 c 2
1 − γˆ3 SR + 4 SR
c
3 Stratégia optimalizálás
Minden stratégiának megvannak a maga paraméterei, amik a profit taking és
a stop loss korlátokra vonatkoznak. A backtestelés során pedig kiderülhet,
hogy ezekkel a paraméterekkel milyen eredményeket kapunk. Ahhoz, hogy a
stratégia a lehető legjobb legyen nyilván érdemes lenne a paramétereit opti-
malizálni, viszont ha ezt backtest futtatás eredménye alapján tesszük, akkor
nagy valószı́nűséggel overfitteljük az adott backtestet, még akkor is ha cross-
validationt használunk. Ennek a valószı́nűségnek a becslésére ad módszert a
Prado, de ad egy alternatı́v megoldást, ami megpróbálja elkerülni ezt az overfit-
tinget. Ez az alternatı́v módszer arról szól, hogy a historikus adatok statisztikai
karakterisztikái alapján szintetikus adatot generálunk, ı́gy rengeteg, a modell
számára ismeretlen adaton backtesztelhetünk, ezzel csökkentve, hogy a stratégia
egy konkrét adathalmazra lett optimalizálva.
5
Legyen πi,t := mi (Pi,t − Pi,0 ) az i-edik bárban nyitott, t-edik bárban lezárt,
mi volume-mal rendelkező pozı́ció profit/loss értéke. Így a fenti módszer formálisabban:
R∗ = arg max{SRR },
R∈Ω
E[πi,Ti |R]
SRR = ,
σ[πi,Ti |R]
ahol E[.], σ[.] a várható értéke és szórása πi,Ti -nek az R kereskedési szabállyal
(i = 1, ..., I). Viszont ezzel a módszerrel könnyen overfittelhetjük a paramétereket.
Alább konkrétan definiálom, mit nevez Prado overfittelt kereskedési szabálynak:
R∗ kereskedési szabály overfit, ha