Tässä on yksi kynttilä. Binance USDⓈ-M -perpetuaali, BTCUSDT, minuutti, joka alkaa hetkellä 13:46:00 UTC. Se tuli klines-endpointista paljaana kahdentoista arvon taulukkona, ja se on yleisin syöteyksikkö retail-tason ja sitä sivuavan kvanttitutkimuksen parissa. Lähes jokainen tuottamamme strategia käsittelee jotain tämän muotoista.
Puretaan se siis indeksi indeksiltä ja katsotaan, kuinka paljon backtest tulkitsee siitä väärin.
| Indeksi | Arvo | Nimi |
|---|---|---|
| 0 | 1773495960000 | avausaika (ms) |
| 1 | "84120.50" | avaus |
| 2 | "84177.90" | ylin |
| 3 | "84098.10" | alin |
| 4 | "84163.40" | sulku |
| 5 | "38.417" | perusvolyymi (BTC) |
| 6 | 1773496019999 | lopetusaika (ms) |
| 7 | "3232108.94" | noteerausvolyymi (USDT) |
| 8 | 1204 | kauppojen määrä |
| 9 | "21.883" | taker-ostojen perusvolyymi |
| 10 | "1841203.55" | taker-ostojen noteerausvolyymi |
| 11 | "0" | ohita |
[0] ja [6]: mikä minuutti tämä on, ja kenen kello sen kertoo
Avausaika 1773495960000, lopetusaika 1773496019999. Huomaa jälkimmäinen: se päättyy lukuun 19999, millisekuntia ennen seuraavan kynttilän avausta. Aikaväli on puoliavoin, ja pörssi kertoo sen sinulle täysin suoraan. Puolet jahtaamistani datavirheistä on alkanut siitä, että joku on käsitellyt molempia päätepisteitä mukaan lukevina ja laskenut rajalla tehdyn kaupan kahdesti tai kohdistanut resamplauksen niin, että jokainen 5 minuutin kynttilä lainaa naapuriltaan yhden millisekunnin.
Aikaleimat ovat pörssin matching-enginen aikaa. Eivät sinun kellosi, eivät toimittajasi ingest-kello eivätkä sama kello, jota funding-snapshot käyttää. Kun yhdistät kline-sarjan eri endpointista haettuun funding-rate-sarjaan tai open-interest-sarjaan, yhdistät lähteitä, jotka täsmäävät useimmiten noin sekunnin tarkkuudella. 1 minuutin strategialle se merkitsee 1.7%:n ajoitusvirhettä jokaisella yhdistetyllä rivillä. Kaikki alle minuutin strategiat kaatuvat siihen.
Ja tämä kynttilä on leimattu sen avauksella. Sen sisältämää tietoa ei voi tietää ennen hetkeä 13:46:59.999. Jokainen indeksöintiin liittyvä kysymys — siirränkö yhdellä, käytänkö tapahtuma-aikana kynttilän sulkua vai avausta — on pohjimmiltaan sama lookahead-kysymys eri asussa.
[1] "84120.50": avaus, jolla et voi käydä kauppaa
Avaus on ensimmäisen aikavälillä toteutuneen kaupan hinta. Se on kahden muun ihmisen välinen loppuun saatettu transaktio. Kun kynttilä on datakehyksessäsi rivinä, tuo hinta on kuusikymmentä sekuntia vanha.
Edellinen kynttilä sulkeutui hintaan 84109.80, joten vierekkäisten 1 minuutin kynttilöiden väliin jää $10.70:n hintaliike. Se on 1.3 korkopistettä, kaaviossa näkymätön ja suurin piirtein neljännes taker-maksusta. Selvä. Mutta katso samaa sarjaa alt-perpetuaalissa Yhdysvaltain CPI-julkaisun aikana, niin kynttilöiden väliset aukot ovat 15–40 bps. Backtest, joka generoi signaalin kynttilän sulkeutuessa ja täyttää sen seuraavan kynttilän avauksessa, olettaa huomaamatta aukon olevan nolla — ja se on nolla juuri silloin, kun sillä ei ole merkitystä.
[2] ja [3]: "84177.90" ylin, "84098.10" alin
Näissä useimmat fill-moottorit käyvät kuolemassa, joten tästä tulee pitkä osio.
Ylin ja alin ovat äärimmäisiä kosketettuja hintoja. Ne eivät kerro koosta eivätkä kestosta. Saman minuutin raakakauppanauhasta näkyy, että kaikki hinnalla 84100.00 tai sen alle tehty kauppa oli yhteensä 0.62 BTC yhdeksässä printissä 1.4 sekunnin aikaikkunan sisällä. Backtestin stop kohdassa 84100 siis "täyttyy" — ja jos positiosi on 3 BTC, söit koko näkyvän order bookin matkalla alas ja loppu koosta toteutui jossain 84105–84130:n paluumatkalla. Kynttilä kertoo alimman hinnan olleen 84098.10. Se ei kerro, että siinä käytiin kauppaa vain $52,000:n nimellisarvosta.
Toinen suunta on vielä pahempi, koska se imartelee sinua. Oletetaan, että sinulla oli lepäävä myyntilimiitti hinnassa 84175. Kynttilän ylin on 84177.90, joten naiivi moottori täyttää toimeksiantosi hinnassa 84175 ja kirjaa maker-hyvityksen taker-kulun sijaan. Se, tapahtuiko täyttö todella, riippuu jonopaikastasi kyseisellä hintatasolla — eikä kynttilä voi tietää sitä, etkä todennäköisesti koskaan tallentanut sitä. Kosketettu ei tarkoita täytettyä.
Fill-moottorissamme vakiintunut sääntö on tämä: lepäävä limiitti täyttyy vain, jos kynttilä käy tason läpi, ei vain kosketa sitä. Täytöt täsmälleen äärimmäisessä tickissä vaativat trade tapesta saatavaa volyymi-hintataso-näyttöä; muuten ne hylätään. Tämä poisti tyypillisestä mean-reversion-kirjasta noin 6% kaupoista ja pudotti yhden ehdokkaan backtestatun Sharpen arvosta 1.9 arvoon 1.1. Ehdokas ei ollut koskaan todellinen; täyttösääntö oli vain ensimmäinen asia, joka oli tarpeeksi rehellinen sanomaan sen.
Läheinen ansa: kynttilän sisäinen reitti. Jos kynttilän vaihteluväli kattaa sekä stop-lossisi että take-profitisi, OHLCV ei voi kertoa, kumpi osui ensin. Jokaisen moottorin on valittava käytäntö. Me oletamme aina stopin osuvan ensin, mikä on pessimististä ja toisinaan väärin, mutta ei koskaan tuota valheellista voittoa. Jos moottorisi olettaa take-profitin osuvan ensin, laajan vaihteluvälin kynttilät valmistavat epäselvyydestä voittoa — ja juuri laajan vaihteluvälin kynttilät hallitsevat PnL-jakaumaasi.
[4] "84163.40": kynttilän vähiten robusti luku
Sulku on viimeinen aikavälillä tehty printti. Siinä kaikki. Se saattaa olla 0.002 BTC:n odd-lot-kauppa bottihärveliltä, joka viimeistelee position pyöristyksen hetkellä 13:46:59.8. Juuri tätä rakenteellisesti mielivaltaista tickiä useimmat tutkimusputket käyttävät jokaisen signaalin laskemiseen, jokaisen position markkaamiseen ja jokaisen ulostulon arviointiin.
BTC-perpetuaaleissa sillä tuskin on väliä; ohuesti vaihdetussa altcoin-perpetuaalissa kello 04:00 UTC sillä on valtava merkitys, ja kahden pörssin saman minuutin sulkujen välinen ero voi ylittää koko kauppakohtaisen etusi. Kun strategian PnL riippuu nimenomaan sulusta, ajamme sen uudelleen käyttäen pörssin mark pricea, joka johdetaan indeksistä ja jota on paljon vaikeampi peukaloida. Jos tulokset eroavat, strategia kävi kauppaa artefaktilla.
[5] ja [7]: "38.417" ja "3232108.94", minkä yksikön volyymia
Perusvolyymi on BTC:tä; noteerausvolyymi on USDT:tä. Tässä molemmat, mikä on palvelus, jota kaikki markkinapaikat eivät tarjoa. Syy välittää asiasta on markkinapaikkojen välinen aggregointi. Coin-marginaaliset sopimukset noteerataan $100:n nimellisarvoisina kontrakteina. Jotkin osakedatasyötteet raportoivat round loteja. Ennustemarkkinat raportoivat osakemääriä, joissa yksi osake on dollarimääräinen binäärinen saatava. "Volyymin" summaaminen sekaympäristössä ilman normalisointia yhteen nimellisyksikköön tuottaa likviditeettijärjestyksen, joka on puhdasta hölynpölyä — ja vieläpä vakaalta näyttävää hölynpölyä, joka selviää katselmoinnista.
Normalisoi kaikki noteerausnimellisarvoon ingest-vaiheessa. Tallenna myös raakakenttä, mutta älä koskaan anna strategian nähdä sitä.
[8] 1204: kenttä, jonka pitäisi määrittää impact-mallisi
Kauppojen määrällä jaettu perusvolyymi antaa keskimääräiseksi printiksi 0.032 BTC:tä eli noin $2,700. Jos ehdokasstrategiasi haluaa avata $250,000:n position kerralla, se pyytää kooltaan noin 92 kertaa tuon minuutin tyypillisen transaktion verran. Juuri tämän luvun, ei jotain yleistä 5-bps:n slippage-vakiota, pitäisi ohjata square-root impact -termiäsi. Laskemme osallistumisasteen kynttilää kohti ensiluokkaisena sarakkeena ja hylkäämme strategiat, joiden mediaanisisääntulo ylittää muutaman prosentin kynttilän nimellisarvosta, koska kaikki sen jälkeinen on fiktiota.
Kauppojen määrä paljastaa myös oudot minuutit halvalla. Volyymi normaali, kauppojen määrä romahti 11:een? Joku teki blokin. Volyymi normaali, kauppojen määrä 9,000? Kyseessä on likvidaatiokaskadi, joka pilkotaan pieniksi paloiksi.
[9] ja [10]: "21.883", kenttä, jonka kaikki heittävät pois
Taker-ostojen perusvolyymi. Tässä kynttilässä ostajat aloittivat 21.883 BTC:n 38.417 BTC:n volyymista, joten allekirjoitettu volyymidelta on +5.349 BTC ja aggressorin jakauma 57/43 ostajien suuntaan. Pörssi antaa sinulle order flow -epätasapainon ilmaiseksi kentässä, jota useimmat eivät koskaan lue, koska pandas ei nimennyt saraketta heidän puolestaan.
En väitä, että se ennustaisi tuottoja yksinään; naiivit delta-strategiat ovat yksi varmimmista tavoista lahjoittaa fee-ledgerille. Mutta se on aidosti eri mittaus kuin hinta, se on saatavilla samassa pyynnössä, jonka jo muutenkin teit, ja sen avulla voit erottaa ostetun nousun noususta, joka tapahtui myyjien vetäydyttyä. Nämä kaksi näyttävät OHLC:ssä identtisiltä ja käyttäytyvät kymmenen minuuttia myöhemmin eri tavoin. Tutkimusagenttimme käsittelee hypoteesia, joka sivuuttaa taker-jaon markkinapaikalla, joka julkaisee sen, niin, että pöydälle jätetään näyttöä.
[11] "0": ohita — ja kaikki muu, mitä tässä ei ole
Indeksi 11 on vanhentunut kenttä, pysyvästi nolla. Mielenkiintoisempaa on luettelo asioista, joita tämä kynttilä ei sisällä: ei bidiä, ei askia, ei spreadia, ei order bookin syvyyttä, ei funding ratea, ei open interestiä, ei likvidaatioita, ei mark pricea eikä index pricea. Ja ratkaisevasti: ei mitään keinoa tietää, olisiko sinun toimeksiantosi ollut maker vai taker, mikä on tällä markkinapaikalla ero 0.045%:n maksamisen ja 0.01%:n ansaitsemisen välillä.
Siksi mikä tahansa pelkkiin klineihin perustuva fee-malli on oletus, joka pukeutuu luvun vaatteisiin. Ratkaisemme asian pakottamalla jokaisen strategian ilmoittamaan toteutustapansa etukäteen ja veloittamalla taker-maksun kaikesta, mikä ei pysty todistamaan muuta.
Kynttilä, jota ei koskaan näkynyt
Viimeinen kohta, ja se puree kovimmin majorien ulkopuolella. Minuutista, jolla ei ole yhtään kauppaa, ei synny klineä lainkaan. Toimittajat ja kirjastot täyttävät sen usein edellisen arvon mukaan: open = high = low = close = edellinen close, volume 0. Indikaattorisi laskee tyytyväisenä. Strategiasi näkee kelvollisen rivin ja voi tuottaa signaalin minuutilla, jolla kukaan maailmassa ei käynyt kauppaa kyseisellä instrumentilla.
Yhdessä mid-cap-perpetuaalissa, jonka ingestöimme, 4.1% 1 minuutin kynttilöistä kahdentoista kuukauden ikkunassa sisälsi nolla kauppaa. Kyseisen symbolin mean-reversion-ehdokas sijoitti 38% sisääntuloistaan synteettisille kynttilöille, koska tasaiset synteettiset hinnat ovat magneetti kaikelle, mikä mittaa poikkeamaa liukuvasta keskiarvosta. Backtest näytti upealta. Se kävi kauppaa datan aukoilla.
Siksi ingest-kerros sisältää nyt jokaisella kynttilällä synthetic-booleanin, joka kulkee mukana jokaisessa resamplauksessa, ja verifiointiseula hylkää kaikki strategiat, joiden kaupat keskittyvät niihin. Halpa sarake. Se on tappanut enemmän ehdokkaita kuin yksikään koskaan kirjoittamamme indikaattori.
Kaksitoista arvoa. Neljä niistä tulkitaan toistuvasti väärin, kaksi heitetään toistuvasti pois, ja kokonainen luokka puuttuu riviltä mutta moottori kuvittelee sen olevan siellä. Ennen seuraavaa backtestiäsi hae omasta varastostasi yksi raaka kynttilä ja lue jokainen kenttä ääneen verraten sitä siihen, mitä fill-logiikkasi olettaa. Se on kahdenkymmenen minuutin harjoitus, enkä ole koskaan nähnyt kenenkään tekevän sitä niin, ettei mitään löytyisi.
← Kaikki kirjoitukset