You are on page 1of 6

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

2 Egy konkrét stratégia backtesztelése


Ha úgy gondoljuk, hogy minden modul, amit a modell épı́tésre, és a stratégia
megvalósı́tásra használunk kész, akkor nekiállhatunk backtestelni. Ebben a
fejezetben két módszert ismertetek, amivel backtestelni lehet egy stratégiát.
Fontos megjegyezni, hogy ha egy startégiát nem elég egy részvényre backtestelni,
ahhoz, hogy a stratégiáról reális képet kapjunk minél több részvényen érdemes
kipróbálni a stratégiát.

2.1 Walk-forward backtest


Mint azt már ı́rtam a backtest múltbéli adatokon való kı́sérletezést jelent, de az,
hogy ezeket a múltbéli adatokat hogyan használjuk fel a backtest során az nem
egyértelmű. A leggyakrabban használt módszer a walk-forward módszer, ami
egy historikus szimulációnak felel meg, hogy a model/stratégia hogyan teljesı́tett
volna a múltban.
A walk-forward módszernek az előnyei:
• Egyértelmű historikus interpretációja van.

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

• Egyetlen egy backtest ”útvonal” van prediktálva, ı́gy könnyű overfittelni.


• Az eredményből nem lehet (vagy inkább nem érdemes) a várható jövőbeli
teljesı́tményre következtetni.

2.2 Combinatorial Purged Cross-Validation method


A kutatók/traderek gyakran kiváncsiak, hogy egy modell hogyan teljesı́t egy
olyan előre nem látható helyzetben, mint például a 2008-as válság. Ehhez nem
kell, hogy feltétlen 2008-nál korábbi adatokra tanı́tsuk a modellt. Megtehetjük,
hogy a validation pl 2009-től 2017-ig tart és a backtesting data lesz a 2008-as
év. Ekkor az eredmény nem lesz historikusan interpretálható, hisz a modell

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

Figure 1: CPCV, ahol N = 6, k = 2

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

ahol Z[.] a standard normál eloszlás eloszlásfüggvénye, T a megfigyelt returnök


száma, γˆ3 a returnök ferdesége, és γˆ4 a returnök lapultsága.
A deflated Sharpe ratio (DSR) egy olyan PSR, ahol az elvárt threshold
igazı́tva van úgy, hogy tükrözze a backtestek számát. Tehát az SR∗ -t nem mi
adjuk meg, hanem a következőképp becsüljük:
r h i    
∗ −1 1 −1 1 −1
SR = V {SRn } (1 − γ)Z
d 1− + γZ 1− e
N N

dn }] a becsült SR-ek varianciája a tesztek során, N a független tesztek


ahol V [{SR
száma, és γ az Euler-Mascheroni konstans.

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.

3.1 Definı́ciók, historikus optimalizálás


A Prado könyv alapján:
Egy S stratégia kereskedési szabályának nevezzük az R := {π, π} paraméter
halmazt, ahol π is the stop-loss and π is the profit-taking threshold. A stratégia
optimalizálása a következőképp történhet:

• Vegyük a különböző kereskedési szabályok halmazát. (Ω := {R})


• Ezekkel a szabályokkal backtest során értékeljük az S stratégiát
• Válasszuk ki az optimális R∗ paraméter halmazt.

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

E[πj,Tj |R∗ ] E[πj,Tj |R]


    
E < M eΩ E ,
σ[πj,Tj |R∗ ] σ[πj,Tj |R]

ahol j = I + 1, ..., J és M eΩ a medián.


Ez annak felel meg, hogy egy in-sample (i ∈ [1, I]) optimális kereskedési
szabály overfit, ha várhatóan rosszabbul teljesı́t az alternatı́v paraméter halma-
zok mediánjánál out-of-sample (j ∈ [I + 1, J]).

3.2 Optimalizálás szimulált adatokon


Az overfittelés elkerülése érdekében a Prado által javasolt módszer az, hogy
vegyünk egy diszkrét stochasztikus folyamatot az árakon, aminek paramétereit
a meglévő múltbéli adatok alapján becsüljük. Ezzel akármennyi az eredeti-
hez (statisztikai értelemben) hasonló árgörbét tudunk szimulálni, és ı́gy ezen
árgörbék sokaságán megyünk végig grid search-csel a különböző paraméter hal-
mazokon. Így kiválasztva a legjobbat, jobb eséllyel elkerüljük az overfitet, hiszen
nem egy konkrét árgörbére optimalizálunk. Ennek a módszernek matematikai
részleteibe nem mennék bele, bővebben lásd Prado, Chapter 13.

You might also like