2026. szeptember 1. · vállalati események

Splitre korrigált adatok szétszedve: mit tesz az NVDA 10:1 arányú részvényfelosztása az összes mögöttes sorral

Splitre korrigált adatok szétszedve: mit tesz az NVDA 10:1 arányú részvényfelosztása az összes mögöttes sorral

Íme egy sor egy napi részvényadatfájlból. NVDA, 2024. június 7., péntek, az utolsó kereskedési nap a 10:1 arányú split életbe lépése előtt.

Oszlop Érték
date 2024-06-07
close 1208.88
volume 42,800,000 (kerekítve)
split_factor 1.0
dividend 0.00
adj_close 120.8781

Az OHLC oszlopokat szándékosan hagytam ki ebből a nézetből. A cikk vége felé visszatérünk rájuk, mert éppen ezek okoznak észrevétlenül hibát.

Ebben a sorban minden érdekes a második és a hatodik oszlop közötti különbségben rejlik. Június 7-én a piaci árfolyam 1208.88-at mutatott. Ezen az áron többé senki sem fog kereskedni, mert az az egységként értett részvény, amelyre ez az ár vonatkozott, már nem létezik. A 120.8781 egy rekonstruált érték, és nem egyszerűen a 1208.88 tizede. Nézzük végig oszlopról oszlopra.

10:1minden korábbi sorra alkalmazott osztó
0.99991789egy nappal később rögzített osztalékfaktor
$90fiktív jutalék oda-vissza kereskedésenként
5.6ppaz osztó által kitalált éves hozamcsökkenés

date: 2024-06-07, és a másik két fontos dátum

A splitet 2024. május 22-én, az eredményközléssel együtt jelentették be. A tulajdonosi nyilvántartás fordulónapja június 6. volt. Június 10-én, hétfőn indult a kereskedés split utáni alapon. Három dátum van, az adatszolgáltatód split_factor oszlopa pedig pontosan az egyikhez igazodik, jellemzően az első split utáni kereskedési naphoz. Az egy napos eltolás a leggyakoribb vállalati eseményekkel kapcsolatos hiba, amellyel találkozom, és összesített adatokban láthatatlan: a részvénygörbéd egyetlen nap alatt 90%-ot zuhan vagy 900%-ot ugrik, amit a 2,000 napon számolt Sharpe alig jelez, a maximális visszaesés vagy a stop-loss szabály viszont nagyon is.

Az osztaléknak is van dátumproblémája, ráadásul 2024-ben mindenki alatt megváltozott. Az NVDA split utáni, negyedéves osztaléka részvényenként $0.01 volt, a tulajdonosi nyilvántartás fordulónapja pedig június 11. Az amerikai elszámolás 2024. május 28-án T+1-re állt át, vagyis a szelvényvágás napja és a fordulónap most már egybeesik. Minden olyan betöltő, amely a szelvényvágás napját úgy számítja ki, hogy „a fordulónap előtti munkanap” — ami évtizedeken át helyes volt —, 2024 júniusától észrevétlenül egy kereskedési nappal korábbra teszi az osztalékkorrekciót. Nem keletkezik hiba. A faktor egyszerűen rossz sorra kerül.

A vállalati eseményeket kezelő kód hibája sosem kivétel. Hanem egy nappal elcsúszott, teljesen hihetőnek látszó szám.

close: 1208.88 — az ár, amely nincs benne a fájlban

Ez a nyers árfolyam, és a legtöbb kutatási folyamatban csak egy olyan oszlopban szerepel, amelyet senki sem olvas. A jelzések a adj_close alapján készülnek. Minden olyan szabály pedig, amely dollárban megadott, részvényenkénti árszintre hivatkozik, most egy olyan számot használ, amelyet egyetlen piaci szereplő sem látott.

Az NVDA 2024 tavaszán az 1,000 dollár felé tartó menetelése valós esemény volt, valódi megbízási forgalommal a háttérben: a kerek árak vonzották az árfolyamot, az opciós kötési árak a 950 és 1000 körüli szinteken csoportosultak, minden közelítésnél címlapkockázat merült fel. A korrigált adatokban ez az egész epizód 100 dolláron zajlik. Ha pszichológiai árszintek viselkedését, kerek árak körüli réstöltési logikát vagy a kötési ár közelségét mérő jellemzőt tesztelsz, akkor egy olyan ársoron teszteled, amelyet egy akkor még be sem következett esemény skálázott át.

Ugyanez érvényes az univerzum szűrésére. Az „5 dollár alatti részvények kizárása” valós piaci mikrostruktúra-problémák érvényes közelítő mutatója: széles relatív spreadek, fedezeti szabályok, tickméretek. Korrigált múltbeli adatokon futtatva olyan időszakokban zárod ki a cégeket, amikor 30 dolláron kereskedtek velük, és csak később hajtottak végre fordított splitet. Ha azt futtatod, hogy „árfolyam 500 dollár felett”, az NVDA-t észrevétlenül minden 2024. június előtti évből kizárod. Az árszűrőket korrigálatlan árfolyamokra kell alkalmazni. Pont.

split_factor: 1.0 — és a következő sorban lévő 0.1

A faktor egy, a mai naptól visszafelé haladó kumulatív szorzat. 2024. június 10. előtt minden sorra rákerül a splitből adódó 0.1, megszorozva a 2021-es 4:1 arányú split 0.25 értékével, és az összes korábbival. Az NVDA 2021 előtti múltbeli adatai 0.025-tel vannak skálázva, így a 2019-ben 200 dolláron forgó gyertya 5.00 dollárként jelenik meg.

Két következményt érdemes észben tartani. Először is, a korrigált múltbeli adatok megváltoznak, valahányszor új vállalati esemény történik. A 2024 májusában futtatott backteszted és a mai futtatás azonos kódon, azonos dátumokra eltérő számokat ad, és ha a jellemzőket értékpapír-azonosító és dátum alapján gyorsítótáraztad, adatverzió-megjelölés nélkül, akkor most két különböző skálát keverő gyorsítótárad van. Pontosan ezért építjük be a korrekciós korszakot a jellemző kulcsába; egy nagyon zavaros délutánunkba került, mire ezt megtanultuk.

Másodszor, 0.025-ös skálázásnál egy részvény, amely 0.01-es tickekkel forgott, most 0.00025-ös lépésekben mozog. A tickkerekítési logikád, az „új csúcsot értünk-e el” összehasonlításaid, a lebegőpontos egyenlőségvizsgálataid: mind olyan felbontáson működnek, amely jóval finomabb annál, mint amit a piac valójában használt.

dividend: 0.01 — az érték, amely az összes korábbi árfolyamot kiveszi a centes rácsból

Egy cent. Zajnak tűnik, pedig emiatt mutat a adj_close 120.888 helyett 120.8781-et.

A június 10-i záróár 121.79 volt. Az osztalék miatti korrekciós faktor: (121.79 − 0.01) / 121.79 = 0.99991789. Ez a faktor megszoroz minden június 11. előtti árfolyamot, így a splitkor korrigált 120.888-ból 120.878074 lesz. Apró változás, de végleges, és az NVDA múltjának nagyjából hatvan, sőt több szelvényvágási napjánál újra alkalmazzák. Az összetett hatás számít: mire 2015-höz érünk, olyan árfolyamot látunk, amelyet több tucat, enyhén irracionális faktor szorzott meg. Egyetlen korrigált történelmi árfolyam sem esik a centes rácsra.

Ez azt jelenti, hogy minden == kerek árszinttel való összehasonlítás hibás, minden „elértük-e a limitárat” ellenőrzéshez tűrés kell, és a rekonstruált OHLC már nem teljesíti azt az invariánst, hogy low ≤ open ≤ high, ha naivan 4 tizedesjegyre kerekítünk. Azt is jelenti, hogy a adj_close teljes hozamú idősor, míg a close árfolyamhozam-idősor; ha az egyikből számolsz hozamot, a másikból pedig visszaesést, két eltérő definíciót keversz arról, mi történt.

volume: 42,800,000 — az osztó, amelyet senki sem következetesen alkalmaz

A részvényforgalmat 10-zel kell megszorozni, hogy összehasonlítható legyen a split utáni kereskedési napokéval. Egyes adatszolgáltatók megteszik. Mások nem. Némelyik a OHLC-adatokat korrigálja, a forgalmat viszont nyersen hagyja; ez a három közül a legrosszabb, mert a fájl belsőleg következetesnek tűnik, amíg meg nem szorzod az árat a forgalommal.

A legjobb megoldás az, ha többé nem használsz részvényforgalmat jellemzőként, hanem dollárforgalmat, amely a konstrukciójánál fogva invariáns a splitekre. Egy 20 napos átlagos dollárforgalomra épülő likviditási szűrőhöz egyáltalán nincs szükség korrekciós logikára, és vállalati esemény sem tudja elrontani. A jellemzők invarianciája többet ér a helyes korrekciós kódnál, mert a helyes korrekciós kód olyan dolog, amelynél folyamatosan helyesen kell eljárnod.

Az adatszolgáltatói fájlok 3 változata, 3 hibalehetőség.

Mit tartalmaz Mi romlik el
Csak a korrigált záróár, nyers OHLC A rések és a napon belüli logika két árskálán számol
Korrigált OHLC, nyers forgalom A dollárforgalom a split arányával eltér; az ADV-szűrők hibásan működnek
Nyers OHLCV és faktoroszlopok Semmi, ha alkalmazod őket. Minden, ha rossz soron alkalmazod őket

A hiányzó oszlopok: adj_open, adj_high, adj_low

Tegyük vissza az OHLC-t. Ha egy adatfolyam csak a záróárat korrigálja, a stratégiád pedig a open / prev_adj_close − 1 alapján számítja az éjszakai rést, akkor 2024. június 10-én a 120.37 / 120.8781 − 1 műveletet végzi el, ami megfelelő érték, nagyjából −0.4%. Ugyanezt a kódot 2024. június 7-re visszafuttatva a nyers fájlból veszi a nyitóárat (körülbelül 1207), egy korábbi splitek miatt 0.025-tel korrigált záróárhoz viszonyítja, és több ezer százalékos rést ad.

Minden olyan számítás, amely nyers és korrigált oszlopot kever, két koordinátarendszer közötti művelet. Most már a vegyes korrekciójú adatok beolvasását betöltőszintű ellenőrzéssé tettem, mert egy kutatónak sem kell ezt észben tartania — nekem sem.

Amit egyetlen oszlop sem árul el: ténylegesen hány részvényt vettél volna

Ez az, ami pénzbe kerül a backteszt költségmodelljében, és ezért írok egyáltalán a részvényfelosztásról.

Az amerikai részvényeknél gyakori a részvényenkénti jutalék. Legyen ez $0.005, $1.00 minimális megbízási díjjal, ami gyakori, fix díjas lakossági brókerszint. Most tesztelj vissza egy $400,000 értékű NVDA-pozíciót a split előtti évből, amikor a nyers árfolyam 400 dollár körül volt, a korrigált árfolyam pedig 40 dollárként jelenik meg.

Részvényszám Jutalék
Ami ténylegesen történt (nyers $400) 1,000 $5.00
Amit a backteszt lát (korrigált $40) 10,000 $50.00

Ugyanaz a kitettség, ugyanaz az ügylet, a modellezett költség mégis 10-szeres. Lábanként $45 a fikció, oda-vissza $90, egy naponta forgó stratégia pedig évente körülbelül $22,000 olyan költséget emészt fel, amely sosem létezett. Egy $400k-s portfóliónál ez 5.6 százalékpontnyi éves hozam, amelyet teljes egészében egy osztó fabrikál. Itt a valóságnál rosszabbnak tüntet fel, ami még elviselhető.

A fordított splitek ellenkező irányban hatnak, és ez a veszélyes irány. Egy 1:10 arányú fordított split miatt a korrigált múltbeli adatokban az árak 10-szer magasabbak, a részvényszám pedig 10-szer alacsonyabb annál, mint amivel kereskedtél volna. A költségmodell észrevétlenül tizedeli a részvényenkénti jutalékot. A fordított splitek gyakoriak a kis kapitalizációjú, 5 dollár alatti, széles spreaddel kereskedő részvényeknél, ahol a részvényenkénti díjak jelentik a költségek legnagyobb tételét. A backteszt éppen azokat a részvényeket állítja be hízelgőbb színben, amelyeket büntetnie kellene.

A megoldás egyszerű és szerkezeti: a pozíciókat dollárban méretezd, majd az adott dátum korrigálatlan árfolyamával váltsd át részvényszámra, és erre a darabszámra számítsd fel a részvényenkénti díjakat. A nyers árfolyam oszlopát örökre tartsd meg a betöltőben: ne csak ellenőrzési adatként, hanem a végrehajtási motor aktív bemeneteként.

  1. Jelzések és hozamok: korrigált idősor.
  2. Részvényszám, részvényenkénti díjak, tickkerekítés, árszintszűrők: korrigálatlan idősor.
  3. Likviditás és kapacitás: dollárforgalom, amely egyikre sem szorul.

Hat oszlop, egy sor, egy meglehetősen hétköznapi vállalati esemény, amelyet 3 héttel előre bejelentettek, és senkit sem lepett meg. A piac egy délelőtt alatt feldolgozta. Egy kutatási folyamatban ennek hű rekonstruálása ennél jóval nehezebb, és szinte sosem hibaüzenetből derül ki, ha a folyamat nem boldogul vele.

vállalati eseményeksplitkorrekcióamerikai részvényekadatmérnökségbacktesztelés
← Összes bejegyzés