Tuning automatického obchodního systému “90ka by FinHacker”

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…

  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.
Backtest upraveného systému “90ka by Finhacker”, období 1.1.2000 až 19.3.2021.

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ávací backtest, období 1.1.2000 až 19.3.2021.

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 %.
Výkonnost upravené 90ky po jednotlivých měsících a letech.

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:

  1. První den se nakoupí akcie A za 10 %. Obsazené sloty: 1/20.
  2. 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).
  3. 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).
  4. Č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í:

  1. První den se nakoupí akcie A za 6,67 %. Obsazené sloty: 1/30.
  2. 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).
  3. 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).
  4. Č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.

Srovnání průběhu equity upravené strategie vs původní, období 1.1.2018 až 19.3.2021.

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.

Srovnání ukazatelů upravené strategie vs původní, období 1.1.2018 až 19.3.2021.

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í…


Subscribe
Upozornit na
guest

27 Komentáře
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
View all comments
Pišta

A důvod proč jsi to přestal sám obchodovat a nyní už jen aktivně investuješ?

torgar

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 ?

petr

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?

petr

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. :)

Toník

Můžeš prosím nasdílet projekt tvé upravené 90ky Amibrokeru ?

petr

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. :)

petr

Aha, tak ameritrade se zda byt bez poplatku pro US listed akcie.

petr

Mas pravdu, pri registraci se sice da zvolit czech republic, ale po dokonceni registrace vyhodi hlasku, ze ucet nezalozi.

hast29

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í.

petr

To vypada pouzitelne. Mas s tim realne zkusenosti?

hast29

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.

hast29

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 …

hast29

Díky, mě právě ten popis v pravidlech znejistěl :-), tak jsem se radši zeptal.

torgar

Ahoj,

mel bych jeste dva dotazy prosim.

Kdyz pises

  1. První den se nakoupí akcie A za 10 %. Obsazené sloty: 1/30.

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?

torgar

Parada, dekuji

torgar

Skvele, jeste jednou dekuji

Přejít nahoru