2026. gada 27. augusts · datu inženierija

Jūsu simbolu kopa ir laika mašīna: izdzīvošanas novirze kriptovalūtu beztermiņa fjūčeru atpakaļtestos

Jūsu simbolu kopa ir laika mašīna: izdzīvošanas novirze kriptovalūtu beztermiņa fjūčeru atpakaļtestos

Jūs atsūtījāt man piezīmju grāmatiņu svētdienas vakarā, un kopš tā laika tā ir atvērta otrajā monitorā. Šķērsgriezuma moments, 150 populārākie Binance USDⓈ-M beztermiņa fjūčeri pēc 30 dienu dolāru apgrozījuma, iknedēļas līdzsvarošana, garā pozīcija augšējā decilē, īsā — apakšējā, no 2021-01 līdz 2026-06. Sharpe 2.31, maksimālais kritums 14.2%, un izmaksu modelis, kas man šķita godprātīgs: ieeja kā taker, izeja kā taker, finansējums uzkrāts par katru intervālu, slīdes komponents, kas mainās atkarībā no jūsu pozīcijas lieluma salīdzinājumā ar orderu grāmatu. Sarežģītākās daļas bijāt paveicis pareizi. Tad jūs jautājāt, kāpēc sešas papīra tirdzniecības nedēļas beigušās bez rezultāta un vai priekšrocība ir izzudusi.

Tā neizzuda. Tā nekad nebija iekļauta atpakaļtestā. Apskatiet 4. šūnu:

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

Jūs izsaucāt šo galapunktu 2026. gada jūnijā un izmantojāt atbildi, lai noteiktu, ko drīkstēja tirgot 2021. gada martā. Pēc definīcijas visi šajā sarakstā iekļautie simboli bija izdzīvojuši līdz 2026. gada jūnijam. Tā ir visa kļūda, un tās ietekme ir lielāka nekā pārējā jūsu izmaksu modeļa kopējā ietekme.

2.31 → 0.74Sharpe rādītājs: izdzīvojušo saraksts pret konkrētā laika brīža datiem
~1 no 5no jūsu 2021. gada kopas vairs neeksistē
380 KBikdienas exchangeInfo momentuzņēmums saspiestā gzip formātā

Ko galapunkts jums nepateiks

Vietnē exchangeInfo nav vēstures. Nav parametra asOf, arhīva vai izmaiņu žurnāla. Tas ir pašreizējā brīža momentuzņēmums, un Binance nekad nav solījis neko citu. Kad līgumu izslēdz no tirdzniecības, tā ieraksts tiek dzēsts no atbildes, un API kontekstā šis simbols pārstāj eksistēt. Kopš 2019. gada Binance ir iekļāvis vairāk nekā 600 USDⓈ-M beztermiņa līgumu un izņēmis no aprites krietni vairāk nekā simtu. BTS, COCOS, TOMO, RAY, FTT, SC un gara aste ar 2021. gada altsezonas līgumiem, kuriem bija viens spožs ceturksnis, bet pēc tam apgrozījums saruka, līdz platforma tos izņēma.

Padomājiet, kurus nosaukumus iecienītu 30 dienu momentuma atlase. Ne jau BTC. Tā iecienītu aktīvu, kura cena tikko trīskāršojusies pēc iekļaušanas tirdzniecībā un Twitter ažiotāžas. Šo aktīvu kopa lielā mērā pārklājas ar tiem, kurus vēlāk izņem no tirdzniecības, bet jūsu kopas filtrs šo pārklājumu izslēdza.

Es atkārtoju jūsu testu, izmantojot mūsu momentuzņēmumu arhīvu un konkrētā laika brīža kopu, ar to pašu signālu un tām pašām izmaksām. Sharpe rādītājs bija 0.74, bet kritums — 31%. Aptuveni divas piektdaļas starpības rada no tirdzniecības izņemtie aktīvi, kurus jums nemaz nebija ļauts turēt. Vēl ceturtdaļu rada spoguļproblēma, kas ir mazāk uzkrītoša un, manuprāt, jums patiks vēl mazāk.

Otra laika mašīnas puse: simboli, kas vēl neeksistēja

Jūsu pazīme ir 90 dienu ienesīgums. Jūsu slīdošais logs ir min_periods=20, jo jūs to reiz iestatījāt, lai ieskriešanās periods neiznīcinātu parauga pirmo ceturksni, un pēc tam pie tā vairs neatgriezāties. Tāpēc līgums, kas tirdzniecībā pieejams tikai 21 dienu, saņem momentuma vērtējumu, kas aprēķināts no trīs nedēļu cenu kustības pēc iekļaušanas. Tas aptuveni vienmēr ierindojas augšējā decilē, ja vien iekļaušana bijusi veiksmīga, un nonāk jūsu portfelī.

Šo daļu varētu uzskatīt par pieņemamu. Taču nepieņemama ir šī: jūsu datu nodrošinātājs dažiem simboliem pievienojis vēsturiskus spot vai indeksa datus no laika pirms beztermiņa līguma pastāvēšanas, tāpēc vairākiem līgumiem kline vēsture sākas pirms to pašu onboardDate. To var pārbaudīt aptuveni minūtes laikā. Savienojiet cenu tabulu ar iekļaušanas datumiem un saskaitiet rindas, kas ir pirms iekļaušanas. Jūsu datos ir 41 simbols ar svecēm pirms iekļaušanas, un viens no tiem 2023. gada vasarā nodrošina 6% pieaugumu kapitāla līknē vienas nedēļas laikā, pateicoties pozīcijai līgumā, kas vēl neeksistēja deviņas dienas.

Biržas simbols nav identifikators. Tas ir biržas iznomāta etiķete, ko reizēm iznomā divreiz.

Te jāpiemin arī pārdēvēšana. MATICUSDT kļuva par POLUSDT. FTMUSDT kļuva par SUSDT pēc 1:1 konversijas. 2022. gada maija LUNA situācijas rezultātā radās LUNCUSDT un vēlāk pilnīgi jauns LUNAUSDT, kam ir tā pati simbola sakne kā aktīvam, kurš zaudēja gandrīz visu vērtību. Ja datu ielādētājs izmanto simbola virkni kā atslēgu un apvieno visus atrastos failus, jūsu datos ir vismaz viena laikrinda ar pārrāvumu, ko nav izraisījusi cenas kustība, un jūsu momentuma pazīme šo pārrāvumu uztvers kā spēcīgāko signālu visā šķērsgriezumā.

Viss pārējais, kas pa šo laiku mainās

Kad pieņemat, ka simbolu saraksts mainās laika gaitā, tas pats attiecas uz katru citu šīs atbildes lauku. Jūs visiem izmantojat šodienas vērtības.

LauksKā tas maināsKas tiek sabojāts
statusTRADING → SETTLING → pazūdIzdzīvošanas novirze; fiktīvas izejas par slēgšanas cenu, par kādu tirdzniecība nekad nav notikusi
onboardDateKatru nedēļu tiek iekļauti jauni simboli; izslēgtiem simboliem šīs vērtības navTirdzniecība ar līgumiem pirms to pastāvēšanas
tickSize / stepSizeTiek pielāgoti, mainoties cenu līmeņiemOrderu noapaļošana un limita cenas, kuras tiktu noraidītas
minNotionalLaika gaitā paaugstināts nelikvīdās orderu grāmatāsNelielas pozīcijas, kuras jūsu tiešsaistes maršrutētājs noraidītu
fundingIntervalHours8h gadiem ilgi, pēc tam daudziem simboliem 4h vai 1hFinansējuma izmaksas kļūdainas 2–3× apmērā tieši tiem altkoiniem, kurus atlase tur portfelī
leverage bracketsPārskatīti līmeņi un uzturēšanas maržaLikvidācijas modelēšana un maržas kapacitāte

Jūsu gadījumā visvairāk kaitē finansējuma izmaiņas. Jūsu uzkrāšanas cikls pieņem, ka visā vēstures periodā dienā notikuši trīs maksājumi. Būtiska altkoinu portfeļa daļa pārgāja uz finansējumu ik pēc četrām stundām, un jūsu simulētā peļņa un zaudējumi lielā mērā rodas no īsajām pozīcijām aktīvos ar augstu finansējuma likmi. Te kļūda nav noapaļošanas robežās. Tā ir daudzkārtīga.

Arī izslēgšana no tirdzniecības ir notikums, ko jūs nemodelējat

Konkrētā laika brīža atkārtotajā testā es stratēģijai piešķīru izdevīgu izejas nosacījumu. Reālās izslēgšanas notiek pēc scenārija: paziņojums, parasti septiņas līdz četrpadsmit dienas iepriekš, pēc tam tikai pozīcijas samazinošu orderu periods un tad piespiedu norēķins pēc mark cenas. Paziņojums ir publiski pieejama informācija, un jūs varat rīkoties, tāpēc godprātīgā simulācijā jāiziet no pozīcijas paziņojuma dienas slēgšanas cenā. Taču tipiska altkoina izslēgšanas gadījumā šī cena jau ir par 10-20% zemāka nekā iepriekšējā nedēļā, orderu grāmata ir plāna, un jūsu slīdes komponentam jāņem vērā, ka notiek tirdzniecība citā režīmā. Ja jūsu izpildes dzinējs piešķir jums norēķinu cenu bez ietekmes uz tirgu, jūs nemanāmi esat padarījis mirstošus aktīvus tirgojamus par patieso vērtību.

Ja nekad neesat arhivējis exchangeInfo, vēl nekas nav zaudēts. Publiskajā izdrukā vietnē data.binance.vision/data/futures/um/monthly/klines/ joprojām ir direktorijas ar izslēgtiem simboliem ilgi pēc tam, kad API tos aizmirsis. Iegūstiet direktoriju sarakstu, un katra simbola pirmais un pēdējais mēneša fails sniegs izmantojamu iekļaušanas un izslēgšanas laika logu bez datu piegādātāja. Tā ir rekonstrukcija, nevis arhīva ieraksts, un ar to nevarēs atgūt cenas soli vai finansējuma intervālus. Taču tā pateiks, kuri simboli un kad pastāvēja, un tas ir 80% no pirmdienai nepieciešamā.

Ko es ieteiktu izveidot, pirms atkal ķeraties pie signāla

  1. Cron uzdevumu, kas katru dienu iegūst exchangeInfo no katras jūsu pētītās platformas un saglabā to objektu krātuvē, izmantojot datumu kā atslēgu. Saspiesti gzip formātā dati aizņem mazāk nekā pusi megabaita. Desmit gadu datu glabāšana S3 izmaksās nenozīmīgi maz, bet sniegs pētniecības iespējas, ko vēlāk nevarēsiet nopirkt.
  2. No šiem momentuzņēmumiem atvasinātu aktīvu pamatdatu tabulu: viena rinda katrai kombinācijai (venue, symbol, valid_from, valid_to) ar pilnu lauku kopu. Salīdziniet secīgus momentuzņēmumus, lai to ģenerētu, un katras lauka izmaiņas gadījumā izveidojiet jaunu rindu.
  3. Kopas funkciju ar obligātu laika zīmoga argumentu. universe(ts), nekad universe(). Iestatiet tādu noklusējumu, kas neļauj nevienam, arī jums pašam nākotnē naktī pulksten 1, nejauši izmantot izdzīvojušo sarakstu.
  4. Pirms iekļaušanas datu ielādētājā veiciet pārbaudi: neviena svece nedrīkst būt pirms onboard_ts mīnus vienas dienas. Apturiet izpildi, nevis parādiet brīdinājumu.
  5. Stabilu iekšēju instrumenta ID, kas paliek nemainīgs arī pēc pārdēvēšanas, bet simbolu padariet par atribūtu. Piešķiriet POL un MATIC vienu ID un atzīmējiet nominālvērtības maiņu, lai nepārtrauktības loģika varētu atteikties tos savienot.

Izdariet to un palaidiet testu vēlreiz. Domāju, ka rezultāts būs tuvu manam 0.74, un tad interesantais jautājums būs, vai 0.74, kurā iekļauti arī izslēgtie aktīvi, ir kaut cik vērtīgs papīra tirdzniecībai. Iespējams. Šķērsgriezuma moments beztermiņa fjūčeros nav tukša skaņa, un daļa no tā, kas paliks pēc kopas labošanas, būs īsts ienesīgums no īsās puses. Jūs arī redzēsiet, ka papīra tirdzniecības rezultāti un atpakaļtests sāk sakrist, jo papīra tirdzniecība vienmēr izmantoja konkrētā laika brīža kopu. Tai nebija citas izvēles.

P.S. Šī problēma nav raksturīga tikai kriptovalūtām, tā vienkārši ir izteiktāka. Akciju pētnieki cīnās ar no tirdzniecības izņemto uzņēmumu ienesīguma un pārstrādātu biržas simbolu problēmu kopš CRSP sāka tos piegādāt, bet prognožu tirgos šī parādība sasniedz galējību: katram līgumam pēc definīcijas beidzas termiņš, tāpēc visu kopu veido iekļaušana un izzušana. Ja kādreiz pārnesīsiet šo atlasi uz Kalshi, vispirms izveidojiet aktīvu pamatdatu tabulu. Tur nav cita veida vēstures.

izdzīvošanas novirzedati konkrētā laika brīdīkriptovalūtu fjūčeriatpakaļtestēšanadatu inženierija
← Visi raksti