Te ir viena rinda no dienas akciju datu faila. NVDA, piektdiena, 2024. gada 7. jūnijs — pēdējā tirdzniecības sesija pirms split attiecībā 10 pret 1 stāšanās spēkā.
| Kolonna | Vērtība |
|---|---|
| datums | 2024-06-07 |
| slēgšanas cena | 1208.88 |
| apjoms | 42,800,000 (noapaļots) |
| split koeficients | 1.0 |
| dividende | 0.00 |
| koriģētā slēgšanas cena | 120.8781 |
Šajā skatā OHLC kolonnas apzināti neiekļāvu. Tās atgriezīsies raksta beigās, un tieši tās klusi rada problēmas.
Viss interesantais šajā rindā slēpjas atšķirībā starp otro un sesto kolonnu. 7. jūnijā biržas lentē bija 1208.88. Par šo cenu vairs nekad nevarēs noslēgt darījumu, jo akcija, uz kuru tā attiecās, vairs nepastāv kā tāda vienība. 120.8781 ir rekonstruēta vērtība, un tā nav vienkārši 1208.88 dalīts ar desmit. Apskatīsim katru kolonnu pēc kārtas.
datums: 2024-06-07 un abi pārējie svarīgie datumi
Par split tika paziņots 2024. gada 22. maijā līdz ar peļņas pārskatu.
Reģistrācijas datums bija 6. jūnijs. Pirmdien, 10. jūnijā, tirdzniecība sākās,
ņemot vērā split korekciju. Trīs datumi, bet jūsu datu piegādātāja
split_factor iekrīt tieši vienā no tiem — parasti pirmajā sesijā
pēc split. Nobīde par vienu dienu ir visbiežākā korporatīvo darbību koda
kļūda, ko redzu, un kopējos datos tā nav pamanāma: kapitāla līkne vienā dienā
piedzīvo 90% kritumu vai 900% kāpumu — Sharpe, kas aprēķināts par 2,000
dienām, to gandrīz neuzrāda, bet maksimālais kritums vai stop-loss noteikums
gan reaģē uzreiz.
Arī dividendei ir savs datumu sarežģījums, un 2024. gadā tas mainījās visiem nemanot. NVDA ceturkšņa dividende pēc split bija $0.01, un tās reģistrācijas datums bija 11. jūnijs. ASV norēķinu termiņš 2024. gada 28. maijā pārgāja uz T+1, tāpēc ex-datums un reģistrācijas datums tagad sakrīt. Jebkurš datu ielādētājs, kas ex-datumu aprēķina kā “reģistrācijas datums mīnus viena darbdiena” — kā tas bija pareizi desmitiem gadu — 2024. gada jūnijā sāka nemanāmi veidot dividenžu korekcijas vienu sesiju par agru. Nekāda kļūda neparādās. Koeficients vienkārši nonāk nepareizajā rindā.
Korporatīvo darbību koda kļūda nekad neizpaužas kā izņēmums. Tā ir par dienu nobīdīta vērtība, kas izskatās pilnīgi ticama.
slēgšanas cena: 1208.88 — failā neiekļautā cena
Šī ir neapstrādātā tirgus cena, un lielākajā daļā pētniecības datu plūsmu tā
ir tikai kolonna, ko neviens nelasa. Signālus aprēķina no
adj_close. Un jebkurš noteikums, kas atsaucas uz akcijas cenas
līmeni dolāros, tagad izmanto skaitli, ko neviens tirgus dalībnieks nav
redzējis.
NVDA cenas kāpums līdz $1,000 2024. gada pavasarī bija īsts notikums ar reālu orderu plūsmu: apaļie skaitļi piesaistīja cenu, opciju strike cenas grupējās pie 950 un 1000, un katra pietuvošanās radīja virsrakstu risku. Koriģētajos datos viss šis periods notiek pie $100. Ja pārbaudāt uzvedību pie psiholoģiski nozīmīgiem cenu līmeņiem, cenu spraugas aizpildīšanas loģiku pie apaļiem skaitļiem vai strike cenas tuvuma pazīmi, jūs to testējat pret cenu rindu, ko pārskalojis notikums, kurš tobrīd vēl nebija noticis.
Tas pats attiecas uz instrumentu atlases filtriem. “Izslēgt akcijas zem $5” ir pamatots reālu mikrostruktūras problēmu rādītājs: plašas relatīvās starpības, maržinālās tirdzniecības ierobežojumi, cenu soļa režīmi. Izmantojot koriģēto vēsturi, jūs izslēdzat uzņēmumus periodos, kad to akcijas tirgojās par $30 un tikai vēlāk tika veikts apgrieztais splits. Izmantojot filtru “cena virs $500”, jūs nemanāmi izslēdzat NVDA no katra gada pirms 2024. gada jūnija. Cenu filtri jāpiemēro neapstrādātajām tirgus cenām. Punkts.
split_factor: 1.0 — un 0.1 nākamajā rindā
Koeficients ir kumulatīvs reizinājums, ko aprēķina atpakaļ no šodienas. Katrā rindā pirms 2024. gada 10. jūnija ir 0.1 no šī split, reizināts ar 0.25 no 2021. gada split attiecībā 4 pret 1 un ar visu, kas bija pirms tam. NVDA vēsture pirms 2021. gada tiek reizināta ar 0.025, tāpēc cena, kas 2019. gadā bija $200, datos kļūst par $5.00.
Jāatceras divas sekas. Pirmkārt, koriģētā vēsture mainās ikreiz, kad notiek jauna korporatīvā darbība. Atpakaļtests, ko palaidāt 2024. gada maijā, un tas, ko palaižat šodien, dod atšķirīgus rezultātus ar identisku kodu un identiskiem datumiem. Ja pazīmes saglabājāt kešatmiņā pēc simbola un datuma, neiekļaujot datu versiju, tagad jums ir kešatmiņa, kurā sajaukti divi mērogi. Tieši tāpēc pazīmes atslēgā iekļaujam korekcijas laikmeta versiju; šīs mācības apgūšana mums prasīja vienu ļoti mulsinošu pēcpusdienu.
Otrkārt, pie reizinātāja 0.025 akcija, kas tirgojās ar $0.01 cenu soli, tagad mainās pa $0.00025. Jūsu cenu soļa noapaļošanas loģika, salīdzinājumi “vai šī ir jauna augstākā cena”, skaitļu vienādības pārbaudes ar peldošo komatu — tas viss tagad darbojas ar precizitāti, kas ir krietni zemāka par tirgus faktisko izšķirtspēju.
dividend: 0.01 — skaitlis, kas izjauc cenu centu soli visā iepriekšējā vēsturē
Viens cents. Tas izskatās pēc trokšņa, un tieši tāpēc
adj_close rāda 120.8781, nevis glītu 120.888.
10. jūnija slēgšanas cena bija 121.79. Ex-dividenžu koeficients ir (121.79 − 0.01) / 121.79 = 0.99991789. Šis koeficients tiek reizināts ar katru cenu pirms 11. jūnija, tāpēc splitam koriģētā cena 120.888 kļūst par 120.878074. Neliela, pastāvīga korekcija, ko atkārtoti piemēro katrā no vairāk nekā sešdesmit ex-datumiem NVDA vēsturē. Svarīga ir salikšanās: aplūkojot 2015. gadu, redzat cenu, kas reizināta ar desmitiem nedaudz neracionālu koeficientu. Neviena koriģētā vēsturiskā cena vairs neiekrīt centu solī.
Tas nozīmē, ka katrs == salīdzinājums ar apaļu līmeni ir aplams,
katrai pārbaudei “vai cena sasniedza limita cenu” vajadzīga pielaide, un
rekonstruētie OHLC vairs neapmierina nosacījumu low ≤ open ≤ high pēc naivas
noapaļošanas līdz 4 zīmēm aiz komata. Tas nozīmē arī to, ka
adj_close ir kopējā ienesīguma rinda, bet close ir
cenu ienesīguma rinda; ja ienesīgumu aprēķināt no vienas, bet kritumu no
otras, jūs esat sajaukuši divas atšķirīgas notikušā definīcijas.
volume: 42,800,000 — dalītājs, ko ne visi piemēro vienādi
Lai akciju apjoms būtu salīdzināms ar sesijām pēc split, tas jāreizina ar 10. Daži datu piegādātāji to dara, daži ne. Daži koriģē OHLC, bet atstāj neapstrādātu apjomu — sliktākais variants, jo fails izskatās iekšēji saskaņots, līdz cenu sareizina ar apjomu.
Pareizā rīcība ir pārtraukt izmantot akciju apjomu kā pazīmi un izmantot apgrozījumu dolāros, kas pēc definīcijas nav atkarīgs no split. 20 dienu vidējā apgrozījuma dolāros likviditātes filtram vispār nav vajadzīga korekciju loģika, un korporatīvā darbība to nevar sabojāt. Pazīmju invariance ir labāka par pareizi uzrakstītu korekciju kodu, jo pareizam korekciju kodam vienmēr jāpaliek pareizam.
Trīs datu piegādātāju failu veidi, trīs kļūdu scenāriji.
| Kas ir failā | Kas sabojājas |
|---|---|
| Koriģēta tikai slēgšanas cena, neapstrādāts OHLC | Spraugas un cenas kustības sesijas laikā loģika aprēķina, izmantojot divas cenu skalas |
| Koriģēts OHLC, neapstrādāts apjoms | Apgrozījums dolāros neatbilst split attiecībai; ADV filtri darbojas nepareizi |
| Neapstrādāts OHLCV un koeficientu kolonnas | Nekas, ja koeficientus piemēro pareizi. Viss, ja tos piemēro nepareizajai rindai |
Kolonnas, kuru te nav: adj_open, adj_high, adj_low
Tagad atgriezīsim OHLC. Ja datu plūsma koriģē tikai slēgšanas cenu un
stratēģija aprēķina nakts spraugu kā open / prev_adj_close − 1,
tad 2024. gada 10. jūnijā tā aprēķina 120.37 / 120.8781 − 1 — saprātīgu
skaitli, aptuveni −0.4%. Ar to pašu kodu atgriežoties pie 2024. gada 7.
jūnija, atvēršanas cena tiek ņemta no neapstrādātā faila (ap 1207), bet
slēgšanas cena ir koriģēta ar 0.025 no agrākiem split, un rezultātā rodas
vairāku tūkstošu procentu sprauga.
Jebkura darbība, kurā sajauc neapstrādātu un koriģētu kolonnu, ir aritmētika divās koordinātu sistēmās. Tagad jau ielādētāja līmenī lieku pārbaudīt, vai nav jauktas korekcijas; pētniekam to nevajadzētu paturēt prātā, jo viņš to neizdarīs — arī es ne.
Ko neviena kolonna neatklāj: cik akciju jūs patiesībā būtu nopirkuši
Tieši šis apstāklis ietekmē atpakaļtesta izmaksu modeli, un tāpēc vispār rakstu par akciju split.
ASV akciju tirdzniecībā komisijas maksu bieži nosaka par katru akciju. Pieņemsim, ka tā ir $0.005, bet minimālā maksa par orderi — $1.00; tā ir izplatīta fiksēta privāto brokeru likme. Tagad veiciet atpakaļtestu pozīcijai $400,000 apmērā NVDA akcijās gadu pirms split, kad neapstrādātā cena bija tuvu $400, bet koriģētajos datos redzama kā $40.
| Akciju skaits | Komisijas maksa | |
|---|---|---|
| Kas notika patiesībā (neapstrādātā cena $400) | 1,000 | $5.00 |
| Ko redz atpakaļtests (koriģētā cena $40) | 10,000 | $50.00 |
Tā pati ekspozīcija, tas pats darījums, bet modelētās izmaksas ir 10x lielākas. Tie ir $45 izdomātu izmaksu par katru darījuma pusi, $90 turp un atpakaļ, un stratēģija, kas ik dienu veic darījumus, gada laikā uzkrāj aptuveni $22,000 izmaksās, kuru nekad nav bijis. Pie $400k portfeļa tās ir 5.6 procentpunkti no gada ienesīguma, ko pilnībā radījis dalītājs. Šajā gadījumā modelis liek izskatīties sliktāk, nekā bija patiesībā, un ar to var sadzīvot.
Apgrieztais split darbojas pretējā virzienā, un tas ir bīstami. Split attiecībā 1 pret 10 nozīmē, ka koriģētajā vēsturē cenas ir 10x augstākas, bet akciju skaits — 10x mazāks nekā darījumos. Izmaksu modelis nemanāmi dala komisijas maksu par akciju ar desmit. Apgrieztais split biežāk sastopams mazas kapitalizācijas akcijās, kuru cena ir zem $5 un kurām ir plašas starpības; tur maksa par akciju ir lielākā izmaksu pozīcija. Atpakaļtests glaimo tieši tiem vērtspapīriem, kurus tam vajadzētu sodīt.
Tātad risinājums ir vienkāršs un sistēmisks: pozīcijas apjomu nosakiet dolāros, akciju skaitu aprēķiniet, izmantojot konkrētā datuma neapstrādāto cenu, un komisijas maksu par akciju piemērojiet šim skaitam. Neapstrādātās cenas kolonnu paturiet ielādētājā vienmēr — nevis revīzijas vajadzībām, bet kā aktīvu izpildes dzinēja ievadi.
- Signāli un ienesīgums: koriģētā rinda.
- Akciju skaits, maksa par akciju, cenu soļa noapaļošana, cenu līmeņu filtri: neapstrādātā rinda.
- Likviditāte un ietilpība: apgrozījums dolāros, kam nav vajadzīga ne viena, ne otra.
Sešas kolonnas, viena rinda, visai parasta korporatīvā darbība, par kuru paziņoja trīs nedēļas iepriekš un kura nevienu nepārsteidza. Tirgus to apstrādāja vienā rītā. Uzticami rekonstruēt šo notikumu pētniecības datu plūsmā ir krietni grūtāk, un pazīme, ka datu plūsma to nav izdarījusi, gandrīz nekad nav kļūdas paziņojums.
← Visi raksti


