V jednom z předchozích článků jsem vás seznámil s poměrně zajímavou systematickou strategií s názvem “devadesátka”, představil její minulou výkonnost, výhody, nevýhody a také to, že v posledních dvou letech neměla zrovna na růžích ustláno. Článek končil slovy, že lze strategii modifikovat tak, aby se zlepšil její risk profil a celková equity. A protože už se mnozí z vás na pokračování určitě těší, dnešní článek bude celý o úpravách tohoto obchodního systému.
Geneze
Po celou dobu živého obchodování originální devadesátky jsem se nemohl zbavit pocitu, že jde o velmi agresivní a značně rizikovou strategii, byť z backtestů vycházela jako méně volatilní a s příznivějším průběhem drawdownu, než samotné držení indexu S&P 100. Proto jsem se jal zkoumat možnosti, jak strategii upravit, aby vyhovovala mému risk apetitu.
Fáze první – optimalizace optimalizovaného (data first)
Optimalizace jednotlivých prvků základní logiky strategie byla první věc, co mě napadla. Například:
- různé periody RSI indikátoru,
- zapínání / vypínání strategie pomocí všemožných period klouzavých průměrů a jejich křížení,
- vyloučení akcií z konkrétních sektorů v rámci indexu S&P 100 (hodně volatilní bývají typicky biotechnologie),
- zamezení vysoké koncentrace akcií v portfoliu v rámci jednoho až dvou sektorů,
- škálování do pozice po různých x-násobcích, procentuálních poklesech nebo dle volatility (ATR),
- možné i nemožné logiky přikupování,
- a asi 20 dalších možností.
Jak určitě tušíte, nic nevedlo ke kýženému cíli. Jistě, equity se dařila různě vyhlazovat a drawdown snižovat, jenomže veškerých vylepšení bylo dosaženo díky tzv. curve fittingu, neboli pasování podmínek a filtrů na datové řady tak, aby zpětně zlepšovaly backtestové výsledky daného systému. Curve fitting je zkrátka velkým nepřítelem všech systematických obchodníků a velmi snadno se k němu sklouzne v rámci optimalizačního procesu.
Tudy cesta nevedla. Veškeré úpravy jsem hodil za hlavu a dal si na pár týdnů pohov.
Fáze druhá – jádro problému (idea first)
Po dostatečném mentálním oddechu jsem se opět pustil do práce, ale tentokrát jiným způsobem. Plán byl takový, že místo “štelování” různých pravidel na historická data bude lepší, když se zamyslím nad tím, kde se z logiky věci mohou skrývat největší rizika. Zásadní problém jsem viděl v agresivním škálování (přikupování) do již otevřených pozic a tím pádem potenciální vysokou koncentraci portfolia do pár akcií. Obě negativa byly popsány v prvním dílu. Díky identifikaci zásadních problémů postupně vzniklo něco, čemu říkám…
Strategie “90ka by FinHacker”
Představuji vám upravenou verzi devadesátky, jejíž finální varianta byla hotová někdy v říjnu až listopadu roku 2018. Začnu tím nejlepším, nejdřív ale technikálie…
- Všechny datové řady jsou nominální, tedy nejsou očištěny o vliv inflace.
- Data nejsou upraveny o dividendy (dividend adjusted). Dividendy přičítám k celkové equity v den jejich výplaty (ex-dividend day) a daním je sazbou 15 %.
- Poplatky za jeden obchod počítám jako $0,0035 za 1 akcii, minimálně však $0,35 za otevření pozice. Za uzavření to stejné (odpovídá Interactive Brokers).
- Skluzy v plnění (tzv. slippage) nejsou započítány.
- Vstupní i výstupní ceny jsou za denní uzavírací ceny (close).
- Backtesty pracují se survivorship bias databází.
- V rámci backtestů nezohledňuji každoroční danění zisků z obchodování.
- Strategie pracuje s pákou 2:1, v případě buy&hold indexu pracuji s pákou 1:1. Veškerý zisk je dále reinvestovaný, stejně tak dividendy.
- Startovní kapitál 100.000 USD.
Za povšimnutí stojí poměrně stabilní equity křivka, která překonává svoje high, ale zejména průběh drawdownu v čase. Jeho maximální hodnota byla za posledních víc jak dvacet let -28,55 % (-54 % u S&P 100), při nedávné korona krizi to bylo pouhých -8 % (-31,44 % u S&P 100). A to prosím nezapomínejte, že se strategie obchoduje na páku 2:1 (v případě maximální expozice kapitálu)!
V grafu je zaznačené datum (říjen až listopad 2018), kdy byla hotová finální verze upravené devadesátky. Následující období dva a půl roku lze brát jako slušný out-of-sample vzorek dat (přes 400 obchodů), který strategie při svém vzniku neviděla.
Srovnání jednotlivých ukazatelů vůči buy & hold přístupu je pozoruhodné (pozn.: v rámci backtestu 90ky není zohledněné zdanění zisků z obchodování). Za povšimnutí stojí zejména:
- expozice kapitálu 15,36 % vs 100 % (pozn.: v backtestu je chybně uvedeno 192,89 %, protože dochází k reinvestování dividend),
- roční výkonnost 21,91 % vs 5,79 %,
- win rate devadesátky 83,67 %,
- maximální drawdown -28,55 % vs -54,21 %.
S ohledem na roční výkonnost překonávala devadesátka index v celém sledovaném období kromě let 2017 (15,5% vs 21,3%), 2018 (-8,4% vs -4,4%) a 2019 (11,7% vs 31,2%).
Jaké jsou teda ty změny?
Jedná se o dvě “drobné” avšak zásadní úpravy…
#1 Problém koncentrovaného portfolia
Devadesátka operuje s něčím, co pracovně nazývám sloty. Originální verze měla 20 slotů, jeden slot odpovídá 10 % alokovaného kapitálu. Pokud bychom nakupovali akcie a neškálovali je, potom máme 20 dílů kapitálu, za který postupně nakupujeme. V případě škálování docházelo k tomu, že se první tranše akcií nakoupila za 10 % (jeden slot), druhá za 20 % (dva sloty), třetí za 30 % (tři sloty) a čtvrtá za 40 % (4 sloty), celkem tedy 100 % kapitálu (10 slotů) mohlo být alokováno do jediné akcie. Obchoduje se na páku 2:1, takže dalších 10 slotů ještě zbývá.
Mně přišlo dvacet slotů na takto agresivní strategii málo, proto jsem je rozšířil o dalších deset, tedy celkem 30 slotů, kdy jeden slot odpovídá 6,66 % kapitálu.
#2 Problém agresivního škálování
V původní verzi 90ky se přikupovalo denně do všech otevřených pozic v případě, že byla cena dané akcie nižší než poslední cena, za kterou se pozice otevírala (např. včera uzavřela akcie X na 100, ke konci dnešního obchodního dne se obchoduje za 97,5, takže se pozice přikoupí). Škálování probíhalo následujícím způsobem:
- První den se nakoupí akcie A za 10 %. Obsazené sloty: 1/20.
- Druhý den, pokud byla cena akcie A pod vstupní cenou z bodu 1, se přikoupí pozice v akcii A za dalších 20 % kapitálu a zároveň se otevře pozice v nové akcii B za 10 % (pokud jsou splněny ostatní podmínky). Obsazené sloty: 4/20 (1+2+1).
- Třetí den, pokud je cena akcie A nebo B pod vstupní cenou z bodu 2, se přikoupí pozice v akcii A za dalších 30 % kapitálu, akcie B za 20 % a zároveň se otevře pozice v nové akcii C za 10 % (pokud jsou splněny ostatní podmínky). Obsazené sloty: 10/20 (1+2+1+3+2+1).
- Čtvrtý den, pokud je cena akcie A, B nebo C pod vstupní cenou z bodu 3, se přikoupí pozice v akcii A za posledních 40 % kapitálu, akcie B za 30 %, akcie C za 20 % a zároveň se otevře pozice v nové akcii D za 10 % (pokud jsou splněny ostatní podmínky). Obsazené sloty: 20/20 (1+2+1+3+2+1+4+3+2+1).
Čtvrtým dnem se obsadily všechny sloty – alokoval se veškerý kapitál. Až uzavřením některé z pozic (uzavírací cena akcie je větší než 5denní klouzavý průměr uzavíracích cen dané akcie) došlo k jeho uvolnění a následné možnosti otevírat nové obchody dle pravidel systému.
Problém v případě takto agresivního škálování je v tom, že si často vyplýtváte veškerý volný kapitál během pár dnů, ale nakoupené akcie ještě ani nemusely pořádně vyklesat. Řešením bylo omezit škálování na pouhý jeden titul denně. V rámci jednoho dne tedy může dojít ke třem věcem: 1x nákup nové akcie, 1x škálování již nakoupené akcie nebo kombinace. Pořadí jednotlivých aktivit určuje indikátor RSI(2) – čím nižší hodnota, tím větší priorita. Otevírání nových pozic a škálování probíhá do té doby, dokud se nezaplní všech 30 slotů.
Ještě zde nastíním nový postup jako v případě první ukázky škálování:
- První den se nakoupí akcie A za 6,67 %. Obsazené sloty: 1/30.
- Druhý den, pokud je cena akcie A pod vstupní cenou z bodu 1, se přikoupí pozice v akcii A za dalších 13,34 % kapitálu (6,67 * 2) a zároveň se otevře pozice v nové akcii B za 10 % (pokud jsou splněny ostatní podmínky). Obsazené sloty: 4/30 (1+2+1).
- Třetí den, pokud je cena akcie A nebo B pod vstupní cenou z bodu 2 a akcie A má nejnižší RSI, se přikoupí pozice v akcii A za dalších 20,01 % kapitálu (6,67 * 3), akcie B se nepřikoupí a zároveň se otevře pozice v nové akcii C za 6,67 % (pokud jsou splněny ostatní podmínky). Obsazené sloty: 8/30 (1+2+1+3+1).
- Čtvrtý den, pokud je cena akcie A, B nebo C pod vstupní cenou z bodu 3 a akcie A má zase nejnižší RSI, se přikoupí pozice v akcii A za posledních 26,68 % kapitálu, akcie B se nepřikoupí, akcie C se nepřikoupí a zároveň se otevře pozice v nové akcii D za 6,67 % (pokud jsou splněny ostatní podmínky). Obsazené sloty: 15/30 (1+2+1+3+2+1+4+1).
Pozorný čtenář si všimne, že čtvrtý den končí alokovaným kapitálem z 50 % oproti původnímu schématu, kdy čtvrtý den už došlo k plnému zainvestování. Můj přístup je méně agresivní, výhodou je celkově nižší expozice v trzích, což s sebou přináší ale i nevýhodu v tom, že ve velmi silných cenových růstech zůstane většina kapitálu nevyužitá. Nicméně dle jednotlivých metrik z backtestu se zdá, že to nikterak nevadí.
Níže ještě ukázka, jak vypadala výkonnost upravené a originální verze od začátku roku 2018 po současnost.
Na první pohled je vidět, že nová verze devadesátky je mnohem méně volatilní, což je zřetelné například na maximálním drawdownu během tohoto období (-21,61 % vs -44,12 %). Pokud jde vše podle plánu a trhy rostou, bude původní strategie na koni. Čas od času ale vše podle plánu nejde a to je potom člověk rád za jakýkoliv méně agresivní přístup, který lze finančně a psychicky přežít bez větší újmy.
A to je vše, v jednoduchosti je krása. K dosažení stejných výsledků nejsou žádné další změny potřeba. Pokud se podobnou strategii chystáte obchodovat, nebo ji už jedete live, zkuste si zbacktestovat, jak by výkonnost vypadala v případě výše popsaných úprav. Třeba budete mile překvapení…
A důvod proč jsi to přestal sám obchodovat a nyní už jen aktivně investuješ?
Kromě jistých nevýhod algo obchodování jsem dost pevně přesvědčený, že v opravdu dlouhodobém horizontu je jen málo lidí schopných překonávat trh (ať už z hlediska samotné výkonnosti nebo risk-adjusted returns). Nedokážou to nejlepší portfolio manažeři na světě, ani různé quant fondy mající za sebou týmy matfyzáků. Třeba se ale pletu a všechny AOSy, které jsem dříve obchodoval, budou jako celek performovat lépe než index. Sám jsem na další vývoj velmi zvědavý a určitě to tady na blogu budu trackovat.
Ty zminovane nevyhody chapu a souhlasim s nimi.
Nicmene z toho prekonavani trhu jsem trochu zmateny. Preci jen z tohoto clanku je videt, ze od roku 2000 – tedy 20 let, coz za me uz je opravdu dlouhodoby horizont, udelala tvoje 90ka 6600 % a Buy&Hold S&P pouze nejakych 240 %. To je preci diametrialni rozdil. Na jeho zaklade by preci bylo uplne v poradku tvrdit, ze jsem zasadnim zpusobem prekonal trh. Anebo je problem ukryty v tom, ze prvnich 17 let to byl vlastne “curve fitting” a realnou vykonost lze nahlednout az od roku 2018 ?
Takhle bych se na to určitě nedíval. Já beru jako stěžejní datum out-of-sample této strategie od začátku roku 2013, kdy ji winpes poprvé zveřejnil na svém blogu.
Od roku 2000 do 2012 včetně devadesátka brutálně outperformovala buy&hold, konkrétně 25,14 % vs 1,32 % CAR s drawdownem -28,55 % vs -55,23 %.
Když si porovnám období 2013 až po současnost, vychází backtest 16,72 % vs 15,01 % CAR a drawdown potom -21,67 % vs -31,32 %. Jeden by si pomyslel, pořád super výkonnost, ale… Na první pohled je vidět, že se alpha strategie pomalu vytrácí, resp. já bych spíš řekl, že po rok 2013 byla strategie svým způsobem napasovaná na minulost (nemyslím to nijak špatně vůči winpsovi), protože to prostě vycházelo zajímavě a byl určitý předpoklad, že by to tak mohlo být i do budoucna.
Teď se dostanu k jádru problému… AOSy se neobchodují samostatně, ale v rámci portfolia několika systémů, a je 100% jisté, že některé budou výkonnostně horší než index, některé půjdou úplně do kopru a některé na tom budou velmi dobře. Jenže…to jsem prozatím nepočítal s nutným daněním zisků z obchodování. Například u 90ky se dostaneme v období 2013 až 2021 zhruba na 14,21 % CAR (počítáno od oka).
Abych to nějak shrnul: Systematické obchodování je dle mých zkušeností mnohem zajímavější a profitabilnější cesta než stavění si portfolia ze samostatných akcií. Nicméně díky obrovské komplexnosti finančních trhů a psychologii lidí jsem přesvědčený, že dlouhodobé investování bude v dostatečném časovém horizontu překonávat jakékoliv AOS portfolio retailového obchodníka.
Každopádně mně ale přijde systematické obchodování mnohem rozumnější než klasický stock picking…
Zajimala by mne technicka stranka veci (pokud jsi ochoten se podelit :)). Kdyz jsi mel aktivnich nekolik AOS, jaka byla architektura tveho reseni? Jednoduche nezavisle skripty reprezentujici jednotlive AOS nebo event-driven microservice based system?
Pokud se pod pojmem “event-driven microservice based system” skrývá něco jako centrální mozek, který zapíná / vypíná strategie, přiděluje jim váhy dle výkonnosti / korelace atd., tak potom byl můj přístup velmi jednoduchý a jednotlivé AOSy jsem obchodoval nezávisle s tím, že jsem měl v zásadě rozdělené přístupy na čtyři logiky:
Rebalancoval jsem jednou za rok. Nad hlavní logikou, která bude řídit jednotlivé AOSy, jsem také uvažoval a dělal si na to nějaké testy, ale došel jsem k závěru, že se vlastně jedná o “systém nad systémy” a je to další věc, co se může pokazit – třeba přeoptimalizací nebo chybnou logikou.
Já spíš myslel konkrétní implementaci jednoho AOS systému.
Jestli jsi to provozoval jako jeden script s jednou strategií per VPS, nebo to byl komplexnější systém.
Pod fancy spojením “event-driven microservice based system“ se skrývá něco jako jednotivé mini systémy (produkující/konzumující na AMQP), např jeden na generování potřebných dat (quotes, dividendy, metadata o společnostech, …) pro aktivní strategie, další na tvorbu kandidátů/orderů na základě těchto dat, další provádí exekuci příkazů přes brokera a poslední updatuje data a metriky (třeba hodnoty portfolia nebo provedené obchody). Plus nějaký dashboard na vizualizaci.
Ale díky i tak, podělil jsi se o jinou zajímavou věc a to dělení strategií podle logiky. :)
Aha, už rozumím. Pro každý AOS jsem měl samostatný skript, který pár sekund před close / open trhů vygeneroval dávku s potřebnými informacemi o otevíraných / uzavíraných pozicích. K poslání všech dávek přes API sloužil další skript. Poslední skript evidoval velikost otevřených pozic a alokaci. Celé to běželo na jednom VPS tuším ve Frankfurtu. Na takto jednoduchou architekturu, jestli se to tak dá vůbec nazvat, nebylo zapotřebí více strojů.
Můžeš prosím nasdílet projekt tvé upravené 90ky Amibrokeru ?
Nemůžu, resp. nechci. Důvod jsem popisoval zde.
Tip na solidniho brokera s pythonim API by tu nekdo mel? Pracovat s IB je fakt peklo (kvuli kvalite a nutnemu prostredniku-gateway). Alpaca neumoznuje live ucty pro non-us residenty (ale je tam nejaka beta). Ameritrade zvazuju, ale poplatky jsou vyssi (pravdepodbne to pro mne bude prijatelny trade-off).
Budu rad za jakykoliv tip. :)
Aha, tak ameritrade se zda byt bez poplatku pro US listed akcie.
Měl jsem za to, že TD Ameritrade neotevírá účty pro Evropany.
Mas pravdu, pri registraci se sice da zvolit czech republic, ale po dokonceni registrace vyhodi hlasku, ze ucet nezalozi.
US broker Tradier.com, má tzv. international account, s vyšším deposit limitem a přísnějším inactivity fee. Automatická registrace taky nejde, ale ozvou se přes email a po pár dotazech CZ rezidenta zaregistrují.
To vypada pouzitelne. Mas s tim realne zkusenosti?
Od letošního února, ale ne s jejich API, jen ručně pár objednávek měsíčně na jejich WEB platformě. V tom rozsahu likvidita, spread a podpora mi přijde poměrně srovnatelné s IB, jen u opcí se platí za excersize, IB to má bez poplatku. Tradier má ale zase bez poplatku americké akcie a ETF.
No a IB má lepší možnosti deposit/withdrawal. Ale na to tady je článek, že jsou různé možnosti jak na to s Trasferwise a Revolutem. Já tam převedl část účtu IB(UK), tím ACH převodem, tak mě to nic nestálo.
Doporučil mi je jeden Američan, který právě jako hlavní výhodu viděl že může použít API a svoje C scripty a vlastní SW. Ale já s tím zkušenosti nemám.
Zdravím finhacker.cz, z popisu těch příkladů (#2 agresivní škálování) mám jednu nejasnost a prosím jestli k tomu můžeš dovysvětlit. Pravidlo číslo 7. původní devadesátky říká že se otevírá jen jedna pozice denně, doslovně tam bylo napsáno že buď dokup do otevřené pozice nebo nová pozice nového tickeru, podle toho co má nižší RSI(2), ale jen jedno z toho. V těch Tvých příkladech původní i zlepšené devadesátky se ale otevírá více pozic denně.
Podle logického základu toho vylepšení, tedy vyvarovat se vysoké koncentraci portfolia, by zřejmě přednostní otevírání těch jednoslotových pozic na nových tickerech byla výhoda, ale radši se ptám. Každopádně díky za super post …
U originální devadesátky se denně otevírala maximálně jedna NOVÁ pozice, ale ke škálování docházelo u VŠECH otevřených pozic v případě nižší ceny než vstupní. Škálování probíhalo do té doby, dokud se nezainvestoval veškerý kapitál. Jsem si na 100 % jistý, že takto zněla původní pravidla.
U mojí verze devadesátky se otevírá maximálně jedna NOVÁ pozice denně (to je stejné jako u původní verze), ale škáluje se denně pouze jedna otevřená pozice, která má nejnižší RSI. Tohle je opravdu můj výmysl…
Díval jsem na to sedmé pravidlo a bohužel je trošku nešťastně zformulované, ale je to tak, jak píšu.
Díky, mě právě ten popis v pravidlech znejistěl :-), tak jsem se radši zeptal.
Ahoj,
mel bych jeste dva dotazy prosim.
Kdyz pises
Tak to by ale spravne melo byt, ze se nakoupi akcie A za 6.66 % ne? Pokud by to bylo za 10 %, tak je paka 3:1.
Druhy dotaz je spis prosba. Mam svoji implementaci AOS, ktera se chova stejne, kdyz jsem ji ale upravil pomoci te tvoji modifikace, nedokazu se za stejne obdobi (1.1.2018 – 19.3. 2021) dostat ani zdaleka k zisku 35,58 %. Drawdown je podobny, okolo 20 %, ale na konci letosniho brezna koncim s trapnymi + 8 %. Pritom ta modifikace, co se kodu tyce, je opravdu jednoducha, neni mi jasne, kde je chyba. Byl by velky problem nasdilet alespon cast obchodu, ktere ta modifikovana strategie udelala v tomto obdobi, abych to mohl zvalidovat proti svym obchodum prosim?
ad 1) Ano máš pravdu, mám tam chybu. Díky za upozornění, opravím. V backtestu mám alokaci správně ;-)
ad 2) Jasný, není problém, akorát jsem teď na dovolené, tak jak se vrátím, hodím sem výpis provedených obchodů.
Parada, dekuji
Tady máš výpis všech obchodů 1.1.2018 – 19.3.2021.
Skvele, jeste jednou dekuji