2026 m. rugsėjo 1 d. · įmonių veiksmai

Splitais pakoreguoti duomenys išnarstyti: ką NVDA 10:1 splitas padaro kiekvienai eilutei

Splitais pakoreguoti duomenys išnarstyti: ką NVDA 10:1 splitas padaro kiekvienai eilutei

Štai viena eilutė iš dienos akcijų duomenų failo. NVDA, 2024 m. birželio 7 d., penktadienis – paskutinė sesija prieš įsigaliojant 10:1 splitui.

Stulpelis Reikšmė
data 2024-06-07
uždarymo kaina 1208.88
apyvarta 42,800,000 (suapvalinta)
split_factor 1.0
dividendas 0.00
adj_close 120.8781

Šiame vaizde OHLC stulpelius sąmoningai praleidau. Prie jų grįšime pabaigoje – būtent jie tyliai viską sugadina.

Įdomiausia šios eilutės dalis – tarpas tarp 2-ojo ir 6-ojo stulpelio. Birželio 7 d. prekybos juostoje užfiksuota 1208.88 kaina. Tokia kaina daugiau niekas neprekiaus, nes ja žymėtas akcijos vienetas nebeegzistuoja. 120.8781 yra rekonstruota reikšmė, ir ji nėra tiesiog 1208.88, padalinta iš dešimties. Panagrinėkime kiekvieną stulpelį iš eilės.

10:1daliklis, pritaikytas visoms ankstesnėms eilutėms
0.99991789dividendo koeficientas, įrašytas po dienos
$90išgalvoti komisiniai už visą sandorio ciklą
5.6ppdaliklio išgalvotas metinis nuostolis

data: 2024-06-07 ir dar 2 svarbesnės datos

Apie splitą paskelbta 2024 m. gegužės 22 d. kartu su finansiniais rezultatais. Įrašo data buvo birželio 6 d. Prekyba pagal splitu pakoreguotą kainą prasidėjo pirmadienį, birželio 10 d. Trys datos, o jūsų duomenų tiekėjo split_factor reikšmė priskirta tiksliai vienai iš jų – paprastai pirmai sesijai po splito. Vienos dienos poslinkis yra dažniausia mano matoma įmonių veiksmų apdorojimo klaida, ir bendruose rodikliuose jos nesimato: nuosavo kapitalo kreivėje atsiranda vienos dienos 90% kritimas arba 900% šuolis. Per 2,000 dienų skaičiuojamas Sharpe rodiklis vos į tai sureaguoja, bet didžiausias nuosmukis ar stop-loss taisyklė – tikrai taip.

Dividendas turi atskirą datos problemą, o 2024 m. taisyklė pasikeitė visiems. Po splito NVDA ketvirtinio $0.01 dividendo įrašo data buvo birželio 11 d. 2024 m. gegužės 28 d. JAV atsiskaitymo terminas sutrumpėjo iki T+1, todėl ex-date ir įrašo data dabar sutampa. Bet kuris duomenų įkėlimo procesas, nustatantis ex-date kaip „įrašo data minus viena darbo diena“ (dešimtmečius tai buvo teisinga), nuo 2024 m. birželio dividendų korekcijas tyliai pradėjo taikyti viena sesija per anksti. Jokia klaida nepranešama. Koeficientas tiesiog atsiduria ne toje eilutėje.

Įmonių veiksmus apdorojantis kodas niekada nesukelia išimties. Jis pateikia vienos dienos poslinkiu klaidingą, bet visiškai įtikinamai atrodančią reikšmę.

close: 1208.88 – kainos, kurios faile nėra

Tai pirminė sandorio kaina, o daugelyje tyrimų duomenų apdorojimo grandinių ji tėra stulpelis, kurio niekas neskaito. Signalai skaičiuojami pagal adj_close. O bet kuri taisyklė, kurioje nurodomas kainos lygis doleriais už akciją, dabar remiasi skaičiumi, kurio nematė nė vienas rinkos dalyvis.

2024 m. pavasarį NVDA kaina iš tiesų artėjo prie $1,000, ir tai buvo tikras reiškinys, kurį skatino realūs pavedimai: apvalūs skaičiai traukė kainą, opcionų vykdymo kainos telkėsi ties 950 ir 1000, o kiekvieną kartą artėjant prie jų kilo naujų antraščių rizika. Pakoreguotuose duomenyse visas šis epizodas vyksta ties $100. Jei tikrinate psichologinių kainų lygių poveikį, spragų užpildymo logiką šalia apvalių kainų ar atstumo iki vykdymo kainos požymį, tikrinate pagal kainų seką, kurią perskaičiavo dar neįvykęs įvykis.

Tas pats galioja visatos filtrams. „Neįtraukti akcijų, kurių kaina mažesnė nei $5“ yra pagrįstas realių mikrostruktūros problemų pakaitinis rodiklis: dideli santykiniai kainų skirtumai, tinkamumo užtikrinti maržą taisyklės, kainos žingsnio režimai. Pritaikę filtrą pakoreguotai istorijai, neįtrauksite bendrovių laikotarpiais, kai jų akcijos kainavo $30, o vėliau įvyko atvirkštinis splitas. Pasirinkę „kaina virš $500“, tyliai pašalinsite NVDA iš visų metų iki 2024 m. birželio. Kainos filtrus reikia taikyti pirminėms sandorių kainoms. Taškas.

split_factor: 1.0 – ir 0.1 kitoje eilutėje

Koeficientas yra nuo šiandien atgal skaičiuojama kumuliacinė sandauga. Kiekvienai eilutei iki 2024 m. birželio 10 d. priskiriamas šio splito 0.1 koeficientas, padaugintas iš 2021 m. 4:1 splito 0.25 ir visų dar ankstesnių koeficientų. Iki 2021 m. buvusi NVDA istorija perskaičiuota taikant 0.025 koeficientą, todėl 2019 m. $200 kainavusi žvakė dabar rodoma kaip $5.00.

Verta įsidėmėti 2 pasekmes. Pirma, pakoreguota istorija keičiasi kiekvieną kartą įvykus naujam įmonės veiksmui. 2024 m. gegužę atliktas backtestas ir šiandien atliekamas backtestas, vykdomi tuo pačiu kodu už tas pačias datas, pateiks skirtingus skaičius. Jei kaupėte požymius pagal simbolį ir datą, bet nenurodėte duomenų versijos, dabar turite podėlį, kuriame sumaišytos 2 skalės. Būtent dėl to į požymio raktą įtraukiame korekcijų epochą; šią pamoką išmokti prireikė vienos labai painios popietės.

Antra, kai taikomas 0.025 koeficientas, akcija, kurios kainos žingsnis buvo $0.01, dabar juda $0.00025 žingsniais. Kainos žingsnio apvalinimo logika, patikros „ar tai nauja aukščiausia kaina“ ir slankiojo kablelio skaičių lygybės tikrinimas – visa tai dabar veikia gerokai žemiau tikrosios rinkos skiriamosios gebos.

dividend: 0.01 – skaičius, panaikinantis centų tinklelį visoms ankstesnėms kainoms

Vienas centas. Atrodo kaip triukšmas, bet būtent dėl jo adj_close rodoma 120.8781, o ne apvalus 120.888.

Birželio 10 d. uždarymo kaina buvo 121.79. Korekcijos dėl dividendo koeficientas yra (121.79 − 0.01) / 121.79 = 0.99991789. Šis koeficientas dauginamas iš visų kainų iki birželio 11 d., todėl splitu pakoreguota 120.888 kaina tampa 120.878074. Pokytis mažas, bet nuolatinis, ir toks koeficientas taikomas kiekvieną iš daugiau nei 60 ex-date per visą NVDA istoriją. Svarbus sudėtinis poveikis: 2015 m. kaina jau būna padauginta iš dešimčių šiek tiek neracionalių koeficientų. Nė viena pakoreguota istorinė kaina nebeatitinka centų tinklelio.

Tai reiškia, kad kiekvienas == palyginimas su apvaliu lygiu yra klaidingas, kiekvienai patikrai „ar pasiekėme limito kainą“ reikia paklaidos tolerancijos, o rekonstruota OHLC seka po paprasto apvalinimo iki 4 skaitmenų po kablelio nebeatitinka sąlygos low ≤ open ≤ high. Be to, adj_close yra bendrosios grąžos seka, o close – kainos grąžos seka. Jei vieną naudojate grąžai, o kitą nuosmukiams skaičiuoti, sumaišote 2 skirtingus įvykusių pokyčių apibrėžimus.

volume: 42,800,000 – daliklis, kurį taiko ne visi vienodai

Kad akcijų apyvarta būtų palyginama su sesijomis po splito, ją reikia padauginti iš 10. Kai kurie duomenų tiekėjai taip ir daro. Kiti – ne. Dar kiti pakoreguoja OHLC, bet palieka pirminę apyvartą. Tai blogiausias variantas iš 3, nes failas atrodo nuoseklus, kol nesudauginate kainos ir apyvartos.

Patikimiausia nebenaudoti akcijų apyvartos kaip požymio ir rinktis apyvartą doleriais, kuri pagal apibrėžimą nekinta dėl splitų. 20 dienų vidutinės apyvartos doleriais likvidumo filtrui nereikia jokios koregavimo logikos, todėl jo negali sugadinti įmonės veiksmas. Požymių nekintamumas geriau nei teisingas koregavimo kodas, nes pastarąjį reikia nuolat prižiūrėti, kad jis ir toliau būtų teisingas.

3 duomenų tiekėjų failų formos ir 3 klaidų tipai.

Kas pateikiama Kas sugenda
Pakoreguota tik uždarymo kaina, pirminės OHLC kainos Spragų ir dienos eigos logika skaičiuoja tarp 2 kainų skalių
Pakoreguotos OHLC kainos, pirminė apyvarta Apyvarta doleriais neatitinka splito santykio; ADV filtrai veikia klaidingai
Pirminės OHLCV reikšmės ir koeficientų stulpeliai Nieko, jei koeficientus pritaikote. Viskas, jei pritaikote ne tai eilutei

Stulpelių, kurių čia nėra: adj_open, adj_high, adj_low

Dabar grąžinkime OHLC. Jei duomenų srautas pakoreguoja tik uždarymo kainą, o jūsų strategija nakties spragą skaičiuoja kaip open / prev_adj_close − 1, 2024 m. birželio 10 d. ji apskaičiuos 120.37 / 120.8781 − 1 – visai tinkamą, maždaug −0.4% reikšmę. Paleiskite tą patį kodą 2024 m. birželio 7 d., ir jis ims atidarymo kainą iš pirminio failo (apie 1207), o uždarymo kainą – pakoreguotą 0.025 koeficientu dėl ankstesnių splitų. Gausite kelių tūkstančių procentų spragą.

Bet kokia operacija, kurioje sumaišomas pirminis ir pakoreguotas stulpelis, yra aritmetika dviejose koordinačių sistemose. Dabar mišrių korekcijų duomenų naudojimą tikrinu duomenų įkėlimo lygiu, užuot tikėjęsis, kad tyrėjas tai prisimins, nes neprisimins – aš taip pat.

Ko neparodo nė vienas stulpelis: kiek akcijų iš tikrųjų būtumėte nusipirkę

Ši klaida kainuoja backtesto sąnaudų modelyje, ir būtent dėl jos apskritai rašau apie akcijų splitą.

JAV akcijų sandorių komisiniai dažnai skaičiuojami už akciją. Tarkime, $0.005 su minimaliu $1.00 pavedimo mokesčiu – tai įprastas fiksuoto tarifo mažmeninio brokerio planas. Dabar atlikite $400,000 vertės NVDA pozicijos backtestą metams iki splito, kai pirminė kaina buvo apie $400, o pakoreguota rodoma kaip $40.

Akcijos Komisiniai
Kas iš tikrųjų įvyko (pirminė kaina $400) 1,000 $5.00
Ką mato backtestas (pakoreguota kaina $40) 10,000 $50.00

Ta pati pozicijos vertė, tas pats sandoris, bet modeliuojamos sąnaudos 10 kartų didesnės. Tai $45 išgalvotų sąnaudų už kiekvieną sandorio dalį ir $90 už visą ciklą. Kasdien daug sandorių sudaranti strategija per metus priskaičiuos apie $22,000 neegzistavusių sąnaudų. $400k portfelyje tai reiškia 5.6 procentinio punkto metinės grąžos – viską išgalvojo daliklis. Šiuo atveju jūsų rezultatai atrodo prastesni nei tikrovėje, ir tai dar pakenčiama.

Atvirkštiniai splitai veikia priešinga kryptimi, ir tai pavojinga. Po 1:10 atvirkštinio splito pakoreguotoje istorijoje kainos rodomos 10 kartų didesnės, o akcijų skaičius – 10 kartų mažesnis nei būtumėte iš tiesų prekiavę. Sąnaudų modelis tyliai sumažina komisinius už akciją 10 kartų. Atvirkštiniai splitai dažni mažos kapitalizacijos, mažesnių nei $5 kainų ir didelių kainų skirtumų akcijų visatoje – būtent ten mokesčiai už akciją sudaro didžiausią visų sąnaudų dalį. Backtestas pagražina būtent tų akcijų rezultatus, kuriuos turėtų pabloginti.

Taigi sprendimas paprastas ir struktūrinis: pozicijų dydį nustatykite doleriais, akcijų skaičių apskaičiuokite naudodami tos datos nepakoreguotą kainą ir komisinius už akciją skaičiuokite pagal šį skaičių. Pirminės kainos stulpelį duomenų įkėlimo procese palikite visam laikui – ne kaip audito įrašą, o kaip aktyvią pavedimų vykdymo variklio įvestį.

  1. Signalai ir grąža: pakoreguota seka.
  2. Akcijų skaičius, komisiniai už akciją, kainos žingsnio apvalinimas, kainų lygio filtrai: nepakoreguota seka.
  3. Likvidumas ir pajėgumas: apyvarta doleriais, kuriai nereikia nei vienos sekos.

6 stulpeliai, 1 eilutė, vienas gana įprastas įmonės veiksmas, apie kurį paskelbta prieš 3 savaites ir kuris nieko nenustebino. Rinkai jį įveikti prireikė vieno ryto. Ištikimai atkurti jį tyrimų duomenų apdorojimo grandinėje gerokai sunkiau, o požymis, kad grandinė to nepadarė, beveik niekada nebūna klaidos pranešimas.

įmonių veiksmaisplitų koregavimasJAV akcijosduomenų inžinerijabacktesting
← Visi įrašai