Hyödyllisessä backtest-testissä ei etsitä parempaa parametria: pysäytä prosessi puolivälissä, palauta se ja aja sama toisto loppuun. Kun syötteet ja hallittu toteutussimulaattori ovat samat, päätösten, toimeksiantojen ja oman pääoman kehityksen pitäisi vastata keskeytymätöntä ajoa.
Jos näin ei käy, olet löytänyt tilanhallintaongelman. Strategia riippuu jostakin, mitä et tallentanut tai pystynyt palauttamaan. Tämä riippuvuus on merkityksellinen aina, kun tutkimusajoja jatketaan, työprosesseja korvataan tai paperikaupankäynnin palveluun otetaan käyttöön uutta koodia.
Pidän tästä testistä, koska oikea vastaus on poikkeuksellisen selvä. Ei tarvitse kiistellä siitä, muuttuiko markkina. Molemmat ajot saavat saman markkinadatan.
Tässä on kolme väärää tapaa käynnistää uudelleen. Luvut ovat havainnollistavia; kukin virhe voi tapahtua muuten deterministisessä järjestelmässä.
1. Lataa muutama kynttilä ja oleta indikaattorit valmiiksi lämmitetyiksi
Oletetaan, että strategia käyttää 100 jakson eksponentiaalista liukuvaa keskiarvoa. Sen päivitys on:
alpha = 2 / 101
ema_next = alpha * close + (1 - alpha) * ema_previous
Keskeytymätön prosessi jatkaa EMA:n laskentaa kertyneestä tilasta. Uudelleenkäynnistetty prosessi hakee 100 kynttilää, alustaa EMA:n ensimmäisellä päätöskurssilla ja olettaa, että 100 jakson indikaattori tarvitsee 100 havaintoa.
Tässä sekoitetaan indikaattorin tasoitusparametri äärelliseen muistijaksoon. EMA säilyttää alkutilan pienenevän vaikutuksen. Jos kahden version EMA-arvot eroavat aluksi 10 hintayksikköä, sama myöhempi hintasarja pienentää eroa näin:
| Päivityksiä alustuksesta | Jäljellä oleva ero | Alkuperäisestä virheestä jäljellä |
|---|---|---|
| 100 | 1.353 | 13.53% |
| 250 | 0.0674 | 0.674% |
| 500 | 0.000454 | 0.00454% |
Laskukaava on 10 * (99 / 101)^k. Kun haet 100 kynttilää, saat vain 99 päivitystä, jos ensimmäinen havainto toimii alustusarvona.
Ongelma näkyy yleensä päätösrajan lähellä. Yhdessä ajossa hinta on EMA:n yläpuolella, toisessa sen alapuolella. Pieni numeerinen ero synnyttää kokonaan ylimääräisen kaupan. Sen jälkeen myös jäähdytysajat, käytettävissä oleva käteinen ja myöhemmät päätökset voivat erkaantua.
Tallenna rekursiivisten indikaattorien tila, niiden alustustila ja viimeksi käsitelty tapahtuma. Vaihtoehtoisesti toista tapahtumat tunnetusta alkutilasta. Pidempi lämmitysjakso voi tuottaa riittävän hyvän approksimaation, mutta valitse sen pituus määritellyn virhetoleranssin perusteella ja tarkista, voiko toleranssin raja muuttaa päätöksiä. ”Viisi kertaa jakson pituus” on käytäntö, ei todiste.
Eikä indikaattoreiden historiaan kaikki rajoitu. Liukuva persentiili tarvitsee oman ikkunansa. Verkossa oppiva malli saattaa tarvita optimoijansa tilan. Säännön, joka odottaa tappion jälkeen kolme kynttilää, on muistettava tappio ja laskuri.
2. Tallenna positiot ja unohda toimeksiannot, joiden käsittely on kesken
Tavoitepositiosi on 10 yksikköä. 10 yksikön ostotoimeksiannosta on toteutunut 4, ja 6 on vielä avoinna. Tallennat positioksi 4, käynnistät prosessin uudelleen ja lähetät uuden ostotoimeksiannon puuttuvista 6 yksiköstä.
Jos alkuperäinen loppuosa ja korvaava toimeksianto toteutuvat molemmat, omistat 16 yksikköä.
Backtestissä tämä virhe jää usein piiloon, koska täyttömoottorin uudelleenkäynnistys pyyhkii avoimet toimeksiannot huomaamatta. Paperikaupankäynnissä simulaattori tai ulkoinen palvelu saattaa säilyttää ne. Sama palautuskoodi johtaa silloin erilaiseen altistukseen sen mukaan, mikä komponentti jäi toimintaan.
| Uudelleenkäynnistyksen hetkellä | Todellinen tila | Vain position palautus näkee |
|---|---|---|
| Tavoitepositio | 10 | 10 |
| Toteutunut positio | 4 | 4 |
| Avoinna oleva oston määrä | 6 | 0 |
| Tarvittava lisämäärä | 0 | 6 |
Ongelma näkyy selittämättömänä toimeksiantojen ryöppynä heti palautuksen jälkeen. Joskus altistus kaksinkertaistuu. Joskus positio suljetaan, vaikka sen suojaava toimeksianto on yhä avoinna ja voi myöhemmin avata uuden position.
Tarkistuspisteeseen on tallennettava positioiden lisäksi toimeksiantojen tunnisteet ja elinkaaritila. Palautuksen on täsmäytettävä tiedot toteutusjärjestelmän kanssa ennen uusien toimien luomista. Jos toimeksiannon lopputulos on tuntematon, asia pitää selvittää. Kun tallennetun kuittauksen puuttuminen tulkitaan niin, ettei toimeksiantoa koskaan lähetetty, syntyy kaksoistoimeksiantoja.
Pysyvien asiakastoimeksiantotunnisteiden avulla voit selvittää, mitä tapahtui. Ne estävät kaksoiskappaleet vain, jos vastaanottava järjestelmä todella valvoo vaadittua yksilöllisyyttä tai idempotenssia. Tallenna myös käsiteltyjen toteutusten tunnisteet, jotta uudelleen toistettu täyttö ei kasvata positiota kahdesti.
Minulla on heikkous tylsää toimeksiantojen tilanäkymää kohtaan. Uudelleenkäynnistyspäivänä sen pienistä riveistä tulee yhtäkkiä rakennuksen kiinnostavin käyttöliittymä.
3. Palauta positio ja aloita uusi P&L-kirjanpito
Tarkastellaan vivuttamatonta spot-esimerkkiä ilman kuluja. Alkukäteistä on $10,000, ostat 10 yksikköä hintaan $100 ja tallennat tarkistuspisteen, kun markkina-arvo on $110.
Oikea tila on $9,000 käteistä ja positio, jonka arvo on $1,100: omaa pääomaa yhteensä $10,100. Jos palautus tuo takaisin 10 yksikköä mutta nollaa käteisen alkuperäiseen $10,000:een, järjestelmä ilmoittaa summaksi $11,100. Olet luonut $1,000 käynnistämällä prosessin uudelleen.
Toiset versiot ovat vähemmän näyttäviä. Palautus säilyttää oman pääoman ennallaan mutta nollaa hankintahinnan arvoon $110. Oma pääoma voi pysyä oikeana, vaikka realisoituneen ja realisoitumattoman tuloksen kohdistus muuttuu. Jos stop- tai poistumisehto viittaa hankintahintaan, kirjanpidon oikopolku muuttaa nyt kaupankäynnin toimintaa.
Tai järjestelmä unohtaa edellisen oman pääoman huipun. Oletetaan, että oma pääoma kävi huipussaan arvossa $10,600 ennen laskua arvoon $10,100. Lasku huipusta on noin 4.72%. Jos huipputaso nollataan palautuksen yhteydessä, strategia uskoo yhtäkkiä, ettei laskua ole lainkaan. Kaikki huipusta laskuun perustuva riskienhallinta on juuri nollattu ilman lupaa.
Ongelma voi siis näkyä katkoksena oman pääoman käyrässä, epäilyttävän pienenä huipusta laskuna tai riskisääntönä, joka lakkaa laukeamasta käyttöönottojen jälkeen. Säilytä kirjanpito ja strategian kirjanpidosta riippuva tila: käteisen liikkeet, positiot, soveltuva hankintameno, kertyneet kulut ja riskienhallinnan muisti. Täsmäytä palautettu oma pääoma kirjanpitoon samalla arvostuksen aikaleimalla.
Tarkistuspiste vaatii yhtenäisen rajakohdan. Jos käteinen tallennetaan täytön jälkeen mutta position määrä ennen täyttöä, tuloksena on tila, jota ei koskaan ollut olemassa. Tallenna toisiinsa liittyvä tila yhtenä kokonaisuutena tai kirjaa kestävä tapahtumajono, jonka perusteella tila voidaan rakentaa uudelleen. Tallenna tapahtumakohta tilan mukana, jotta palautus ei ohita täyttöä eikä käsittele sitä kahdesti.
Tutkimusympäristöön jättäisin testin, jossa ensin ajetaan keskeytymätön vertailutoisto ja sitten toinen ajo käynnistetään uudelleen tarkoituksella hankalissa kohdissa: indikaattorin alustuksen aikana, osittaisen täytön jälkeen ja riskirajan ollessa voimassa. Käytä samaa tapahtumajärjestystä ja säilytä simulaattorin satunnaistila. Vertaa ensimmäistä palautuksen jälkeistä päätöstä, toimeksianto- ja täyttötietoja sekä oman pääoman kehitystä. Pelkkä loppusaldo voi peittää vastakkaisiin suuntiin kumoavia virheitä.
Jos kaatuminen tapahtuu lähetyksen ja kuittauksen välissä, testin on säilytettävä myös toteutuspalvelun tila erillään strategiasta. Muuten poistat juuri sen epävarmuuden, jota yrität testata.
Strategian määrittelyyn kuuluu se, mitä se muistaa. Tee muistista niin selkeä, että voit pysäyttää prosessin kesken toiston ja näyttää täsmälleen, miten se pääsee taas töihin.
← Kaikki kirjoitukset


