Vyrobit analýzu třídenního držení akciového obchodu pomocí Excelu je nyní již téměř hračka. Měnit délky držení takových fiktivních obchodů je již hračkou také, toto všechno bylo popsáno v minulých článcích při postupném poznávání, jak funguje základní logika a psaní VBA skriptů. Na pětiletých stažených datech z Yahoo.finance jsem toto prováděl na akciovém titulu Goldman Sachs (GS). Prozatím tomu ale opět něco chybí. Ve svých ukázkových excelech, které jsou k dispozici ke stažení, jsem již měl data ve svém excelovském sešitu stažena a připravena k testování a tato data začínala v pětileté historii v nějakém náhodném historickém okamžiku, ani již dokonce nevím, proč je to zrovna 6.7.2015 a nikoliv nějaké jiné datum. Pravděpodobně bych také nezačal obchodovat v nějakém chaoticky vybraném dni, ale volil bych (u kratších period například) nějaké pevné dny v týdnu. Pětidenní obchody bych patrně začínal v pondělí a ukončoval je v pátek, dvoudenní obchody bych mohl zkoušet například od každého pondělí do úterý nebo během čtvrtka a pátku atd. Navíc jsem si pořídil zdarma tato data z tohoto volného zdroje v „americkém formátu“ dat a mám místo desetinných čárek tečku, toto se pak projeví zejména při další potřebě, abych staženou pětiletou databázi pro Goldman Sachs nahradil databází jinou, třeba pětiletými daty Bank of America (BAC) a provedl stejný test také na tomto titulu. V dnešním článku tak budu hledat odpovědi, které by mi mohly pomoci vyřešit právě tyto problémy. Mohl bych si tak naformulovat tento úkol. Na stažených pětiletých datech GS budu chtít testovat držení akcií, které pořídím každé pondělí na Open a těchto akcií se zbavím v pátek stejného týdne na Close, budu tak chtít trávit víkendy bez držení akcií. Tento obchod pak budu chtít podrobit zjištění, jak by si v něm vedly také jiné tituly – například MCD, JNJ, BAC či F. Tuto činnost bych pak chtěl co nejvíce zautomatizovat pomocí VBA. Celý excelovský sešit je opět ke stažení i s makry a skripty, které budou předmětem dnešního článku a bude se jednat o další vylepšení excelovského souboru z minulého článku. Stáhnout jej lze z tohoto umístění. Při otevření musíte „povolit makra“. Celý problém pak bude v postupném řešení tří základních kroků. Nejprve úprava pořízených dat v listu sešitu pro práci v českém prostředí Excelu. Dále úprava, vytřídění a kontrola stažených dat pro potřebu zadaného úkolu trvání fiktivních obchodů (v období pouze pondělí až pátek) a nakonec provedení analýzy nejen pro aktuální titul, ale také pro další vybrané tituly.
1/ Úprava dat pro český Excel
Stažení dat do označené buňky, například „B3“, jsem již popisoval v jednom z předcházejících článku o VBA.
Ze záložky Data výběrem „Z textu/CVS“ načtu pomocí průvodce stažený soubor s daty pro zadaný titul uložený v mém počítači do označené buňky.
Mohu pak vidět, po smazání sloupců Adj Close a Volume, data v tomto tvaru podle verze Excelu, který mám nyní k dispozici. Data jsem samozřejmě pro plastičnost ukázky nyní zkrátil na několik řádků. Mohu pak vypozorovat, že formát ve sloupci pro datum je v evropském formátu (sloupec „B“), ale formát cenových dat ve vedlejších sloupcích je ve tvaru, kdy desetinná čárka je tvořena tečkou (oblast sloupců „C:F“). Takové číslo ale má verze Excelu neumí zpracovat, musím proto hromadně provést takovou úpravu, abych tento soubor amerických desetinných čísel převedl na evropský formát. Hromadnou záměnu teček za čárku provedu dvěma postupnými kroky. Nejdříve si nadefinuji oblast buněk, pro kterou chci tuto záměnu vyrobit a poté na této oblasti spustím proceduru samotné záměny znaku tečka za čárku. Proč si budu definovat nějakou oblast? Protože nevím, jaké úkoly mě budou v mém sešitu čekat a jak rozsáhlé datové soubory budu zpracovávat. Zadáním oblasti buněk dynamickým způsobem pak bude do budoucna jedno, jestli budu vyměňovat tečku za čárku na dvaceti řádcích nebo na pěti tisíci řádcích. Můj skript se zadanou dynamickou oblastí podle počtu zaplněných řádků automaticky rozpozná velikost oblasti a tuto potom zpracuje a já nemusím o ničem přemýšlet. Jak je to myšleno, je patrné na obrázku níže.
Každá oblast buněk, kterou si ve svém sešitu vyberu, má jasnou topografii. Je vymezena buňkou v levém horním rohu (na obrázku „C4“) (1) a buňkou v pravém spodním rohu (v mém obrázku „F27“) (2). Pokud bych si chtěl takovou pevnou oblast zapsat pomocí VBA, tak by pro oblast „C4:F27“ byl zápis formátem Cells takový: Oblast=DataSheet.Cells (Cells (4,2), Cells(6,27)). Takto bych řekl svému počítači, aby do budoucna počítal s takto vybranou oblastí buněk. Já ale nevím, jak bude v budoucnosti tato oblast veliká, protože netuším, jestli budu zpracovávat pětiletá data o tisíci řádcích nebo týdenní data o sedmi řádcích. Toto lze ale jednoduše zařídit. V minulém článku jsem popisoval jednořádkový skript, který umí vyhledat poslední plný řádek a číslo takového řádku pak nabude hodnota nějaké jednoduše předdefinované proměnné, nazvu si ji třeba PosledniRadek. Pokud poté namísto pevného čísla řádku u buňky v pravém dolním rohu (2) v zápise pomocí Cells uvedu proměnnou PosledniRadek a ta bude číslem posledního plného řádku, budu mít vždy zajištěno, že vybírám a nastavuji ke zpracování celou momentálně zaplněnou oblast. Jenom pro dokreslení dynamiky oblasti mohu také zjistit hodnotu posledního zaplněného sloupce a celou oblast definovat pomocí pravé spodní buňky složené ve formátu Cells s proměnných vyjadřujících poslední plný řádek a poslední plný sloupec a oblast může být libovolně dlouhá a libovolně široká…Jak tedy bude vypadat skript pro makro nahrazující desetinnou tečku za desetinnou čárku s definicí takové dynamicky se přizpůsobující oblasti buněk.
Makro jsem si nazval CarkaZaTecku, abych věděl, co mi skript bude vlastně řešit (1). Nadefinoval jsem si tři proměnné, které budu ve skriptu používat instrukcemi Dim (2). První proměnná definuje list Data jako list sešitu Worksheet, na kterém se budu pohybovat. Druhá proměnná TabulkaTecky je deklarována jako Range, znamená to, že tento objekt se bude chovat jako oblast buněk mého listu, to je první novinka tohoto článku z pohledu dosavadních znalostí jazyka VBA. Třetí proměnná PlnyRadek je oznámení, že tato proměnná bude číslo a budu ji následně využívat jako číslo posledního zaplněného řádku mého listu Data, kde mám staženou databázi historických dat. Následně jsem příkazem Set nastavil, že list, který jsem si v excelovském sešitu označil na jeho oušku jako „Data“, je listem, na kterém hodlám provádět nějaké činnosti (3). Tímto mám nastaveno vše, co potřebuji. Další pokračování skriptu je následující.
Nyní si chci, pro potřeby zjišťování velikosti mé zpracovávané databáze, zjistit, jaké číslo má můj poslední zaplněný řádek. Tuto proceduru zachycenou do jednořádkového skriptu jsem popisoval v minulém článku, nebudu tedy nic dalšího k tomu uvádět. Prozkoumávám odspodu můj excelovský list ve druhém sloupci, abych našel první plnou buňku, na kterou narazím a této hodnotě se rovná proměnná PlnyRadek (4). Podle obrázku s daty výše má nyní číslo 27, protože na tomto řádku se ve druhém sloupci nacházejí poslední data, konkrétně s datem 10.7.2019. Příkazem Set pak mohu „nasetovat“ (nastavit) oblast – proměnnou TabulkaTecky, kterou chci podrobit změně tečky za čárku tak, jak jsem popisoval výše (5). V mém případě jde o oblast „C4:F27“, já mám však buňku „C4“ nastavenu pevně (protože na ní začínají data) na hodnotě Cells (4,3) a buňku „F27“ mám definovánu ve formátu Cells jako Cells (PlnyRadek, 6). Jaká bude hodnota pro PlnyRadek při další datové řadě nevím, mám však zajištěno, že hodnota PlnyRadek bude tak veliká, jak dlouhá bude má datová řada.
Vyrobit z malebné severomoravské vesničky „Býkov“ jihomoravský hrad „Bítov“ je pomocí VBA opravdu jednoduché. I při velmi jemném googlení lze nalézt mnoho VBA skriptů, které umí zaměňovat znaky ve slovech pomocí funkce Replacement, která funguje také jako implementovaná funkce v klasickém Excelu. Problémem ovšem je, že takové záměny znaků na začátku, konci, uprostřed…prostě kdekoliv na vybraných místech řetězce znaků velmi skvěle a jednoduše funguje u textových tvarů (String), ale nahradit „něco něčím“ v desetinném čísle je opravdu výzva. V tomto článku jsem v oddíle „Pořízení dat“ popisoval, jak lze zaměnit desetinnou tečku za čárku manuálně pomocí nástroje „Nahradit“ spouštěného z lišty nástrojů Excelu. Celá procedura spočívala v činnosti výběru oblasti buněk, kde chci provést takovou znakovou záměnu a pomocí formuláře Excelu Najít/Nahradit takový úkon potvrdit. Funguje to bezchybně. Nyní ale chci takovou proceduru zautomatizovat a nemohu najít relevantní řešení, proto se nabízí jednoduchá pomoc. Zkusím si takovou proceduru zaznamenat jako makro a poté si takový vygenerovaný skript prohlédnu, jak vypadá a jak bych jeho části mohl využít. O tom, jak zaznamenat makro jsem psal v prvním článku o VBA, takže není obtížné si jej udělat právě na této proceduře a poté zakomponovat do svého skriptu.
Nadeklarovanou a definovanou oblast dat TabulkaTecky, která je tvořena buňkami, kde se vyskytují data, která chci zpracovat, jednoduše vyberu příkazem .Select (6). Skript označený (7) je pak okopírovaná a upravená část záznamu makra pro daný „zaměňovací úkon“ a nezbývá než ji s nynější úrovní znalosti VBA respektovat. Strávil jsem značnou dávku času zkoumáním, proč daný záznam také nefungoval, protože tato část skriptu opravdu znamená „…vyměň znak tečky za znak čárky...“ než jsem zaměnil znak čárka v červeném kolečku také za znak tečky. Přestože to vypadá divně, tak tato část skriptu mi vlastně říká „…vyměň tečku za tečku…“, ale skript rovněž předpokládá, že zadaným měněným útvarem je text, aby jej posléze můj český Excel přečetl jako číslo s desetinnou čárkou…těch hodin zkoušení…:c). Nicméně tento skript je velmi elegantní a funguje bezchybně. Poslední řádek skriptu pak upraveným číslům dává stejný formát čísla s dvěma desetinnými místy (8), taková úprava formátu buňky je pak standardní a jednoduchou procedurou, kterou lze nalézt na každém základním webu o VBA, nebudu se jeho syntaxí zabývat. Spuštěním makra pak mohu vidět celou úpravu mých stažených dat takto.
Upravenou tabulku dat s desetinnou čárkou pak mohu začít zpracovávat podle zadání, které jsem si vytyčil, tedy analyzovat profitabilitu držení akciového titulu mezi pondělním Open a pátečním Close. Toto již může evokovat budoucí testování například weeklys opčních kontraktů pořízených v pondělí s expirací v pátek téhož týdne. Jak na to?
Doplňuji názvy dnů
Nyní tak již mám připravená stažená data v uskupení, kde první sloupec tabulky znamená konkrétní datum v historii akcie GS s dalšími čtyřmi sloupci s cenovými údaji tohoto dne historie (Open, High, Low a Close) ve tvaru českého čísla s desetinou čárkou. První konkrétní úpravou je pak zjištění, jaký je název dne v této časové řadě. Nebude to nic obtížného, protože využiji klasickou excelovskou funkci =HODNOTA.NA.TEXT, která umí převést datum na název dne v týdnu a kterou jsem již popisoval v úplně prvním článku na tomto webu o jednoduchém využití Excelu pro analýzu nějakého opčního nápadu. Tato funkce by potom při použití v klasickém Excelu měla takový tvar.
Přesně takovou změnu formátu datumu na název dne týdne si chci nechat zanést do sloupce „H“ pro každé datum v mé stažené a upravené databázi, tedy do druhého sloupce od posledního zaplněného sloupce mé existující tabulky. Udělám to tak, že budu pokračovat v rozepsaném skriptu, kterým jsem zaměnil desetinné tečky za čárky a vybavím jej dalšími řádky skriptu, které mi takovou záležitost zařídí.
Je vidět, že posledním úkonem, který jsem popsal výše, je změna formátu čísel na čísla s dvěma desetinnými místy (1) a tady navazuji a pokračuji v tvorbě dalšího skriptu. Nyní si mohu nadeklarovat další proměnné, které budu potřebovat (2). Proměnná Datum bude mít tvar As Date a bude postupným nositelem hodnoty každého datumu, který chci přepsat na název dne v týdnu. Proměnná AktualniRadek bude jednoduché číslo a bude znamenat první řádek pro zpracování dat v pozdější cyklické funkci Do While…Loop, kterou jsem již poznal v předcházejících článcích. Proměnná DenvTydnu bude nadeklarována As String, tedy bude nositelem obsahu ve tvaru textu, konkrétně právě názvu jednotlivého dne v týdnu. Proměnná PlnySloupec jako Integer ponese hodnotu prvního prázdného sloupce, což opět není nic nového. Její hodnotu si ihned po deklaraci nových proměnných načtu instrukcí v řádku označeném (3). Takto nadeklarované proměnné podrobím cyklickému posouvání po jednotlivých řádcích, abych postupně načítal jejich hodnoty, tyto zpracovával a zapisoval tyto zpracované hodnoty jako výsledky do příslušného sloupce. Výsledkem pak budou požadované zápisy názvu dne v týdnu do řádku pro každé konkrétní datum.
První datum ke zpracování se nachází na čtvrtém řádku a má hodnotu 6.6.2019, proto je hodnota proměnné AktualniRadek napevno čtyřka (1). Spuštění cyklu Do While…Loop bude zastaveno splněním podmínky, že se objeví na místě sloupce s datumy (druhý sloupec „B“) první prázdná buňka (5). Pokud tomu tak není, probíhá zpracování po jednotlivých řádcích, kde hodnota konkrétního data je načtena do proměnné Datum, pro první cyklus, kdy proměnná AktualniRadek = 4 je tak vybrána buňka Datum = DataSheet.Cells(4, 2), tedy 6.6.2019 (6). Proměnná DenvTydnu bude mít formát DenvTydnu = Format(Datum, „DDDD“), tedy upraví hodnotu proměnné Datum (první výraz v závorce) na formát „DDDD“ stejně, jako to dělá klasický excelovský vzorec (7). Pro první cyklus, kdy je datum hodnota 6.6.2019, pak po takovém formátování bude hodnotou proměnné DenvTydnu výraz „čtvrtek“. Takto naformátovanou proměnnou DenvTydnu („čtvrtek“) pak zapíšu jako výsledek do sloupce, který je druhým vpravo od posledního zaplněného sloupce, který reprezentuje hodnota proměnná PlnySloupec +2 (8). V mém konkrétním případě prvního cyklu se výraz „čtvrtek“ zapíše do sloupce „H“ do buňky „H4“. Po těchto transakcích přičtu jedničku k proměnné AktualniRadek (9), aby se cyklus mohl po instrukci Loop vrátit na řádek Do While a pokračoval zpracováním dalšího řádku. Ukončení cyklu vyčerpáním všech datumů k přepisu na název dne v týdnu se makro ukončí a vyskočí ohlašovací okno s upozorněním na konec zpracování (10). Mohu pak pozorovat tento obrázek.
Odkliknutím zadaného okna mohu vypozorovat, že mám databázi s čísly s desetinnou čárkou a s převedenými datumy na názvy dny v týdnu. Tomuto makru pak na listu Data přiřadím tlačítko, abych mohl úpravu dat lépe ovládat. Pro zajímavější grafiku mohu formát tlačítka vybírat také například z karty Vložení a vybrat z široké palety tvarů a barevných provedení.
Má volba padla na obdélník se zakulacenými rohy v modrém provedení a se zápisem textu do tlačítka, který popisuje akci, kterou bude spouštět. Přiřazení makra k tlačítku pak provedu standardně kliknutím pravým tlačítkem myši na plochu tlačítka.
Volbou „Přiřadit makro…“ pak z nabídky vytvořených maker vyberu požadované, toto jsem již popisoval v článku o psaní prvního makra. Mohu pak na listu Data pozorovat výsledek takového „tlačítkového úkonu“ (tlačítko později přenesu na list Start)
Získávání názvu dne v týdnu, jako příznak do řádku s datem a cenami v mé datové tabulce, bude vhodné právě pro tuto analýzu, kdy hledám obchody podle názvu jednotlivých dnů v týdnu, mohu si však takové příznaky jednotlivých datumů (a času obecně) rozšířit například o řádek skriptu, který mi přiřadí ke každému datu třeba pořadový den v měsíci a mohu pak vyhodnocovat mechanické obchody, kdy vstupuji do obchodu první den v měsíci a chci z něj vystoupit dvacátý den v měsíci, toto bych zařídil skriptem, který by mi proměnnou Datum zpracoval tímto příkazem =Day(Datum), jehož výsledkem je pořadové číslo dne v měsíci (hodnota 1 – 31), stejně tak mohu vyřadit z tabulky celé měsíce pomocí skriptu =Month(Datum), jehož výsledkem je pořadové číslo měsíce hodnota (1-12) atd.….
2/ Třídím a kontroluji
Takto připravenou tabulku s datovou řadou upravenou pro českou lokalizaci Excelu a s vygenerovanými názvy dnů v týdnu pak musím podrobit další úpravě, protože mě zajímají obchody, ve kterých se bude jednat o vstup pouze v každé pondělí a výstup pouze v pátek stejného týdne. Musím proto z takové datové tabulky odstranit všechny ostatní dny, kterých se nebude týkat žádná obchodní aktivita. Budu tedy chtít zařídit, aby v mé tabulce zůstaly pouze řádky reprezentující pondělky a pátky a tyto potom podrobím analýze mého zamýšleného obchodu. Proč takto složitě a proč prostě nepoužít k vybírání dnů pro vstupy a výstupy z obchodů řádky, ve kterých je napsáno „pondělí“ a „pátek“, to by určitě bylo možné nějak pomocí VBA skriptu napsat. Ano, to by možné bylo, ale prakticky by to znamenalo, že by musel každý týden mé stažené pětileté datové řady mít pondělí a pátek, a takto to jednoduše není. Exchange Holidays, nejrůznější volna a svátky nebo výpadky provozu burzy v době katastrof nebo technických problémů způsobují, že každý týden, který je součástí mých stažených historických dat, prostě pondělí a pátek nemusí mít a takto chybějící dny by způsobily chaos v testování a v konečném výsledku. Musím proto úpravu smazání neaktivních dnů ještě podrobit kontrole, zda je datová řada opravdu připravena na bezchybné testování. Naštěstí se to bude dát zařídit jedním makrem, tedy nakonec jedním stisknutím dalšího vytvořeného tlačítka.
Zahájení procedury čištění datové řady o nevhodné nebo nepotřebné výrazy mohu začít vytvořením menu, ze kterého mohu tyto vybírané a mazané výrazy vybírat. Začnu tím, že si na nějakém místě mého sešitu vytvořím jejich seznam, já jsem například zvolil nový List1, který nebudu zatěžovat žádnými VBA skripty. Do tohoto listu si do sloupce vepíšu názvy dnů, které budu chtít ze své databáze odstranit.
Do sloupce „A“ na tomto Listu1 jsem si vypsal názvy dnů, které se mohou objevovat v mé datové řadě po formátování data na název dne v týdnu. Navolil jsem také možnost „-nic-„, která znamená, že nebudu chtít mazat žádný den v týdnu a budu chtít provádět pouze kontrolu datové tabulky. Poté se vrátím na list Start.
Na tomto listu Start, který je jakousi přístrojovou deskou mého sešitu se staženými a upravenými daty, zvolím kliknutím na buňku místo, kde budu chtít mít zobrazeno rozbalovací menu s hledanými výrazy určenými k odstraňování, já volím další připravené pole v rozšířené tabulce zadávání nejrůznějších hodnot, tedy buňku „C13“.
Poté na pásu karet volím záložku „Data“ a vyberu nástroj „Ověření dat“ a otevírám položku „Ověření dat…“, tato volba vyvolá zobrazení okna nabídky
V tomto okně na záložce „Nastavení“ (1) v nabídce Ověřovací kritéria vybírám ze seznamu „Povolit“ volbu „Seznam“ (2). V okně „Zdroj“ pak zvolím oblast, kde se nachází můj seznam dnů určených k mazání (3), já jej mám na Listu1 v buňkách A1:A6 a takto jej tažením myší v této oblasti na tomto listu také zadávám. Celou volbu ukončím kliknutím na „OK“ (4). Mohu pak vidět na listu Start toto menu.
Rozbalovací menu nabízí výběr ze seznamu vytvořeného na Listu1, tam mohu vybírat a má volba je nyní například „středa“. Tato volba způsobí zápis výrazu „středa“ do buňky „C13“ na listu Start.
Je pak již nyní patrné, že budoucí proměnná MazaciDen se bude načítat z této buňky. Seznamy si mohu samozřejmě vytvářet jakékoliv podle potřeby pročišťování datové tabulky a příznaků v řádcích, které jsem si vytvořil. Pokud jsem avizoval například označení data pořadovým dnem v měsíci, mohu si vytvořit seznam s čísly 1-31 a vybrané pořadové dny v měsíci vymazávat podle takto zadaného rozbalovacího seznamu.
Nyní již mám tedy stažená pětiletá data titulu Goldman Sachs připravená pro mou lokalizaci Excelu a mám vyhodnoceno každé datum podle názvů dne v týdnu, toto jsem zařídil jediným kliknutím tlačítka spouštějícího příslušné makro. Mám vytvořený seznam položek (názvy dne v týdnu), které bych chtěl z mé tabulky odstranit a nově také vím, jak mohu nadeklarovat a určit oblast buněk v mém excelovském listu pomocí proměnné, která se bude chovat As Range. Mohu proto přikročit k samotnému „mazacímu skriptu“, který bude současně vyhodnocovat, jestli promazávaná databáze nevykazuje chyby. Opět zvolím metodu, že ukážu celý skript, který po jednotlivých pasážích popíšu a vysvětlím, co jednotlivé řádky skriptu znamenají. Makro jsem si nazval MazaniRadku a má tento tvar.
Zdá se, že je to rozsáhlejší skript, ale velkou část tvoří řádky s popisky a je také složen ze dvou samostatných procedur – vyhledání a smazání zbytečných řádků datové tabulky a následná kontrola takového výsledku. V úvodu skriptu mám nastaveno, že se budu pohybovat na listu Data a Start, to je již známá část skriptu (1). V další části mám nadefinovány proměnné, se kterými budu pracovat a jejich formát. Mohu si všimnout, že jedna z proměnných bude znovu oblastí s názvem OblastHledani (červená šipka), tedy …As Range. Proměnné MazaciDen a ChybnyDen pak budou textové útvary (…As String) a budou patrně nabývat hodnoty názvů dne v týdnu (2). Ostatní proměnné již podle povědomých názvů budou sloužit ke známým účelům.
Další pasáž skriptu je o načtení hodnot proměnných, které jsem si výše nadefinoval. Mohu tak vypozorovat, že jsem si opět určil hodnotu posledního plného řádku mých stažených dat v listu data a tuto hodnotu přidělil proměnné PlnyRadek, ve stejném smyslu jsem pak proměnné PlnySloupec určil číslo označující poslední zaplněný sloupec s mými staženými daty (3). Aktuálně jsou má data až do řádku 1262 a do sloupce „G“, tedy hodnota 6. Hodnota proměnné MazaciDen je hodnota z buňky „C13“ z ovládacího listu Start, tedy z buňky, kde mám rozbalovací seznam s možnostmi výběru názvu dne v týdnu (4). Nyní jsem si pro odstranění vybral den „úterý“.
Toto zadání pak bude mít za úkol zbavit se řádků s příznakem „úterý“
Budu tedy chtít první procedurou smazat z mé tabulky všechny řádky, kde se nachází slovo „úterý“, budou to řádky označené šipkami. Posledním řádkem této části skriptu na obrázku skriptu v textu výše při prozatímním načítaní hodnot proměnných je nastavení oblasti (Set), kde budu vyhledávat „škodlivá slova“, tedy názvy dnů v týdnu (5). Má přeformátovaná data s názvem dne v týdnu se nachází v osmém sloupci (H) proto jsem si oblast s názvem OblastHledani, kde budu hledat názvy dnů v týdnu vytyčil velkoryse v rozsahu buňky čtvrtého řádku a sedmého sloupce „H4“ a buňky „K5000“. Graficky znázorněno je to tato oblast.
Další část skriptu přináší poznání další cyklické funkce, která bude mít za úkol „pročesat“ řádek po řádku mou zadanou oblast a zjišťovat, jestli se v něm nenachází „zakázané“ slovo „úterý“ a pokud toto bude pravda, tak tento nalezený řádek bude smazán.
For…Next
Cyklická funkce For…Next má nejrůznější varianty. Mnou nyní použitá cyklická funkce využívá počitadlo, které slouží jako posouvač po jednotlivých řádcích a které má určený rozsah počtu úkonů. Každý jednotlivý cyklus umožňuje vykonat výpočetní operace na mém excelovském listu, které se nacházejí mezi instrukcí For a instrukcí Next. Mezi tyto příkazové instrukce lze vkládat také další cyklické nebo rozhodovací funkce, v mém případě budou mé jednotlivé cykly obsahovat jednoduchou vnořenou funkci podmínky. Níže je uvedená část skriptu.
Označení cyklu mezi instrukcemi For a Next je znázorněno kruhovými šipkami. Makro se tak v tuto chvíli svého běhu bude zabývat pouze touto procedurou opakování jednotlivých kroků, aby po vyčerpání zadaných opakování pokračovalo dále v dalších řádcích skriptu. Logika této cyklické funkce je pak následující „…začni na řádku č.1 oblasti, kde se mohou nacházet výrazy, které chci smazat („úterý“). Ptám se poté, jestli se na tomto řádku v zadané oblasti opravdu nachází slovo „úterý“. Pokud je toto pravda a na tomto řádku se tento výraz opravdu objevuje, smažu celý „škodlivý řádek“, pokud to pravda není, jdu dál a ukončuji tento dotaz pro tento řádek. Posouvám se na další řádek a dotaz opakuji pro tento další řádek…“. Start na prvním řádku začíná přiřazením hodnoty 1 proměnné Radek, kterou mám nadeklarovánu (6.1). Počitadlo úkonů mám nastaveno od 1 do 5000 (6.2), bude provedeno prohledání celkově 5000 řádků datové tabulky, číslo mohu libovolně měnit podle rozsahu tabulky (pokud předpokládám 252 obchodních dnů v roce, tak hodnota 5000 reprezentuje 20-ti letý rozsah datové tabulky). Na řádku (6.3) je formulována avizovaná podmínka, kde se dotazuji, jestli (If) se v nadeklarované oblasti OblastHledani na aktuálně zpracovávaném řádku s proměnnou Radek nenachází hodnota proměnné MazaciDen (nyní „úterý“) a jestliže ano, potom (Then) požaduji skriptem na dalším řádku (6.4) celý tento řádek smazat. Pokynem Else na dalším řádku (6.5) se posouvám dále, abych zvýšil hodnotu proměnné Radek o jedničku (6.6), což způsobuje posun na další řádek v mé datové tabulce. Před tímto posunem musím ukončit dotaz na podmínku uzavřením dotazu (End If) na řádku (6.7). Poté se přečtením instrukce Next (6.8) vracím na řádek skriptu s příkazem For a celý cyklus se opakuje. Zpracování takové cyklické funkce je závislé na výkonnosti počítače, pro takto rozsáhlou datovou tabulku trvá například u mě toto zpracování zhruba jednu sekundu. Jaký je výsledek?
Z mé tabulky zmizely všechny řádky obsahující výraz „úterý“. Protože chci pouze obchody, které budou probíhat mezi pondělím a pátkem, stejnou procedurou smažu také „středy“ a „čtvrtky“. Toto je výsledek.
Je patrné, že v datové tabulce zůstaly pouze řádky s pondělky a pátky, což je skvělé. Musím ale také konstatovat, že se mi na jednom z řádků objevilo slovo „chyba“ (červená šipka), které označuje závadu v posloupnostech pondělí – pátek, které je způsobeno skutečností, že se v datové řadě nevyskytuje pondělí 7.9.2015. Na tento den v tomto roce totiž připadl svátek Labour Day a na burze se neobchodovalo. Pokud bych nyní zpracoval svá data na držení akcií Goldman Sachs pro pondělí až pátek, vznikl by velmi zmatečný výsledek, protože v jednotlivých řádcích pod sebou by se nevyskytovaly pouze opakující se periody s pondělky a pátky. Jak se tam takové slovo dostalo? S dalšími řádky tohoto makra.
Po smazání nepotřebných dnů procedurou For…Next pokračuje skript kontrolou tabulky, jestli se v ní neobjevuje výše popisovaná chyba. Protože si chci tabulku upravit tak, aby na každých dvou řádcích byl okamžik vstupu do obchodu na prvním řádku a okamžik výstupu na druhém řádku, nesmějí se příznaky, které jsem si vytvořil u jednotlivých dat sobě rovnat, jednoduše a konkrétně, v případě, kdy zpracovávám data s denními daty nemohou být za sebou dva pondělky nebo dva pátky. Stačí tedy, abych mezi sebou porovnal tyto dvojice řádků a pokud se budou tyto příznaky (označení dne v týdnu) rovnat, nechám si zapsat do řádku slovo „chyba“. Nadefinuji si proto další dvě proměnné AktualniDen (jako String) a AktualniRadek (jako Integer) (7) a v dalším řádku skriptu smažu oblast, kde by se mohly vyskytovat hlášky se slovem „chyba“ z posledního spuštění makra (8).
Toto vyhodnocení – porovnání dvou řádků – jsem si nechal opět vyrobit procedurou Do While…Loop. Na řádku (9) je konstatování, že data začínají na čtvrtém řádku a řádek (10) definuje podmínku, aby vyhodnocování skončilo vyčerpáním všech zpracovaných dat. V řádcích (11) je pak načtení hodnot dvou sousedních řádků pro každý cyklus, v prvním cyklu tedy řádek 4 (AktualniRadek=4) a řádek 5 (AktualniRadek+1 má tak hodnotu 5). Prvnímu řádku se rovná hodnota proměnné AktualniDen a druhému řádku se tak rovná hodnota proměnné ChybnyDen, kterou jsem si již dříve nadeklaroval, a je to potenciálně chybová hodnota, protože by se neměla rovnat předchozímu řádku (…dva pátky za sebou je „chyba“). Do procedury Do While…Loop jsem vnořil podmínku stejně, jako do procedury For…Next ve skriptu výše. Její zápis je na řádku (12) a je dotazem právě na rovnost výrazů (názvu dvou dnů v týdnu). Jestliže je podmínka splněna, tak se do vedlejší buňky chybného dne natvrdo zapíše hláška „chyba“ (13). Pokud tomu tak není, procedura pokračuje dále (Else) a dojde také k ukončení podmínky (End If) (14). Cyklus nadefinuje posun o jeden řádek dále (15) a instrukce Loop (16) vrátí cyklus na řádek Do While. Provedení všech úkonů makra, tedy mazání nevhodného řádku a procesu kontroly, je ukončeno vyskakujícím potvrzovacím oknem (17).
Mohu odkliknutím „Ok“ na vyskočeném okně a ukončit celé makro. Na obrázku je také možné vypozorovat, že jsem si přidal na list Start dvě nová tlačítka, která spouštějí tyto dvě nová makra, makro upravující tabulku pro český Excel a přidávající příznak názvu dne v týdnu a makro provádějící mazání a kontrolu datové tabulky.
Nyní nezbývá, než odstranit řádky z tabulky, které nesou příznaky „chyba“. Není jednoduché vymyslet nyní skript, který by toto zařídil, protože mohou nastat různé situace. Mohu mít nejen dva pátky za sebou, ale také dva pondělky za sebou, mohu mít ale dokonce takové události tři za sebou (typicky období vánoc a nového roku).
Dny 21.12.2015, 28.12.2015 a 4.1.2016 jsou tři pondělky za sebou. První dva pondělky v červeném obdélníku (21.12.2015 a 28.12.2015) nemají odpovídající pátky, třetí pondělí v řadě (4.1.2016) již tvoří plnohodnotný týden s pátkem v následujícím řádku. Řádky v červeném obdélníku tedy musím smazat. Udělám to nyní ručně pro vyloučení chyby a složitosti psaného skriptu a je to ve zpracování dat k analýzám nyní nejotravnější krok. Pětiletou datovou tabulku ale mám takto upravenou manuálně za čtyři minuty (schválně jsem to stopoval :c). Mohu pak znovu nechat makrem zkontrolovat, jestli jsem chyby opravdu odstranil.
Do volby mazacího dne navolím možnost „-nic-“, protože nechci mazat žádný den, ale jen provést tu část makra, které zkontroluje, zdali jsem správně vymazal chybové řádky. Kliknutím na zelené tlačítko „mazání dne a kontrola“ provedu takovou opětovnou kontrolu.
Mohu pak zjistit, že datová tabulka žádné chyby nevykazuje a například období vánoc a nového roku 2015 již žádné údaje o chybovosti výskytem slovy „chyba“ nezobrazuje.
Takto upravená pětiletá data pro akciový titul Goldman Sachs, tedy pouze kompletní období pondělí – pátek, podrobím analýze týdenního obchodu využitím makra z minulého článku. Na listu Start zadám tyto parametry.
Název analýzy „po-pá“ (1) nepotřebuje komentář, stejně tak vyplněná pole (2), (3) a (4). Doba trvání obchodu bude „2“, protože se skript bude pohybovat mezi dvěma sousedními řádky (5) a bude to tak, jako bych testoval mezidenní držení akcií, mám však řádky promazány tak, že na těchto dvou řádcích je zachyceno období jednoho kalendářního týdne. V buňce (6) nezadávám žádný požadavek na mazání. Celý backtest spouštím tlačítkem „Spusť test!!!“ (7). Na listu Celkem pak mohu vypozorovat výsledek.
Týdenní držení s nákupy v pondělí a prodejem v pátek by přineslo profit +3.129.01 USD. Mohu pak pro srovnání navštívit obrázek z konce minulého článku, kde byl výsledek pětidenního držení akcií GS bez ohledu na dny v týdnu (prostých pět obchodních dnů tak jak jdou za sebou) s konečným výsledkem pouhých +6.00 USD. Pokud bych tedy „vsadil na kázeň“ a dodržoval vstupy v pondělí a výstupy v pátek, výrazně bych si polepšil. Graficky pak na obrázku níže.
3/ Záměna datových řad
Takto upravená tabulka pro titul Goldman Sachs je základním výchozím bodem pro srovnávání stejných typů obchodů pro různé tituly. Vstupování do obchodů v pondělí a výstupy v pátek by vyneslo pro akcii GS za pět let výnos +3.129.01 USD i se zaplacenými poplatky a nyní mě zajímá, jak by si vedly v takovém srovnání jiné akciové tituly a možná bych tak objevil vhodnější kandidáty pro takové obchody. Budu nyní chtít vymyslet, jak bleskurychle pomocí VBA skriptu přenášet data jiných titulů k stejnému otestování. Kupodivu to nebude nijak složité, protože budu na upravenou a protříděnou datovou řadu pouze aplikovat jiná data jiných akciových titulů. K takové úpravě pak budu využívat klasickou excelovskou funkci =SVYHLEDAT, kterou aplikuji a upravím pro své potřeby. Jak celý koncept funguje ukážu na jednoduchém případu.
V excelovském listu mám určitá data umístěná ve sloupci A1. Mohu si představit, že to je to nejcennější, co nyní mám také na listu Data, tedy protříděnou a zkontrolovanou pětiletou datovou řadu sestavenou z termínů pondělí a pátek v každém týdnu. V pravé části listu vidím datovou tabulku značně objemnější, která obsahuje kromě stejných dat, které jsou ve sloupci „A“ také jiné datumové údaje pro jiné dny. Mohu si pak představit, že toto je nějaká databáze jiného akciového titulu, například McDonalds‘ (MCD). Mým úkolem bude přenést k jednotlivým údajům ve sloupci „A“ pouze některé údaje, které mají stejnou hodnotu pro datum ve větší tabulce vpravo. Konkrétně budu chtít pro datum 15.1.2020 ve sloupci A umístit do buňky vedle tohoto údaje odpovídající hodnotu pro stejné datum 15.1.2020 nacházející se ve větší tabulce ve druhém sloupci vedle buňky vykazující shodu, tedy chci přenést slovo „karel“. Toto vše chci navíc najednou pro každou hodnotu ve sloupci A.
Na obrázku je červeně vyznačena syntaxe takového příkazu pro klasický Excel. Funkce =SVYHLEDAT(A3:A17;G3:K26;2;0), umístěná v první buňce zaplňované oblasti v tomto zápise znamená, že pro data ve sloupci A, konkrétně oblast „A3:A17“ hledám shodu v oblasti buněk velké tabulky o rozsahu „G3:K26“ a chci pro vyhledanou shodu přenést hodnotu zapsanou ve 2 sloupci (vedlejším) v oblasti s nalezenou shodou. Hodnota nula (False) jako čtvrtý argument je nyní povinný parametr. Výsledek takového zápisu je tento
Pokud budu chtít zaplnit také další sloupec podle stejné shody, stačí pouze ve vzorci =SVYHLEDAT zadat přenos hodnoty ze třetího sloupce prohledávané oblasti podle nalezené shody.
Výsledkem je zaplnění také druhého sloupce hledaných hodnot
Obdobně pak mohu zaplnit zbylé dva sloupce výběrem dat pro shodné hodnoty buněk jednotlivých datumů srovnávaných oblastí.
Takto jednoduše mohu zaplnit buňky novými daty z větší oblasti, tedy v mém případě nahradit starou datovou tabulku novými hodnotami umístěnými kdekoliv v mém excelovském sešitu. Takovou práci ale nebudu provádět vepisováním vzorců =SVYHLEDAT, ale celou proceduru zautomatizuji makrem. Co tedy bude zapotřebí udělat a jaká bude filozofie také záměny dat? Musím si určit oblast buněk, pro kterou budu hledat shodu v datech, tedy protříděná upravená data ve sloupci s datumy. Musím si určit oblast buněk, ve které budu hledat shodu s daty z první oblastí, tedy například čerstvě stažená historická data akciového titulu MCD a dále si budu muset určit buňky, které jsou první buňkou ve sloupci, kde se bude zapisovat shoda (tam kde jsem v příkladu vepisoval excelovský vzorec =SVYHLEDAT). To je vše, ostatní zařídí zapsaný skript.
První úpravou je vytvoření dalšího listu mého sešitu, kam umístím nová data, která budu chtít otestovat podle zadaného úkolu
Nový list sešitu jsem si nazval NovaDB (nová databáze) a do buňky „A1“ jsem si nechal natáhnout stažená data pro akciový titul MCD, tak jak jsem jej pořídil z Yahoo.finance. Tím jsem vytvořil novou datovou tabulku, ze které budu čerpat nová data pro předpřipravené časové období pěti let pouze pro vyseparované dny pondělí a pátek. Jak jsem napsal skript pro převod jednotlivých dat MCD do listu Data, kde mám cenové údaje pro titul GS, je na obrázku níže.
Toto makro jsem si nazval ZamenaDat. Nejdříve jsem nadefinoval nový list sešitu NovaDB (první červená šipka). Poté jsem si nadefinoval oblasti buněk, které budu později porovnávat, tedy StaraDB a NovaDB, obě As Range. Nový list sešitu s názvem NovaDB jsem si také patřičně nastavil (poslední červená šipka). Modrými šipkami jsem si nadeklaroval proměnné, které budou nosiči hodnot čísla posledního zaplněného řádku pro starou a novou datovou tabulku PrazdnyRadekSDB a PrazdnyRadekNDB.
Skript pokračuje zjištěním hodnot proměnných posledního zaplněného řádku pro starou a novou datovou tabulku (2) známým jednořádkovým skriptem. PrazdnyRadekSDB je zjištěné číslo posledního zaplněného řádku ve druhém sloupci na listu Data, kde je datum upravené datové řady, PrazdnyRadekNDB je zjištěné číslo posledního zaplněného řádku v prvním sloupci na listu NovaDB, kam jsem si natáhl novou datovou tabulku pro MCD. Obě zjištěné čísla jsem si nechal vyobrazit na listu Data do buněk v prvním řádku. Pokud skript dorazí do tohoto místa, mohu na listu data v prvních dvou buňkách vidět údaje o hodnotách těchto posledních zaplněných řádků a získat informace o velikosti srovnávaných oblastí.
Mohu pak vidět, že má oblast na listu Data, kam budu chtít natáhnout shodná data se rozprostírá od čtvrtého řádku, kde datumy začínají, až na řádek 460 a ve stejném smyslu má nová datová tabulka na listu NovaDB s daty akcie MCD sahá od prvního řádku až na řádek 1260. K čemu je takové zjištění dobré? Můj skript funguje bezchybně s jedinou výjímkou a tou je občasné zaseknutí skriptu na definici oblasti, ze které čtu data, pokud jej mám dynamicky definovány pomocí Cells. Pokud však zadám oblast pomocí Range („B4:B460“) tato chyba se neobjevuje, k ní ale potřebuji znát právě číslo 460, tedy hodnotu posledního zaplněného řádku, proto je tento údaj vynesen právě do těchto buněk, co tím je myšleno vyplývá z následujícího obrázku.
Na řádku (4) podbarveném zeleně (aby jej VBA ignorovalo) je nastavení rozsahu oblasti pro kterou budu hledat shodu, tedy sloupec s datumem, které jsem protřídil na pondělky a pátky na listu Data. Jedná se o data rozprostírající se v buňkách „B4″ až „B460″. Oblast musí být definována přesně, jinak skript vyhodnotí špatně definovanou oblast jako chybu, proto, pokud ji mám zapsánu pomocí Cells jako =DataSheet.Range(Cells (4, 2), Cells(PrazdnyRadekSDB, 2)), kde PrazdnyRadekSDB reprezentuje právě číslo 460, skript se může někdy opravdu zastavit. Pokud se mi skript zasekne na tomto řádku, stačí jej nahradit =DataSheet.Range (Cells („B4:B460“) a vše funguje skvěle, musím ale do skriptu zasáhnou a na tomto místě jej přepsat v případě, že se zastaví jeho běh. Pokud nahradím číslo 460 v zápisu pomocí Range proměnnou PrazdnyRadekSDB tímto způsobem =DataSheet.Range(„B4:B“ & PrazdnyRadekSDB) (5), skript již takové poruchy nevykazuje. Toto je prozatím nejslabší místo mé „programátorské práce“. Oblast, pro kterou hledám shodu tedy vyžaduje dokonalé určení, pro oblast, kde je shoda hledána taková preciznost vyžadována není, mohu tak datovou tabulku NovaDB nastavit opět velkoryseji, a protože jsem data natáhl na tomto listu do buňky A1 a data začínají na druhém řádku, nastavil jsem tuto oblast jako Range („A2:E5000“) (6). Tímto mám nastaveno, pro jaká data hledám shodu a v jaké oblasti tuto shodu budu vyhledávat. Dalším úkolem, ve smyslu vzorce =SVYHLEDAT, je nalezení první buňky sloupce, do které budu vzorec zapisovat, aby se mi poté zaplnily zbylé řádky sloupce vyhledanými výrazy.
V mém případě budu chtít nejdříve zapsat do sloupce Open, do prvního řádku s daty (buňka „C4“) tento vzorec =SVYHLEDAT pomocí VBA, který by mi vyplnil zbytek sloupce až na řádek 460 všechna nalezená shodná Open pro každé stejné datum z tabulky pro MCD umístěné na listu NovaDB.
Jednořádkový skript (7) mi proměnné PrvniRadek sdělí číslo řádku, na kterém se nachází buňka, do které chci zapsat vzorec =SVYHLEDAT pomocí VBA, a protože nyní chci zapisovat do buňky „C4“, bude výsledkem číslo 4. Další řádek (8) obsahuje opět jednořádkový skript, který proměnné PrvniSloupec sdělí číslo sloupce, na kterém se nachází buňka, do které chci zapsat vzorec =SVYHLEDAT pomocí VBA, a protože nyní chci zapisovat do buňky „C4“, bude výsledkem číslo 3. Tímto mám zjištěno a určeno, kam bude směřovat první zápis excelovské funkce vyhledávající shodu pro srovnávané oblasti. Samotný zápis tohoto vzorce je pak v této části skriptu.
Mám nyní další možnost se seznámit s variantou cyklické funkce For…Next ve tvaru For Each…Next. Tuto funkci mohu přečíst jako „…pro každý jeden prvek v zadané oblasti udělej to, co je vepsáno mezi For Each a Next…“. Mohu tak vypozorovat, že můj skript nařizuje, aby pro každý prvek (nazval jsem jej „udaj“) v oblasti nadefinované jako StaraDB (9), provedl to, co je obsahem první buňky DataSheet.Cells(PrvniRadek, PrvniSloupec), tedy buňky „C4“ (10). Obsahem této buňky je pak excelovská funkce VLookUp (anglicky SVYHLEDAT) v tomto tvaru =Application.WorksheetFunction.VLookup (udaj, NovaDB, 2, False). Slova v závorce pak popisují přesně to, co potřebuji, tedy pro každý datum staré datové tabulky (udaj) hledám shodu v tabulce s novými daty (NovaDB) a chci přenést data ze druhého sloupce této oblasti (ceny Open), argument False je povinný. Tímto je vyřešeno zaplnění prvního řádku hledání shody, pro posun na další řádek s buňkou C5 v oblasti a hledáním shody je pak instrukce na řádku (11), po přičtení jedničky se cyklus odrazí od Next a vrací se na řádek For Each. Vyčerpáním cyklu (spotřebováním všech řádků v tabulce pro hledanou shodu) se cyklus zastaví a pokračuje v dalším čtení skriptu. Tímto jsou do staré datové tabulky s daty pro GS načteny všechny ceny Open pro titul MCD se shodou pro stejné datum. Není pak žádným překvapením, že tato procedura For Each…Next se bude opakovat také pro sloupec s High, Low a pro sloupec Close. Celkem tedy budou patrné čtyři cykly pro každý sloupec zvlášť.
Je patrné, že zápisy skriptu pro hledání shody pro další sloupce budou obdobné, jenom se změní umístění první buňky v sloupci, do kterého chci zapisovat vyhledávací formuli =SVYHLEDAT pomocí VBA (červené šipky vlevo v obrázku) a také, která data (z kterého sloupce) oblasti, kde shodu vyhledávám chci přenášet (červené šipky vlevo v obrázku). Čísla (15), (16) a (17) pak znamenají odstavce skriptu, který zařizuje vyplnění požadovaných sloupců. Potvrzovací oznámení (18) ohlásí konec procedury náhrady datových tabulek a makro se ukončí. Pokud vše proběhlo správně, mohu vidět, že data GS jsou nahrazena daty pro MCD.
Pro větší komfort jsem si na listu Start vyrobil další tlačítko „Natáhni nová data!!!“, kterému jsem přiřadil toto makro, Po jeho stisknutí proběhne datová náhrada, kterou mohu odsouhlasit kliknutím na „ok“ v okně ohlašujícím splnění úkolu.
Tyto data pro akciový titul MCD pak mohu podrobit stejné analýze, jakou jsem prováděl na titulu GS
Na listu Start, přístrojové desce mého sešitu, pak pouze přepíšu název tickeru na MCD a test odstartuji spuštěním makra přiřazeného k tlačítku Spusť test!!! Výsledek je pak patrný na listu Celkem.
Mohu pak takovou sumarizaci vyhodnotit jako zjištění, že nakupování 100 akcií na pondělním Open a jejich prodej na pátečním Close stejného týdne s komisí 2 USD by bylo pro akcie MCD s výsledkem +5.798,01 USD, což je více než pro stejné obchody na akciovém titulu GS, které by přinesly výkon +3.129,01 USD. Stejné úkony pak provedu na slibovaných titulech JNJ, BAC a F. Stažení dat z Yahoo.finance, natažení do listu NovaDB, nahrazení starých dat novými na listu Data a spuštění analýzy mi zabere sotva pět minut. Mohu pak odezírat na listu Celkem tyto výsledky.
V grafickém provedení pak takto.
Série článků o VBA, jako rozšíření funkcionalit Excelu, možná přijde nezáživná a nudná. Zcela zřetelně si ale vybavuji, jak jsem se po prvních pokusech si „něco ve VBA napsat“ a ulehčit si tak práci vždy vracel na oblíbené webové stránky s řádky nejrůznějších skriptů a hledal způsoby, jak z těchto vyčtených znalostí něco vytěžit pro řešení mého výpočetního problému a přizpůsobit načerpané znalosti mým individuálním potřebám. V tomto duchu se nesou také články této minisérie. Je nyní úplně jedno, jestli budu opravdu hledat řešení týdenního držení stovky akcií, protože nejpodstatnější zjištění by nemělo být proč jsem to vlastně zjišťoval, ale jakým způsobem jsem to provedl. Pokud budu chápat základní logiku skriptu (převážně na několika málo řádcích) budu schopen si nejen skript opravit, když jeho průběh nebude hladký, ale zejména jej přizpůsobit k řešení jiných výpočetních situací. Může mě pak napadnout téměř cokoliv a budu schopen si takový problém otestovat a vyzkoušet a být přitom dostatečně efektivní, zejména z pohledu vynaložené dávky času strávené nad rozlousknutím vytyčeného úkolu.
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
Čau, nevím, jak nové verze Excelu, ale můj z r. 2003 lze nastavit, aby měl jako desetinny oddělovač desetinnou tečku.
Mám to tak nastavené, jinak bych nemohl do Excelu načítat z IB živé ceny opcí, které nemají striky na celých dolarech.
Ahoj,
podle mě se tohoto tématu dotknu hned v dalším článku. Jsou dvě základní možnosti nastavení 1/ mít české prostředí Excelu a změnit tečku na čárku některým ze způsobů, který jsem popsal (přímo z Excelu nebo makrem) a pak využívat českých excelovských vzorců se středníky, formáty datumů (zejména) a všemi funkcionalitami, které české prostředí přináší. 2/ zvolit v nastavení PC/Čas a jazyk/Datum, čas a místní formát/Místní formát/Angličtina (Spojené státy) a nemuset tyto převody tečky na čárku vůbec dělat – výhodné je to u streamování dat z IB, kde desetinné číslo je opravdu to s tečkou,mám pak ale jiný formát datumu, času a a další detaily fungují mírně jinak, a to je to, co popisuješ…:c) Jirka