Napsat jednoduché makro pomocí jazyka VBA, vyplnit jej skripty, které umí číst hodnoty z buněk nebo je formátovat, mazat či přenášet na jiné místo v excelovském listu, tvořit proměnné a vybavovat je hodnotami, zajistit cyklické načítání dat, umět formulovat základní logické a rozhodovací funkce a vytvořit nástroj na záměnu celé databáze bylo předmětem minulých článků. Na této úrovni poznání jazyka VBA již lze pravděpodobně vyhodnotit, že pouze poznání jeho základů může výrazně urychlit práci s daty a vytvářet analýzy nejrůznějších obchodních nápadů. Protože směruji k využití VBA k nějakému zevrubnému testování opčních obchodů, budu se v dnešním článku zabývat právě prvním možným zapojením opčních kontraktů do vytvářených analýz.

   Nechci v žádném případě vytvářet dojem, že poznání programovacích možností jazyka VBA je jakýsi „vyšší level“ práce s Excelem a nelze se bez něj obejít. Některé procedury však v Excelu prostě nevytvoříte, některé z nich jsou zase ve VBA zbytečně složité, například oproti nějakému jednoduchému vzorci umístěnému v excelovské buňce. Dobré tak je zvolit nějaký přijatelný kompromis, aby zadaný analyzovaný úkol dobře na počítači běžel, abych jeho zpracování rozuměl a abych jej byl také schopen jednoduše ovládat či upravovat. Taková konstelace mi pak umožňuje být dostatečně efektivní a pružněji se přizpůsobovat mým „analytickým požadavkům“. V dnešním článku bych chtěl takové spojení klasických excelovských vzorců a VBA skriptu použít na vyřešení jednoduchého obchodního zadání, které se výjimečně nyní nebude zabývat prací s historickými daty umístěnými v pořízené datové tabulce, ale bude zpracovávat reálná data, které mi poskytuje můj broker Interactive Brokers. Tento článek pak bude rozvíjet poznatky z článku Živá data z IB do Excelu a Syntetické pozice – I.. Co bude tedy k řešení? Avizované obchodní příležitosti v kombinacích Conversion a Reversal, tedy vytvořených diskrepancích mezi nabídkou a poptávkou po opčních kontraktech na obou stranách opčního řetězce sestavených do těchto dvou formací z akcií a opcí na stejném strike, jako bezrizikové kombinace, které jsem již na tomto webu mnohokrát popisoval. Jak bych tedy mohl tyto obchodní příležitosti vyhodnotit nějakým mírně automatizovaným systémem bude náplní dalšího textu společně s konkrétním obchodem na mém obchodním účtu.


   Streamování dat využitím API do mého excelovského sešitu jsem popisoval v článku Živá data z IB do Excelu a nebudu již nyní tyto základy rozebírat, dotknu se pouze základních věcí. Beru již za vyřešené, že jsem schopen pomocí funkcionality RTD (Real-Time-Data) načítat do excelovských buněk hodnoty cen jednotlivých akciových titulů a opčních kontraktů na nejrůznějších strike a v nejrůznějších expiracích. Nemělo by pak být obtížné, z takto načtených cen akcií a opcí vyhodnotit, jestli se na takto získaných cenových údajích nevyskytuje nějaká větší abnormalita, která by mohla vést k nějakému smysluplnému obchodu. Toto je sice pravda a takto jednoduše si to mohu představit pro jednotlivě ručně zadaný titul do excelovské buňky, ale při nějakém „hromadnější zpracování“ se vyrojí k řešení mnoho nečekaných problémů, se kterými je nutno si poradit. „Americký“ formát dat přitékající do mého sešitu, variabilita a dostupnost strike, chybové hlášky serveru a časová prodleva s načtením hodnot jsou ty nejvýraznější z nich. Řešení hledání příležitosti na Conversion a Reversal pak bude spojením využití vlastností excelovských buněk v listu formou klasické práce s buňkami a nástroji zabudovanými do Excelu a napsaným skriptem ve VBA, který bude tento nastavený excelovský list postupně zásobovat jednotlivými daty.

Nastavení Excelu

   Můj excelovský sešit, vytvořený pro řešení tohoto úkolu je ke stažení z tohoto místa, bude mít tři listy

   Na listu „Start“ bude opět jakési zadávací rozhraní – přístrojová deska, která bude sloužit k ovládání základních parametrů analyzovaného úkolu. Na listu „Tickers“ budu mít seznamy akciových titulů, pro které chci vyhledat obchodní příležitosti (například tickery S&P500, DJ Industrial, NASDAQ 100..) a na třetím listu „Result“ budu zapisovat vyhledané a vypočítané údaje. Budu se tak pohybovat mezi listy jednoho sešitu. Z pohledu klasické práce s Excelem budou nejdůležitější vlastnosti a nastavení listu „Start“

   Na obrázku mohu vypozorovat excelovský list s nachystaným nastavením pro čerpání živých dat akcií a opčních kontraktů od mého brokera Interactive Brokers. Na obrázku jsou červenou kurzívou vyznačeny vzorce v buňkách, které toto zařizují. Pomocí funkce =RTD(ProgID, Server, předmět dotazu1, předmět dotazu2…..) pak mohu čerpat při spuštěné platformě TWS data do vybraných buněk podle zadaných parametrů. Argumentem funkce =RTD s názvem ProgID je označení serveru poskytujícího data a má pro každý vzorec stejnou pevnou hodnotu (tws.twsrtdserverctrl) vepsanou do buňky A1 (1), druhý argument s názvem Server je pak prázdná hodnota (neuvádí se). Zbylé argumenty pak představují zadání „Tickeru“ (označení akciového titulu), burzy, ze které chceme data čerpat „Exchange“ a cenové akce, kterou chci zobrazit v buňce („Last“…) (2). V případě opčních kontraktů musím dotaz vylepšit o uvedení informace, že chci opční data („OPT“), jakou požaduji expiraci („20200821“ je pátek 21.8.2020), zda mám zájem o Call („C“) nebo Put („P“) opční kontrakty a samozřejmě na jakém strike, toto vše musím proložit přesným počtem lomítek a pospojovat znaky ampersand (3). Dotaz na požadovaný typ opční ceny do buňky pak musím vyjádřit v posledním argumentu („Last“ například) (4). Toto vše je podrobněji popsáno v článku Živá data z IB do Excelu. Pokud při spuštěné obchodní platformě TWS mám takto zadáno nastavení, mohu pozorovat načítání živých dat do buněk mého excelovského listu „Start“.

   Pokud skryji na listu „Start“ nepotřebný sloupec „A“, kde mám uvedeny pouze „těla dotazů“, které nepotřebuji pro žádná další vyhodnocení, mohu vypozorovat rozmístění jednotlivých prvků, kterými budu ovládat a specifikovat potřebnou analýzu, jako na níže uvedeném obrázku. Každý prvek pak představuje nastavení a řešení dílčího problému s přitékajícími daty do mého excelovského sešitu.

Formát a volba strike

   Na obrázku je patrné, že jsem si připravil tři oddíly pro strike, které budu chtít načítat do mého sešitu, označeno (1), (2), a (3). Za povšimnutí stojí zejména „americký tvar“ jednotlivých číselných údajů. Musím si jednoduše pro tuto analýzu nastavit prostředí mého počítače na americký formát dat, protože při volbě strike 42,50 s desetinnou čárkou nevrátí server žádnou odpověď, vnímá totiž čísla pouze ve formátu s desetinnou tečkou, tedy strike 42.50. toto zařídím tak, že v nastavení mého počítače (Windows 10) zvolím volbu „Čas a jazyk“

   V tomto výběru pak vybírám v menu „Související nastavení“

   Potvrzením „Datum, čas a místní formát“ mohu vybírat z jazykových verzí pro formátování čísel mých aplikací.

   Volbou „Angličtina (Spojené státy)“ pak zaměním formátování čísel na potřebný tvar s desetinnou tečkou namísto čárky, toto nastavení pak ponechám pro celou mou prováděnou analýzu. Mohu se pak vrátit k obrázku s třemi sekcemi strike výše a vypozorovat, že u těchto číselných hodnot strike (a také ostatní číselné hodnoty v obrázku) mám namísto desetinných čárek tečky. Proč mám tedy tři sekce strike? Základním problémem pro mou analýzu a streamování opčních dat je skutečnost, že každý titul může mít listovány nejrůznější strike na nejrůznějších úrovních. Obecně platí, že akciové tituly s hodnotou do 100 USD mají jednotlivé strike na hodnotě celých dolarů, Na obrázku je akcie XOM s aktuální cenou 43.42 USD, která má v první sekci viditelné Call i Put strike na hodnotách 41, 42, 43, 44 a 45 a k nim načtené ceny opčních kontraktů Put i Call (1). Mohu ale jednoduše zjistit, že tituly, které mají cenu vyšší než 100 USD již mají tento „krok“ v hodnotách strike po 2.50 USD. Na obrázku níže je taková situace znázorněna.

   Volbou akcie MMM s aktuální cenou 158.01 USD mohu pozorovat, že pro strike 158 se objevuje namísto ceny opčních kontraktů hláška serveru o neexistenci takového kontraktu (1). Ovšem v sekci, kde jsou strike v krocích po 2.50 USD již vidím ceny v pořádku načteny (2). Protože budu zkoumat tituly s nejrůznějšími cenami, musím ošetřit právě tento problém s volbou strike nejblíže aktuální ceně postupnými dotazy (v následném VBA skriptu) na jednotlivé sekce podle strike a na existující načtené ceny opčních kontraktů. Třetí sekce excelovského listu „Start“ s krokem strike po 5 USD je pak určena pro akciové tituly s vyšší cenou, které nemají listovány opční kontrakty nejen po jednotlivých dolarech, ale také ani po 2.50 USD, příkladem pak může být tato situace.

   Titul AMZN se obchoduje za cenu přesahující tři tisíce dolarů a jeho strike nejblíže aktuální ceně 3162 USD pak leží na hodnotách 3160 USD. Jak dostanu pro každou načtenou hodnotu akciového titulu potřebné sady možných strike je patrné na obrázku níže.

   Zaokrouhlovací funkce =MROUND (číslo; základ pro zaokrouhlení) mi umožní vytvářet takové sady strike velmi pohodlně. Podle načtené Last ceny akciového titulu (43.42 USD) po zadání vzorce =MROUND(G3;2.5) vyrobí excelovský vzorec pro zaokrouhlení v příslušné buňce číslo zaokrouhlené právě na hledaný krok strike 2.50 USD (42.50). Ostatní strike okolo tohoto ATM strike již vytvořím přičítáním a odečítáním hodnoty +/-2.50 od takto zaokrouhleného čísla (1). Ve stejném smyslu pak hledám zaokrouhlení na základ 5 USD pro nejdražší tituly pomocí zaokrouhlovací funkce =MROUND(G3;5) v třetí sekci strike (2). Načtení jakéhokoliv akciového titulu pak povede k vytvoření tří sad strike podle jednotlivých kroků s tím, že mám zaručeno, že alespoň v jedné z těchto sekcí uvidím hledané opční ceny na nejbližších strike k aktuální ceně, která se mi načetla do excelovského sešitu.

Prodleva v načítání dat

   Zcela zásadním problémem, se kterým je třeba se poprat, je prodleva načtení dat ze serveru Interactive Brokers. Pokud zadám do takto připraveného excelovského listu „Start“ do buňky pro ticker požadovaný akciový titul, odeslání požadavku na data a jejich stažení do připravených buněk není ihned, ale trvá nějakou dobu, která je závislá na mnoha faktorech, rychlosti mého počítače, vytíženosti datového serveru, kvalitě internetového připojení atd. Musím proto mezi jednotlivými postupnými načteními jednotlivých titulů dopřát celému vyrobenému nástroji čas, aby data do excelu zcela kompletně nahrál a teprve potom mohu tyto stažená data využít pro další výpočty. Na obrázku níže je označena buňka, do které bude zanesena velikost pauzy mezi jednotlivými zpracováními

   Mám nastaveno na hodnotu +5 sekund a bude to znamenat, že mezi jednotlivými požadavky bude pětivteřinová pauza na stažení akciových a opčních dat nebo příslušných varovných upozornění do mého excelovského sešitu. Tuto prodlevu pak mohu samozřejmě upravovat podle potřeby nebo kvality a podmínek stahovaných dat.

Datové sady

   K testování hledání příležitostí si musím vytvořit seznam akciových titulů, které chci do analýzy zapojit. Bude se jednat o řady akciových tickerů, které budu postupně doplňovat do excelovského listu a očekávat stažení akciových a opčních dat k tomuto titulu. Na listu „Start“ bude každá řada reprezentována číslem sloupce, ve kterém se příslušný seznam tickerů nachází na listu „Tickers“.

  V obrázku je označení datové řady číslem „2“. Znamená to, že nyní budu chtít testovat akciové tickery z listu „Ticker“ ve sloupci „B“

  Mohu pak vypozorovat, že v druhém sloupci mám data akciového indexu Dow Jones Insdustrial Average, tato data pak budou postupně do lisu načítána. Mohu si také všimnout připravených sloupců pro akciové tituly zahrnuté do indexu S&P 500 (sloupec č.4), Russell 2000 (sloupec č.6) nebo Nasdaq 100 (sloupec č.8). Mohu si vytvářet pochopitelně libovolně své vlastní sloupce se seznamy akciových titulů podle vlastního uvážení, například importovat výsledky nějakého webového screeneru, preferovat vlastní sestavený výběr apod. Základním pravidlem pro sestavení takového seznamu je pak zjištění, jestli se daný ticker obchoduje prostřednictvím mého brokera a poskytuje alespoň akciová data. Musím proto (například datová řada pro Russell 2000) takové řady nejdříve upravit o odstranění titulů, pro které nedisponuje IB žádnými daty, analytický nástroj by pak zastavoval běh procedury v případě, že by se takové tituly v datové řadě nacházely.

  Expirace a Počítadlo

   Pro hledání obchodních příležitostí pro kombinace Conversion a Reversal na ATM strike musím samozřejmě pro potřeby stahování opčních dat datovému serveru sdělit, o jakou expiraci opčních kontraktů mám zájem. Toto zadám do příslušné buňky na listu „Start“ následovně.

   Údaj 20200821 (1) pak znamená datum expirace v pátek 21.8.2020, přesně v takovém tvaru RRRRMMDD musím aplikaci pro stahování sdělit požadované expirační datum. Dále mám na listu „Start“ umístěno Počítadlo, které reprezentuje řádek sady Tickerů z listu „Tickers“, který požaduji zpracovat. Toto číslo mi pak pomáhá jednak pozorovat průběh zpracování analýzy, protože se po každém zpracovaném tickeru zvedne o hodnotu jedna a také pomáhá v případě problémů vypozorovat, na kterém řádku datové sady tickerů je nějaká chyba v načítání, kterou je zapotřebí opravit. Přerušení běhu aplikace se stavem počitadla 248 při zpracování titulů zahrnutých do indexu S&P 500 mi pak říká, že jsem v polovině zpracovávaného procesu a chybu mi generuje právě řádek 248 ve sloupci 4.

Výsledek analýzy

   Výsledky každého zpracování dat jsou přenášeny na list „Result“

   Po zpracování tickerů náležejících do indexu DJIA (které trvalo necelé tři minuty) mohu vypozorovat, že na listu „Result“ (1) mám vyplněné řádky s výsledky zpracování pro každý akciový ticker z této datové sady. Podle nadepsané hlavičky přehledu pak mohu vedle tickeru v každém řádku vypozorovat o jakou expiraci se jedná (2) a jaký je Ask a Bid pro daný akciový titul pro danou chvíli zpracování (3). První sekce sloupců (4) označuje výsledek v případě, že analýza nalezla ceny opčních kontraktů v sekci opčních strike s krokem jeden dolar a udává hodnotu nalezeného ATM strike a již vypočítanou hodnotu Conversion a Reversal pro načtené ceny opčních kontraktů Call i Put v kombinaci s akciovými Ask a Bid (princip dále v textu popisu skriptu VBA). Pokud jsou jednotlivé buňky podbarveny zeleně, znamená to, že s takovým výsledkem by se dala příležitost zobchodovat v můj prospěch v danou chvíli analýzy a mohla by si tak zasluhovat nějakou dávku mé pozornosti a dalšího podrobnějšího zkoumání. Dvě následné skupiny sloupců pak zobrazují totéž, ale pro nalezené opční kontrakty s krokem jiným než jeden dolar, tedy 2.50 USD (5) a 5.00 USD (6), jak popsáno výše v textu.

   Pro takto prozkoumaný a připravený excelovský sešit pro hledání příležitostí na ATM Conversion a Reversal pro jakékoliv akciové tituly které mě jenom mohou napadnout, pak mohu ukázat napsaný VBA skript, který bude tento připravený excelovský sešit plnit staženými daty a zapisovat jednotlivé výsledky.


   VBA skript a „Návod k použití“

   Mým konkrétním úkolem bude nyní otestovat třicet akciových titulů z akciového indexu DJIA a zjistit, jestli se na ATM strike nenachází výrazná obchodní příležitost k pořízení Conversion a Reversal za použití opčních kontraktů s expirací v pátek 21.8.2020. Znamená to, že budu z listu „Tickers“ vybírat ze druhého sloupce seznamu tickerů.

   Ve sloupci „B“ reprezentující seznam tickerů DJIA je prvním tickerem MMM, seznam končí titulem DIS. V seznamu chybí akciový titul CSCO, který při zpracování vykazuje chybu, a to takovou, kterou dokonce popisuje komentář k požívání RTD serveru na stránkách IB.

   Data týkající se CSCO tak musím oželet a pouze na okraj uvádím, že dalších podobných titulů z obrovské plejády možných tickerů se takové upozornění týká opravdu jen malé hrstky (zmiňovaný MSFT z textu z obrázku výše například již žádné problémy nedělá)

   Analýzu tedy započnu tak, že do buňky pro ticker na listu „Start“ zapíšu právě hodnotu prvního titulu (MMM) a nastavím další parametry.

   Zápis tickeru MMM (1) načte data pro akcie a opční kontrakty pro tento první titul v datové sadě tickerů, a to pro vybranou expiraci 21.8.2020 (20200828) (2). Zvolím tickerovou sadu DJIA (3) nacházející se ve druhém sloupci na listu „Tickers“ (3). Pauzu mezi zpracováním ponechám na pěti sekundách (4). Zápis hodnoty 2 do buňky Počitadlo (5) znamená, že chci po zápisu hodnot prvního tickeru (MMM) pokračovat zpracováním následujícího druhého tickeru ve zvolené datové řadě. Toto zadání pak vlastně vykresluje celou logiku napsaného skriptu postupného načítání tickerů v časových prodlevách zadaných nyní na hodnotě 5 sekund. Mezi každým zápisem tickeru s načtením nových hodnot bude pětisekundová prodleva před zpracováním načtených výsledků. V případě prvního tickeru MMM a zadáním takové výchozí konstelace analýzy na listu „Start“ pak těchto pět sekund jistě uběhne. Na obrázku jsou také vidět tři další tlačítka (6), které budou proceduru zpracování spouštět, zastavovat a mazat zpracovaná data před dalšími analýzami. Z uvedeného pak vyplývá, že kromě samotného analyzujícího makra budou v mém sešitu další tři makra, která budu spouštět pomocí těchto tlačítek.

   Vlastní hlavní skript (makro) jsem si nazval Stream a jeho skript není nijak významně rozsáhlý. Budu postupovat opět po jednotlivých logických částech k pochopení významu jednotlivých řádků skriptu.

   VBA skript začíná jako obvykle deklarací proměnných, kterých budu ve skriptu využívat. Je patrné, že jsem zvolil úspornější možnost zápisu více proměnných na jeden řádek. V části skriptu (1) jsem nadeklaroval proměnné, které budou mít tvar desetinného čísla (As Double) a bude se jednat o proměnné nesoucí hodnoty Ask a Bid pro načtené akciové ceny (StockAsk, StockBid), hodnotu ATM strike pro každou sadu strike podle jednotlivých kroků mezi hodnotami sousedních strike (Strike1, Strike2_5 a Strike5) a hodnoty opčních kontraktů Call i Put na těchto strike v obou možnostech Long a Short, například pro ATM strike v části, kde je krok strike jeden dolar budu mít nadeklarovány proměnné LongCall1, ShortCall1, LongPut1 a ShortPut1, obdobně pak dále pro strike s jinými kroky strike (2.50 USD a 5 USD). V části skriptu (2) mám nadeklarovány proměnné, které budou mít podobu textu (As String)  a proměnné, které budou celými čísly (As Integer). Poslední odstavec skriptu (3) je nastavením používaných listů v mém excelovském sešitu, do jehož jednotlivých listů budu do příslušných buněk zapisovat nebo čerpat nejrůznější údaje.

   VBA skript pokračuje načtením hodnoty některých proměnných. Proměnná „Chyba“ (4) bude mít tvar hlášky „TwsRtdServer error: No security definition has been found for the request“, protože toto je přesné znění oznámení serveru, že na zadaném strike není možné nalézt příslušný investiční nástroj, tedy v mém případě neexistuje listovaná opce na tomto strike pro tuto expiraci. Seznam těchto chybových hlášení i s popisem co znamenají můžete nalézt zde. Další proměnné budou načteny z příslušných buněk listu „Start“

   Pěti řádkům skriptu (5) pak odpovídají hodnoty z buněk z listu „Start“ označené červenými šipkami. V mém případě pro první zpracovávaný titul bude hodnota proměnných Exchange = SMART, Ticker = MMM, Expiration = 20200821, StockAsk = 158.33 a StockBid = 158.03. Po této operaci čtení skriptu s načtením prvních proměnných pro první ticker MMM dojde k prvnímu zápisu těchto načtených hodnot do listu „Result“ pomocí následujících řádků skriptu

   Známá procedura hledání hodnoty proměnné VolnyRadek (6) bude mít za úkol nalézt hodnotu prvního prázdného řádku na listu „Result“ v prvním sloupci. Tuto proměnnou VolnyRadek pak využiji pro zápis již známých hodnot proměnných pro ticker MMM do listu „Result“ do prvního volného řádku. Proměnné Ticker, Expiration, StockAsk a StockBid pro MMM pak budou zapsány takto.

   Po zapsání těchto hodnot proměnných do listu „Result“ začne skript vyhodnocovat načtené hodnoty opčních kontraktů na ATM strike a pokusí se je sestavit do kombinace Conversion a Reversal společně s cenami akcií. Pro první ticker MMM pak musím konstatovat, že s dostupností cen opčních kontraktů na jednotlivých strike je to takto:

   MMM jako dražší titul nedisponuje strike s krokem jeden dolar, proto mohu vypozorovat u první skupiny strike nejblíže aktuální ceně (strike 158) chybovou hlášku, že datový server nemohl najít takto listované opční kontrakty. Chybová hláška v buňkách u cen Ask i Bid pro Call 158 i Put 158 vyplývá, že odsud žádné ceny do svého sešitu nenačtu, proto se musím přenést do další sekce se strike s krokem po 2.50 USD. tady již vidím na strike 157.50 všechny potřebné ceny opčních kontraktů, proto načtu proměnným hodnoty z této sekce. Jak jsem si s tímto poradil ve VBA je patrné níže

   Využil jsem rozhodovací funkce If…ElseIf…Else, abych prozkoumal, zda se v buňkách o které mám zájem, neobjevuje chybová hláška serveru načtená do proměnné Chyba. Mohu tuto podmínku vidět zapracovanou do dotazu v prvním řádku této sekce skriptu (8), kdy se ptám, jestli se buňka na 11 řádku a v pátém sloupci (Ask pro Long Put 158) nerovná proměnné Chyba. Pokud by to byla pravda, tak by se v této sekci objevily ceny pro opční kontrakty na strike 158 a já mohl proměnným Strike1, LongCall1, Short Call1, LongPut1 a ShortPut1 přiřadit patřičné hodnoty z této sekce strike (9). Mohl bych pak na list „Result“ přenést další hodnoty do řádku pro ticker MMM, které hledám a vypočítávám, tedy hodnotu strike (10), který tvoří Conversion a Reversal (Strike1) a nakonec také samotnou hodnotu těchto kombinací (11) a (12) vypočítanou pomocí proměnných LongCall1, Short Call1, LongPut1 a ShortPut1. Proč zrovna tento výpočet je popsáno v tomto článku  nebo v tomto článku. Já však zjišťuji, že se mi u těchto strike objevuje chybová zpráva a podmínka If je tak porušena, proto se musím přenést do další sekce strike, tentokrát s krokem 2.50 USD (13), kde se na buňku na 19 řádku a v pátém sloupci (Ask pro Long Put 157.50) obrátím se stejným dotazem na existenci chybového upozornění. Nyní je podmínka pro If splněna a já mohu naplnit hodnoty proměnných Strike2_5, LongCall2_5, Short Call2_5, LongPut2_5 a ShortPut2_5 načtenými opčními cenami. Poslední tři řádky skriptu (14) pak přenesou hodnotu strike a hodnotu vypočtených kombinací Conversion a Reversal do listu „Result“

   Zápis je proveden do sekce pro příslušnou sadu strike s krokem 2.50 USD. Mohu pak vypozorovat, že v době, kdy jsem tento výpočet provedl, bylo možné na tomto ATM strike na kombinaci Reversal vytvořit pozici s bilancí +48 USD (bez poplatků). Skript poté pokračuje vyhodnocením, zda neexistuje možnost, že i v předcházející sekci s 2.50 USD krokem strike se nenachází žádné opční ceny a tyto by tak mohly být dostupné v sekci se strike s krokem 5.00 USD.

   Stejný dotaz na chybové hlášení (15) je položen do buňky na 27 řádku a v pátém sloupci se stejnými předepsanými následnými úkony, které by se měly provést, pokud by předcházející obě sekce selhaly s dodávkou cen opčních kontraktů, tyto úkony popsané ve skriptu jsou stejné jako u předcházejících dotazů. Možnost, že se i v této poslední sekci s pětidolarovým krokem strike nenachází žádné opční ceny je pak ošetřena v závěru před ukončením procedury If…Else, a to tak, že pokud všechny dotazy na opční ceny selhaly, bude k tickeru MMM do listu „Result“ namísto hodnot vepsáno hlášení „opční kontrakty nenalezeny“ (16). Zadaný ticker pak pravděpodobně nemá listovány opce, pokud jsem je tedy nenalezl na žádném strike s různým typem kroku mezi jednotlivými sousedními strike. Zpracování načtených dat pomocí skriptu do tohoto místa se pořád týká prvního tickeru MMM, pro který mám v tento okamžik již vše hotovo. Nyní tedy řádky skriptu zabezpečí načtení a zpracování dalšího tickeru ve zvolené tickerové sadě.

  Načtením dalších proměnných provedu zjištění hodnoty AktualniRadek (17), které reprezentuje buňka Počitadla (G6) na listu „Start“. Momentálně je zde hodnota 2, protože se právě zpracoval první ticker v řadě MMM a čeká se na načtení druhého tickeru (AXP). To, že se jedná právě o ticker AXP vyplývá z výběru sady tickerů na dalším řádku skriptu, kde načtu hodnotu proměnné TickerSet (18), která se nachází v buňce D6 a mám zde vepsánu hodnotu 2, tedy druhý sloupec na listu „Tickers“ s tickery pro akciový index DJIA. Hodnota proměnné Ticker (19) tak bude načtena z buňky na listu „Tickers“, jejíž topografie bude sestavena právě z předcházejících proměnných (AktualniRadek, TickerSet), momentálně z buňky na druhém řádku (AktualniRadek) a ve druhém sloupci (TickerSet) a tam se nachází ticker AXP. Tento pak bude načten do buňky pro zadání tickeru na listu „Start“, kde se nyní nachází MMM a toto tak bude přepsáno na AXP (20). Rozhodovací procedura If…Then (21) pak zjistí, jestli již není počet tickerů vyčerpán a jestli se ve sloupci buněk, odkud je nyní čerpám, nenachází prázdná buňka. Pokud by toto byla pravda, tak vyskočí ohlašovací okno s upozorněním „Všechny tituly zpracovány !!!“. Novinkou je nyní příkaz Call nacházející se na dalším řádku (22). Tento příkaz má za úkol přerušit zpracovávání tohoto makra a „zavolat“ další makro a v něm vykonat nějakou proceduru. Můj příkaz Call obsahuje volání makra s názvem Spustit a právě makro Spustit mi bude ošetřovat prodlevu potřebnou pro načtení dat ze serveru Interactive Brokers. Než jej ukážu, upozorním na poslední řádky skriptu z obrázku, kdy po zpracování volaného dalšího makra zvýším hodnotu Počitadla na listu „Start“ o jedničku (23), abych zajistil načtení dalšího tickeru v tickerové sadě v dalším novém zpracování. Po tomto zvýšení hodnoty Pročitadla se celé makro ukončí (24).

   Jak vypadá volané makro Spustit, které přeruší běh analytického makra na určenou dobu pro klid ke stažení potřebných dat je patrné z obrázku. Toto makro se samozřejmě nachází ve stejném Module mého excelovského sešitu.

   Makro, které volám má název Spustit. Má dvě proměnné Sekunda a Prodleva (1) deklarované As Date, půjde tedy o data ve formátu času. Hodnota proměnné Sekunda (2) je údajem z buňky G5 z listu „Start“, které je momentálně nastaveno na 5 sekund. Hodnota proměnné Prodleva (3) je určena hodnotou funkce Now, která vrací aktuální čas s přičtením hodnoty proměnné Sekunda, v mém případě bude hodnota proměnné Prodleva znamenat současnou hodnotu aktuálního času zvýšenou o pět sekund. Celý proces pozastavení pak zařizuje funkce Application.OnTime, která umí zařídit, aby se spustila určitá procedura v určitém okamžiku v budoucnosti (4). V mém případě pak budu chtít, aby po pauze vyjádřené proměnnou Prodleva bylo spuštěno makro Stream, tedy mé hlavní analytické makro zpracovávající jednotlivé Tickery. Vyplněním tohoto zadání (pětivteřinové čekání) se toto makro Spustit ukončí a v běhu pokračuje hlavní makro Stream. Makru je pak přiřazeno tlačítko na listu „Start“, kterým spouštím proceduru analýzy. Druhému tlačítku na listu „Start“, které analýzu zastavuje je pak přiřazeno makro, které celou analýzu zastavuje, jeho skript je na obrázku níže.

   Nastavením procedury Application.OnTime jako False (červená šipka) způsobuje zastavení původní procedury, která je nastavena jako True, toto se však nemusí u původní (spouštěcí) procedury uvádět. Třetí tlačítko, které jsem si nainstaloval na list „Start“ reprezentuje mazání provedené analýzy před provedením další. Jeho povědomý skript z minulých článků vypadá následovně.

   Makro VymazTest podle mého již nepotřebuje žádný komentář, maže oblast buněk zaplněné daty provedené analýzy.

   Takto napsaný VBA skript pak velmi jednoduše umí analyzovat načtená opční a akciová data do mého excelovského sešitu a provádět nejrůznější výpočty. Nemusím mít zrovna nějakou velkou fantazii, abych si neuměl představit analyzování příležitostí Conversion a Reversal také současně na jiných strike než právě na ATM a rozšířil tak záběr mého pozorování na větší vzorek zpracovávaných dat. Mohu také sledovat jiné obchodní příležitosti, než jsou právě jen tyto kombinace, ukázka skriptu je jen vodítkem, jak by se mohly takové činnosti zpracovat. Základem takových stahování je pak rychlost, s jakou mohu takovou analýzu provést v podmínkách mého počítačového vybavení. Mohu vycházet z předpokladu, že vyhodnocené analyzované příležitosti zůstanou v trzích nějakou dobu a poté je budu moci například zobchodovat. Provést analýzu pro 500 tickerů náležejících do indexu S&P500 pak trvá zhruba třičtvrtě hodiny (při intervalu prodlevy 5 sekund) a neumím si vůbec představit, že bych něco takového prováděl ručně a ještě se například nespletl ve výpočtu nebo výběru strike, toto je prostě nemožné.


   Co se zjištěnými analytickými výstupy vlastně dělat? Nejlépe je tyto výsledky zobchodovat :c) Pořídit Conversion nebo Reversal „za plus“ pak znamená bezrizikový obchod, jehož výsledkem by měl být právě tento „plus“. Nalezené příležitosti je však zapotřebí podrobit zkoumání, proč jsou takové příležitosti k dispozici. Pohledem na analýzu, kterou jsem vyhotovil při psaní těchto řádek na pěti stech titulech akciového indexu S&P 500 mohu vypozorovat tyto příležitosti hned na prvních řádcích výsledků. Při jejich zkoumání a interpretaci si musím dát pozor zejména na několik okolností – Dividendy, poplatky (úroky) za půjčení akcií a na chvíle, kdy analýzu provádím.

Dividendy

   Zdálo by se, že pořídit Reversal na strike, které mi analýza vyhodnotila pro expiraci 21.8.2020 by bylo vhodné pro tituly XOM, WMT a CVX. Všechny tituly nabízí takovou konstrukci Reversal se slušným zhodnocením v desítkách dolarů, jako bezriziková investice to vypadá opravdu dobře. Není tomu ale tak, všechny tři tituly totiž do expirace opcí 21.8.2020 vyplácejí Dividendu (mají Ex-Dividend Day). Vyplácení Dividendy se promítá do ceny Put opčních kontraktů, toto jsem popisoval v tomto článku. Ceny Put opcí jsou tak ohodnoceny právě s ohledem na vyplácenou Dividendu, tento problém jsem popsal také v tomto článku. Reversal, jako kombinace Long Call, 100x Short akcií a Short Put s opcemi na stejném strike, pak způsobuje, že sice získám přebytek na svůj účet, ale jako držitel Short akciové pozice na Ex-Dividend Day musím zaplatit Dividendu v plné výši, taková skutečnost pak způsobuje, že na takto vyhodnocené příležitosti musím zapomenout. Pro úplnost, CVX má EDD 18.8.2020 s Dividendou +129 USD, XOM má EDD 12.8.2020 s Dividendou +87 USD a  WMT má EDD 13.8.2020 s Dividendou +54 USD.

Úroky za půjčení akcií

   Dětská hádanka: “…Představte si zaoceánské plavidlo Queen Mary2. Lodi velí kapitán Ronald Warwick, jehož otec byl kapitánem předchůdkyně Queen Mary. Na lodi je 37 výtahů, 5000 schodů, 1310 kajut pro cestující, 2000 koupelen, 955 balkonů, 500 km potrubí, 80 tisíc svítidel, 3000 telefonů, 8000 hasicích přístrojů, 5 velkých bazénů, malá nemocnice, 14 barů, divadlo, muzeum, planetárium a knihovna. O denní spotřebu 1100 tun sladké vody se starají tři úpravny. Nejdražší lístek při první plavbě vyšel na 1,5 mil. Kč. Pohon lodi je čtyřmi dieselovými motory, a jako doplňkový pohon jsou instalovány i dvě spalovací turbiny….“ Otázka: „Jak zjistím, kolik má kapitán Ronald Warwick dětí?…„ Odpověď: „Zeptám se ho!

   Přesně v tomto duchu dětské hádanky jsem pořídil konkrétní Reversal na svůj účet. Přestože jsem vybaven nástrojem, který umí vyhledat tyto příležitosti, na tento obchod mě upozornil Marian, můj kamarád opční obchodník. Nebyla tedy výsledkem prosévání stovek titulů akciových tickerů. Na titulu NKLA se objevila obrovská příležitost na Reversal, kterou jsme si neuměli nijak vysvětlit, na takovou příležitost bych ale při skenování titulů, do kterého by byla NKLA zahrnuta, mohl velmi pravděpodobně narazit. Short Put opce na tento titul byly natolik drahé, že se zdálo, že tvůrci trhu na tomto titulu nejsou zcela duševně v pořádku. NKLA není na trzích dlouho a pokouší se proniknout na trzích v segmentu elektroaut, když cenový průběh tohoto titulu zaznamenaly v posledních měsících velmi divoký průběh, jak by mohl ale takový volatilní průběh mít vliv na cenu Put kontraktů? Má pozice, do které jsem vstoupil byla o to komplikovanější, že nebylo v danou chvíli možné pořídit Short akciovou pozici, protože můj broker nenabízel takovou možnost v tuto danou chvíli.

   Nemožnost získat Short akciovou pozici jsem zařídil vypsáním 2x Short Call hluboce „v penězích“ těsně před expirací weeklys opčního kontraktu (1). Za tyto dva výpisy na strike 45 jsem obdržel 2x +653 USD a znamenalo to, že při přiřazení otevřu na svém účtu pozici 200x Short akcií za prodejní cenu 45 USD/kus, společně s Prémiem (45 USD +6.53 USD) to pak znamenalo, že jsem tuto pozici prodal za +51.53 USD/kus. Současně s touto akciovou Short pozicí jsem nakoupil v expiraci další pátek Long Call na strike 52 za -175 USD a na témže strike vypsal Short Put 52 za +708 USD (2). Znamená to, že jsem za tento Reversal utržil +5.153 USD (100x Short akcie NKLA) -175 USD (Long Call 52) a +708 USD (Short Put 52), celkově tedy +5.686 USD. Mám zaručeno, že v expirační pátek bude má pozice zlikvidována za -5.200 USD, protože budu muset nakoupit 100x Long akcií NKLA za cenu strike některé z opcí (uplatnění Long Call 52 nebo přiřazení Short Put 52). Toto ale znamená čistý profit (+5.686 USD – 5.200 USD) ve výši +486 USD bez jakéhokoliv zjevného rizika. Protože mám 200x Short akcií NKLA, otevřel jsem ještě jeden Reversal s expirací za čtrnáct dnů (3). Long Call 52 mě vyšla na -240 USD, ale za Short Put 52 jsem inkasoval +1089 USD, společně se 100x Short akciemi za +5.153 USD tak mám Reversal za +6002 USD. Jistota likvidace pozice za -5.200 USD pak dává této pozici vydělat +802 USD, oba Reversals by pak měly vydělat bezrizikových +1.288 USD, a to zní velmi slibně.

   Protože se na Wall Street nedávají obědy zadarmo, nemohli jsme přijít na to, kde je zakopaný pes a proč jsou Put opce tak předražené. „Psa jsme nakonec vykopali“ a zjistili jsme, že je to v úrocích, účtovaných za zapůjčení Short akcií NKLA.

   Ve sloupci Fee rate aplikace TWS mohu vypozorovat, že úroky za takovou pozici jsou opravdu astronomické (772.25% p.a.) a mohl jsem je v této výši vypozorovat v pondělí po přiřazení vypsaných Short Call 45, které vedly k otevření Short akciové pozice. Toto číslo úroku, převedeno na denní úrok ve výši 2.11 %, zcela vysvětluje, proč je takový cenový nesoulad. Vše, co jsem získal na Prémiu na obou Short Put odevzdám na těchto poplatcích a ještě pravděpodobně prodělám. Existují ale i tři možnosti, kdyby se tak nemuselo stát. Cena akcie NKLA začne prudce klesat (nižší cena/nižší částka úroků), začne se dramaticky snižovat tato úroková sazba nebo mi broker tento poplatek prostě nenaúčtuje, protože jsem akcie získal přiřazením. Světe div se, staly se všechny tři skutečnosti najednou. Na obrázcích níže je postupný průběh výše úroků mezi 21.7.2020 až 28.7.2020

21.7.2020

22.7.2020

23.7.2020

24.7.2020

27.7.2020

28.7.2020

   Rovněž cenový graf nahrával okolnosti, aby úroky za shortování akcií nebyly dramaticky vysoké, cena akcií totiž vytrvale v době držení obou Reversal klesala.

   Prudký cenový pokles a dramatické snížení úrokové sazby bylo nakonec doprovázeno zjištěním, že jsem na svém účtu nezaznamenal výrazné zvýšení poplatků, které by obchod ohrozilo. Přestože broker uvádí, že tyto úroky účtuje na mezidenní bázi a jsou součástí měsíčního statement, já je v tomto výkazu jednoduše neobjevil. Pozor ale na tyto poplatky, které mohou způsobovat výrazné zkreslování opčních kontraktů a tím vytvářet nesprávné obchodní příležitosti.

Premarket a Aftermarket

   Provádět analýzy mimo obchodní hodiny opčních kontraktů může způsobit velmi mnoho investičních příležitostí, které ale ve skutečnosti nebude možné zobchodovat. Cenové pohyby na akciích v Aftermarketu nebo Premarketu mohou být značné, ceny opčních kontraktů však zůstávají v těchto časových úsecích stejné jako při Close opčních trhů. Je proto vhodné provádět analýzy příležitostí na kombinacích akcií a opčních kontraktů pouze v obchodních hodinách opčních kontraktů, aby nevznikaly „falešné příležitosti“, které nakonec zobchodovat opravdu nepůjde.


   Vytvořit analytický nástroj pomocí VBA skriptu za využití funkcí a vlastností excelovského sešitu může vést k obrovskému zefektivnění práce s daty, které bych bez těchto znalostí z kapacitních a časových důvodů velmi obtížně zvládl. Tomuto excelu společně se skriptem pak stačí do buňky Tickeru napsat první ticker v zadané tickerové sadě, tuto tickerovou sadu označit číslem sloupce v buňce TickerSet, zadat analyzovanou expiraci a do buňky pro Počítadlo vepsat číslovku 2. Stisknutím tlačítka „Spusť test“ pak mohu tento analytický nástroj nechat pracovat nad libovolnou sadou zvolených tickerů a ze zapsaných výsledků pak vybírat možné obchody. Celý nástroj pak mohu libovolně upravit pro své další analýzy na širším vzorku stahovaných dat, kdy mohu vybírat příležitosti na Conversion a Reversal na více strike než jen přísně na ATM strike. Mohu samozřejmě také vyhledávat úplně jiné kombinace (Short Box. Long Box…) logika skriptu by pak mohla zůstat zhruba zachována, pouze bych mohl provést další drobné úpravy podle svého analytického zadání.

   Celý excelovský sešit se skriptem VBA k prozkoumání a případnému vyzkoušení můžete stáhnout zde.

  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

One thought on “Backtestování v Excelu (VBA) – VII.”

Napsat komentář

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