Backtesting / Testování a jak na něj (2/6)

V prvním díle minisérie o backtestování jsme probírali definice věci, obecnou motivaci k backtestům a způsob, jak k tomu všemu vůbec přistupovat. Dnes to bude praktičtější díl, zaměříme se totiž na způsoby, jak a kde získat pro testování burzovní data.

Dejme tomu, že podmínky jsou splněné a chceme se pustit do nějakého toho opravdového testování. Z logiky věci potřebujeme někde vzít data na testování – jak probíhalo v minulosti obchodování a za kolik se akcie nakoupily / prodaly v nějakém čase.

Ještě si živě vzpomínám na to, když jsem před lety s akciemi začínal, že jsem v souvislosti s daty zažil dvojí překvapení. Jednak jsem si (naivně) myslel, že data o proběhlých obchodech budou “někde” k dispozici na internetu zadarmo, a jednak jsem si (naivně) myslel, že tato data budou ver formátu “datum + cena”. Samozřejmě takto to není.

Především, existují minimálně tři druhy dat co do kvality, to je třeba si uvědomit. Máme tedy:

  1. Data zdarma, které lze najít na portálech jako http://finance.yahoo.com nebo https://www.google.com/finance.
  2. Data od brokera. Pokud je například tímto brokerem Interactive Brokers, dají se data stahovat přes (netriviální) API. Je to fuška rozchodit, ale jde to.
  3. Profesionální data, jako jsou ta od https://www.iqfeed.net/ nebo http://www.esignal.com/ (a jistě i řada dalších)

Dále, data opravdu nejsou typicky poskytována ve formátu “datum + cena proběhlého obchodu”, ale v jakýchsi agregovaných balíčcích obsahujících údaje o proběhlých obchodech za nějaké časové období (jako je minuta nebo den). Setkáváme se tedy se zkratkami “OHLC” nebo “OHLCV”. To znamená, že v jednom “řádku” dat dostaneme několik informací najednou, význam je tento:

  • [O]=Open, otevírací cena v daném období (např. cena, na níž byl uskutečněn první obchod sledovaného dne)
  • [H]=High, nejvyšší cena v daném období (např. cena, na níž byl uskutečněn nejdražší obchod sledovaného dne)
  • [L]=Low, nejnižší cena v daném období (např. cena, na níž byl uskutečněn nejlevnější obchod sledovaného dne)
  • [C]=Close, zavírací cena v daném období (např. cena, na níž byl uskutečněn poslední obchod sledovaného dne)
  • [V]=Volume, zkrátka počet kusů cenného papíru (akcie apod.), které ve sledovaném období změnily majitele.

S daty je tedy docela zmatek. Pro testování některých strategií nicméně bohatě stačí vypreparovat datum a zavírací cenu, čímž se testování podstatně usnadňuje. Logicky – namísto s pěti nebo šesti informacemi za den pak pracujeme pouze se dvěma.

Dividendy

S daty je i další legrace. Některé firmy například platí akcionářům dividendy, což je sice dobrá zpráva pro ty akcionáře, ale hotová pohroma pro testování strategií. To proto, že vyplacené dividendy jednorázově a skokově sníží hodnotu firmy (a v souvislosti s tím pochopitelně cenu akcie). Při testování se tedy někdy používá termín “data adjustovaná o dividendy”, nebo data “upravená” o dividendy. Funguje to tak, že pro účely testování se o cenu dividendy v historii poníží zavírací cena, aby data seděla.

Ceny upravené o dividendy používají některé portály, například http://finance.yahoo.com. Na obrázku vidíte, že u tickeru SPY byla 16.12.2016 vyplacena dividenda 1.329 USD na akcii, a proto “oficiální” zavírací cena 15.2 sice byla 226.81 USD, ale po odečtení té dividendy to dělá pouze 226.81-1.329=225.481 USD, což je ten zelený rámeček.

dividenda_SPY

Na tomto místě bych si dovolil malou poznámku k umírajícímu portálu yahoo.com. Stránka http://finance.yahoo.com byla po řadu let hlavním zdrojem informací pro řadu obchodníků s akciemi, včetně mě. Dnes je ale portál v takovém srabu, že na různých místech uvádí různá historická data pro stejné akcie, což je docela brutální průšvih. Například screenshot uvedený výše byl převzat ze stránky https://in.finance.yahoo.com/q/hp?s=SPY&a=11&b=01&c=2016&d=11&e=31&f=2016&g=d, tam jsou adjustované ceny uvedeny správně, zatímco tady: https://finance.yahoo.com/quote/SPY/history?ltr=1 jsou uvedeny chybně, viz obrázek, chyba je označena červeně:

blbě

Při exportu dat do Excelu už je to správně, ale v zobrazení historických dat je to špatně.

Splity

Čas od času se z různých důvodů rozhodne, že akcie se rozdělí (sloučí) na více (méně) kusů s nižší (vyšší) cenou. Takže například namísto 100 kusů akcií po 100 USD má najednou akcionář 200 kusů akcií po 50 USD, nebo 50 kusů akcií po 200 USD.

Z hlediska držitele cenného papíru samozřejmě celý proces probíhá transparentně a spravedlivě, takže nikdo nepřijde o žádné peníze. Splity jsou jen technická věc. Ovšem z hlediska testování dat je to opět malér. Proto se při rozdělení akcií (split) přepočítávají historické ceny tak, jako by ke splitům nikdy nedošlo a tudíž mohou fungovat výpočty indikátorů (jako jsou například průměrné ceny) alespoň trochu příčetně.

Zatímco z hlediska testování strategií lze někdy vliv dividend ignorovat (alespoň kvůli hrubému nástřelu, prostě se zanedbá, tam to tolik nevadí), tak vliv splitů rozhodně ignorovat nejde, protože je zásadní.

Učebnicový příklad – máme akcii, jejíž cena je 100 USD na kus a už týden se nehýbe. Máme vypočítat pětidenní průměrnou cenu. Snadné, že? (100+100+100+100+100) / 5 = 500/5 = 100. Pokud by ale třetí den došlo ke splitu 2:1 (tedy cena akcie by byla poloviční, zatímco počet by byl dvojnásobný), byl by průměr (100+100+50+50+50) / 5 = 350/5= 70, což je úplně špatně.

Malá poznámka: Historicky se může stát, že ke splitu (nebo reverznímu splitu) akcie dojde za její život několikrát. Úprava ceny pak samozřejmě musí zahrnovat všechny splity, aby to celé dávalo smysl.

vxx

Na obrázku vidíme kvartální ceny ETN VXX, které klesají z původních více než 30000 USD za akcii až na současných 21.90 USD na akcii. To samozřejmě neznamená, že by v roce 2009 ta akcie stála 30000 USD za kus, znamená to spíš to, že v historii došlo několikrát ke splitům.

Z hlediska testování tedy často slýcháme termín “cena akcie upravená o splity a dividendy”, což není nic jiného než kombinace předchozích dvou úprav.

Výpadky dat

Data, která na testování obdržíme (z libovolného zdroje) je ještě třeba podrobit jedné kontrole. Je to kontrola na to, zda nám nějaká data v číselné řadě nechybějí. Jestliže například testujeme denní strategii pro obchodní rok skládající se z 250 obchodních dnů, měla by mít každá testovaná akcie skutečně k dispozici 250 denních záznamů. Pokud je nemá, znamená to, že

  • buď se daný den s akcií vůbec neobchodovalo, což je krajně nepravděpodobné,
  • nebo data prostě chybějí a je potřeba je stáhnout někde jinde, případně reklamovat

Dodnes – a to i u renomovaných poskytovatelů dat – narážím na to, že údaje zkrátka nejsou kompletní. Je to ostuda, ale je to tak a je potřeba s tím počítat a kontrolovat to.

Příspěvek byl publikován v rubrice Nezařazené se štítky , , , , , . Můžete si uložit jeho odkaz mezi své oblíbené záložky.

37 komentářů u Backtesting / Testování a jak na něj (2/6)

  1. misch napsal:

    Historická data z IB mají jednu nemilou vlastnost: pokud dojde ke změně symbolu nějaké akcie, tak se IB tváří že žádná historická data nového symbolu před tou změnou neexistovala. A ten původní symbol už naopak dál neupravuje o splity a dividendy. Tzn. dojde k přejmenování ABC na DEF, a od té chvíle má člověk v historických datech IB dvě nezávislé historie :(

    • admin napsal:

      Mě tam tedy ještě víc štvou ta omezení na tempo, jakým se data stahují. To je k zbláznění…

      • misch napsal:

        Tempo mě ani tak neirituje, resp. nevadí mi že musím data stahovat pomalu a vkládat tam mezery (abych se vyhnul chybě „Historical data request pacing violation“). Programově se to dá ošetřit bez problémů, a historická data pro výpočet signálů si tahám každý den do databáze už předem, takže je mi jedno že se komponenty SPX stahují skoro dvě hodiny, protože je mám i tak stáhnutá v dostatečném předstihu.

        Víc mě irituje to zařezávání historie při každé změně. Viz třeba VXX (u IB má historie jen 125 dní). Pak totiž nezbývá než brát data odjinud, což mě štve mnohem víc než to první omezení.

  2. jsem Z5 napsal:

    Žádný komentář? Tak já jeden přidám :-)…
    nevím jestli je to v plánu v třetím díle :-), ale možná zde mohlo zaznít
    u splitu : jak a kde nejlépe najít, kdy a v jaké výši bylo na daném titulu „splitnuto“

    možná je to pro někoho triviální záležitost, ale seriál jde od základů…

    za mě díky a palec nahoru :-)

    • Honza napsal:

      Zkusim tim vyridit dve mouchy jednou ranou ..

      Splity se daji dohledat napriklad zde:
      quandl.com/api/v3/datatables/WIKI/PRICES.json?date.gte=19000101&date.lt=20170101&ticker=AAPL&api_key=YOUR_KEY

      Mate s timhle zdrojem dat nekdo zkusenosti? V neplacene verzi jsou jen akcie, ale delkou historie to vypada docela dobre.

  3. jsem Z5 napsal:

    jj Quandl používám a také jen ve free verzi …

  4. jsem Z5 napsal:

    nejde editovat příspěvek, tak jako nový:
    mám to přímo v exelu…https://www.quandl.com/tools/excel
    pro programátory vlastních aplikací a znalce přes API zřejmě meně efektivní, ale jinak dostačující :-)

  5. LB napsal:

    jedna resp dve od AOS zacatecnika :)
    1 – tedy dividendy je nejjednodussi (a nejspravnejsi?) resit prez Adjusted Close?
    2 – jak resite split? sehnani spravnych dat je jedna vec, ale osetreni v kodu druha vec, takze nejaky nasobeni/deleni ceny split ratioem v kodu pri backtestu AOS?

    • admin napsal:

      1) Ano, přesně tak.
      2) To může být cesta, ale ideální je, když testovací platforma vidí už ošetřená data. Už kvůli rychlosti, tzn. jednou se to přepočítá a pak se to mnohokrát může použít pro testy.

  6. Tomáš napsal:

    Dobrý den,

    omlouvám se, možná jsem úplně slepý, ale nenašel jsem na vás nikde kontakt. Z tohoto důvodu píši zde do diskuze. Měl bych na vás prosbu. Potřebuji vytvořit velmi jednoduchý automatický obchodní systém pracující na obchodním účtu u Interactive Brokers. Problém je, že jsem problematikou programování a API zcela nepolíben.

    Byl byste tak hodný a našel si na mě chvilku? Tedy můžete se mi prosím ozvat na uvedený mail. Pochopitelně veškerý Váš čas a práci, kterou byste pro mě případně udělal, rád zaplatím.

    Děkuji mnohokrát.

    • admin napsal:

      Dobrý den, tohle já nedělám, ale když na sebe necháte nějaký kontakt, tak se Vám třeba ozve nějaký jiný čtenář. Kontakty zde nechávat je možné.

      • Tomáš napsal:

        Děkuji za odpověď. A není pro vás schůdná ani varianta taková, že byste mi poskytl informace (jak vše nejlépe technicky vyřešit – propojit) a následně mi poskytl nějaký jednoduchý ukázkový systém (zdrojový kód). S tím už bych se nějak snad dokázal poprat a samotný zdroják podle svého gusta upravil. Jak už jsem psal, velmi rád bych Vám za to zaplatil. Nechci, aby pro mě někdo mrhal časem zdarma.

        Pokud to možné není, najdu se tu někdo, kdo by mi v této problematice poradil a pomohl mi? Potřebuje informace (jak technicky na to) a ideálně vytvořit i finální (velmi jednoduchý) program fungující na obchodním účtu Interactive Brokers. Rád zaplatím!!!

        Mail na mě: tomastomas333@seznam.cz

        Děkuji komukoliv, kdo mi pomůže.

  7. merlinx napsal:

    Zdravím, protože jsem zde na blogu tento odkaz ještě nikde nezahlédl, přidávám:
    http://www.financial-hacker.com
    Je tam spousta zajímavých článků zejména 5-ti dílný seriál věnovaný backtestingu a nedávno vyšel článek o backtestování opčích strategií.

    • admin napsal:

      Člověče, tanhle server jsem vůbec neznal, moc díky za tip, počtu si!!!

      • merlinx napsal:

        Nemáš zač :-) . Já ho objevil tento týden náhodou a moc se mi libí. Zatím jsem ho prošel pouze zběžně. Autor jak se zdá má s alogo tradingem velké praktické zkušonosti a na blogu je předává zdravou a srozumitelnou formou včetně jeho postřehů, stejně jako ty zde ;-)

  8. Pingback: Backtesting / Testování a jak na něj (3/6) | Akcie

  9. Petr napsal:

    Zdravím, nevím kde se zeptat, tak to zkusím tady, třeba se to někomu bude hodit. Mám problém s tickerem CMCSA, liší se mi data na Google (včerejší close 37.66) a na Yahoo (75.99). První co mě napadlo je podívat se na Nasdaq, kde jsou ceny shodné s Yahoo, ale IB mi hází realtime cenu kolem 38. Jsem z toho poněkud jelen, protože historické ceny tahám z Yahoo, mám je kolem 70, tím pádem je samozřejmě RSI skoro na nule, a systém by tedy nejspíš naprosto chybně nakoupil tenhle ticker. Vyhodnotil jsem to jako chybu na Nasdaq, a přemýšlím, jak tohle ošetřit. Můžu se zeptat, jaký přístup používáš? Mě napadlo porovnat data z nezávislých zdrojů, ale pokud je chyba na Nasdaqu, tak stejně nemám zaručeno, že to ostatní poskytovatelé jen nepřebírají…

    • admin napsal:

      Tyhle bezplatné zdroje dat jsou úplně k ničemu, s tím se daleko nedostaneš. Buď sosej data od brokera, nebo si zaplať nějaký kvalitní externí zdroj tickových dat, jinou radu bohužel nemám.

      • Petr napsal:

        OK, díky, kousnu se a udělám import z IB. Nevíš, posílá IB adjustované close? V dokumentaci se o tom nic nepíše, ale na netu jsem na něco takového narazil.

    • Honza napsal:

      Na yahoo finance pisou, ze byl split 1:2. Neni tedy mozne, ze ho google vs yahoo jen jindy zaindexuji? A na jakou hodnotu se v yahoo datech divas? close nebo adjClose?

      A jeste jedna poznamka – akcie je pod SMA200, takze v pripade 90tky by se nakupovat nemela.

      • Petr napsal:

        Nojo, už to tam je, a už mají i adjustovaná historická data, teda jen v csv, na stránce ještě ne. Při open to ještě neměli, a nikde jsem se o splitu nedočetl. Dík za info, už jsem zase happy :)

        S tím SMA200 máš pravdu, to by ji mělo eliminovat.

  10. Petr napsal:

    No ale na výpočet SMA a RSI mají vliv i předchozí close, a zatím tedy vycházím z výpočtů nad adjusted. Dividenda v tom možná nebude hrát takový vliv, tam jde o pár setin, ale split už neokecám. Chtěl jsem si zjednodušit práci a nechat ty výpočty na jiných.

    • admin napsal:

      nenené. O splitu musíš především vědět ty sám, a to ideálně předem. Pak se rozhodneš, jestli tu akcii na pár týdnů nevnechat (což je často nejméně pracné řešení) nebo jestli ji nepřepočítat.

      Mlhavě si vzpomínám, že sem někdo dával skript zjišťující nadcházející splity, zkus to pohledat.

      Pravda je, že dividendy lze při výpočtu SMA200, SMA5 a RSI2 typicky zanedbat.

      • Petr napsal:

        OK, checknu…dík a omlouvám se za řazení.

        • Petr napsal:

          Krátký update – podle IB supportu mají na API historické close adjustované na splity, ale ne o dividendy. Yahoo se tváří, že adjustuje i o dividendy, ale v datech to nevidím – před i po dividendě je close a adjusted close stejné, vliv má jedině split. Co si člověk neudělá sám, to nemá :)

      • myk napsal:

        Je opravdu nutné hlídat splity?

        Selskou úvahou mi vychází, že po splitu spadne cena pod SMA200 a akcie se nekoupí.

        Hlídat split je nutné podle mě nutné jen u otevřených pozic, protože tam pak pět dnů nesedí SMA(5).

        Nebo mi něco nedocvaklo?

  11. merlinx napsal:

    Zdravím, když už se tu probírají splity, napadá mě jedna věc, kterou ještě nemám v devadesátce ošetřenou. Jak vyřešit případ, kdy byl již ticker nakoupený, došlo ke splitu tudíž bych vlastnil např. 2x více akcií. Moje devadesátka by při prodeji automaticky prodala danný počet akcií, který nakoupila, neboť si to bere z databáze. Má toto již někdo kdo obchoduje devadesátku automatizované?

    • admin napsal:

      Tohle by tedy třeba u mě zrovna prošlo, protože já kontroluju celkovou cenu v USD. Ale máš pravdu, při spoléhání se na počet by se to mohlo vymstít. Furt je na co myslet.

  12. jsem Z5 napsal:

    Omlouvám se za prosbu nebo spíš dotaz.
    Nemohl by někdo nasměrovat na script o kterém se zmínil admin : „Mlhavě si vzpomínám, že sem někdo dával skript zjišťující nadcházející splity, zkus to pohledat.“
    Zkoušl jsem hledat, ale nemůžu to najít :-)
    Kdyby to měl někdo po ruce a nebo věděl…
    V článcích to nebude a pokud to někdo dával sem, tak jedině asi do diskuse… tak že nevím jak to rozumně najít…
    Děkuji !

Napsat komentář

Vaše emailová adresa nebude zveřejněna.