„…Potřebuji zjistit, jak se chová nákup Put Bear Spreadu s Long Put na ATM strike a vypsanou opcí o tři strike níže, pořizovaný každé pondělí na weeklys opcích s expirací v pátek stejného týdne za posledních pět let na titulu JNJ, k tomu chci zjistit to samé, ale pro třístrikový Call Bull Spread na stejném titulu s Long opcí jeden strike od aktuální ceny, obě zamýšlené strategie pak podrobit testování na různých hladinách Implied Volatility…“ byly mé úvodní řádky z článku Backtestování v Excelu (VBA) – II., kterým jsem odstartoval minisérii o možnostech testování historických dat pomocí programovacího jazyka VBA, který je součástí Excelu. V tomto článku bych tak chtěl své odvážné odhodlání, kterému jsem v minulosti pyšně vyhradil méně než hodinu práce, prakticky popsat a ukázat, jak se takového zdánlivě pracného úkolu zhostit co nejelegantnějším způsobem.  

   Již v minulém článku jsem připustil, že snažit se pomocí VBA vyřešit všechny početní problémy a zadání pravděpodobně lze, pro praktičnost řešení některých úkolů (alespoň pro mě) je spojit základní funkcionality Excelu s potřebnými skrtipty ve VBA, abych co nejefektivněji a hlavně nejpřehledněji získal hlavní obrysy testovaných strategií. Ztratit se ve složitých skriptech, které vedou k poruchám zpracovávaných operací je pak velmi jednoduché a hloubat nad příčinami nefunkčnosti pak znamená značnou ztrátu času, který jsem se svou „programátorskou“ prací tolik snažil snížit.

   Podstatou práce s akciovými daty v článku Backtestování v Excelu (VBA) – VI. bylo vytvoření excelovského sešitu s historickými daty, jehož úkolem bylo na stažených historických datech z yahoo.finance zkoumat, jak by si vedlo nakupování akcií v zadaných časových intervalech v minulosti. Tento excelovský sešit měl pak vytvořen jakýsi „ovládací list“, kde bylo možné zadávat základní parametry takových analýz a pomocí vytvořených tlačítek pak testování spouštět, mazat jeho výsledky, upravovat databázi historických dat do nějakého formátu či ji třídit podle nějakého zadání a v neposlední řadě také takovou databázi zaměňovat za data dalších akciových tickerů. Tento excelovský sešit pak byl jednoduchou kombinací funkcionalit excelu a napsaných VBA skriptů, který měl plnit jednoduché požadavky na historické analýzy. Nemohu si myslet, že se tento vytvořený nástroj stane perlou mé testovací práce, ale jeho publikace společně s ukázkou VBA skriptů byla předskokem, jak takovou koncepci využít k provádění testování opčních obchodů. Vytvořit testovací nástroj pro opční obchody pak bude kompilátem mnohého, co jsem doposud na těchto webových stránkách napsal v souvislosti s výpočty cen opcí a jejich konstrukcí, Black-Scholesovým modelem, Volatilitou, řeckými písmeny a jejich výpočty, VBA skripty a samotným Excelem. Využívání těchto poznaných věcí mě doprovází již velmi dlouho a musím bez nějaké významné diskuze poznamenat, že mě tyto poznatky v minulosti velmi slušně posunuly. Současně jsem však také zaznamenal, že mé vlastní testovací nástroje jsou dost roztříštěné a vytvořit z nich nějaký jednotný testovací nástroj pro potřeby tohoto článku bylo pro mě mírnou výzvou. Uvědomil jsem si, že vyznat se ve vlastním vytvořeném nástroji je pro mě, jako tvůrce, velmi jednoduché, přenést nebo ukázat jeho výsledky někomu třetímu je však již značně komplikované, protože dotyčnému musíte k lepšímu pochopení sdělit alespoň základní motivy nebo principy své tvorby, a to je opravdu někdy velmi obtížné. V tomto duchu jsem se snažil napsat články o práci s VBA skripty a Excelem, abych postupně, na nějakých jednodušších příkladech, mohl vyrobit nějaký opticky složitější výtvor, jehož základní funkcionality jsou ale postaveny na velmi jednoduchých principech. Testovací aplikace pro opční obchody pak nebude nic jiného než složenina věcí, které jsem již na těchto stránkách popsal.


Jak na ceny opcí?

   Základem práce s vytvářením testovacího nástroje je pochopení tvorby ceny opčního kontraktu a jeho aplikace do Excelu pomocí VBA, kterou jsem popisoval v článku Cena opce, který jsem publikoval již před více než třemi lety jako jeden z prvních článků. V tomto článku byl k dispozici excelovský sešit s naprogramovanými funkcemi pro výpočet ceny Call a Put opčního kontraktu pomocí VBA. Nyní, když již mám větší povědomí o práci s VBA skripty, mohu jednoduše takto vytvořené skripty pro cenové výpočty přenášet mezi jednotlivými excelovskými sešity a využívat vytvořené funkcionality kdekoliv mě napadne. Tyto vzorce pak jednoduše přenesu do ovládacího listu mého opčního testeru, který jsem v „odlehčené verzi“ prezentoval v článku Volatilita cenový pohyb – IV.. Úvodní list testovacího nástroje pak vypadá jako na níže uvedeném obrázku. Protože jsem v článku výše popisoval, jak takový nástroj funguje, pouze připomenu, že nyní, vybaven také VBA skriptem pro testování na historických datech, jej stále mohu použít na jednoduché zjišťování ceny opčních kontraktů podle zadaných dat a simulovat tlačítky změny ceny opčních kontraktů na straně výstupu na základě změny času do expirace, pohybu podkladu a úrovně Implied Volatility. Zaměřím se tak nyní pouze na změny, které do takového testeru přibyly oproti jeho původní verzi, celý opční tester je pak ke stažení zde (při stažení je nutno „Povolit makra“)

   První změnou, kterou jsem provedl je doplnění údaje o času o hodiny a minuty. Mohu tak pozorovat, že jsem do obchodu vstoupil v pondělí 10.8.202015:30, tedy ihned na Open opčních trhů a můj opční kontrakt má expiraci v pátek 14.8.2020 ve 22:00 hodin (1). Z tohoto obchodu pak budu chtít vystoupit podle údajů na straně scénáře v pátek 14.8.2020 ve 21:59 hodin, tedy na Close opčních trhů (2). Klikacími tlačítky (3) u termínu výstupu z obchodu pak mohu pozorovat, jak by se měnila cena opcí na jednotlivých strike v obrázku, pokud bych pohyboval časem směrem zpět a neměnila by se cena podkladu ani úroveň Implied Volatility. Tyto cenové změny pak mohu pozorovat se změnou času nejen o jeden den, ale také o jednu hodinu nebo dokonce o jednu minutu. Vstupní data musím doplnit o cenu podkladu (akcie JNJ) v okamžik vstupu, která mohla být například 143.47 USD a vstupní úroveň Implied Volatility v okamžiku vstupu do obchodu, která je pak například 26.09% (4). K vyhodnocení scénáře výstupu budu potřebovat znát výstupní cenu v pátek na Close opčních trhů (144.25 USD) a také úroveň Implied Volatility v okamžiku výstupu (24.20%) (5). Mohu opět pozorovat klikací tlačítka (6), kterými mohu simulovat vliv změny výstupních parametrů na hodnotu cenových kontraktů. Protože vystupuji jednu minutu před Close opčních trhů, mohu pozorovat, že strike Call opcí na 142, 143 a 144 jsou „v penězích“ a jejich cena se tak rovná Vnitřní Hodnotě opčního kontraktu při ceně podkladu akcie JNJ na úrovni 144.25 USD. Pokud bych měl zadán jiný výstupní termín, tedy nikoliv jednu minutu před páteční expirací, ale například ve středu na Close, mohl bych klikáním na tlačítka pozorovat změnu cen opcí podle změny parametrů pohybu podkladu a Implied Volatility. Již jsem v článku Volatilita cenový pohyb – IV. uváděl, že tato klikací tlačítka pak hravě nahradí celkem těžkopádný Risk Navigator platformy TWS a lze jimi modelovat jakoukoliv situaci opčního kontraktu nebo opční pozice. Volba strike a stanovení ceny opčních kontraktů na těchto strike je pak následující.

   Na obrázku mohu pozorovat, že cena strike je odvozena od aktuální ceny podkladu. Při jeho ceně 143.47 USD je pak v buňce se strike zaokrouhlená hodnota ceny podkladu na celé číslo a snížená o jedničku (1). Bude to znamenat, že tento strike je nyní prvním strikem „v penězích“ podle aktuální ceny, zbylé strike jsou vzdáleny OTM vždy o jeden dolar, jak vyplývá ze vzorců u strike 143 a 146. Je tak patrné, že mě budou u titulu JNJ zajímat strike maximálně jeden dolar ITM a dále již jen OTM strike, toto si však mohu libovolně navolit. Pokud budu testovat dražší titul, který má krok strike nikoliv jeden dolar, ale třeba 2.50 dolaru, použiji zaokrouhlovací funkce =MROUND, kterou jsem popisoval v minulém článku. Každému zvolenému strike je pak vypočtena cena opčního kontraktu pomocí naprogramované funkce =CallCena a =PutCena (2). Argumenty této funkce jsem popisoval v článku Cena opce a tvoří jej Cena podkladu, Strike, Doba do expirace, Úroky, Implied Volatilita a případné Dividendy. Všechny hodnoty vybírám z patřičných buněk, pouze upozorním na Dobu do expirace, která je rozdílem okamžiku vstupu a okamžiku expirace vydělená číslem 365 – tato doba života opce se vyjadřuje v anualizovaném tvaru (2). Výpočet ceny opčních kontraktů podle zvoleného scénáře (okamžik výstupu z pozice) je pak zachycen na pravé straně testeru (3). Funkce =CallCena pak má samozřejmě stejné argumenty, které opět reprezentují hodnoty příslušných buněk v okamžiku vystoupení z opční pozice. Celý VBA skript, který ovládá v testeru výše popsaná makra, tedy tlačítka ke změně hodnot výstupních parametrů (posun času, ceny podkladu nebo Implied Volatility) a naprogramované funkce výpočtu cen opčních kontraktů Call i Put a souvisejících řeckých písmen je pak možné stáhnout z odkazu v článku výše (celý tester – při stažení je nutno „Povolit makra“).

   Module2 obsahuje VBA skripty pro jednotlivé výpočty, po jeho rozkliknutí je pak patrná jeho skladba

   Celý skript je dosti rozsáhlý, proto uvádím jen ilustrační obrázek. Není problém, s nynější znalostí základů VBA vypozorovat, že je to opravdu „otrocky“ přepsané znění Black-Scholesova oceňovacího modelu do VBA pomocí proměnných, které tvoří komponenty ceny opčního kontraktu. Výpočty jsou pak proloženy výpočty distribuční funkce a ostatními výpočty, z kapacitních důvodů zde již nebudu vysvětlovat popis struktury každé jednotlivé funkce a výpočtu, spotřeboval bych na to text o objemu celého samostatného článku. Ke skriptu maker posouvajících hodnoty jednotlivých hodnot testeru myslím není co vysvětlovat, jejich primitivní skript je snadno pochopitelný. Pouze bych upozornil na makra měnící hodnotu času o jednu hodinu a jednu minutu.

   Změnit čas o jednu hodinu vyžaduje k hodnotě aktuálního času přičíst/odečíst +/- 0.041666667 (1) a změnit čas o jednu minutu vyžaduje k hodnotě aktuálního času přičíst/odečíst +/- 0.000694444 (2), toto jsou hodnoty jedné hodiny a jedné minuty ve tvaru času převedeného do číselné hodnoty. Po zadání data vstupu, expirace, ceny podkladu a Implied Volatility v okamžiku vstupu mi zabudované vzorce =CenaCall a =CenaPut vygenerují ceny opčních kontraktů na příslušných strike přesně podle Black-Scholesova oceňovacího modelu. Mohu pak tyto ceny využít pro úvahy o ceně opčních strategií, které chci otestovat.

   Z obrázku je patrné, že jsem vyrobil sloupec s názvem „cntr“ obsahující vyjádření počtu zamýšlených opčních kontraktů na jednotlivých strike (1). V mém případě testuji vstup do Call Bull Spreadu s Long Call na aktuální ceně (ATM), proto při ceně podkladu 143.47 USD je tímto strike 143, u něj mám číslici „+1“, protože nakupuji jednu Long Call 143. Výpis na tři strike vzdáleném strike pak reprezentuje číslice „-1“ u strike 146. Mohu pak konstatovat, že bych byl schopen teoreticky vstoupit do takové opční kombinace za cenu (-186.33 USD +67 USD) ve výši -119.33 USD (2). Na pravé straně testeru, podle zvoleného scénáře výstupu jednu minutu před páteční expirací, mohu pozorovat ceny mých opčních kontraktů, ze kterých vyplývá, že při ceně podkladu v tuto chvíli na úrovni 144.25 USD by Long Call 143 měla hodnotu +125 USD a vypsaná Short Call 146 by byla bezcenná. Tržba za Long Call 143 by tak představoval teoretickou výstupní cenu Call Bull Spreadu, jak je sumarizována výpočtem v Excelu ve výši +125 USD (3). Mohl bych pak konstatovat, že nákup za -119,33 USD a tržba za prodej +125 USD by způsobily profit ve výši +5.67 USD (4). Je jasné, že mohu vytvářet na těchto strike libovolné kombinace s libovolným počtem kontraktů, mohu si také přidat další řádky s dalšími možnými strike s implementovanými vzorci pro výpočet ceny opčních kontraktů, pokud by mi předvolených šest strike pro Call a šest strike pro Put nepostačovalo, pochopitelně mohu volbu strike více „potápět do peněz“ než jen mnou předvolený „mínus jeden“ strike ITM, tyto jednoduché úpravy pak závisí na požadavcích řešeného analytického zadání. Práce s testerem tak spočívá ve dvou rovinách použití. Mohu si manuálně navolit vstupní údaje – datum vstupu, expiraci, vstupní cenu, vstupní Implied Volatilitu, Dividendu za života opce a Úroky a na zadaném okamžiku výstupu z pozice, výstupní ceně a výstupní Implied Volatilitě, pak vypozorovat, jak by se zadanému obchodu vedlo. Mohu také tyto výstupní hodnoty podrobovat analýze klikáním na tlačítka změny výstupních parametrů a modelovat nejrůznější tržní situace a jejich dopady na výstupní cenu zadané opční kombinace. Mě však bude zajímat druhé poloha využití opčního testeru, a to opakované zadávání historických dat z nějaké datové řady a sledování, jak by si konkrétní opční strategie vedla v určitém úseku v minulosti za jejího mechanického opakování a takové mechanické opakování pak podrobovat analýze a filtrování, například podle aktuální úrovně volatility. Tyto historické analýzy chci samozřejmě automatizovat pomoci VBA skriptů, aby jejich vyhodnocení bylo co nejméně pracné a vynaložené úsilí bylo efektivně zužitkováno.


Jak na data?

   Jaká data, takový výsledek. Toto by mohlo být hlavní motto práce s historickými daty, protože na jejich kvalitě záleží vypovídací schopnost výsledku a nakonec také aplikace nějakého zjištění do obchodní praxe. Analyzovat historická data není výrazný problém pro akciového obchodníka, protože historická data drtivé většiny obchodovaných titulů jsou běžně a hlavně zdarma dostupná alespoň ve tvaru denních Open, High, Low a Close, obohacené případně o další údaje. Opční obchodník ale stojí před významnější výzvou pokud se chce pokusit o totéž. Nejenže opční data nejsou „zdarma“ nikde k mání, ale musí nakonec provádět nezbytné výpočty, aby se k nějakým historickým cenám vůbec propracoval. Pro stanovení ceny opčního kontraktu v minulosti existují tři možnosti, jak jej získat. Mohu si zakoupit datový soubor s potřebnými daty a tento pak podrobit vlastní analýze. Toto je první, pravděpodobně nejkvalitnější, ale současné nejdražší způsob, jak se k takovému problému postavit. Opční data jsou neuvěřitelně drahá a tyto náklady jsou pro drobného tradera nemožné vynakládat (můj názor), stačí se jen podívat na cenovou strukturu nabízených dat na livevol.com nebo ivolatility.com. Opční data mohu také pořídit stahováním historických cen na jednotlivých strike pro jednotlivé dny v historii a jednotlivé expirace z datových zdrojů, které je poskytují zdarma, například v analytické platformě thinkorswim. Představa stahování pětileté historie opčních cen pro třicet titulů z indexu Dow Jones, představuje (30 x 1250) 37 500x ruční stáhnutí stránky thinkback této aplikace a utřídění stažených dat do vlastního databázového souboru, nad kterým bych potom mohl pracovat, musel bych ale mít jistotu, že jsou data úplná nebo správná, což není u této aplikace pravidlem. Chybějící údaje na některých strike či v některých expiracích nebo opční ceny, které neodpovídají historické realitě dělají z této vynikající analytické platformy nástroj pouze hrubé představy o chování zkoumané strategie v minulosti, tato volba pořízení opčních dat je pak velmi pracná a vynaložená práce nakonec ani nemusí přinášet kvalitní výsledky. Třetí volbou je pak si taková historická data pořídit vlastním výpočtem a vyhnout se buď značným nákladům na zakoupení opčních dat nejrůznějších poskytovatelů nebo úmorné práci k získání nepřesných dat z populární analytické platformy, a to bude mé řešení.

   Ke stanovení opční ceny v jakémkoliv okamžiku jejího života potřebuji nutně základní cenotvorné údaje, které vstoupí do oceňovacího modelu a jeho výstupem pak budou konkrétní ceny jednotlivých kontraktů na jednotlivých strike a v jednotlivých expiracích. Pokud mám tyto cenotvorné údaje pohromadě, nemám žádný problém stanovit teoretickou cenu opčního kontraktu, která bude trpět pouze odchylkami způsobujícími spread mezi Ask a Bid a tlaky poptávky a nabídky působící na trhu opčních kontraktů podkladového aktiva v danou chvíli. Ukazoval jsem na tomto webu v několika článcích, že vypočítané ceny opčních kontraktů podle Black-Scholesova modelu opravdu víceméně odpovídají aktuálně obchodovaným cenám, mohu pak své výpočty brát jako velmi slušně kvalitní údaje pro vyhodnocení mnou analyzované opční strategie v minulosti. Také jsem několikrát tvrdil, že pokud bych měl k dispozici tyto cenotvorné údaje, mohu rekonstruovat jakýkoliv historický okamžik v minulosti a vytvořit pro něj odpovídající opční řetězec. Vypočítané teoretické ceny opcí v každém představitelném okamžiku v historii podle modelu pak mohou vyřešit mnohé problémy – chybějící data v analytických platformách nebo jejich nesprávné údaje, ušetřit nemalé peníze na zakoupená data a také možnost simulace opčních obchodů, které v minulosti nemohly proběhnout (např. SPY a jeho expirace několikrát v týdnu v minulosti neexistovaly..).    

   Protože zadarmo vím, jaké jsou historické ceny podkladu (yahoo.finance a jiné možné zdroje), sledovaná hodnota strike je na mé volbě, přesný datum expirace opcí je ten, který si konkrétně vyberu z kalendáře, a to, jestli se vyplácely Dividendy mohu zdarma zjistit a konstatovat také. Úroková míra amerických státních dluhopisů s odpovídající dobou splatnosti jako je expirace opce je téměř zanedbatelný parametr, takže mohu volit nějaký „přibližný paušál“. Zbývá historická hodnota Implied Volatility – největší kámen úrazu takového výpočtu. Pokud budu znát její hodnotu v každém okamžiku v historii, budu k takovému okamžiku schopen celkem velmi přesně stanovit hodnotu opčních kontraktů, zejména na těch strike, které se nacházejí kolem aktuální ceny. Zdálo by se tak, že nemusím pracně stahovat z analytických platforem celé opční řetězce, ale stačilo by z nich získat pouze hodnoty Implied Volatility (nebo si zakoupit pouze její hodnoty) a vše by poté mohlo fungovat s dostatečně přesnými výpočty a výstupy. To je určitě vše pravda, ale existuje překvapivě elegantnější řešení.

   Pokud jsem v některém z článků na tomto webu uvedl, že bych si měl k obchodům vybrat takového brokera, který bude svým technologickým řešením schopen odpovědět i na otázky, které mě doposud nenapadly, mohu směle potvrdit, že Interactive Brokers je zcela jistě v tomto smyslu velmi dobrá volba. Musím konstatovat, že existuje překvapivě malé povědomí o tom, že tento broker poskytuje velmi praktické a jednoduché řešení, jak získat nejrůznější historická data co do jejich druhů a typů, toto jsem ostatně popisoval v článku Historická data z IB do Excelu  Protože se již nyní nacházíme ve fázi, kdy jsme dokonaleji schopni pochopit, co znamenají jednotlivé řádky VBA skriptu a co to vlastně vůbec VBA je, pouze zrekapituluji, že ke schopnosti získat historická dat na různých timeframe musím do svého excelovského sešitu zkopírovat VBA skript ze stránek IB (viz odkaz na článek v předcházející větě) a zakomponovat do něj přihlašovací jméno k mému účtu.

   Namísto franta123 samozřejmě uvedu za písmenem „S“ své pravé přihlašovací jméno, nejlépe ke svému demo účtu. Po instalaci skriptu je zapotřebí vyrobit v listu excelu tlačítko, které bude spouštět příslušné makro, jak je opět popsáno v článku o historických datech.     

   Celý proces získávání dat je pak na pochopení syntaxe požadavku, který, zapsán do buňky excelu, způsobí načtení požadovaných dat do excelovského listu. Vzorový excel s VBA skriptem, tlačítkem a navoleným řádkem požadavku je možné stáhnout zde. Aktuálně mohu například požadovat hodinová data akciového titulu JNJ. Struktura požadavku pak vypadá takto.

   Začerněné pole představuje moje přihlašovací jméno k mému účtu (1). JNJ je požadovaný ticker (2). 20200824 je koncové datum, od kterého chci požadovaná data, tedy od 24.8.2020 a starší (3). Chci největší možnou hloubku do historie a tou je jeden rok, kterému odpovídá symbol „Y“ (4). V tomto období rok zpět chci hodinová data, které reprezentuje číslo „10“ (5). Chci pro každou danou hodinu střední cenu, tedy „MIDPOINT“ (6). Tabulky s možnostmi zadání jsou na obrázku níže.

   Kliknutím na tlačítko spouštějící makro bych měl mít možnost obdržet požadovaná data do excelovského listu

   Připravenost ke stisknutí tlačítka ke stažení dat dává oznámení buňky s příkazem „FINISHED“ (1). Stažením (2) pak získávám požadovaná hodinová data v sestupném uspořádání rok zpět. Podle zadaného požadavku je posledním dnem roční historie 26.8.2019, kde mám zobrazenou středovou cenu Open v 16:00 hodin na úrovni 127.49 USD. Středová cena představuje střed mezi Ask a Bid daného okamžiku. Mohu pak velmi jednoduše zaměňovat názvy tickerů a získávat tato hodinová data pro nejrůznější tituly dle vlastní potřeby. Pokud jsem v předcházejících článcích o testování akciových titulů pomocí VBA skriptů hovořil o testování obchodů na databázích s jiným timeframe než jen Open a Close, pak jsem měl na mysli právě tyto datové soubory, které lze velmi snadno pořídit. Nemusím snad dodávat, že pokud je maximální hloubka dat jeden rok zpět od zadaného data požadavku, tak není problém zadat ke stažení další požadavek s datem o rok dříve a obdržet další předcházející rok a tato data pak jednoduše pospojovat do jedné datové řady. Tato tvorba zabere opravdu několik okamžiků s jedinou úpravu datumu v požadavku, viz obrázek níže, který mi poskytl stejná hodinová data, ale za období o rok dříve sahající do roku 27.8.2018           

   Jaká data jsem si vlastně stažením pořídil? Protože mám k dispozici hodinová data s údaji Open, High, Low a Close, pak tato data představují hodinovou svíčku, kterou mohu zobrazit v burzovní grafu právě s s těmito parametry – cenou Open, v mém případě středová cena na Open, stejně pro High, Low a Close, tyto ceny pak vyjadřují popisované stavy ceny v období vyjádřené daty stažené „svíčky“. Z obrázku v textu výše pak mohu pozorovat, že mohu získávat nejen denní a hodinová data, ale mohu svůj timeframe rozdrobit až na jednosekundové svíce. To, co ale hledám, je řešení mého požadavku na data týkající se Implied Volatility. Pokud jsem nyní již pochopil a zvládl splnění požadavku na jakýkoliv timeframe a jakékoliv období pospojováním získaných ročních dat, mohu prozkoumat, jaký typ dat, kromě požadavku na MIDPOINT, tedy středové ceny mi můj broker může poskytnout. Přehled typů jednotlivých dat stahovaných ve formě svíček nabízí překvapivou nabídku, které je na níže uvedeném obrázku.

   V tabulce je přehled datových typů, které si mohu do svého excelovského listu stáhnout. V záhlaví tabulky je uvedeno (1), že stažené hodnoty reprezentují časové období, které pokrývá délka svíce, kterou jsem si do svého listu stáhnul. Mohu tak vyčíst, jaké jsem si doposud stahoval ceny akcií, pokud jsem v požadavku uvedl MIDPOINT (2). To je dobré zjištění, ale ještě skvělejší zjištění je pak skutečnost, že si na zadané svíčce mohu také zobrazit hodnoty Implied Volatility, stačí pouze přeformulovat požadavek na OPTION_IMPLIED_VOLATILITY. Jak tedy bude vypadat požadavek na stažení hodnot Implied Volatility za poslední rok, pro akcii JNJ na denním grafu (svíce = jeden den)    

    Požadavek obsahuje stejné údaje, jako pro stažení akciových cen, tedy Ticker, poté datum, od kterého chci stahovat, písmeno „Y“ pro sdělení, že chci roční data, číslovku „11“ pro požadavek na timeframe jeden den a namísto požadavku MIDPOINT vložím OPTION_IMPLIED_VOLATILITY. Potvrzením příkazu získám stisknutím tlačítka data jako na obrázku níže.

  Řazení výsledků od nejstaršího po nejmladší mi ukazuje, že před rokem, dne 29.8.2019, činila na Open hodnota Implied Volatility 18.51%, nejvýše tento den činila její hodnota 19.03%, nejníže 18.05% a při Close dne měla hodnotu 18.07%. To je přesně to, co potřebuji pro mé analýzy. Není žádný problém nyní vytvořit čtyři další požadavky na stažení dat před 29.8.2019 až do roku 2015, abych získal celistvou pětiletou řadu této Implied Volatility a takovou řadu pak připojil ke své datové tabulce s denními cenami staženými třeba s yahoo.finance a mohl začít vypočítávat hodnoty opčních kontraktů na Open a Close této pětileté periody. Možnost stahování dat Implied Volatility samozřejmě funguje také na kratších časových rámcích, mohu si například chtít testovat nějaké intradenní vstupy hodinu po otevření trhů a vystupovat hodinu před zavřením trhů, takže by mě mohla zajímat třeba hodinová data Implied Volatility. Změnou požadavku z čísla „11“ přivolávající denní data na číslo „10“ obdržím do svého excelovské listu hodinové svíčky Implied Volatility za rok zpět. Mohu pak vyhodnotit takové údaje.

  V levé časti obrázku mám možnost na prvním řádku pozorovat hodnoty Implied Volatility dne 21.8.2020 v jejím denním průběhu. V pravé části obrázku je pak stejný den rozložen do hodinových úseků, kterým odpovídají stažené hodnoty Implied Volatility v těchto jednotlivých hodinách. Mohu pak zkontrolovat (červené šipky), že hodnoty Open a Close obou časových úseků jsou stejné, u hodinového průběhu na pravé straně tak mohu pozorovat podrobnější hodinový náhled na průběh Implied Volatility během tohoto dne.

   Jak s touto funkcionalitou mého brokera naložit je na každém, mohu ale potvrdit, že toto je velmi elegantní zdroj, kde mohu získat nejen akciová data na nejrůznějších timeframes, ale současně, pouhou záměnou textu požadavku ke staženým cenovým datům na těchto časových rámcích získat odpovídající hodnoty Implied Volatility. Vypozorováním dalších možností získání jiných typů dat mohu zjistit, že stejným způsobem mohu obdržet také hodnoty Historické Volatility pro dané časové úseky, svádí to pak k myšlence například otestovat jejich vzájemný vztah při vstupech do obchodu…


 Logika Opčního Testeru

  Mám povědomí, jak pomocí naprogramovaných funkcí vypočítat cenu opčního kontraktu, pokud budu mít všechny cenotvorné údaje. Mám povědomí, jak tyto cenotvorné údaje získat, některé jsou pevně dány a je velmi jednoduché je zjistit, některé musím pořídit z nějakých datových zdrojů – veřejně dostupných nebo z databáze mého brokera (například). Nic mi tedy nyní nebrání začít sestavovat postup, který by mi umožňoval velmi rychlou výměnu sady dat o konkrétním obchodu v minulosti z připravených datových souborů, když na každé zadané datové sadě historického obchodu provedu své výpočty, které si uložím do nějaké souvislé analýzy s nějakým vlastním historickým průběhem a konkrétním výsledkem. Základem této práce bude již předpřipravený excelovský sešit, který jsem již prezentoval a který bude pracovat na stejných principech jako testovací nástroj, který jsem ukazoval pro akciové obchody v minulých článcích.

   Excelovský sešit má několik „povědomě pojmenovaných“ listů, se kterými budu pracovat nebo se kterými bude nakládat můj VBA skript. Na listu „Tester“ budou základní údaje mé analýzy s vlastními parametry analyzovaného obchodu, tedy opět jakási „přístrojová deska“ s možnostmi měnit parametry obchodu a zapisovat takto modifikované výsledky po provedení každého jednotlivého testu. List „Data“ obsahuje upravenou datovou tabulku, kterou jsem si připravil, upravil, protřídil nebo zkombinoval pro mé analytické zadání. List „Backtest“ bude obsahovat zpracované datové údaje o každé jednotlivé analýze, každá nová další analýza s jinými parametry tento list přepíše. List „Celkem“ poskytuje sumář každé jednotlivé analýzy z listu „Backtest“ před jeho smazáním, přestože tedy budou každé jednotlivé analýzy smazány provedením další, sumarizace se neztratí, ale bude uchována na tomto listu „Celkem“. List „NovaDB“ bude sloužit jako místo pro přípravu datové tabulky pro jiný testovaný titul, tuto připravenou novou databázi pak budu připraveným makrem přenášet do listu „Data“ a na těchto zaměněných datech budu provádět další nové analýzy pro jiný titul. List „Grafy“ slouží pro vizualizaci výsledků z listu „Celkem“ do spojnicového nebo sloupcového grafu. Je tak patrné, že nic revolučního v tuto chvíli není na obzoru, budou to tedy stejné postupy a přístupy, které jsem již v článcích popisoval.     

JNJ Put Bear Spread 

   Otestování týdenního Put Bear Spreadu na titulu JNJ a na pětiletých datech s Long Put „na penězích“ o rozsahu tři strike se vstupem na pondělním Open a výstupem v pátek minutu před expirací by pak mohlo vyžadovat následující postup. Ze stránek Yahoo.finance si stáhnu pětiletá historická data tohoto akciového titulu.

   Tyto data následně naimportuji do svého excelovského listu „Data“, do buňky „B3“.

    Stažená data ve formátu .csv mají po importu do listu „Data“ tvar desetinného čísla s tečkou namísto desetinné čárky, proto provedu pomocí vytvořeného makra (nebo manuálně procedurou Najít/Nahradit) jeho převod pro fungování v českém prostředí Excelu.

   Pětiletá datová tabulka je převedena na český formát čísel společně s názvy dne týdne pro každý datum v mé datové tabulce. K těmto pětiletým cenovým datům na časovém rámci jeden den pak budu potřebovat zjistit hodnoty Implied Volatility za stejné období pěti let zpět. Tato data pořídím pomocí speciálního excelovského sešitu a postupu popsaného výše v textu.

   Pouze pro úplnost je na obrázku formulace dotazu s požadavkem na daný Ticker (JNJ), datum, od kterého chci historii (20200827), rok zpět (Y), denní data (11) a datovým typem je hodnota Implied Volatility pro zadané období a časový rámec (OPTION_IMPLIED_VOLATILITY). Pořízená a zkompletovaná data o Implied Volatilitě za pět let zpět na jednodenním časovém rámci přidám k datové tabulce, abych měl data v tomto tvaru.

   Doporučuji přidat nejdříve data stažených hodnot Implied Volatility i s datumy a provést kontrolu, jestli odpovídá datum s cenou akcie a datum s hodnotou stažené Implied Volatility. Následně použiji makro pro převod datumu na text – název dne v týdnu.

   Výsledkem těchto operací pak bude takto upravená datová tabulka.

   V následujícím kroku úpravy datové tabulky, kde budu chtít testovat obchody otevírající se v pondělí a uzavírající se v pátek, budu chtít nechat vymazat řádky, které nesou příznak názvu dne, který nenese název pondělí a pátek. Toto mi zabezpečí mazací makro, které jednotlivé řádky odstraní podle zadaného názvu dne, který do své datové tabulky nepotřebuji. Chci poznamenat, že mohu mít také zcela jiné obchodní zadání než jsou obchody pondělí a pátek, mohu se pohybovat v testování například na hodinových datech nebo třeba chtít do obchodu vstupovat první pracovní den v měsíci a vystoupit na expiraci měsíční opce ve třetí pátek v měsíci. Pro takové potřeby pak do mazacího seznamu mohu zadávat názvy jednotlivých hodin, které se mi do testování nehodí a upravit datovou tabulku právě pro hodinové obchody. Stejným způsobem mohu například opatřit každý řádek datové tabulky příznakem pro první pracovní den v měsíci a příznakem pro páteční expiraci v měsíci (z vytvořené databáze expirací) a poté si nechat vymazat všechny řádky, které takové příznaky mít nebudou. Na těchto datech pak mohu testovat obchody s trváním první den v měsíci/expirace opce. Ukazoval jsem skripty VBA právě pro možnost si takové vlastní analýzy vytvářet podle svých individuálních potřeb. Já ale nyní potřebuji smazat dny, které nejsou pondělky a pátky a zkontrolovat, jestli mi některý z těchto dnů v databázi nechybí pro uzavření burzy v tento den například kvůli svátkům. Nastavení mazání je z připraveného seznamu dnů v týdnu umístěného na listu „Tester“

   Výběr z připraveného seznamu (1) potvrdím spuštěním makra přiřazeného k tlačítku (2). Těmito úkony smažu z datové tabulky nevhodné dny v týdnu a prohlédnu výsledek, zda se v něm neobjevují chybové upozornění.

   Řádky, které narušují datovou řadu, protože jsem je opatřil chybovou hláškou „chyba“, odstraním a mám nyní databázi připravenou pro provedení analýzy mého zamýšleného Put Bear Spreadu. Tato příprava datové tabulky se nyní, po popisu jednotlivých kroků, může zdát dost komplikovaná nebo složitá, je ale také pravdou, že volná dostupnost těchto dat a jejich následné zpracování zcela kompenzuje pomyšlení, že bych za opční data musel platit horentní sumy nebo je velmi pracně (hlavně časově) získával z analytických platforem. Mohu také zvolit jiný přístup, jak takto volně dostupná data zpracovat a vymyslet jiný postup pro sestavení smysluplné databáze se kterou potom následně provádět nejrůznější analýzy, to vše již závisí na kreativitě a programátorské zdatnosti každého. 

   Testování týdenního třístrikového Put Bear Spreadu se začátkem obchodu na pondělním Open a uzavřením minutu před pátečním Close začnu nastavením Testeru, a to tak, že vytvořím nastavení času mého obchodu pro potřeby výpočtů cen opčních kontraktů-

   Do buněk, ve kterých zadávám čas obchodu mohu vybrat jakýkoliv obchodní týden a je lhostejné, jaké bude jeho „datumové vyjádření“. Mohu například použít datum z týdne, který právě uběhl, tedy vstup do obchodu v pondělí 24.8.202015:30 hodin (1), expirace opčního kontraktu je v pátek 28.8.2020 ve 22:00 hodin (2) a výstup z obchodu je jednu minutu před páteční expirací, tedy 28.8.2020 ve 21:59 hodin (3). Takto nastavené hodnoty pak budou dodávat údaje o času do mých vzorců pro výpočet ceny opčního kontraktu, a protože budou tyto časy stejně veliké pro minulý týden nebo například pro třináctý týden v roce 2017, je lhostejné, který týden (…a které datumy) si pro navolení času vlastně zvolím. Nyní přikročím k zadání vlastního obchodu.

   Put Bear Spread chci sestavit z Long Put na ATM strike, kterému odpovídá, při ceně podkladu 149.20 USD (1), strike na hodnotě 149 (2). Protože hodnoty těchto strike vznikají zaokrouhlováním aktuální ceny, budu mít vždy zajištěno, že v této buňce bude aktuální hodnota ATM strike, a protože na tomto strike chci nakupovat 1x Long Put, je v tomto řádku hodnota +1. Požadavek na Put Beer Spread s rozsahem tří strike splním tak, že o tři strike níže (na strike 146) pořídím 1x Short Put, což zabezpečím vepsáním hodnoty -1 do tohoto řádku. Mohu pak zjistit, že mi vzorce pro výpočet ceny opcí dodaly hodnotu mého obchodu -90.37 USD (3), tuto cenu bych tedy musel zaplatit za takovou opční kombinaci při aktuální ceně a aktuální Implied Voltilitě při pondělním Open. Protože vidím, že při pátečním Close byla cena akcie JNJ na úrovni 151.80 USD (4), vypršely mé Put opce jako bezcenné (5) a celková výstupní cena by tak byla na hodnotě nula (6). Celý obchod tak zakončil ztrátou celé investice ve výši -90.37 USD (7). Takto bych mohl vypozorovat tento jednorázový obchod manuálně zadaný do tohoto vytvořeného nástroje. Mě však nyní bude zajímat celé pětileté období takových obchodů, proto těžištěm mého zájmu bude postupně zapisovat do buněk vstupní ceny a vstupní hodnoty Implied Volatility a odpovídající výstupní ceny a výstupní hodnoty Implied Volatility, které vygeneruje odpovídající ceny opčních kontraktů na jednotlivých strike a zapisovat každý takový obchod do listu „Backtest“ za celé pětileté období a vyhotovit jeho celkovou sumarizaci na list „Celkem“. Opakované zapisování údajů a provádění výpočtů zabezpečím VBA skriptem, který nakonec nebude nijak složitý.

   Smyslem vytvořeného VBA skriptu bude postupné zadávání vstupních cenových hodnot analyzované akcie a hodnot Implied Volatility do buněk v červených obdélnících (1) a (2) na základě čehož pak budu moci pouze zaznamenávat odpovídající vstupní hodnoty celého opčního obchodu (3) a od něj odečítat výstupní hodnotu celé opční kombinace (4), to nebude programátorsky nic složitého. K popisu jednotlivých analýz využiji buňky s příslušným popisem, abych se při jejich větším počtu neztratil při jejich vzájemném srovnání, mohu také nechat své obchody filtrovat podle vstupu na určité úrovní Implied Volatility, abych odhadl, které úrovně této Implied Volatility mé strategii více svědčí.

   Název analýzy jsem si zvolil „PBS/0100-10/10-80%“ (1). Pojmenování PBS je pro Put Bear Spread. Souhrn nul a jedniček reprezentuje rozložení strike na mé šestistrikové sadě možných strike a 10-80% reprezentuje skutečnost, že chci testovat jen obchody, kde vstupní Implied Volatilita se pohybuje mezi těmito hodnotami, jsou to shodou okolností všechny obchody, protože hodnota Implied Volatility za toto pětileté období nepřesáhla 80%. Ticker JNK označuje testovaný titul (2). Nastavení parametrů pro vstupní Implied Volatilitu je v buňkách označených (3). Po takto nastaveném listu „Tester“ mohu podrobit má pětiletá data zkoumání.

   Spuštěním modrého tlačítka „Testuj“ (1) dojde k inicializaci makra, které „prožene“ má data z datové tabulky listem „Tester“ s buňkami s nastavenými vzorci pro výpočty cen opčních kontraktů a po splnění úkolu ohlásí konec analýzy oznamovacím oknem (2). Celou podrobnou analýzu si mohu prohlédnout na listu „Backtest“

   Každý obchod za pětileté období mám popsán jeho vstupními a výstupními parametry se sumarizací, je tak patrné, že tato strategie by za sledované období utrpěla ztrátu -1.157,51 USD. Sumarizaci tohoto obchodu mohu pozorovat na listu „Celkem

   Sloupec se záznamem celkové equity z listu „Backtest“ je opatřen názvem analýzy a její celkovou sumarizací. Graficky pak mohu vizualizovat tuto analýzu v připraveném grafu.

   Průběh křivky z listu „Celkem“ nepovídá, že tento typ obchodu by pravděpodobně nebyl z těch, které by stály za mou pozornost. V takto připraveném excelovském sešitu tedy přesouvám svou pozornost na Call stranu a pokusím se vyhodnotit obdobnou strategii debetního spreadu, ale s Call opcemi. Slibovaný test by měl být opět na Call Bull Spreadu o rozsahu tři strike s Long opcí jeden strike od aktuální ceny. Mé nastavení testeru by pak mohlo být následující.

   Vše zůstává stejné, pouze se změní nastavení počtu a typu opčních kontraktů na Call straně (červená šipka). Zůstává stejný čas i zadání filtru podle Implied Volatility, kdy chci prověřit všechny obchody.

   Výsledek je výrazně jiný a přináší již první náznaky, že obchody na Call straně budou tomuto titulu více svědčit. Protože jsem ve svém zadání uvedl, že chci testovat umístění Long opce jeden strike od aktuální ceny a nespecifikoval, jestli má být pod nebo nad aktuální cenou, vyzkouším i druhou možnost, tedy s Long Call opcí jeden strike „v penězích“. Zadání by bylo následující

  Výsledek je opět kladný.

   Ponoření Long Call „do peněz“ jeden strike nevykazuje známky ztrátového průběhu, celkový výsledek je ale o -400 USD slabší. Výsledek pak mohu vizualizovat v grafu.

   Nad plán pak mohu přidat testování Call Bull Spreadu s Long Call opcí umístěnou ATM „na penězích“ se stejným rozsahem tři strike.

   Mohu pak vypozorovat, že tato kombinace má nejlepší výnos.

   Vizualizace v grafu pak níže.

   Ponechám nyní nejvýkonnější strategii v centru své pozornosti, tedy Call Bull Spread s rozsahem strike tři body a pokusím se jej upravit o vstupy podle hladiny Implied Volatility. Zbavím se aktuálních sumarizací testů na listu „Celkem“ spuštěním mazacího makra.

  Nyní tedy budu zkoušet různé varianty vstupů podle navoleného vstupního pásma Implied Volatility. Toto zadání pak budu upravovat v těchto buňkách.

   V prvním testu tak budu chtít vstoupit pouze do obchodu v případě, že Implied Volatilita bude vyšší než 10%, ale nižší než 15% (1). Tento průběh si označím také v Názvu analýzy (2). Postupně pak budu testovat různá pásma, abych dospěl například k takto vizualizovanému výsledku.

  Do vstupu do obchodů na hladině Implied Volatility 10% až postupně 55% výkonnost strategie roste.

   Částka 5.137,20 USD by pak byl výsledek testu se vstupy mezi 10% a 55%. Mohu si tak dovolit velmi rychle vyzkoušet, jak by si strategie vedla při vstupech na vyšších hladinách volatility, tedy vyloučit vstupy, kdy Implied Volatilita bude nižší než 15%, 20% a 25%. Tento výsledek pak je možné vidět v tomto zobrazení

   Vyloučením obchodů při nízké Implied Volatilitě vede samozřejmě k redukci celkového počtu obchodů a související výkonnosti strategie, která ztrácí páru s odfiltrováním obchodů na její nízké úrovni. Je to logické, Call Bull Spread potřebuje ke svému úspěšnému životu růst trhů a ten je charakterizován především nízkou Implied Volatilitou, při jejím zvyšování (jako filtru obchodů) se záměrně a nelogicky vyhýbám obdobím klidu na trzích a vstupuji pouze v období zvýšené nejistoty, tam jsou ale opce nejen drahé, ale také mají menší pravděpodobnost, že budou ziskové z pohledu jejich zapojení do kombinace Call Bull Spread.

   Mohu si také vymyslet jiné opční strategie k otestování na tomto časovém rámci. Mohu tak zjistit, že například kreditní strategie, tedy vypisování naked Put nebo Call, kreditních vertikálních spreadů nebo Iron Condorů na tomto týdenním časovém rámci je v rámci mnou testovaných strike na pětiletém období veskrze ztrátové.   

   Z grafické vizualizace těchto kreditních strategií pak vyplývá, že pokud nevykazují trvale sestupnou křivku equity, pak je vždy různě dlouhé období stagnace nebo mírného růstu křivek vystřídáno ztrátou většího rozsahu která spolehlivě maže předchozí výkony, toto chování je pak vlastní těmto strategiím, přestože si obrovské masy traderů (a dokonce mentorů) myslí něco jiného.

Záměna dat

   Po prozkoumání titulu JNJ nyní chci využít vytříděnou a upravenou datovou řadu také pro jiný akciový titul, a to konkrétně například pro avizovaný McDonald’s (MCD). K takovému úkonu my nyní stačí stáhnout opět pětiletá akciová data pro tento titul z nějakého veřejného zdroje (yahoo.finance) a k nim si opatřit pětiletá data Implied Volatility od mého brokera Interactive Brokers. Obě tyto datové tabulky natáhnu do excelovského listu „NovaDB“, aby data měla tento tvar.

   Na listu „NovaDB“ (1) jsou vedle sebe obě datové řady s cenovými akciovými údaji a s údaji o Implied Volatilitě. Data s Implied Volatilitou jsou od sloupce „H“ (2) a obsahují také příslušné datum. Toto je pro kontrolu, že žádné datum v obou datových řadách nechybí, toto musím zkontrolovat, aby nedocházelo k disproporcím v analýze díky časovému nesouladu obou datových řad. Pokud mám takto data připraveny, použiji makro pro převod této nové databáze do listu „Data“.

   Makro je přiřazeno k tlačítku „Natáhni nová data“ a po jeho spuštění dojde k výběru potřebných údajů z datové tabulky MCD do datové tabulky na listu „Data“, konkrétně budou vybrány pouze dat příslušející pondělkům a pátkům za pětileté období. Správnost celé operace je potvrzeno vyskočeným oknem oznamujícím konec takového převodu. Volba akcie MCD přináší úpravu výpočtu jednotlivých strike, protože je to dražší akcie, která má listovány opční kontrakty s krokem 2.50 USD.

 

    Krok 2,50 USD při výpočtu strike musím vyřešit zaokrouhlovací funkcí Excelu =MROUND, abych obdržel hodnoty jednotlivých strike přepočtené podle takového krokování. Nyní mohu na nových datech MCD vyzkoušet stejnou analýzu pro Put Bear Spread o rozsahu tři strike a Cal Bull Spread o rozsahu tři strike. U Call Bull Spreadů vyzkouším variantu s Long Call jeden strike nad ATM a variantu s ATM jeden strike „v penězích“.

   Sázet pět let na pokles pomocí debetního Put Bear Spreadu vykazuje opět ztrátový průběh. Call Bull Spready jsou na tom ale daleko lépe a výnos za pětileté období je podstatně zajímavější. Mohu si pak tyto tři testy graficky zobrazit.

   Na datech MCD nyní mohu opět dále experimentovat s nejrůznějšími strategiemi výpisů a nákupů na nejrůznějších strike s nejnemožněji představitelným počtem jednotlivých kontraktů a samozřejmě se také mohu pokusit obchody filtrovat podle aktuální hodnoty Implied Volatility. Na obrázku níže pár ukázkových testů na Call straně.   

   Řekli by jste, že pořizování Call Ratio Spreadu sestaveného ze dvou Long Call a vypisování tří Short Call na vyšších strike by přineslo za pět let částku dosahující +20.000 USD?


VBA skript

  V popise VBA skriptu se omezím pouze na makro, které zpracovává vlastní testování datové řady. Ostatní makra, zařizující ostatní procedury jsem popsal v předchozích článcích o testování akciových titulů (mazání listu, záměna tečky za čárku, mazání řádků podle výrazu v něm, natažení nové databáze…) již popisovat nebudu, protože jejich princip zůstal zachován. Všechna tato makra se nacházejí v Module1

   První makro v Module1 s názvem OpcniTester je prvním makrem v pořadí a je právě makrem, které obsluhuje samotné zpracování pořízených dat.

   Spuštění tohoto makra zahájí deklarací excelovského sešitu (1) a nastavením jeho listů (2) a pokračuje deklarací proměnných, které budu následně používat (3). Po tomto úkonu dojde k vymazání předchozího podrobného backtestu na listu „Backtest“ (4), aby se nově zadávaná analýza zpracovávala na vyčištěném listu.

   Pokračování skriptu pokračuje načtením hodnot proměnných, které budou po celou dobu zpracovávané analýzy neměnné. Těmito hodnotami bude pojmenování analýzy (Analyza) a název titulu (Ticker) a také hranice Implied Volatility, kterými chci případně filtrovat vstupy do obchodů (IV_OdHodnoty a IV_DoHodnoty) (5). Další řádky skriptu předepíší hlavičku přehledu na listu „Backtest“ (6) a stejně předepíší hlavičku přehledu sumarizace na listu „Celkem“ (7).

   Další část skriptu je pak již známým „motorem“ makra, tedy postupným vkládáním jednotlivých dat z datové tabulky a jejich vyhodnocováním pomocí cyklické funkce Do While…Loop  (8). Jejím principem je postupné načítání hodnot proměnných z datové tabulky pro každý cyklus (9). na tomto místě mohu jen připomenout, že pokud se někomu může zdát, že testování Call Bull Spreadu na tickeru JNJ v rámci jednoho týdne (pondělí až pátek) je velmi malý časový rozsah držení obchodu, může si volbou buněk pro načítání hodnot proměnných velmi jednoduše zajistit načítání z buněk, které reprezentují nikoli pouze jednotýdenní držení obchodu, ale například jeho čtrnáctidenní průběh, třítýdenní průběh…, většina titulů, která disponuje weekly opcemi má tyto listovány také v těchto expiracích, takže modelovat držení v delším horizontu je jenom o mírné úpravě tohoto cyklu pomocí tohoto skriptu na výběr odpovídajících hodnot pro načítání proměnných. Nejdůležitější části cyklu je vložení hodnot proměnných pro vstupní a výstupní cenu a vstupní a výstupní Implied Volatilitu do buněk Testeru pro provedení výpočtu cen opčních kontraktů navolenými vzorci na jednotlivých strike (10). Pokud je toto provedeno, list Testeru vypočítá hodnoty opčních kontraktů a takto zadaný obchod zapíše do prvního prázdného řádku na listu „Backtest“ (11). VBA script poté vyhodnotí, jestli zadávaný obchod vyhovuje vstupním hodnotám filtrování podle Implied Volatility, toto je zabezpečeno využitím podmínky If…Then…Else (12). Posun cyklu o požadovaný počet řádků (opět souvisí s testováním období jeden týden, pokud budu chtít delší období – upravím podle potřeby) zabezpečí změna proměnné AktualniRadek (13). Proceduru opakuji skokem na první řádek Do While…Loop  (14), která odstartuje další cyklus s dalšími daty z datové tabulky. Provedením všech úkonů cyklu vyčerpáním všech dat v datové tabulce, provede skript operace shrnutí.

   Zjištění konečné hodnoty výsledku je načteno do proměnné Vysledek, které je posledním číslem ve sloupci, do kterého jsem na listu „Backtest“ sečítal celkovou equity testované strategie (15). Tento sloupec s vyznačenou equity je přenesen z listu „Backtest“ do prvního volného sloupce na listu „Celkem“, kde zůstane pro srovnání s dalšími analýzami (16). Úprava šířky sloupce podle názvu analýzy je řádky skriptu označeného (17), je to proto, aby se mi názvy lehce četly a nemusel jsem manuálně šířku upravovat podle vepsaného textu s názvem analýzy. Celá analýza navolené opční strategie končí vyskočením oznamovacího okna s vyobrazením jeho konečného výsledku (18).   

   Ve světle minulých článků se tak při psaní skriptu neobjevilo nic nového a všechny funkcionality Testeru jsou postaveny na již nabytých znalostech VBA. Myslím, že skript je velmi jednoduchý, a proto by měl zajišťovat hladký průběh testování obchodů, záleží pak jenom na rozsahu testovaných dat a výkonnosti počítače, aby zpracování jednotlivých analýz netrvalo více než jednotky desítek vteřin. Opční Tester je ke stažení s daty titulu MCD a s nastavenými kroky strike po 2.50 USD a s provedenými testy na listu „Celkem“ podle textu výše. 


   Co dodat závěrem. Nebylo mou ambicí proniknout do všech zákoutí programování ve VBA, ale zejména ukázat, že i pouze základní znalosti a principy tohoto programovacího jazyka se mohou proměnit ve vcelku mocný nástroj a efektivního pomocníka opčního tradera. Nechci nikomu samozřejmě vnucovat své řešení, ale chtěl jsem ukázat pouze jeho principy, aby si každý mohl vymyslet a naprogramovat své vlastní nástroje k vyhodnocení zamýšlených opčních strategií. Můj ukázkový testovací excelovský sešit samozřejmě umožňuje řadu dalších vylepšení, mohu si zvolit více strike než jen mnou použitých šest pro každou stranu opčních řetězců, mohu do svých výpočtů zahrnout další parametry filtrování například pomocí vestavěných funkcí pro výpočet řeckých písmen, které jsou součástí Module2, mohu svá vstupní nebo výstupní rozhodnutí vybírat nebo omezovat hodnotou nejrůznějších indikátorů, pokud budu mít k dispozici jejich historické hodnoty. Možností je opravdu mnoho a záleží na každém, jak je nakonec využije. Plně si uvědomuji, že není jednoduché (možná napoprvé) pochopit mé myšlenkové pochody, které vedly k tvorbě tohoto excelovského sešitu k testování opčních strategií a je pravděpodobné, že tento článek je jeden z nejméně pochopitelných pro čtenáře, který nemá o opčním obchodování většího povědomí a není současně seznámen se základy VBA. Jsem ale přesvědčen, že by mohl alespoň ukázat, že lze vždy najít nějaké řešení, které vede k základnímu vyhodnocení zamýšlených obchodů a není k tomu zapotřebí nijak zvláštně sofistikovaný přístup nebo drahý software, který nakonec ani nebude schopen vyřešit vše, co by mě mohlo zajímat. Pochopení alespoň jednoduchých základů VBA skriptů pak může jednoznačně pomoci při využití všech funkcionalit Excelu, což se může hodit nejenom při tradingu, ale také v jiných oblastech jeho použití….:c)    

   Komentáře a příspěvky k tomuto článku prosím směrujte do Diskuzního fóra do tohoto vlákna k tomuto článku nebo do obecnější diskuze o Excelu :c) 

Sleduj facebook, napiš e-mail nebo tweet

12 thoughts on “Backtestování v Excelu (VBA) – VIII.”

  1. Zdravím!
    Můžu se zeptat, ve které verzi TWS a API to výše popsané stahování OPTION_IMPLIED_VOLATILITY fungovalo?
    Protože ve verzi 981 už to bohužel nefunguje 🙁
    Ani v nastavení Global Configuration v TWS už není možnost zatrnout „Enable DDE clients“, jak bylo popisováno zde https://dobretrejdy.com/?p=2208
    Díky
    J.

    1. Ahoj Jožko, už ti to funguje? V Global configuration taky nemám to Enable DDE, mám tam „DDE replaced with DDE Bridge…“ a nejde to zatrhnout (je to zašedlý). Když to makro zkouším v Excelu spustit (buď v mým nebo v tom, co dával Jirka ke stáhnutí), tak se to nejdřív zeptá, jestli opravdu chci spustit aplikaci Sjmenouctu.exe (stejný jméno, co vyplňuju v tom makru). Když kliknu na „ano“ tak mi to napíše, že „program nebo nějaká jeho součást je poškozená nebo chybí.“ (Případně Jirko, co ti poradili na podpoře?) Na stránkách s infem o API jsem nic nennašel. Díky

      1. Ahoj,
        tak mi to pořád funguje v tom excelu, který je ke stažení, nicméně při spuštění nastaveni API mi vyskakuje hláška, že mé nastaveni je zastaralé a je doporučeno nastavení přes DDE Socket Bridge.

        . P

        Prozatím jsem na toto nastavení nepřepínal (a ponechal staré), protože podle informací z webu IB to bude znamenat pravděpodobně změnu v syntaxi požadavku na stahování nebo stream dat. Toto musím prozkoumat a upravit své excely, pokud by se někomu podařilo proniknout, jaké změny to vyžaduje (vím, že je například změna názvu serveru atd…). Informace na tomto odkazu https://interactivebrokers.github.io/tws-api/dde_intro.html a znamená to, že nové propojení přes DDE Socket Bridge funguje již od API v975, takže pokud máš starší verzi (jako já), tak to ještě pojede ve „starém režimu“, stažením nové verze již bude asi potřeba udělat patřičné inovace….:c)

        1. Ahoj,
          jelikož mám vše 64-bitové (OS, TWS v981 i Excel), tak už to takto nejde a jak už bylo řečeno výše, DDE client vůbec nejde zapnout.
          Bohužel v DDE Socket Bridge je zřejmě nějaká chyba, protože stahování TRADES normálně funguje, ale pro OPTION_IMPLIED_VOLATILITY mi to hlásí něco jako „Option expired“. Když to zkusím přes ukázkovou aplikaci (C:\tws-api-981\samples\CSharp\IBSampleApp), tak to jede, takže odhaduji, že problém je v tom DDE Socket Bridge. Takže jsem se na to celé DDE vykašlal a stáhnul si to přes Python API…
          Jožka

  2. Dobrý den.

    Chtěl bych se zeptat, jestli tohle backtestovani funguje i na obyčejnou strategii nákup CALL a PUT opce. Chtěl bych si otestovat svoji strategii a použit ji na září 2021. Jde mi o to jestli se mohu dopočítat cen opci za kterou bych je koupil a následně prodal. Tedy zjistit jaký teoretický zisk/debet bych měl.

    Předem děkuji

    1. Ahoj Jakube,
      samozřejmě to jde. Pořídíš si data za období, které chceš prozkoumat a upravíš je tak, aby odpovídaly tvému zadání. V článcích je popsaná varianta otevření v pondělí a uzavření v pátek, takže si se stažených dat vybereš jen pondělky a pátky. Takovou upravenou databázi vložíš na list „Data“. Na listu „testeru“ pak zadáš parametry (vstup, výstup, expirace), zadáš do sloupce kontraktů hodnotu +1 na požadovaném strike (nákup Long) a v požadované sekci (Call nebo Put) a spustíš test. Měl bys obdržet teoretický výsledek.

      Práce s testerem je vhodná pro větší objemy dat, třeba pět let, protože nahradí pracné ruční testování v thinkorswim. Pokud chceš ale prozkoumat jen několik obchodů (uvádíš za září), je jednodušší spustit TOS a vypracovat analýzu ručně pro těchto pár obchodů…pokud jsem tě správně pochopil, že chceš takový krátký úsek… Jirka :c)

      1. Děkuji za odpověď.

        Jde mi o strategii na bázi intradennich obchodu, to jsem zapomněl napsat. Tak ze obchody od Po do Čt. Vždy otevření obchodu a uzavření během dne. Rozpětí obchodu 1-5 za den. Dokáže i tohle vás Excel?

        Děkuji

        1. IB umožňuje stažení intradenních (třeba minutových) dat a na tomto timeframe také hodnot Implied Volatility. Mohu pak v mém testeru simulovat například vstup každé úterý v 16:44 a výstup hned ve středu v 20:48,a to tak, že ze stažených dat vyberu právě všechny úterky 16:44 minut a všechny středy 20:48 minut a budu pak na takto vybraných datech moci testovat. Mohu pak nastavit, jestli vstoupím do opce v úterý 16:44 a vystoupím ve středu 20:48 s expirací v pátek stejného týdne nebo to bude na opci, která má expiraci následující pátek atd…Co tester neumí, je vstoupit do opce v pondělí 16:45 a vystoupit v v pondělí 21:30 a hned v úterý vstoupit v 16:45 a vystoupit ve 21:30…atd. každý den po sobě pro opci se stejnou expirací. To bych musel v testeru měnit pro každý takový jednotlivý výpočet čas, který opci zbývá do expirace, protože například od pondělí 16:45 do expirace je delší doba než u následného vstupu v úterý v 16:45, to excel neumí. Snad jsi myslel tento případ, Jirka :c)

  3. Dobrý den ahoj,

    rád bych se zeptal jestli se někomu podařilo přes nové nastavení API zprovoznit stahování historických dat v excelu?

    Pěkný den
    David

Napsat komentář: Jožka Zrušit odpověď na komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *