2026 m. rugpjūčio 27 d. · duomenų inžinerija

Jūsų simbolių visata – laiko mašina: išlikimo šališkumas kriptovaliutų perpetual sandorių atgaliniuose testuose

Jūsų simbolių visata – laiko mašina: išlikimo šališkumas kriptovaliutų perpetual sandorių atgaliniuose testuose

Sekmadienio vakarą atsiuntėte man užrašinę, ir nuo tada ji atverta antrame monitoriuje. Skerspjūvio momentum strategija, 150 didžiausią 30 dienų dolerinę apyvartą turinčių Binance USDⓈ-M perpetual sandorių, savaitinis balansavimas, ilgoji pozicija viršutiniame decilyje ir trumpoji apatiniame, laikotarpis nuo 2021-01 iki 2026-06. Sharpe 2.31, didžiausias nuosmukis 14.2 %, o kaštų modelis man atrodė sąžiningas: įeinama kaip taker, išeinama kaip taker, finansavimo mokėjimai kaupiami kas intervalą, praslydimo koeficientas didėja pagal jūsų pozicijos dydį ir pavedimų knygos gylį. Sunkiausius darbus atlikote gerai. Tada paklausėte, kodėl šešios popierinės prekybos savaitės baigėsi be rezultato ir ar pranašumas išnyko.

Jis neišnyko. Jo atgaliniame teste niekada ir nebuvo. Pažiūrėkite į 4 langelį:

info = requests.get(BASE + "/fapi/v1/exchangeInfo").json()
symbols = [s["symbol"] for s in info["symbols"]
           if s["status"] == "TRADING" and s["quoteAsset"] == "USDT"]

Šį galinį tašką iškvietėte 2026 m. birželį ir pagal gautą atsakymą nusprendėte, kuo buvo galima prekiauti 2021 m. kovą. Pagal apibrėžimą tame sąraše buvo tik simboliai, išlikę iki 2026 m. birželio. Štai ir visa klaida; jos poveikis didesnis nei viso likusio kaštų modelio kartu sudėjus.

2.31 → 0.74Sharpe: išlikusių sąrašas ir istorinis sąrašas
~1 iš 52021 m. visatos simbolių nebeegzistuoja
380 KBkasdienė exchangeInfo kopija, suspausta gzip formatu

Ko galinis taškas nepasakys

exchangeInfo neturi istorijos. Nėra parametro asOf, archyvo ar pakeitimų žurnalo. Tai dabarties nuotrauka, ir Binance niekada nežadėjo nieko daugiau. Kai kontraktas pašalinamas iš prekybos, jo įrašas dingsta iš atsakymo, o API požiūriu nustoja egzistuoti ir jo žymeklis. Nuo 2019 m. Binance įtraukė į sąrašą daugiau kaip 600 USDⓈ-M perpetual sandorių ir pašalino gerokai daugiau nei šimtą. BTS, COCOS, TOMO, RAY, FTT, SC ir ilga 2021 m. altkoinų sezono kontraktų uodega: kiekvienas turėjo vieną šlovingą ketvirtį, paskui prekyba išseko, kol birža juos pašalino.

Pagalvokite, kuriuos simbolius mėgsta 30 dienų momentum filtras. Ne BTC. Jam patinka tai, kas ką tik patrigubėjo po įtraukimo į sąrašą ir Twitter ažiotažo. Šios grupės ir galiausiai iš prekybos pašalinamų simbolių grupės smarkiai persidengia, o jūsų visatos filtras šį persidengimą ištrynė.

Pakartojau jūsų analizę su mūsų archyvo kopijomis ir istorine visata, palikau tą patį signalą bei kaštus. Gauta Sharpe reikšmė buvo 0.74, o nuosmukis – 31 %. Maždaug du penktadalius skirtumo sudaro pašalinti simboliai, kurių jums niekada nebuvo galima turėti. Dar ketvirtadalį lemia atvirkštinė problema – subtilesnė ir, įtariu, jums mažiau patiksianti.

Kitas laiko mašinos galas: simboliai, kurių dar nebuvo

Jūsų požymis yra 90 dienų grąža. Slankusis langas nustatytas į min_periods=20, nes vieną kartą taip pasirinkote, kad apšilimo laikotarpis neišmestų pirmojo imties ketvirčio, ir daugiau prie to negrįžote. Taigi prieš 21 dieną į prekybą įtrauktam kontraktui momentum balas skaičiuojamas pagal trijų savaičių kainų pokyčius po įtraukimo į sąrašą; kai listingas sekasi, jis beveik visada patenka į viršutinį decilį ir į jūsų portfelį.

Ši dalis dar gali būti laikoma pagrįsta. Štai kas nepagrįsta: jūsų duomenų tiekėjas dalį šių simbolių papildė iki perpetual sandorio sukūrimo buvusiais spot arba indekso duomenimis, todėl kai kurių kontraktų žvakių istorija prasideda anksčiau nei jų pačių onboardDate. Tai patikrinti užtruks maždaug minutę. Sujunkite kainų lentelę su įtraukimo į prekybą datomis ir suskaičiuokite, kiek eilučių yra ankstesnės už šią datą. Jūsų duomenyse 41 simbolis turi įtraukimo datą ankstesnių žvakių, o vienas jų 2023 m. vasarą kreivę kilstelėjo 6 % per vieną savaitę dėl pozicijos kontrakte, kuris prekyboje pasirodė tik po devynių dienų.

Žymeklio eilutė nėra identifikatorius. Tai biržos išnuomojama etiketė, kartais išnuomojama du kartus.

Tai veda prie pavadinimų keitimo. MATICUSDT tapo POLUSDT. FTMUSDT po 1:1 konversijos tapo SUSDT. 2022 m. gegužės LUNA atveju liko LUNCUSDT, o vėliau atsirado visiškai naujas LUNAUSDT, kurio žymeklio šaknis sutampa su simboliu, praradusiu beveik viską. Jei duomenų įkėlimo procesas raktą sudaro pagal simbolio eilutę ir sujungia rastus failus, turite bent vieną seką su lūžiu, kurį sukėlė ne kainos pokytis, o momentum požymis šį lūžį palaikys stipriausiu viso skerspjūvio signalu.

Visa kita, kas laikui bėgant kinta

Pripažinus, kad simbolių sąrašas kinta laikui bėgant, tas pats galioja ir kiekvienam kitam atsakymo laukui. Visur naudojate šiandienos reikšmes.

LaukasKaip kintaKas sugenda
statusTRADING → SETTLING → pašalintasIšlikimo šališkumas; tariami išėjimai už uždarymo kainą, kuria niekas neprekiavo
onboardDateKas savaitę atsiranda naujų listingų; nebelieka pašalintų simbolių duomenųPrekyba kontraktais dar prieš jiems atsirandant
tickSize / stepSizeKeičiama kintant kainų lygiamsPavedimų apvalinimas ir limitinės kainos, kurios būtų atmestos
minNotionalLaikui bėgant didinama mažo likvidumo knygoseMažos pozicijų dalys, kurias jūsų tiesioginės prekybos maršrutizatorius atmestų
fundingIntervalHoursDaugelį metų 8h, vėliau daugeliui simbolių – 4h arba 1hFinansavimo pajamos ar sąnaudos apskaičiuojamos 2–3× netiksliau būtent tiems altkoinams, kuriuos laiko jūsų filtras
sverto pakoposPeržiūrimos pakopos ir palaikomoji maržaLikvidavimo modeliavimas ir maržos pajėgumas

Jūsų atveju labiausiai kenkia finansavimo intervalo klaida. Jūsų kaupimo ciklas daro prielaidą, kad per visą istoriją mokėjimai vyko tris kartus per dieną. Nemaža altkoinų portfelio dalis perėjo prie finansavimo kas keturias valandas, o nemaža jūsų imituojamo pelno dalis gaunama iš trumpųjų pozicijų didelio finansavimo simboliuose. Čia apsirikote ne dėl apvalinimo. Skirtumas – kartai.

Pašalinimas iš prekybos yra įvykis, bet jūs jo nemodeliuojate

Istorinėje versijoje strategijai suteikiau palankias išėjimo sąlygas. Tikrovėje pašalinimas iš prekybos vyksta pagal scenarijų: paskelbiamas pranešimas, paprastai prieš 7–14 dienų, tada leidžiamas tik pozicijos mažinimas, o galiausiai priverstinai atsiskaitoma pagal žymeklio kainą. Pranešimas yra vieša informacija, kuria galite pasinaudoti, todėl sąžininga simuliacija numato išėjimą pranešimo dienos uždarymo kaina. Tačiau tipiško altkoino atveju ši uždarymo kaina jau būna 10-20 % mažesnė nei ankstesnę savaitę, pavedimų knyga yra sekli, o praslydimo modelis turi atsižvelgti į kitokį rinkos režimą. Jei pavedimų vykdymo variklis priskiria atsiskaitymo kainą be jokio poveikio rinkai, tyliai leidžiate prekiauti mirštančiu turtu tikrąja verte.

Jei niekada nearchyvavote exchangeInfo, dar ne viskas prarasta. Viešame duomenų rinkinyje, esančiame data.binance.vision/data/futures/um/monthly/klines/, delistintų simbolių katalogai saugomi dar ilgai po to, kai API juos pamiršta. Išvardiję katalogus, pagal pirmą ir paskutinį kiekvieno simbolio mėnesio failą galėsite apytikriai nustatyti įtraukimo ir pašalinimo iš prekybos laikotarpius be jokio duomenų tiekėjo. Tai rekonstrukcija, ne įrašas, ir ji neatkurs kainos žingsnių ar finansavimo intervalų. Tačiau parodys, kas ir kada egzistavo – o pirmadienį jums reikia būtent maždaug 80 % reikiamų duomenų.

Ką siūlyčiau sukurti prieš vėl keičiant signalą

  1. Cron užduotį, kuri kasdien iš kiekvienos jūsų tiriamos biržos gauna exchangeInfo ir įrašo jį į objektų saugyklą, raktą sudarydama pagal datą. Suspaustas gzip formatu failas nesiekia pusės megabaito. Dešimt metų kainuos vos pastebimą S3 išlaidų dalį ir suteiks tyrimų galimybę, kurios vėliau nenusipirksite.
  2. Iš šių momentinių kopijų sudarytą turto žinyną: po vieną eilutę kiekvienam (venue, symbol, valid_from, valid_to), su visais laukais. Lyginkite gretimas kopijas ir taip jį sudarykite; kiekvieną lauko pakeitimą laikykite nauja eilute.
  3. Visatos funkciją, kuriai būtinas laiko žymos argumentas. universe(ts), niekada universe(). Pasirinkite tokią numatytąją elgseną, kad niekas, įskaitant būsimą jus 1 val. nakties, negalėtų netyčia pasinaudoti išlikusių simbolių sąrašu.
  4. Duomenų įkėlimo procese įdiekite patikrą, kad nė viena žvakė nebūtų ankstesnė už onboard_ts minus vieną dieną. Sustabdykite vykdymą, neapsiribokite įspėjimu.
  5. Stabilų vidinį instrumento ID, kuris nekinta pakeitus pavadinimą, o žymeklį laikykite atributu. POL ir MATIC priskirkite tam pačiam ID, o redenominacijas pažymėkite, kad tęstinumo logika atsisakytų sujungti šias sekas.

Tai padarę, paleiskite analizę iš naujo. Spėju, gausite maždaug mano 0.74 rezultatą, o tada pagrindinis klausimas bus, ar 0.74, įtraukus nebeišlikusius simbolius, turi ką nors vertingo popierinei prekybai. Galbūt. Perpetual sandorių skerspjūvio momentum strategija nėra bevertė, o dalis po visatos pataisymo likusio rezultato yra tikrosios pajamos iš trumposios pusės. Taip pat pamatysite, kad popierinės prekybos rezultatai ims sutapti su atgalinio testo rezultatais, nes popierinėje prekyboje visada naudota istorinė visata. Ji neturėjo kito pasirinkimo.

P. S. Tai ne vien kriptovaliutoms būdinga keistenybė, čia ji tiesiog labiau išryškėja. Akcijų tyrėjai kovoja su delistingų grąža ir pakartotinai naudojamais žymekliais nuo tada, kai CRSP pradėjo juos teikti. Prognozių rinkose tai pasiekia kraštutinumą: kiekviena sutartis pagal apibrėžimą baigiasi, tad visatą sudaro vien nauji listingai ir pasibaigusios sutartys. Jei kada perkelsite šį filtrą į Kalshi, pirmiausia sukurkite turto žinyną. Ten kitokios istorijos nėra.

išlikimo šališkumasistoriniai duomenyskriptovaliutų ateities sandoriaiatgalinis testavimasduomenų inžinerija
← Visi įrašai