Š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.
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į.
- Signalai ir grąža: pakoreguota seka.
- Akcijų skaičius, komisiniai už akciją, kainos žingsnio apvalinimas, kainų lygio filtrai: nepakoreguota seka.
- 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.
← Visi įrašai


