Budapesti Gazdasági Főiskola KÜLKERESKEDELMI FŐISKOLAI KAR Külgazdasági francia SZAK Nappali tagozat Tőzsde- Pénzintézetek szakirány
PROGRAMOZOTT KERESKEDÉSI RENDSZEREK
Késztette: Kőrös Gábor László
Budapest, 2007.
TARTALOMJEGYZÉK 1
2
A programkereskedés kialakulása...................................................................................... 6 1.1
Ed Seykota.................................................................................................................. 8
1.2
Programozott kereskedés megítélése ......................................................................... 9
A programfejlesztés lépései ............................................................................................. 11 2.1
Az időtáv meghatározása ......................................................................................... 11
2.2
A kereskedési rendszer típusa .................................................................................. 12
2.2.1
Technikai elemzés alapján ............................................................................... 13
2.2.2
Fundamentumok alapján .................................................................................. 16
2.3
2.3.1
Indikátorok ....................................................................................................... 19
2.3.2
Gyertyaformációk............................................................................................. 20
2.3.3
Gap forrás:........................................................................................................ 21
2.3.4
Pullback............................................................................................................ 22
2.4
Program megírása..................................................................................................... 23
2.5
Program tesztelése – backtest, riport kiértékelése.................................................... 25
2.5.1
Időintervallum – jelek mennyisége .................................................................. 25
2.5.2
Választott termék.............................................................................................. 26
2.5.3
Adatok .............................................................................................................. 27
2.5.4
Egyéb backtest beállítások ............................................................................... 29
2.5.5
Riport................................................................................................................ 32
2.5.6
Változtatások.................................................................................................... 39
2.6
3
4
Ötlet.......................................................................................................................... 18
Optimalizálás............................................................................................................ 42
2.6.1
A curve fitting probléma .................................................................................. 42
2.6.2
In-sample, out-of sample adatok ...................................................................... 44
2.7
Végső tesztelés ......................................................................................................... 44
2.8
Rendszer élesbe állítása............................................................................................ 45
Megvalósítás .................................................................................................................... 46 3.1
Pullback Kereskedési Rendszer ............................................................................... 46
3.2
Indikátor rendszer..................................................................................................... 59
Végszó.............................................................................................................................. 67
3
Ábrajegyzék 1. sz. Ábra ................................................................................................................ 15 2. sz. Ábra ................................................................................................................ 20 3. sz. Ábra ................................................................................................................ 43 4. sz. Ábra ................................................................................................................ 50 5. sz. Ábra ................................................................................................................ 55
4
Táblázat jegyzék 1. sz. Táblázat........................................................................................................... 18 2. sz. Táblázat........................................................................................................... 33 3. sz. Táblázat........................................................................................................... 34 4. sz. Táblázat........................................................................................................... 35 5. sz. Táblázat........................................................................................................... 36 6. sz. Táblázat........................................................................................................... 52 7. sz. Táblázat........................................................................................................... 56 8. sz. Táblázat........................................................................................................... 58 9. sz. Táblázat........................................................................................................... 63 10. sz. Táblázat........................................................................................................... 65
5
1 A programkereskedés kialakulása A programozott kereskedési rendszerek az 1970-es évektől kezdve indultak fejlődésnek, miután a világ jelentősebb tőzsdéin elkezdődött az elektronikus rendszerekre történő áttérés folyamata (internet: Wikipédia, Algorithmic trading). A folyamat, mely során ezek a rendszerek robbanásszerűen elterjedtek és meghatározó mértékűvé váltak, az 1980-as évekre datálható. Azóta az eltelt közel harminc év alatt kijelenthetjük, hogy a piacokon és a meghatározó piaci szereplők között térhódítása szakadatlan és növekedési üteme több mint jelentős. Az Aite Group LLC. által publikált kutatás szerint 2006-ban az összes Európai Uniós és
Egyesült
Államokbeli
részvénykereskedés
volumenének
egyharmadát
adták
a
programozott kereskedési rendszerek. Az 50%-os küszöb átlépését 2010-re jósolják. Ugyancsak beszédes adat, hogy 2006-ban a Londoni Tőzsde (LSE) forgalmának 40%-át tették ki a különböző kereskedési algoritmusok. 2007-re 60%-ot prognosztizálnak. De a programkereskedés ugyanúgy tetten érhető a Forex esetében is, 2006-ban a forgalom 25% volt tulajdonítható ennek. Legjelentősebb mértékben azonban az amerikai piacokon alkalmazzák az algoritmusos kereskedést, úgy becsülik, hogy 2008-ra az amerikai tőzsdék forgalmának 80%-át teszik ki majd programozott kereskedési rendszerek által adott ügyletek. Ezeknek, a számoknak a hosszas elemzése felesleges, tisztán látszik, hogy továbbra is erős a tendencia, mely az automatizálás irányába hajtja a piaci szereplőket. Jól jellemzi a helyzetet egy a közelmúltban megjelent cikk (internet: IHT, Citigroup), melyben azt írják, hogy a Citigroup 680 millió dollárért vett meg egy programozott kereskedéssel foglalkozó céget. Ugyanebben a cikkben hangzik el az is, hogy a Goldman Sachs évente több tízmillió dollárt költ ezen részlegének fejlesztésére, és többen dolgoznak ezen részen, mint a trading desk-nél. De mi vezetett el idáig? A történet tulajdonképpen az 1970-es években kezdődött, amikor a New Yorki Tőzsdén (NYSE) bevezették a DOT nevű rendszert. Ez a három betű a „Designated Order Turnaround” kifejezés rövidítése. Ez volt az első lépés, mely abból állt, hogy a megbízásokat elektronikus úton továbbította, majd ezeket, a megbízásokat manuálisan hajtották végre. Ehhez a rendszerhez kapcsolódott az OARS elnevezésű, „Opening Automated Reporting System”. Ennek a rendszernek a fő szerepe abból állt, hogy segítette a specialistáknak meghatározni a nyitószakasz várható árát. Ezen kezdeti lépések tették lehetővé, hogy a
6
későbbiekben a kereskedők automatizált formában adhassanak megbízásokat a tőzsdei termékek vételére ill. eladására. A nagy áttörés az 1980-as években történt, ekkoriban terjedt el széles körben az algoritmusos kereskedés a részvény- ill. a határidős piacokon. Ezen programok lehetőséget adtak az arbitrázsra a részvényindexek esetében. Ez abból állt, hogy megvették, vagy eladták az indexet és pont az ellenkezőjét tették a benne szereplő részvényekkel. Amennyiben az arbitrázs lehetősége fennállt, a programok automatikusan adtak-vettek a megfelelő mennyiségben. Érdemes belegondolni, hogy hogyan nézhetett ki egy arbitrázs művelet az S&P500-as index esetében, ahol az indexkosár 500 részvényt tartalmaz. Az indexarbitrázs mellett a korszak másik népszerű „vívmánya” volt az ún. portfolióbiztosítás. Ennek lényege az, hogy a Black-Scholes opcióárazási modell alapján szintetikus put opciókat hozunk létre a portfoliónkban szereplő részvényekre azáltal, hogy dinamikus kereskedést folytatunk határidős részvényindexekkel. Akkoriban ezt a két tevékenységet közösen illették a programkereskedés szóval. A pénzügyi piacok elektronikus úton történő megbízás-teljesítése az 1990-es évekre teljesedett ki. Ehhez szükséges volt az Egyesült Államokbeli tőzsdék árképzésének „decimalizálására”, vagyis a korábbi gyakorlattal szakítva a minimális tick méretet 1/16 dollárról 1 centre változtatták. Ez mindenképpen nagy segítséget jelentett az algoritmusos kereskedési rendszereknek, mert megváltoztatta a piac mikrostruktúráját és csökkentette a market maker előnyét. Viszont ezzel együtt csökkentek a pozícióméretek és a likviditás is a piacokon. Ez arra késztette az intézményi befektetőket, hogy nagyobb méretű megbízásaikat több, kisebb méretűre bontsák fel. Ennek előnye abban állt, hogy míg a nagy megbízás kedvezőtlen módon hatott volna az adott piacra és rontotta volna az átlagárat, addig a részletekben történő teljesítés tompítja ezt a negatív hatást. Ennek a technikának két változata terjedt el a TWAP és a VWAP. A TWAP - azaz „Time Weighted Average Price”- meghatározza a kontraktusok vagy részvények átlagárát egy adott időintervallumra nézve. Vagyis a nagyméretű megbízások felosztásának fő tényezője az idő és az időbeli eloszlás. Általában a megbízások teljesítése 5050%-ban történik a nap első ill. a nap második felében.
7
A másik módszer a VWAP - vagyis „Volume Weighted Average Price”- a kereskedett mennyiség és a teljes forgalom viszonyát veszi alapul egy adott időszakra nézve és ez alapján határozza meg az átlagárat. Ahogy terjedtek az elektronikus piacok, úgy egyre több fajta algoritmusos kereskedési program jelent meg. Ilyen volt a már említett arbitrázs program mellett a statisztikai arbitrázs program. A statisztikai arbitrázs (melyet a szakirodalom StatArb-ként emleget) adott esetben egy többszáz részvényből álló portfoliót igényel. Itt minden egyes részvényt egyedileg értékelnek különböző szempontok szerint (korábbi teljesítmény, piaci hírek, stb.), s a hasonló jellegű, de éppen eltérő teljesítménnyel rendelkező részvényeket párokba rendezik. Ezen párokon belül az egyik részvény a megelőző időszakban túlteljesített, míg a másik ezzel ellenkezőleg, alulteljesített. Ez utóbbira long, míg az előzőre short pozíciót nyitnak, arra számítva, hogy a két árfolyam közötti spread konvergálni fog. Néhány nevezetesebb pár pl. a Coca Cola (KO) & Pepsi (PEP), Wal-Mart (WMT) & Target (TGT), Dell (DELL) & Hewlett-Packard (HPQ) és a Ford (F) & General Motors (GM). A kockázat csökkentésére minél több ilyen párat kell létrehozni, mely feladat igazából csak a számítógépes kereskedelem megjelenésével lehetett megvalósítani.
1.1 Ed Seykota Ha programozott kereskedésről esik szó, akkor mindenképpen említést kell tennünk Ed Seykota-ról, aki a műfaj talán legelismertebb képviselője (internet, Wikipédia, Ed Seykota), (Schwager,1990). A holland születésű Ed Seykota 1946 augusztus 7-én látta meg a napvilágot egy Hága melletti városban. Tanulmányait a jó nevű MIT egyetemen végezte, ahol elektronikai mérnöki diplomát szerzett 1969-ben. Az elsők között volt, akik az 1970-es években a programozott kereskedéssel kezdtek foglalkozni. A határidős piacokon való kereskedéshez fejlesztett programot annak a brókercégnek a részére, ahol Michael Marcus-szal dolgozott. Később úgy döntött, hogy önálló vállalkozásba kezd, és önállóan kezeli az ügyfelei pénzét. Sikerét nagy részben köszönhette számítástechnikai és programozási ismereteinek. Továbbfejlődésében
8
jelentős szerepe volt a nagynevű technikai elemző, Richard Donchian publikációinak. Ezeknek a hatására kezdett el mozgóátlagokon alapuló trendkövető rendszereket fejleszteni. Ugyancsak nagy hatással volt rá Jesse Livermore élettörténete, melyet a nagysikerű Reminiscences of a Stock Operator c. könyv dolgoz fel. Az első kereskedési rendszere exponenciális mozgóátlagokra épült. Gyakran idézett mondása szerint, a rendszereket nem kell változtatni, hanem egy tradernek olyan rendszert kell kifejlesztenie, amely illik hozzá. Seykota ennek fényében csiszolta rendszerét az idők során, hogy az jobban illeszkedjen az ő kereskedési stílusához. Mint a legsikeresebb traderek mindegyikénél, nála is kiemelhető a kereskedés iránti pozitív értelmű megszállottság. Érdekes tényező, hogy a kereskedés mellett saját website-ján fizikai problémákkal is foglalkozik, különösen Bernoulli-féle áramlástannal. Jelenleg Nevada államban él, a Tahoe tó északi részén.
1.2 Programozott kereskedés megítélése A programkereskedés, mint jelenség megítélése igencsak ellentmondásként jellemezhető. Egyrészről mindenképpen vannak olyan pozitív hatásai, mint pl. a piacok likviditásának fokozása, másrészről viszont befolyásolják a piacok karakterisztikáját. Egyesek az 1987-es tőzsdei krach egyik fő okozójának tekintik. Ennek megítélése viszont korántsem egyértelmű. Valószínűleg a programozott kereskedést nem lehet felelőssé tenni a krach bekövetkezéséért, viszont jelentős szerepe lehetett abban, hogy a tőzsdei zuhanás ilyen gyors és ilyen nagymértékű volt. Főként akkoriban, a programozott kereskedési rendszerek nagy része trendkövető volt. Így amíg az emelkedő trend élt, addig ezek a rendszerek támogatták a vételt. Viszont amikor a fordulat bekövetkezett, akkor hatalmas mértékű eladói hullám alakult ki, minden rendszer zárni akarta a pozícióit. Vannak, akik ellenséget látnak a programozott kereskedésben, vannak, akik ennek köszönhetik vagyonukat. Objektív módon igazságot tenni nem biztos, hogy lehet. Jómagam – mint azt a témaválasztás is sugallja – szimpatizálok a programozott kereskedési rendszerekkel. Egyrészről szépnek látom, hogy egy főként pillanatnyi érzelmek és individumok uralta közegben a végletesen tiszta racionalitás profitot termelhet. A kihívás sem mindennapi, de a szem előtt lebegő jutalom legalább annyira csábító. Én, személy szerint nem látok kivetni valót az automatikus programozott kereskedési rendszerek alkalmazásában. Régen azokat tették felelőssé, akik részvényeket shortoltak a ’29es válság idején. Ma egy short pozíció felvétele nem jelent negatív megítélést. Mindenki próbál az aktuális játékszabályok betartásával – vegyük az optimista esetet – minél nagyobb
9
hasznot elérni. A programozott kereskedési rendszerek alkalmazása nem szabálytalan. Főként azok tekinthetik ellenségüknek, akik nem tudnak alkalmazkodni a megváltozott piaci struktúrához. A továbbiakban ezzel a kérdéssel nem kívánok foglalkozik, és kizárólag a rendszer fejlesztésére fogok koncentrálni. Viszont lényegesnek tartottam, hogy a programozott kereskedési rendszerek ezen aspektusáról is szó essen.
10
2 A programfejlesztés lépései Innentől kezdve elmélyülünk a kereskedési rendszer fejlesztésében. Részletesen végigvesszük a főbb állomásokat, a kínálkozó lehetőségeket előnyeikkel és hátrányaikkal egyetemben. A dolgozat harmadik részében pedig az itt említett elméleti szempontok alapján két konkrét rendszer fejlesztését fogjuk figyelemmel kísérni.
2.1 Az időtáv meghatározása Rendszerünk tervezésekor az első dolog, amit el kell döntenünk az, hogy milyen időtávon akarunk kereskedni. Az egyik legkézenfekvőbb és legáltalánosabb felosztás az időtávok tekintetében a következő: •
Daytrade (napon belüli)
•
Swingtrade (néhány napos)
•
Hetes- hónapos
•
Éves
Az időtávoknak persze megvannak az előnyeik és a hátrányaik is. Daytrade esetében előnyt jelenthet, hogy egy nyitott pozíciót nem tartunk sokáig és ezáltal gyorsan kereskedünk és sok ügyletünk lesz. Ez tapasztalatszerzésnek mindenképpen előnyös, hiszen így tudjuk a leggyorsabban megismerni és megszokni, hogy milyen hatással van ránk, ha pénzünket kockáztatjuk és pozíciót nyitunk. Lényeges dolog, hogy már a kezdetekkor kiderüljön, hogyan tudjuk kezelni az ilyen jellegű stresszt, feszültséget. Aki képes rá, hogy az izgalom ellenére objektíven szemlélje a piaci történéseket, az sikeresebben kereskedhet hosszabb időtávon is. Éves időtávot véve alapul, igencsak valószínű, hogy egy vagy több korrekciós szakaszt is ki kell védekeznünk pozíciónk megléte alatt. Viszont nem mindig nyilvánvaló annak a megítélése, hogy mikor beszélünk korrekcióról és mikor trendfordulóról. Hosszabb távon kereskedni alapvetően olyan piacon érdemes, ahol egyértelműen megállapítható az uralkodó trend iránya. Egy oldalazó piacon a túl hosszú időtávval nem sokra megyünk, míg ha rövidebben szemléljük, akkor jó lehetőségek adódhatnak.
11
Mi alapján döntsük el, hogy milyen időtávon kereskedjünk? Első és talán a legfontosabb tényező az, hogy melyik időtáv illik a személyiségünkhöz. Mennyire tudom elviselni, ha bukó pozícióba kerülök? Ki tudom-e várni, amíg egy korrekció után a trend továbbfolytatódik? Ezt mindenkinek magának kell eldöntenie, főként önismeret alapján. A második tényező az, hogy mennyi időt és energiát tudunk a kereskedésre fordítani. Egész nap a monitor előtt tudunk ülni és figyelni az árfolyamokat, vagy csak a nyitáskor és záráskor, vagy esetleg csak hetente néhányszor nézzük meg mi a helyzet. Ez többnyire az adott ember életmódjával kapcsolatos tényezők. Van viszont még egy fontos tényező mégpedig az, hogy milyen gyorsan szeretnénk eredményt látni. A hosszabb időtávok esetében el kell tudni fogadnunk, hogy könnyen lehet, hogy több hónapig ülünk egy pozícióban és nem olyan kézzelfogható az eredmény, mint amikor daytrade esetében a nap végén látjuk, hogy mi az aznapi egyenlegünk. Ezen tényezők alapján, mindenkinek magának kell eldöntenie, hogy melyik időtáv lehet a legeredményesebb az ő szempontjából és ezt a választott időtávot a rendszer tervezésekor is figyelembe kell venni.
2.2 A kereskedési rendszer típusa A program tervezésének második fontos állomása, hogy meghatározzuk, mire épüljön a rendszerünk, vagyis mi alapján fogunk kereskedni. Véleményem szerint ezen a ponton semmiképpen sem hagyhatjuk figyelmen kívül, hogy milyen piacon kívánunk kereskedni. (egy program robosztusságával később külön foglalkozom). Most vegyük sorra a főbb típusokat: •
Technikai alapon •
Indikátor alapján
•
Gyertyák alapján
• Fundamentumok alapján – scan típusú Mivel dolgozatomnak nem célja ezen elemzési módszerek részletes bemutatása, ezért csak azt emelem ki, ami a koncepció megértéséhez és a programozott kereskedés szempontjából fontos.
12
2.2.1 Technikai elemzés alapján A technikai elemzés az egyik lehetséges megközelítése a piacoknak, nagyon sokan használják felszínesebb vagy elmélyültebb formájában is. Az elemzés arra épül, hogy az ár tartalmaz minden lényeges információt ahhoz, hogy a múltbeli árfolyam alakulásából lehetséges forgatókönyveket készíthessünk a jövőre nézve. Ehhez szükséges feltételezünk azt, hogy a piac szereplői hasonló szituációkban hasonlóan viselkednek. Itt kitérnék egy inkább filozófiainak minősített problémára. Jogos lehet a kérdés, vajon miért követné el valaki kétszer ugyanazt a hibát? Historia docet – a történelem tanít-, mondja a latin mondás. De mit is tanulhatunk mi a már megtörtént eseményekből? Én személy szerint nem hiszek abban, hogy egy olyan területen mint a gazdaság az emberiség ne követné el ugyanazokat a hibákat, amiket annak idején is. Kiváltképpen igaz ez a tőzsdére is. A tőzsde ciklikussága az emberi tömeg természetéből ered. Hiába követet el egy hibát egy adott közösség 1929-ben, véleményem szerint ugyanezt vagy egy hasonló hibát képes (lenne) elkövetni egy másik közösség évtizedek múltán. Jobban hiszek abban, hogy az egyén tanulhat a múltbeli történésekből, felhasználhatja az ott tapasztaltakat, de megváltoztatni, befolyásolni lényegében nem tudja. Az egyén tud tanulni, a tömeg nem. Ezért is gondolom azt, hogy a technikai elemzés egy használható megközelítése a piaci folyamatok kiaknázásának, hiszen pusztán statisztikai módszerek alapján végzünk vizsgálatokat, melyek a kereskedésben résztvevő tömeg viselkedését jellemzi. Jóllehet vannak misztikusnak tűnő eszközök is az eszköztárban, de amit sokan használnak, az azért működik, mert sokan használják. Most vegyük sorra a technikai elemzés eszköztárának leglényegesebb elemeit!
2.2.1.1 Indikátorok Az indikátorok a technikai elemzés eszköztárának egyik nagy csoportját alkotják. Több osztályba sorolhatók, de közös bennük, hogy az árfolyam és néha a forgalom adatok alapján egy megadott matematikai formula szerint számolva a kereskedésben felhasználható jelzéseket generálnak. Osztályozásuk a következőképpen történhet: •
Átlagok
•
Oszcillátorok
13
Átlagok Az átlagok az egyszerűbb fajta indikátorok közé tartoznak, azonban használatuk mégis nagy előnyt jelent. Rendkívül elterjedtek manapság és talán ez állhat használhatóságuk hátterében. A technikai elemzésben a három fő típusa az •
Egyszerű mozgóátlag (Simple Moving Average)
•
Súlyozott mozgóátlag (Weighted Moving Average)
•
Exponenciális mozgóátlag (Exponential moving Average)
Viselkedésében a súlyozott mozgóátlag abban különbözik az egyszerűtől, hogy a vizsgált periódus időben közelebbi elemei valami alapján nagyobb súllyal szerepelnek az átlag számításakor. Ennek egyik előnye, hogy az időben közelebbi értékek meghatározóbbak legyenek, mint a régebben történtek. Ehhez hasonló az exponenciális mozgóátlag is, ahol az adatok súlyozása az idő múlásával exponenciális mértékben csökken. A mozgóátlagokat alapvetően arra használjuk, hogy kiszűrjük az árfolyamban lévő zajt és ezáltal megállapíthassuk, hogy az árfolyam emelkedő, csökkenő vagy trend nélküli mozgást végez. Oszcillátorok Ide tartozik a legtöbb indikátor és változatosságuk miatt még további csoportokba tudjuk őket osztani. Az egyik csoportba azokat sorolhatjuk, melyek a piac túladott vagy túlvett szintjét határozzák meg. Ilyen pl. az RSI (Relative Strength Index) vagy az ROC (Rate Of Change). Ugyancsak beszélhetünk olyan indikátorokról, melyek a piacon uralkodó trend erősségét mérik. Ide sorolhatjuk a DMI-t (Directional Movement Index) vagy a Momentum-ot. Ezen kívül van sokfajta Sztochasztikus Oszcillátor, melyek konkrét vételi és eladási jelzést adnak. Az egyik legjobban használható közülük, a Stochastik Slow. Az itt felsoroltak a leginkább ismertek és használtak, de természetesen rengeteg fajta oszcillátort terveztek már, de ezek azok, amelyek szinte bármelyik technikai elemzéssel foglalkozó programban elérhetőek.
2.2.1.2 Gyertyák – formációk: Több módszer létezik arra, hogyan ábrázoljunk egy árfolyamokat tartalmazó adatsort egy koordinátarendszerben (Chartcenter, 2005). A legegyszerűbb az, amikor adott időintervallum 14
záró- vagy átlagárát ábrázoljuk és a pontokat összekötjük. Ez adja a vonal-típusú grafikont. Ennél viszont többet mond el számunkra a gyertya chart. Ez az ábrázolásmód Japánban jelent meg először az 1700-as években, ahol a rizs árfolyamváltozásának megjelenítésére használtak. Egy Homma nevű japán kereskedő fedezte fel, hogy nemcsak a rizs kínálata és kereslete, hanem a piacon kereskedők hangulata is erősen befolyásolja a rizs árát. Így rájött, hogyha megérti, rendszerezi és definiálja ezt a hangulatváltozást, akkor ez segítheti a rizs árváltozásának megjóslásában. Megértette, hogy óriási különbség tud lenni a rizs értéke és ára között. A Homma által kidolgozott alapelvek segítségével figyelte és előre jelezte a piaci hangulatot. Erre az alapelvre épül a japán gyertya elemzés módszere. Nagy előnye az, hogy egy adott időintervallumhoz kapcsolódóan 4 információt jelenít meg egy gyertya alakú forma segítségével. A négy adat az időszaki nyitóár, záróár, maximum és minimum érték. A nyitóár és a záróár adják a gyertya testét, míg a kanócok az időszaki szélsőértékeket jelölik. Ha a nyitóár alacsonyabb, mint a záróár, vagyis az árfolyam emelkedett, akkor a gyertya teste fehér vagy zöld színű, míg ellenkező esetben fekete vagy piros. Igaz a technika már évszázadok óta ismert volt, lényegében mégis csak a 20. században kezdték el széles körben használni. Elsősorban indikátorokkal együtt használva működik jól ez az elemzési technika ill. olyan termékek esetén, ahol nem áll rendelkezésünkre forgalom adat. Az elemzés során értékelhetünk önálló gyertyákat, de különböző alakzatokat is. Ezekkel az alakzatokkal még a kereskedési ötlet című részben részletesebben foglalkozunk. 1. sz.Ábra
Forrás: chartcenter Technikai elemzés tanfolyam anyaga
15
2.2.2 Fundamentumok alapján A technikai elemzés mellett a másik megközelítés a fundamentális. A fundamentális elemző közép ill. hosszabb távon szemlél egy adott befektetési lehetőséget. Makro- illetve részvények esetén mikrogazdasági szinten vizsgálja a környezetet, vállalat pénzügyi jelentéseiből mutatószámokat számol, figyelembe veszi személyi szinten a cég menedzsmentjét stb. Ha a programozott kereskedést fundamentális elemzésre akarjuk építeni, akkor a legkézenfekvőbb, hogy a pénzügyi mutatószámokat használjuk fel. Ezek gondos megválasztásával viszonylag gyorsan, viszonylag hiteles képet (feltéve, hogy a közölt adatok hitelesek) kaphatunk a kiszemelt vállalatról. A leggyakrabban használt mutatószámok elérhetőek egy fejlettebb kereskedési platform segítségével és ezzel sok időt lehet megtakarítani. Viszont nem szabad csupán a számokra hagyatkozni, figyelembe kell venni az adott szektor teljesítményét és a konkurens vállalatokat is. A mutatószámokat a következőképpen csoportosíthatjuk (Tőzsdei szakvizsga felkészítő, 2004): •
Jövedelmezőségi
•
Hatékonysági
•
Tőkeáttételi
•
Likviditási
•
Piaci
Jövedelmezőségi mutatók Ezek a mutatók arra adnak választ, hogy a vállalatok a gazdálkodás során milyen eredményességgel használják fel a tulajdonosok és a hitelezők által rendelkezésre bocsátott forrásokat, illetve az ezekből megszerzett és működtetett eszközök nyereség termelésére. Legfontosabbak a ROA (Return On Assets) ill. a ROE (Return On Equity) vagyis az eszközill. sajáttőke-arányos nyereség, EPS (Earning Per Share) – egy részvényre jutó eredmény, az osztalékfizetési ráta.
16
Hatékonysági Szintén a vállalat működését vizsgálják, de az egyes eszközök vagy eszközcsoportok kihasználtsága szempontjából. Ide tartozik a készletek forgási sebessége, forgótőke forgási sebessége. Tőkeáttételi mutatók Ezek a mutatók, a társaság finanszírozási tevékenységét, illetve annak a működésére és a befektetőkre gyakorolt hatásával foglalkozik. Ebbe a kategóriába soroljuk az Idegen tőke-saját tőke arányt meghatározó mutatót, a sajáttőke-arányt, ill. a kamatfedezettségi mutatót. Likviditási A likviditási mutatók azt vizsgálják, hogy az adott társaság mennyiben képes eleget tenni rövidlejáratú kötelezettségeinek a rendelkezésre álló forgóeszközei felhasználásával. Ilyen mutató pl. a Likviditási ráta, likviditási gyorsráta, pénzeszközarány. Piaci mutatók A piaci mutatók az adott társaság értékpapírjainak piaci megítélését jellemzik. Legfontosabbak: P/E (Price/Earning) azaz Árfolyam/nyereség arány, árfolyam/cashflow arány, EV/EBDIT-mutató, árfolyam/könyv szerinti érték, osztalékhozam. Fundamentális elemzést programozott kereskedés formájában megvalósítani legkönnyebben a mutatószámok szűrése alapján lehet. Mivel ezek egzakt számok könnyen kezelhetőek. Viszont a hátránya ennek a módszernek, hogy csak részvények esetében működik. De ha kakaóra, olajra, repcére, vagy az angol font – japán yen keresztárfolyamra akarjuk alkalmazni akkor megbukik a módszer. Ha nem pusztán a mutatószámok alapján akarunk rendszert építeni, akkor nagyságrendekkel nehezebb dolgunk van, míg a rendszer használhatósága nem feltétlen fog növekedni az összetettséggel arányosan. Van még egy fontos dolog, amiről itt említést kell tenni. Érdemes kicsit belegondolni, hogy mennyire érdemes árupiaci termékek esetében fundamentális alapon kereskedni. Sok ellentétes véleményt lehet hallani arról, hogy a piacok 30-40 évvel ezelőtt is ilyenek voltak-e vagy sem. Személyes véleményem szerint a piacok karakterisztikája változott. És ennek éppen az egyik oka a programozott kereskedés elterjedése. A legtöbb program technikai 17
alapon kereskedik. Ez nem jelenti azt, hogy a piaci események gyökeres ellentétben lennének a fundamentumok indokolta eseményektől, de hogy torzító hatásuk van az valószínű. A másik dolog pedig az árupiaci termékek és a fundamentális megközelítéssel kapcsolatban az, hogy manapság sokkal de sokkal több a spekulációs pozíció ezeken a piacokon, mint régebben. (internet: Nyilasi, Tőzsdeblog). Ha például megnézzük a crude típusú olaj nyitott kötésállományát novemberre és ezt összehasonlítjuk az októberben kifutó mennyiséggel, vagyis azzal, hogy hány kontraktus vonatkozik a tényleges fizikai szállításra, meglepő eredményt találunk. 1. sz.Táblázat
(forrás: http://nyilasi.tozsdeforum.hu/blog/blog.htm, 2007. november 1.) A tényleges szállításra vonatkozó mennyiség két nagyságrenddel tér el a lejárat előtti spekulációs pozíciók méretétől. Vagyis a kereskedés volumenének mindössze 1%-a vonatkozik a tényleges olajszállításra! A többi mind puszta spekuláció. Egy ilyen környezetben másképpen kell értékelni egy készletadatot, egy hurrikánt, az összes fundamentális hírt, mert az árakat már nem a klasszikus kereslet-kínálati viszonyok tartják kézben.
2.3 Ötlet Most érkeztünk ahhoz a ponthoz, hogy konkrét ötleteket kell megfogalmaznunk, ami alapján venni és eladni fogunk. Rendkívül sok ötletet szerezhetünk könyvekből, internetes honlapokról, fórumokról, ezeket mindig érdemes tanulmányozni. Persze felvetődik a kérdés,
18
vajon ki osztaná meg velünk ingyen a nyerő stratégiáját? Valószínűleg senki, ez így is lehet, viszont ötleteket szerezhetünk vagy már meglévő rendszereket bővíthetünk, átalakíthatjuk. És persze ha van elég tapasztalatunk és kreativitásunk, akkor saját ötletekkel is megpróbálkozhatunk. Az alábbiakban azt vesszük sorra, hogy milyen irányvonalak mentén lehet elindulni.
2.3.1 Indikátorok Készíthetünk olyan rendszert, amely bizonyos indikátorokat figyelnek, egyet vagy többet is egyidejűleg és bizonyos feltételek teljesülésekor vételi ill. eladási jelzést generálnak. Megtehetjük, hogy csak egy kiválasztott indikátor jelzéseit vesszük figyelembe, ám a rendszer hatásfoka számottevően növelhető, ha több, megfelelőem összeválogatott indikátort használunk. Például vegyük az egyik legnépszerűbb indikátort, az MACD, mely a mozgóátlagok konvergenciáját és divergenciáját mutatja meg. Ez az indikátor két vonalat jelenít meg. Az egyik a 12-es és a 26-os periódusú (standard paraméterezés alapján) mozgóátlagok különbségét jelöli, míg a másik pedig ennek a kiszámolt különbségnek a 9-es periódusú mozgóátlaga, ezt nevezik signal - vonalnak is. Az indikátor önmagában is generál vételi és eladási jelzéseket. Vételi jelzésnek számít, amikor az MACD (a különbséget megjelenítő vonal) alulról felfelé metszi a signal vonalat. Eladási jelzése pedig ellenkező esetben van, amikor a signal vonal metszi alulról felfelé az MACD-t. Ha csak ezeknek a jeleknek az alapján kereskednénk, teljesítményünk nagy átlagban minimálisan lehetne jobb, mint 50% a nyerő-vesztő ügyletek arányát tekintve. Viszont ha egy további feltételt építünk a rendszerbe, mellyel ugyan csökkeni fog a jelek száma, a hatékonyság nagymértékben növekedhet. Kombinálhatjuk például az MACD jelzéseit az RSI indikátorral, mely emlékezzünk vissza, a piac túlvett ill. túladott szintjét mutatja. Az RSI egy zárt skálájú indikátor, 0 és 100 között vehet fel értéket. A standard paraméterek alapján 14-es periódusú RSI-nél a 30-as szint alatt tekintjük a piacot túladottnak és a 70-es szint felett pedig túlvettnek. A tapasztalatok alapján az indikátor nem tartózkodhat túl sokáig ezen szélső értéktartományokban. Vagyis megtehetjük azt, hogy csak akkor vesszük figyelembe az MACD vételi jelzését, ha közben az RSI értéke 30 alatt van. Így sokkal bizonyosabb vételi jelzést kapunk és kiszűrtük az MACD
19
téves riasztásait. Ez persze még mindig nagyon egyszerű, de a példa célja az volt, hogy érzékeltesse, milyen lehetőségek vannak az eszközök kombinált használatában.
2.3.2 Gyertyaformációk Ötletként felmerülhet, a már említett gyertya chart-ra épülő kereskedés. Piaci alakzatokkal gyakran találkozhatunk, sokan használják a legelterjedtebbeket. Ilyen pl. a duplacsúcs, duplaalj, háromszögek stb. ez ötlet szintjén jónak tűnhet, de ezeknek az alakzatoknak az egzakt leprogramozása egyáltalán nem egyszerű. Ha valaki mégis ez alapján szeretne kereskedni, annak sem javaslom, hogy nekiálljon a programozásnak, mert azért vannak, akik már ezt megtették és az interneten meg lehet venni a különböző kiegészítő programokat. Viszont ami jóval egyszerűbb, bár korántsem triviális az, hogy gyertya alakzatok alapján kereskedjünk. Tapasztalatok alapján meghatároztak olyan gyertyaformációkat, melyek a múltban megbízhatóan előrevetítették az árfolyam mozgását. Ezek a formák általában nem hosszabbak 4-5 gyertyánál, vagyis leprogramozásuk még az ésszerűség határán belül mozog. Ráadásul létezik egy csoport (www.americanbulls.com), akik amerikai részvényekkel kereskednek – sikeresen - kizárólag gyertyaformációk alapján. Néhány gyertyaformáció: 2. sz.Ábra
Forrás: chartcenter Technikai elemzés tanfolyam anyaga
20
2.3.3 Gap Ha a fenti ábrákra nézünk láthatjuk, hogy több esetben is gap-ek szerepelnek az ábrákon. A gap magyar megfelelője a rés. Gap akkor keletkezik, amikor két egymást követő gyertya nincs egymással átfedésben (Chartcenter, 2005). Tehát van olyan rész a grafikonon, az árfolyamban, ahol nem történik üzletkötés. A technikai elemzés szempontjából a rések jelzik egy folyamat elejét vagy végét, illetve a folyamat kiterjedését. Rések közül több fajtát is megkülönböztet a szakirodalom. Közönséges vagy átmeneti rés Igazi jelentősége nincs, a piac pillanatnyi hirtelen megítélésének változása eredményezi. Konszolidációs vagy trend nélküli időben jelentkezik. A forgalom a rés megjelenésekor nem változik, a piac hamar betölti és éppen ezért jelzés értéke nincs. Kitörési rés Kitörési résről akkor beszélünk, ha az ár egy a korábban megismert formációból tör ki, magas forgalom mellett. Ha a piac rövidesen nem tölti be, akkor egy tartós folyamat kezdetét jelenti. Ha viszont beölti, úgy elveszíti jelentőségét és közönséges réssé válik. Ha a rés kifejlődését követően a rés betöltetlen marad, az árak az új irányba meredeken mozognak, és egy új rés alakul ki, amit szökési résnek nevezünk. Ez vételi jelzésnek minősül. Szökési vagy mérési rés Mint már előbb említettük, a szökési rés egy folyamat során a kitörés és az ármozgás vége között félúton alakul ki, ezért is nevezik mérési vagy felezőpont résnek. Segítségével a trend végét lehet meghatározni. A folyamat közben néha betölti a piac, és több szökési rés is kialakulhat, azonban jelzésértékét ez nem csökkenti. A forgalom a szökési rés megjelenésekor is erősen megnő. Kimerülési rés A kimerülési rés közvetlen a trend vége előtt jelenik meg és azt jelenti, hogy a piac az árfolyamok emelkedésének a lendületét már nem viseli el és nagy forgalom mellett egy réssel válaszol. Ezt a rést a piac rövid időn belül mindig betölti, gyakran egy újabb réssel elszigetelve és létrejön a sziget-forduló. A kimerülési rést nem lehet egyértelműen trendforduló kialakulásának értelmezni (kivéve a sziget fordulót), de utána mindenképpen
21
egyfajta konszolidációs szakasz következik tartott árakon. Eladási jelzésnek minősül, eladni a rés kialakulását követő napon kell. A gap-ek előfordulása meglehetősen gyakori a különböző piacokon, de kifejezetten a részvénypiacokon használhatjuk ki jelenlétüket. Nem véletlen, hogy sok olyan rendszer van, mely kifejezetten a gap-ek alapján kereskedik. És, hogy miért is működhet ez a módszer? A tradingmarkets site-on (internet, Tradingmarkets) olvasható egy érdekes cikk, mely a gap-eket és lap-eket (míg a résnél a gyertyák kanócai sem fedhetik egymást, addig ez a lap-nél lehetséges, itt csak a gyertyatestek nem fedhetik egymást) vizsgálja. Ebben a tanulmányban 1995-től kezdődően megvizsgálták, hogy milyen hozamot jelent rövidtávon a gap utáni vásárlás vagy eladás. Az vizsgálat eredményei az 5 USD feletti és legalább 250.000 db átlagos (100 napos átlag) napi forgalmú részvényekre vonatkoznak. A vizsgálat a következő eredményeket hozta. A 10%-nál nagyobb gap up-ot (felfelé rés) produkáló részvények átlagosan -1,14%-os egyhetes hozamot értek el. Ugyanez az érték gap down (lefelé rés) esetében + 2,01% volt. A lap up-ok esetében – szintén a 10%-nál nagyobbaknál – az egyhetes hozam -1,12% volt, ám lap down esetén az átlagos hozam +2,12% volt. A közel két százalék nyilván nem tűnik egy hatalmas eredménynek, de ha azt vesszük, hogy ezt a két százalékot egy adott részvényen átlagosan érjük el egy hét alatt, akkor már sokkal kecsegtetőbb. Ráadásul a több ezer jegyzett részvény közül igen nagy az esemény bekövetkeztének az esélye.
2.3.4 Pullback A pullback rendszerek szintén széleskörű népszerűségnek örvendenek. Az árfolyammozgások természetes velejárójára épít, vagyis arra, hogy egy erős trendben is vannak korrekciók, legyen az több év hosszúságú vagy néhány órás. A rendszer alaplogikája az, hogy erős trendszerű mozgás esetén, a trenddel ellentétes irányú korrekció során nyitunk a fő trenddel megegyező irányú pozíciót. Ilyen helyzetekben sokkal kedvezőbb kockázat-hozam arányok érhetőek el, mint ha csak a trend közepén nyitnánk pozíciót. Ebben nagy szerepe van a szűken pozícionálható stop-nak is. Ha például egy részvény erős emelkedő trendben van, megvárunk egy korrekciót, amely során a részvényárak lecsökkennek majd az árfolyam elindul tovább
22
felfelé, akkor az első emelkedő gyertya után belevehetünk és egyúttal a lokális alj alatt stoppolhatunk is. Ez egy rendkívül nagy potenciállal rendelkező pozíció, melyben a felmerülő veszteségünket szűk korlátok között tarthatjuk. A pullback rendszerek – annak ellenére, hogy több időtávon is használhatóak – főként a swing traderek körében használatos. Egy tipikus alkalmazása a koncepciónak az alábbi példa. Ebben a példában, akkor nyitunk pozíciót egy korrekció esetén, ha az árfolyam egy bizonyos zónába lép be. Ezt a zónát mi határozzuk meg, méghozzá két mozgóátlag segítségével. Használunk egyfelől egy 10-es periódusú szimpla mozgóátlagot, másfelől pedig egy 30-as periódusú exponenciális mozgóátlagot. A vizsgált terület pedig a két mozgóátlag által határolt terület. A pullback rendszer akkor nyit long pozíciót, amikor az erősen emelkedő árfolyam a korrekció során fentről belép a vizsgálandó területbe. Short pozíció esetében pedig pont ellenkezőleg, akkor adunk el, amikor az árfolyam alulról lép be a területre. Ez egy programnyelven könnyen és pontosan megfogalmazható rendszer, melyet érdemes lehet továbbfejleszteni. Természetesen nem a megváltást várjuk tőle, de megint csak érdemes megfigyelni, hogy az internet a kiinduló ötletekhez nagyon széles választékot kínál.
2.4 Program megírása Ahhoz a részhez érkeztünk, hogy az elméletben megfogalmazott szabályainkat lefordítsuk a gyakorlat nyelvére. Rendszerünk összetettségétől függ, hogy milyen mértékben van szükségünk programozási ismeretekre. Az egészen egyszerű, például egy indikátoron alapuló rendszert szinte bárki könnyen leprogramozhat, sok szoftvernél van lehetőség szinte mondat szintű megfogalmazásra. Ez azonban jócskán behatárolja a mozgásterünket. Komolyabb és használhatóbb rendszerekhez mindenképpen szükség van legalább alapfokú programozási ismeretekre. Szerencsére azonban nem kell az alapoktól felépítenünk a programunkat, mert léteznek kifejezetten erre a célra kifejlesztett programozási nyelvek és szoftverek. Ezek nagy előnye, hogy parancskészletük nagyban megkönnyíti a programozást, ill. sok beépített indikátorral és hasznos utasítással rendelkeznek. Ilyen például a Tradestation, mely lehetőséget ad egészen összetett rendszerek leprogramozására, de fő erőssége a programvezérelt kereskedés terén nyilvánul meg. Vagyis könnyű a megvalósítása annak, hogy a program automatikusan adjon tőzsdei megbízásokat is,
23
a rendszer generálta jelzések alapján. Kezdésnek azonban mégsem ajánlanám, mert a program professzionalitása bizony sokba kerül. Gyakorlottabb programkereskedőknek mindenképpen előnyös, ám kezdésnek felesleges. Ráadásul nagy valószínűséggel a programmal kapcsolatos havi költségek elvinnék profitunk jelentős részét. Ezért csak nagyobb volumenű kereskedés és profit esetén kifizetődő. Előnyösebb megoldás, ha kezdésnek egy kifejezetten programépítésre és tesztelésre használható szoftvert használunk. Ilyen például az Amibroker. Ez a program nagyon jól használható, saját programnyelvvel rendelkezik (AFL – Amibroker Formula Language) viszont kereskedési megbízásokat csak egy másik kereskedési platformon keresztül tud adni. Viszont a program megvétele csak egyszeri költség és utána egyéb havidíja nincsen. Ez az egyszeri költség pedig annyi, mint az előbb említett Tradestation egyhavi költsége. Amit viszont még meg kell oldani program használatához, az az árfolyamadatok betöltése. A napon belüli adatszolgáltatás nincs benne az árban, ezt külső programból kell importálni. Viszont a program nagyon jól használható az egyik legelterjedtebb kereskedési platformmal, az Interactive Brokers Trader Workstation-nel. Ez a platform főként az amerikai részvények területén erős, de ugyanúgy elérhető a többi piac is, mint pl. a FOREX. Ebből a programból gond nélkül importálhatunk valós idejű adatokat, sőt ezen keresztül lehetőség nyílik automatikus kereskedésre is. Az imént ismertetett jellemzők alapján én a dolgozatomban az Amibroker-t használom a kereskedési program megírásához. Az Amibroker első ránézésre nem tűnik túlzottan bonyolult programnak, viszont elmélyülve a szoftver kínálta lehetőségekben egy nagyon jól használható, összetett eszközt fedezhetünk fel. A már említett AFL programozási nyelven túl lehetőséget ad a komplexebb backtest-re (vagyis, hogy rendszerünket múltbeli árfolyamadatokon tesztelhessük), paraméterezésre, scsannelésre, optimalizálásra stb. Az AFL nyelv a C programozási nyelvre épül, de annál egyszerűbb és specializáltabb. A használati utasítás segítségével pedig hatékonyan segíti a programozási nyelv elsajátítását a programozási háttérrel nem rendelkezők számára is. A dolgozat első felében a rendszerfejlesztés elméletével foglalkozom, konkrét programot a dolgozat második részében mutatok be. Most feltételezzük, hogy sikerült egzaktul leprogramoznunk az elméletben összeállított szabályainkat és jön a puding próbája, az evés.
24
2.5 Program tesztelése – backtest, riport kiértékelése A backtest során arra keressük a választ, hogy a leprogramozott rendszerünk egy adott múltbeli időintervallum árfolyamgörbéjén, milyen eredménnyel szerepel. Ennél a lépésnél derülhet ki, hogy a rendszerünk működőképes-e, megéri-e tovább csiszolgatni vagy pedig el kell vetnünk. Ez nagyon sok tényezőnek a függvénye és a tesztelés során sok buktató adódhat. Most ezt a folyamatot vizsgáljuk meg részletesebben. Az első lényeges kérdés, hogy milyen adatsoron végezzük a tesztelés. Ezt két tényező alapján vizsgálhatjuk. Az egyik, hogy milyen hosszúságú időintervallumot vizsgálunk, a másik pedig, hogy milyen terméknek az árfolyamain tesztelünk. Kezdjük az időintervallum kérdésével.
2.5.1 Időintervallum – jelek mennyisége A tesztelés megbízhatóságának szempontjából nagyon fontos szerepet játszik az, hogy elegendő mennyiségű adaton teszteljünk. Ha túl kevés jel alapján vonunk le következtetéseket, az félrevezető lehet a rendszerünk jellemzőivel kapcsolatban. Viszont mindenképpen tudatában kell lennünk annak, hogy MÚLTBELI adatokon tesztelünk. Vagyis még ha megfelelő mennyiségű jelet veszünk alapul, az sem garantálja teljes bizonyossággal, hogy a rendszer a jövőben is hasonló hatásfokkal fog működni. Viszont ezt a tényezőt már nem nagyon tudjuk elkerülni. Amit tudunk ellene tenni az, hogy bizonyos adaptív tényezőket használunk, melyek hozzáigazíthatják a rendszerünket a változó piaci jellemzőkhöz. Azonban ezzel is vigyáznunk kell, mert a túlzott menet közbeni igazítás is több kárral is járhat, mint előnnyel. Visszatérve a megfelelő mennyiségű jel problémájához, nem könnyű konkrét értékeket megfogalmazni arra, hogy hány jel szükséges a program reális teszteléséhez. Itt azt is számításba kell vennünk, hogy a vizsgált időszakban – legyen az kár napi vagy 10 perces bontású – mi jellemezte az adott termék árfolyamának mozgását. Ha egy olyan perióduson vizsgáltuk a rendszerünket, mikor a termék árfolyama erős emelkedő trendben volt, akkor rendszerünk merőben másképpen viselkedhet, ha az árfolyam oldalazó vagy éppen eső trendbe kerül. Ezért nem elég pusztán, ha például 10 perces bontású grafikont egy évre visszamenőleg tesztelünk, mert könnyen előfordulhat, hogy az adott termék az elmúlt egy évben végig erős emelkedő trendben volt. Az extra hosszú időintervallummal ezt a problémát
25
némileg mérsékelhetjük, de fontos, hogy nagyobb felbontásban is megnézzük az adott termék árfolyamgörbéjét korábbra visszamenőleg is.
2.5.2 Választott termék A másik fontos tényező, hogy milyen termék árfolyamán vizsgáltuk a rendszerünket. Ez egy összetettebb kérdés és ennek kapcsán vizsgáljuk meg az ún. robosztus rendszereket (internet, Robosztus rendszer). Egy adott rendszer „robosztusságát” az alapján értékeljük, hogy mekkora az eltérés a rendszer hatékonyságában, ha különböző piacokon alkalmazzuk. A szakma egy része úgy véli, hogy egy jó rendszernek robosztusnak kell lennie. Elvárják, hogy hasonló eredményeket produkáljon a devizapiacon éppen úgy, mint a részvénypiacon. Természetesen megnyugtató lehet, ha rendszerünk különböző, egymástól igencsak eltérő piacokon kiegyensúlyozott hatékonysággal működik, ám én személy szerint nem feltétlen értek egyet ezzel az állásponttal. Véleményem szerint, igazán jó eredményeket elérni úgy lehet, ha egy adott piac vagy akár termék egyedi karakterisztikájára is építünk. Persze nem előnyös az sem, ha rendszerünket túlzottan egy konkrét termékre optimalizáljuk, bár hogyha ez működik, akkor én nem látok ebben kivetni valót. Én jobban hiszek abban, hogy a különböző termékekre, piacokra különböző rendszerek illenek. A részvénypiacon jól működhet egy gap-re épülő stratégia, viszont a devizapiacokon a 24 órás kereskedés miatt ez nem túl valószínű. Én úgy vélem, hogy mindenkinek személyre szabottan kell meghatároznia, hogy hol találja meg az arányt az univerzálisan használható robosztus rendszer és a specializáltabb rendszer között. A rendszer robosztusságát én abban az értelemben tartom lényegesnek, hogy a már fentebb említett trendirányok hatásának kiszűrésére használjuk. A backtest realitásán javít, ha egyidejűleg tesztelünk pl. egy adott részvény csoporton vagy több devizapáron. Vagyis a piacok közötti átmenetet nem engedjük meg, viszont az adott piac több termékén tesztelünk. Lényeges, hogy a választott termékek lehetőleg eltérő jellemzőket mutassanak, vagyis legyen köztük olyan, amelyik emelkedő, csökkenő trendben van ill. oldalazó is. Ezzel kiszűrhetjük, hogy rendszerünk mely trendjellemző alapján eredményes vagy éppen használhatatlan. Viszont nem kell elvetnünk a rendszert, ha mondjuk csak emelkedő piacok esetén hoz kimagasló eredményt, hanem akkor ennek tudatában kell lenni, és ha élesben is felhasználjuk, akkor kifejezetten ilyen trendben lévő termékekre kell használni. Többnyire erre épülnek az
26
úgynevezett trendkövető rendszerek is. Ezek trendszerű mozgás esetén jó eredményeket produkálhatnak, ám oldalazó vagy trend nélküli piacon nem hatékonyak.
2.5.3 Adatok Most ott tartunk, hogy megírtuk a programot, kiválasztottuk a tesztelésre vonatkozó termékeket és az időintervallumot. Már korábban volt szó arról, hogy vajon mekkora adathalmazon kell tesztelnünk ahhoz, hogy a valóshoz közeli eredményt kapjunk. A túl kevés adat azt a problémát hordozza magában, hogy rendszerünket egy túlságosan rövid, egy adott intervallum speciális részére fejlesztjük. Ezen úgy segíthetünk, hogy lehetőleg minél hosszabb időintervallumot választunk. A másik dolog amit figyelembe kell venni – amiről már szintén esett szó -, hogy a vizsgált periódusban milyen jellegű mozgás uralta a piacot. Emelkedő vagy eső trend, esetleg trend nélküli. Úgy is javíthatunk a ezen a problémán, ha több, azonos terméken futtatjuk le a tesztet. Pl. ilyen amikor nem csak egy konkrét részvény árfolyamán tesztelünk 10-20 évre visszamenőleg, hanem több részvényt vizsgálunk az adott periódusban. Ráadásul ezeknek a részvényeknek a gondos összeválogatásával még jobb eredményt kaphatunk. De legnagyobb igyekezetünk ellenére is előfordulhatnak hibák, melyekre oda kell figyelnünk, különben a valós kereskedés során kellemetlen meglepetések érhetnek bennünket. Ezért meg kell vizsgálnunk az adatsort, amin a tesztet futtatjuk.
2.5.3.1 Lehetséges hibaforrások A fentebb említettek miatt foglalkoznunk kell tehát az adatsorunk megbízhatóságával. A következőkben végigvesszük a leggyakoribb hibákat amelyek a gyakorlatban előfordulhatnak (internet: Aranyláz, 2005).
2.5.3.1.1 Részvények árfolyamadataival kapcsolatos problémák Ha rendszerünket a részvénypiacra fejlesztjük és részvénnyel kívánunk kereskedni, akkor számításba kell vennünk olyan eshetőségeket, melyek a részvényekkel előfordulhatnak.
27
Osztalékfizetés Az egyik leggyakoribb jelenség az osztalékfizetés. A vállalatok nagy része a megtermelt profit egy részét osztalék formájában kifizeti a részvénytulajdonosoknak. Az osztalékfizetés nagyban befolyásolja az árfolyam változását, főként attól függően, hogy az adott piacon, ahol a részvénnyel kereskednek, hogyan kezelik az osztalékfizetés. Egy cég általában évente egyszer vagy kétszer fizet ki osztalékot, tehát relatíve gyakori eseménynek számít. A programozott kereskedési rendszerek túlnyomó többsége árfolyam emelkedésből kíván profitálni, nem pedig az osztalékokra koncentrál. Viszont az osztalékfizetés az esedékessége környéki időtartamban befolyásolja a részvény árfolyammozgását. A backtest során ezt mindenképpen figyelembe kell venni. Megtehetjük, hogy ebben az időszakban nem kereskedünk az adott részvénnyel és így mintegy huszárvágással meg is oldhatjuk a problémát. Persze ennél kifinomultabb technikákat is alkalmazhatunk, de ez már többnyire az adott rendszerünk természetétől fog függeni. Részvényfelosztás Egy vállalat működése során megteheti, hogy felosztja a részvényeit, vagyis növeli a részvényei darabszámát és ezzel egyidejűleg csökkenti azok névértékét. Ez nyilvánvalóan az árfolyam esését eredményezi, hiszen az adott részvény, mely régen a vállalat egy adott hányadára biztosított tulajdonjogot, már csak egy kisebb hányadra vonatkozik. Részvénybevonás Megeshet persze ennek az ellenkezője is, vagyis a vállalat részvényeket von be és ezáltal az egy részvényhez kapcsolódó birtokosi hányad növekedni fog, és ezzel egyidejűleg az adott cég papírjának az árfolyama is meg fog emelkedni. Tőzsdéről kivezetett részvények Szintén előfordulhat, hogy egy adott vállalat papírjait különböző okok folytán (felvásárlás, csőd, nem felel meg a tőzsdei szabályzatban leírt követelményeknek) kivezetik a tőzsdéről. ’smart order routing’ megbízások Az esetek egy részében ténylegesen nem hibás adatról van szó, hanem arról, hogy az illikvid részvényeknél nagy árugrások fordulhatnak elő és utólag már nem lehet eldönteni a megbízás teljesülésének az esélyét. Előfordulhat például, hogy a napi ársáv alapján az ügylet teljesülne, ám a valóságban még sincs tényleges ügyletkötés és nem teljesül a megbízás. Ez részben 28
köszönhető a ’smart order routing’ megbízásoknak is, mire a rendszer behozza az adott tőzsdére a megbízást, addigra az ár máshol jár. 2.5.3.1.2 Indexek tesztelésével kapcsolatos probléma Természetes rengeteg olyan származékos pénzügyi instrumentum van, mely több elsődleges termék teljesítményét összevontan tükrözi. Az egyik legkézenfekvőbb példája ennek a tőzsdei indexek, mint pl. a BUX index vagy pedig az S&P500. Survivorship bias Ez a probléma a fentebb leírt termék esetében fordul elő. Sokan elkövetik azt hibát, hogy nem veszik számításba, hogy az indexkosarak összetétele az idő múlásával változik. Vagyis pl. részvényindexek esetében folyamatosan felülvizsgálják, hogy mely részvények kerüljenek a kosárba, azaz mely részvények teljesítménye alapján számítsák az indexet.
2.5.3.1.3 Határidős termékekre vonatkozó probléma Kamat Határidős termékekkel kapcsolatban, főleg hosszabb, több napos vagy hetes pozíciók esetén mindenképpen figyelembe kell vennünk a kamattényezőt. A legalapvetőbb, amivel számolnunk kell, hogy mi kapjuk vagy pedig mi fizetjük a kamatot. Jelentősen ronthatja az eredményt, ha pl. egy carry deviza „rossz” oldalán ülünk a pozíciónkkal huzamosabb ideig, hiszen ilyenkor a kamatkülönbözetet nekünk kell fizetnünk, és ez rontja az árfolyamon elért nyereségünket. Ezen túlmenően a backtest eredmény vizsgálatakor figyelembe kell vennünk, hogy a vizsgált periódus alatt változtak-e a kamatok. Például nem mindegy, hogy a 2001 és 2007 közötti időszakban a dollár kamata többszörösére emelkedett.
2.5.4 Egyéb backtest beállítások A reális backtest eredmény elérése érdekében további beállításokat is el kell végeznünk. Az időintervallumra már részletesen kitértünk, viszont ehhez kapcsolódik, hogy milyen bontású gyertyák alapján akarunk kereskedni. Ez a két tényező nagyban összefügg, hiszen a bontás csökkentésével (vagyis, hogy 10 perces gyertyák helyett mondjuk 1 órásat használunk) növelnünk kell az időintervallumot a megfelelő mennyiségű jelhez. Ez általában egy minimum korlát, abból ritkán adódik baj, ha nagy hosszúságú idősoron tesztelünk.
29
Meghatároztuk tehát a bontást, a hozzá tartozó minimális időintervallumot és a választott termék-termékek körét. Ezen túlmenően meg kell határoznunk, hogy csak long vagy csak short jelzéseket veszünk figyelembe, esetleg mindkettőt. Ez attól is függ, hogy milyen stratégiára épül a rendszerünk. Nem feltétlen kell mind a két irányba kereskednünk gyakori, hogy egy rendszer pl. csak long jelzésekre épül. Emellett meg kall adnunk a kezdőtőkénk összegét, amellyel az első ügylet előtt rendelkezünk. Ez szintén hasznos, mert így jobban hozzáigazíthatjuk a rendszerünket a saját elvárásainkhoz, helyzetünkhöz. Ennek jelentősége főként akkor mutatkozik meg, amikor számításba vesszük az ügyletek tranzakciós költségeit. Az ügyletek tranzakciós költségei nagyon fontos tényező a rendszer megalkotásakor, mert lehetséges, hogy a rendszerünk egész szép profitot hoz, de azt túlságosan sok ügylettel éri el, és ezért profitunk nagy részét elviszik a jutalékok. Lehetőségünk van a jutalék mértékét megadni
százalékos
formában,
konkrét
pénzmennyiségben
ügyletenként
vagy
részvényenként/kontraktusonként, vagy pedig táblázat formájában, ahol a jutalék mértéke bizonyos tényezők alapján változik (pl. kötésméret, daytrade ügylet stb.). Ugyancsak megadhatjuk az éves kamat mértékét, melynek főként a devizák esetében van jelentősége többnapos ügyletek esetén. Ilyenkor a devizapártól ill. a pozíció irányától függően kamatot kaphatunk vagy kamatot kell fizetnünk. Ennek jelentősége akkor nő meg, amikor carry devizapárokkal (olyan devizapárok, ahol a két pénznemre vonatkozó kamat között nagy az eltérés) kereskedünk. Jellegzetes carry a japán yen-nel és a török lírával kapcsolatos devizapárok. Továbbá be kell állítanunk, hogy használunk-e tőkeáttételt. Ezt a margin account mezőben tudjuk megadni, százalékos formában. Az alapbeállítás a 100%, ami azt jelenti, hogy nem használunk tőkeáttételt, vagyis akkora pozíciót tudunk nyitni, amennyi a számlánkon van. Lehetőség van azonban arra, hogy ennél az összegnél nagyobb méretű pozíciót vegyünk fel bizonyos piacokon. Ilyen például a devizapiac, ahol 100.000$-os pozícióhoz nem kell 100.000$ dollárral rendelkezünk, hanem csak a megadott mértékű fedezettel. A nyitott pozíció és a letét mértéke adja meg a tőkeáttétel mértékét. Ha pl. a nyitott pozíció mérete a 30
fedezet ötszöröse, akkor ötszörös tőkeáttételről beszélünk. Ez esetben a margin account-ot 20 %-ra állítjuk. A pozíciómérettel kapcsolatban, megadhatunk minimális kereskedési mennyiséget is darabszámban is (részvény, kontraktus stb.) vagy pénzben kifejezett értékként, de a tehetjük ezt a tőkénkre vetített arányban is. Ezek a backtest beállításának legsarkalatosabb pontjai. Ha ezeket elvégeztük, akkor nincs más hátra, minthogy vegyünk egy nagy levegőt és megnyomjuk a backtest gombot! A program backtest ablakában a szoftver kilistázza a rendszerünk vételi és eladási jelzései alapján végrehajtott ügyleteket. Amit első ránézésre megállapíthatunk, az az ügyletek mennyisége. Előfordulhat, hogy túl szigorú feltételeket adtunk meg, és a vizsgált időintervallum során nagyon kevés ügylet történt. Vagy megtörténhet ennek az ellenkezője is, és rendszerünk nagy mennyiségű ügyletet bonyolít le. Azt természetesen nem lehet egyértelműen eldönteni, hogy melyik a jobbik eshetőség, de minden bizonnyal, mint a legtöbb esetben, az arany középút. Persze itt megint képbe kerül az emberi tényező vagyis, hogy milyen kereskedési habitus illik jobban a programozóhoz. Viszont fontos, hogy a megadott időintervallum viszonyában vizsgáljuk az ügyletek mennyiségét. Napi húsz ügylet valószínűleg a legtöbb kereskedő számára túl sok, viszont ha a húsz ügylet egy év alatt történt akkor már teljesen más a helyzet. Itt azonban azt is számításba kell vennünk, hogy az ügyletek milyen eloszlást mutatnak az időben. Minél homogénebb az eloszlás, annál kiegyensúlyozottabb a rendszer. Ezzel részletesebben a riportról szóló részben foglalkozunk. A megjelenített listán részletesen látjuk az egyes ügyletek jellemzőit: a termék, amiben az ügylet létrejött, a vétel ill. az eladás időpontját, a realizált profitot összegben és százalékban, a nyitott pozíció méretét stb. Gyors tájékozódáshoz ennyi mindenképpen kiváló, ám részletesebb jellemzést a program által elkészített riportban kaphatunk. Mivel a riport foglalja össze számunkra a rendszerünk főbb jellemzőit, ezért ezzel mélységében kell foglalkoznunk.
31
2.5.5 Riport Mivel a riport a programozott rendszer esetében olyan, mint az embereknél a szem – vagyis a lélek tükre – ezért nagy előnyt jelent, ha tudunk olvasni e jelekben, és ebből ismerhetjük meg rendszerünk viselkedését, természetét. Hogy kicsit izgalmasabb legyen a dolog, nem csupán száraz módon sorra vesszük a riport elemeit, hanem mindezt egy konkrét kereskedési rendszer eredményei alapján. Sőt, az igazi érdekesség az, hogy ezt a rendszert nem más tervezte, mint Ed Seykota. Egy nyílt fórum keretében lehetőség volt bepillantást nyerni az ő rendszerfejlesztési szemléletmódjába, és ennek összefoglaló anyagát az interneten is meg lehet találni (internet, Ed Seykota). Az ő elméletben felvázolt rendszerét, egy lelkes kíváncsi leprogramozta az általunk használt AFL nyelven és ezáltal lehetővé tette, hogy tesztelhessük Ed Seykota rendszerét. A téma természetesen roppant érdekes, megtudhatjuk, hogy mi az, ami igazán fontos egy profinak, mire fektet nagy hangsúlyt. Természetesen azt fölösleges lenne várnunk, hogy egy pénzcsináló rendszert csak úgy készhez kapunk ingyen és bérmentve, de tanuláshoz kifogástalan. A rendszerről annyit érdemes tudni, hogy két exponenciális mozgóátlag egymásáltali keresztezéséből generál vételi ill. eladási jeleket. Ez a viszonylag egyszerűbb be-és kilépési rendszer egy kifinomultabb pozícióméretezéssel párosul. Ebből már egyből látszik, hogy a sikeres kereskedés egyik legfontosabb eleme a money management. Ez a rendszer, minden egyes nyitandó pozícióhoz külön határozza meg a pozíció méretét, méghozzá egy indikátor alapján. Így pontosabban beállítható az adott kockázat-hozam arány alapján a befektetendő tőke mérete. Nos, nézzük meg, miként szerepelt a rendszer élesben. A backtest-hez a Hewlett-Packard (HPQ) számítástechnikai cég részvényárfolyamát vesszük az 1997. januártól 2007. novemberig tartó időszakban. Tudnunk kell, hogy ebbe az időintervallumba beleesik a 2000 közepén kicsúcsosodó, majd szétszakadó „.com” lufi, mely számítástechnikai vállalat lévén erősen érintette a HPQ árfolyamát. A vizsgált időszak első 3 éve alatt (1997-2000) a részvény árfolyama megháromszorozódott (20$--> 60$), majd a lufi kipukkadását követően az árfolyamcsúcshoz képest hatodára esett vissza (60$--> 10$). Tehát végső soron szerencsés időszakot vizsgálunk, hiszen szerepel benne erős emelkedő trend, nagyon komoly, gyors zuhanás, ill. egy konszolidáció szakasz, míg az árfolyam magához tér a sokkból és újból 32
emelkedésbe kezd. Mivel ez a rendszer csak long jelzéseket ad, ezért a riportban a külön oszlopban szereplő, short ügyletekre vonatkozó adat mind 0, hiszen nem történik short ügylet. Nézzük akkor Ed Seykota EMA Crossover rendszerének riportját (internet, Amibroker)! 2.5.5.1 Általános rész A riport első része megmutatja, hogy a vizsgált periódus végére hogyan változott a befektetett tőkénk, milyen hozamot értünk el. Látjuk a kezdőtőkét, a periódus végén meglévő tőkeösszeget, a nettó profitot összegalakban és százalékos formában. Ez a profit a választott időintervallumra vonatkozik, nem szabad összetévesztenünk a majd lentebb feltűntetett annualizált formájával, mely éves szintre lebontva határozza meg ezt az értéket. 2. sz.Táblázat
(forrás: AmiBroker program, teszt futtatás) Exposure Szintén ebben a részben van feltűntetve az „exposure”. Ezt a százalékos értéket a szoftver gyertya alapon számolja. az egy gyertyára vonatkozó értéket a nyitott pozíció és a teljes tőke hányadosaként kapjuk meg. A rendszerünk expozíciója pedig ezeknek az expozíció értékkel rendelkező gyertyák értékének összege osztva az összes gyertya számával, vagyis az adott időszakra számított expozíciós értékek átlaga. Ez a mutatószám a tőkekihasználtságot méri. Net Risk Adjusted Return % Ezt a mutatószámot úgy képezzük, hogy a nettó profit százalékos értékét elosztjuk az expozíció szintén százalékos értékével.
33
Risk Adjusted Return % Ez abban különbözik az előző mutatótól, hogy az éves profitot (természetesen százalékban) osztjuk el az expozícióval.
2.5.5.2 Az összes ügyletre vonatkozó statisztikák Ebben a részben valamennyi lezajlott ügyletünkre vonatkozó statisztika szerepel, függetlenül attól, hogy az adott ügylet nyereséges volt-e vagy pedig veszteséges. Itt mindenekelőtt megtudhatjuk, hogy összesen hány ügyletünk volt az adott időszakban, illetve hogy ezekből hány volt long ill. short.
3. sz.Táblázat
(forrás: AmiBroker program, teszt futtatás) Average Profit/Loss (%) Ez mutatja meg, hogy átlagosan egy ügyletre mekkora nyereség vagy veszteség jut. Ha ez a szám negatív, akkor az azt jelenti, hogy a rendszerünk ügyletenként átlagosan ekkora veszteséget termel, míg pozitív érték esetén pedig ellenkezőleg. Average Bars Held Szintén fontos információt jelent számunkra az, hogy egy átlagos ügylet mennyi ideig tartott. Vagyis hány gyertyán keresztül volt nyitva a pozíció. Ezt az értéket beszorozva a használt grafikon beontásával, megkaphatjuk az átlagos ügylet időtartamát perben vagy akár napban is. Itt természetesen arra is kell figyelni, hogy hány ügylet történ ténylegesen, ami alapján az átlagot számoljuk. Ha kevés, merőben más ideig tartott pozícióból számolunk átlagot, akkor annak a valóságban nem sok hasznát vehetjük. Nyereséges-veszteséges ügyletekre vonatkozó statisztika A riportban részletes kimutatás készül a nyerő és a bukó ügyletekről egyaránt, de mivel a mutatószámok mindkét esetben megegyeznek, így összevontan tárgyalhatjuk őket. 34
Nyerő/bukó ügyletek összprofitja-összvesztesége Ez a szám mutatja meg, hogy összesen mennyit kerestünk a nyereséges illetve, hogy mennyit vesztettünk a bukó ügyleteinken. Ennek a két számnak a különbsége adja meg számunkra az első részben említett teljes elért profitot vagy veszteséget.
4. sz.Táblázat
(forrás: AmiBroker program, teszt futtatás) Egy nyerő/bukó ügylet átlagos profitja (%) Itt megint átlagot kapunk egy adott nyerő ill. bukó ügyletre nézve. Mint az átlagoknál mindig, itt is figyelembe kell vennünk, hogy hány nyereséges vagy veszteséges ügylet alapján számoljuk az átlagot. Egy nyerő/bukó ügylet mennyi ideig volt nyitott Ez az érték azt mutatja meg számunkra, hogy egy átlagos nyereséges vagy veszteséges ügylet mennyi ideig volt nyitott pozíció. Legtöbb nyerő/bukó ügylet zsinórban Ez a szám a leghosszabb nyereséges vagy veszteséges periódus mutatja meg számunkra az egymást követő legtöbb nyereséges vagy veszteséges ügylet száma alapján.
35
Legnagyobb nyerő/bukó ügylet profitja Az itt feltűntetett összeg az egy ügyleten elért legnagyobb nyereséget ill. veszteséget adja meg. Legnagyobb nyerő/bukó ügylet időtartama Az imént említett legnagyobb pozitív vagy negatív eredményt produkáló ügylet időtartamát adja meg a gyertyák számában.
2.5.5.3 Egyéb mutatók A riport utolsó részében még több mutatószámmal találkozunk és ezek nagy része szintén rendkívül lényeges, mivel a fentebb említett módszereknél szofisztikáltabban közelíti meg a rendszerünket. 5. sz.Táblázat
(forrás: AmiBroker program, teszt futtatás) Maximum trade drawdown (%) Ez az érték azt mutatja meg, hogy mekkora volt a legnagyobb veszteség menet közben egy pozícióra nézve. Ezt látjuk konkrét összegben is, de százalékos formában tanácsosabb használni. Ez egyébként általánosságban is elmondható. Sokkal hasznosabb és fontosabb, hogy a viszonyítást inkább százalékos formában tegyük meg, mint konkrét összeg alapján. Ennek főként pszichikai oka van. Amíg kisebb összeggel kereskedünk, addig nem jelent 36
problémát, ha mondjuk 1000 dollárból egy ügyleten elveszítünk 100-at. De százalékosan tekintve 10 százalékot veszíteni egy ügyleten igen nagy luxus! Ráadásul még nehezebben kezelhetővé válik ez a fajta szemlélet, ha nagyobb összeggel dolgozunk. Az ember hajlamos ilyenkor a veszteséget lefordítani hétköznapi nyelvre. Ha például egy ügyleten 500$ bukóban van, akkor belegondol, hogy mennyi mindenre költhetné inkább ezt az összeget, ahelyett, hogy itt elveszítené. Ez egy alapvetően hibás hozzáállás. Sokkal fontosabb, hogy eredményeinket és pillanatnyi helyzetünket százalékosan, arányaiban tekintsük. Ugyanakkor abból a szempontból is hasznos ez a mutatószám, hogy belegondoljunk, vajon éles helyzetben ki tudnánk-e tartani a pozíciónk mellett az adott helyzetben. Ez megint csak személyiség függő. Ezt is mint oly sok tényező egyéni preferenciánkhoz kell hozzáigazítanunk, főként önismeret alapján. A lényeg, hogy elsősorban arányokat kell nézni és nem pedig konkrét összegeket! Maximum system drawdown (%) Itt ugyancsak a legnagyobb nem realizált (!!!) veszteség mutatkozik meg, de nem egy ügylet kapcsán, hanem a rendszer szintjén. Ez főleg akkor fontos, ha több termékkel kereskedünk egyidejűleg. Ilyenkor megeshet, hogy hiába van nagy bukónk az egyik ügyleten, egy másik ügylet profitja tompítja ezt a hatást. Persze előfordulhat ennek az ellenkezője is, amikor több, kisebb veszteség adódik össze és rendszer szintjén eredményez nagyobb drawdownt. Azt, hogy több termék egyidejű kereskedése esetén az egyes ügyletek milyen hatással vannak az adott rendszerre, nagyban befolyásolja a termékek árfolyamváltozása közt korreláció. Megtehetjük, hogy olyan termékeket válogatunk össze, melyek árfolyamváltozása között negatív korreláció áll fenn és így nagy eséllyel csökkenthetjük a rendszer drawdown értékét. Ezt különböző portfoliókezelési technikákkal érhetjük el, ám ez terület önmagában is hosszú vizsgálódást igényel, ezért ez nem témája a dolgozatomnak. Mindenesetre a rendszer drawdown mutatója az egyik leglényegesebb tényező, amit fejlesztéskor figyelembe kell vennünk. Recovery factor Ez a mutató szintén egy arányszám, a nettó profitot viszonyítja a rendszer maximális drawdown-jához. Vagyis azt mutatja meg, hogy az adott időintervallumon elért profitunk hányszorosa a rendszer működése során fellépő legnagyobb veszteségnek. Mindenképpen ésszerű, hogy ez az érték ne legyen 1-nél kisebb, de annál jobb minél nagyobb.
37
CAR/MaxDD Még szemléletesebben mutatja be a fenti módszert ez a mutatószám, mivel itt nem a teljes profithoz viszonyítja a rendszer maximális drawdown-ját, hanem a 2. sz. Táblázatban szereplő éves hozamhoz. Vagyis megtudjuk, hogy rendszerünk képes-e ledolgozni a legnagyobb nem realizált veszteséget egy év leforgása alatt. Rendszerünk akkor számít jónak, ha ez az érték 2 vagy annál nagyobb. RAR/MaxDD Ebben az esetben a risk adjusted return-t viszonyítjuk a rendszer maximális drawdon-jához. Szintén 2 vagy efölötti érték esetén tekinthetjük rendszerünket jónak. Profit factor Szintén fontos jellemzője rendszerünknek a profitfaktor. Úgy számítjuk, hogy a nyereséges ügyletek profitját elosztjuk a veszteséges ügyletek veszteségével. Ez mutatja meg tulajdonképpen a rendszerünk profittermelő hatékonyságát. Általános érték mely alapján jónak ítélünk egy rendszert az 5-7 értékektől felfelé. Payoff ratio Ennél a mutatónál az átlagos nyereséget viszonyítjuk az átlagos veszteséghez. Tehát a profitfaktorhoz hasonló megközelítést tükröz, ám itt az átlagokat hasonlítjuk össze. Ennek a mutatónak az előnye abban áll, hogyha reális átlagadatokkal rendelkezünk, akkor az ügyletek profit ill. veszteség mértékének az eloszlását is számításba veszi. Megeshet, hogy sok kisebb profitra jut kevesebb, de nagyobb veszteség. A profitfaktorunk ettől még lehet magas, de a payoff ratio-nál kiderül, hogy kellemetlenül nagy a veszteség a bukó ügyleteken. Standard error A tőkeérték változásának (equity line) egyenletességére vonatkozó érték. Risk-reward ratio Ez a mutató a rendszer belső kockázatának és a potenciális nyereségnek az arányát adja meg. A számítása az equity line meredekségéből (vagyis a várható éves hozam) és a standard error értékéből történik. Minél nagyobb az érték, annál hatékonyabb a rendszer.
38
Ulcer index Ennek a mutatónak az értéke a trade drawdown-ok négyzeteinek összegének négyzetgyöke osztva a gyertyák számával. Ulcer performance index Az éves profit egy fixen megadott éves államkötvényhozammal csökkentett értéke osztva az Ulcer indexszel. Sharpe ratio of trades Ez az érték a befektetés és a hozzá tartozó kockázat arányára ad egy mérőszámot. Értéke 1 felett jónak, 2 felett pedig kiemelkedően jónak tekinthető. K-ratio Ugyancsak a rendszer hatékonyságára jellemző érték. A hozamok inkonzisztenciáját mutatja, értékének lehetőleg 1-nél nagyobbnak kell lennie. Bár ennek megvalósítása meglehetősen nehéz feladat.
2.5.6
Változtatások
2.5.6.1 Limitár vs. Piaci ár- teljesülési kockázat Érdekes jelenség az, hogy általában a limit áras rendszerek magasabb nettó hozamot biztosítanak, mint a piaci áras rendszerek (internet, Tradingmarkets). Vagyis ez azt mutatja, hogy egy optimálisan beállított, limitárakkal dolgozó rendszer jobban teljesít, mint a piaci áras. De mi is tartozik bele az optimálisan beállított kategóriába? A limit áras eljárás esetén kellemetlen új problémák merülnek fel, melyekkel meg kell küzdenünk. Az egyik probléma, hogy egyáltalán teljesül-e a beadott megbízás. Lehet, hogy nem jól határozzuk meg a limitet és a megbízásunk nem teljesül. Ezen túlmenően nem lesz állandó a teljesülő megbízások alapján nyitott pozícióméret sem. Míg piaci áras megbízás esetén nagyon nagy valószínűséggel a teljes mennyiség teljesül, addig ez limitár esetében korántsem biztos. További probléma, hogy megállapítsuk, milyen eséllyel teljesülnek a megbízásaink. Ezen túlmenően pedig a teljesülések homogenitását is figyelembe kéne vennünk. Ezek komplikált problémák, megoldásuk ill. kezelésük nem kézenfekvő. Az ilyen típusú rendszerből nehéz igazán jól működőt készíteni.
39
2.5.6.2 Stop alkalmazása Rendszerünk teljesítményét és jellemzőit jelentősen befolyásolhatja, ha stop loss-t használunk. A stop loss lényege, hogy tőkénk védelme érdekében egy megnyitott pozícióhoz stop megbízást is adunk, egy olyan szinten, ahol minden körülmények között zárni akarjuk a pozíciót. A pozíció nyitáskor a stop szint a maximális felvállalt veszteség szintjénél van, ám ezt később módosíthatjuk. Ugyanígy, már egy nyerőbe fordult pozíció profitját védhetjük meg, ha a nyitási szint fölé húzzuk a stop-ot. A stop szinteket többféleképpen is meghatározhatjuk, beállíthatjuk.
2.5.6.3 Fix stop A fix szinthez beállított stop a legegyszerűbb, ám talán leghasznosabb. A stop szintet meghatározhatjuk a tőkénkre vetített veszteséghez tartozó árfolyamszint alapján, a nyitott pozíción felvállalt maximális veszteséghez tartozó árfolyamszint alapján, támasz- és ellenállás szintek köré, ill. egyéb módszerek alapján.
2.5.6.4 Trailing stop A trailing stop magyar megfelelője a követő stop amint azt elnevezése is sugallja, ez a fajta stop egy bizonyos távolságból követi az árfolyamot. A követő stop működése a következő: megadjuk, hogy milyen távolságból kövesse az árfolyamot és, hogy mekkora lépésekkel ugorjon. A követő stop mindig feljebb tolja a stop szintet, ha az árfolyam emelkedik. Így gyakorlatilag mindig a nyitás óta elért legmagasabb árfolyamszint alatt a megadott távolságban tartózkodik.
2.5.6.5 Indikátorhoz kötött stop A programozott kereskedési rendszerek nagy előnye a mechanikus végrehajtás. Míg a trailing stop alkalmazásának lehetősége az adott piactól függ, addig a fix stop szint megadása gyakorlatilag bárhol lehetséges. És ezt a stopot lehet módosítani. Így megtehetjük azt is, hogy a stop szintet változó paraméterek alapján adjuk meg. Ilyen például, amikor a stop szintet egy adott indikátorhoz kötötten határozzuk meg. Amennyiben nem túlságosan gyakran módosítjuk a stop szintet, akkor ez is megvalósítható.
40
Lényeges megjegyeznünk, hogy a fentebbi két esetben a stop szint csakis felfelé módosulhat. Hiszen ha lefelé menet is tartaná a stop a távolságot, akkor értelmét veszítené az egész procedúra. Fontos szabály még, hogy menet közben ne változtassunk a beállított stop paramétereken. Ha érintettek vagyunk a pozícióban és folyton eltologatjuk a stop szintet a kisebb mértékű veszteség realizálása okozta félelem által vezérelve, akkor előbb utóbb kénytelenek leszünk egy jóval nagyobb veszteséget zsebre tennünk. Most foglalkozzunk azzal, hogy a stop-ok alkalmazása egy kereskedési rendszerben hogyan befolyásolja az eredményt! A tapasztalat az, hogy stop alkalmazásával megnő a veszteséggel lezárt ügyletek száma. Viszont a behatárolt veszteségnek köszönhetően az ügyletekre vonatkozó maximális drawdown is csökkenni fog, viszont ez már nem igaz a rendszer drawdownjára, hiszen sok, egymást követő stop-pal végződő ügylet esetén ez rontja a rendszer minősítését. Általánosságban elmondható, hogy a stop-pal működő rendszerek profitja alacsonyabb lehet, ám a kockázat szempontjából jelentősen javítják egy adott kereskedési rendszer jellegét.
2.5.6.6 Pozícióméretezés Mint a riportról szóló részben is láttuk, a pozícióméretezés a sikeres kereskedés egyik legsarkalatosabb pontja. Gyakran előforduló hiba szokott lenni, főként kezdők esetében, hogy nem a megfelelő volumennel kereskednek. Általában a türelem hiánya és a kapzsiság miatt túl nagy méretű pozíciókat nyitnak és így hamar elvesztik tőkéjük jelentős hányadát. Ha a profi traderek módszereit figyeljük rájövünk, hogy a money management mennyire fontos szempont a kereskedés során. Most viszont csak az egyszerűbb pozícióméretezési módszerekkel foglalkozunk.. Amivel most foglalkozunk, az a legegyszerűbb technikák közül valók. Amikor pozícióméretet választunk, azt az előre megfogalmazott kockázat-vállalási szabályaink tükrében kell tennünk. Nem engedhetjük meg magunknak, hogy tőkénk jelentős részét egy ügylet során elveszítsük. A pozícióméretet megválaszthatjuk a mindenkori tőke arányában. Ekkor az ügyletenként változó tőkéhez viszonyítjuk a következő ügylet méretét. Megtehetjük azt is, hogy csak akkor változtatunk a kereskedési mennyiségen, ha egy bizonyos mértékkel változott a tőkénk. Ennél szofisztikáltabb módszer, ha nem csak a tőkéhez viszonyítjuk a pozícióméretet, hanem az adott helyzethez. Ezt megtehetjük úgy, hogy pl. egy
41
volatilitást mérő indikátor értékét is figyelembe vesszük. Mivel a dolgozatnak nem célja ezen technikák részletes ismertetése, ezért a továbbiakban is a fentebb említett módszereket fogjuk alkalmazni. Kifinomultabb rendszerek leírása a www.tradermike.net/2005/07/position_sizing/
internet
címen olvasható.
2.6 Optimalizálás Tulajdonképpen rendszerünk optimalizálásával már eddig is foglalkoztunk, hiszen a kiinduló ötlet után arra törekedtünk, hogy még jobb eredményeket érjünk el. Ezt többnyire a paramétereink változtatásával érhettük el. Ez vitathatatlanul egy egészséges folyamat, ám ennek is megvannak a maga ésszerű korlátai. Ez nem azt jelenti, hogy nem törekszünk rendszerünk tökéletesítésére, sőt éppen ezt kívánjuk elérni. Itt lép fel a következő probléma.
2.6.1 A curve fitting probléma Mint azt az imént deklaráltuk a rendszerünkből a lehető legjobbat szeretnénk kihozni. Ennek hatékony eszköze a fejlesztőszoftver optimalizáló funkciója. Ennek használatához meg kell határoznunk a rendszerünkben szereplő azon paramétereket, melyeket optimalizálni szeretnénk. Ez persze nem csupán a legmagasabb profit elérését jelenti, hanem egy olyan paraméterezésű rendszert, melynek a riport részben részletesen felsorolt egyéb jellemzői is jónak számítanak. Vagyis megfogalmazhatjuk úgy, hogy a számunkra legkiegyensúlyozottabb rendszert kívánjuk megalkotni a paraméterek optimális összeállításával. Ám itt is van egy veszély, mely a programfejlesztőkre leselkedik. Ez pedig nem más, minthogy túlzottan az adott, backtest-hez használt adatsorra optimalizáljuk a rendszerünket (internet, Aranyláz, 2006a). Ekkor meglehet, hogy kiváló hatásfokot tapasztalhatunk, de ne felejtsük el, hogy ezeket egy múltbéli adatsorra vonatkozólag értük el. Ezt a problémát nevezzük curve fittingnek, vagyis azt, amikor a rendszert túloptimalizáljuk egy adott adatsorra. Ha azokat a paraméter-beállításokat használjuk, melyek az adott adatsorra a legjobb eredményt hozták, akkor igen nagy valószínűséggel nagyságrenddel rosszabb eredményt kapunk, ha élesben futtatjuk a rendszert.
42
3. sz.Ábra
Forrás: Amibroker teszt futtatás A fenti ábrán ragyogóan látszik, hogy mi is a probléma. Ezen a háromdimenziós grafikonon két változó optimalizálása során elért profitot láthatjuk. Ebben a konkrét példában a Commodity Channel Index elnevezésű indikátor alapján történő kereskedést optimalizáltuk. Ez egy túlvett-túladott szinteket jelző indikátor, kereskedési elvünk pedig az, hogy az indikátor túladott piacot jelző szintjénél vételi pozíciót nyitunk és a túlvett szintnél pedig lezárjuk a pozíciót. a két paraméter amit optimalizálunk az indikátor periódusa, illetve a túlvett-túladott szint. Mivel az indikátor nem zárt skálájú, ezért ebben a példában úgy vesszük, hogy a túladott szint, mely negatív érték, pozitív ellentettjét tekintjük túlvett szintnek. Így két paramétert kell optimalizálnunk, a periódust (per) és a szintet (level). A két változó értékei az ’x’ ill. az ’y’ tengelyen vannak feltűntetve, míg a választott paraméterek alapján elért profit a ’z’ tengelyen van jelölve. A tájékozódásban a színezés is segítséget nyújt; minél vörösebb egy terület, annál magasabb a profit. Ezen az ábrán jól látható, hogy a legmagasabb profitot egy meredek csúcshoz tartozó paraméterértékek adják. Pontosan ez jelenti a curve fitting problémát, mert itt vizuálisan is látjuk, hogy a paraméterek kisebb változtatása nagymértékben rontja az eredményt. Ezért ez a paraméterezés ugyan erre az
43
adatsorra a maximális profitot biztosította, ám a jövőben sokkal gyengébb teljesítményt fog nyújtani. Sokkal jobban járunk, ha az ábrán piros fennsíkokat keresünk. Ez ugyanis azt jelenti, hogy az adott profithoz tartozó paraméterek a jövőben is kiegyensúlyozottabb eredményt valószínűsítenek. A vizuális megjelenítés hátránya, hogy – értelemszerűen – csak két optimalizálandó változó esetén használható. Viszont ha ennél több változóval dolgozunk, akkor is mindenáron törekednünk kell arra, hogy a magas profithoz tartozó paraméterek közül az egymáshoz közel esők közül válasszunk (vagyis egy sokdimenziós fennsík egy pontját).
2.6.2 In-sample, out-of sample adatok A fenti probléma kiküszöbölésében nyújt segítséget a következő módszer (internet, Aranyláz, 2006b). Megtehetjük azt, hogy a rendelkezésünkre álló múltbeli adatsort két részre bontjuk. Az egyik részt nevezzük in-sample adatoknak, míg a másik részt out-of-sample adatoknak. A rendszerünk csiszolgatását, optimalizálását mindig az in-sample adatokon kell megtennünk. Ezen az adatsoron végezzük tehát a rendszerünk tökéletesítését. Amikor ezt a folyamatot véglégesnek tekintjük, nincs más dolgunk, minthogy a backtest-et lefuttassuk az out-ofsample adatokon. Szigorú szabály, hogy ezt követően már nem szabad a rendszerünk beállításaihoz hozzányúlnunk. Ha a kapott eredmény jócskán elmarad az előzetes tesztek eredményétől, nagy valószínűséggel a curve fitting csapdájába estünk. Ezzel a módszerrel azonban meggyőződhetünk arról, hogy helyesen végeztük-e az optimalizálást. Ha igen, akkor nagyjából közeli eredményt kell tapasztalnunk. Ezzel a módszerrel, vagyis, hogy az egy adatsoron végzett fejlesztést leteszteljük egy eddig nem vizsgált eredménysoron megejtettük rendszerünk főpróbáját.
2.7 Végső tesztelés Miután levizsgáztattuk a rendszerünket érdemes még néhány jellemzőt megvizsgálnunk. Az éles kereskedés során fontos tisztában lennünk azzal, hogy a kereskedési rendszerünk milyen gyakran és milyen homogenitással ad megbízásokat. Ezt persze a fejlesztés során is látjuk és vizsgáljuk, viszont amikor elkezdünk kereskedni, ennek tudatában kell lennünk. Türelmesen kell várnunk a jelekre és nagyon szigorúan, kivétel nélkül kell ezeket megvalósítani. Nem nyithatunk pozíciót jelzés nélkül és nem hagyhatunk ki pozíciónyitást vagy zárást a rendszer jelzése ellenére. Ezzel borulna az egész eredmény. Ezeknek a tudatosítása és a fegyelem elengedhetetlen része a sikernek. 44
2.8 Rendszer élesbe állítása Amikor a rendszerünket élesbe állítjuk, el kell döntenünk, hogy a megbízás végrehajtását teljesen a rendszerre bízzuk, vagy pedig mi magunk végezzük manuálisan. A teljesen automatikus végrehajtás előnye akkor nyilvánul meg, ha az nagyon pontosan végrehajtható és nagyon gyakoriak a vételi ill. eladási jelzések. Előnyt jelent például a Forex piacon történő kereskedéskor, mivel ez a piac a nap 24 órájában nyitva van. A manuális kereskedés melletti érvként említhető, hogy jobban megismerjük a rendszerünket, jobban átlátjuk a szituációt, amikor lépni kell. Ez akkor lehetséges, ha nincs túl sok jelzés, és a kereskedés időtartamában folyamatosan minden nap lehetőségünk van kötni. Hátránya az lehet, ha engedjük magunkat a piaci hangulat által befolyásolni. Választásunk tehát nagyban függ a rendszerünktől, személyiségünktől és a rendelkezésre álló időnktől.
45
3 Megvalósítás
3.1 Pullback Kereskedési Rendszer Mint azt már az ötletek című résznél említettük, az egyik leggyakoribb kereskedési alapelv a pullback-re épül. Vagyis arra, hogy egy trendszerű mozgásba a korrekciós fázisokkor lépjünk be. Egy ilyen alaprendszert már nagyvonalakban megismertünk, most viszont megvizsgáljuk, hogyan lehet azt a gyakorlatban megvalósítani. Emlékezzünk vissza, hogyan is fogalmaztuk meg a játékszabályokat a pullback című részben! Azt mondtuk, hogy emelkedő trend esetén, akkor akarunk beszállni, amikor az árfolyam a korrekció során belép a 10-es mozgóátlag és a 30-as exponenciális mozgóátlag határolta tartományba. Ezt így szavakban megfogalmazni meglehetősen könnyű, viszont a program nyelvére lefordítani már korántsem olyan triviális. Mindenek előtt azzal kell kezdenünk, hogy meghatározzuk milyen termékekkel akarunk foglalkozni. Most ebben a példában az amerikai NYSE piacon jegyzett főbb részvények közül fogunk válogatni. Ez lesz az a halmaz, amin belül válogatni fogunk a kedvünkre való részvények között. Hogy mi alapján választjuk ki a nekünk tetsző részvényt? Mivel első lépésben long rendszert fejlesztünk, ezért csak olyan részvényekkel foglalkozunk, melyek emelkedő trendben vannak. A továbbiakban végig napi gyertyák alapján építjük rendszerünket. Első vételi kritériumunk tehát, hogy a választott részvény árfolyama emelkedő trendet mutasson. Ezt a következőképpen fogalmazhatjuk meg:
Condition1=MA(C,50)>Ref(MA(C,50),-1); Vagyis ez annyit jelent, hogy meghatározunk egy feltételt (Condition1), mely azt mondja ki, hogy a záróárak 50 periódusú mozgóátlagának értéke az adott gyertyán nézve nagyobb, mint az őt megelőző gyertyán. Vagyis így tudtuk megfogalmazni azt, hogy az 50 napos mozgóátlag
46
emelkedik. Később ezt majd finomíthatjuk azzal, hogy meghatározzuk az emelkedésnek egy minimális értékét. Vételi megbízásunk további feltétele, hogy az árfolyam felülről lépjen be a meghatározott mozgóátlagok határolta területre. Az erős emelkedő trend esetén a szimpla mozgóátlag és az exponenciális mozgóátlag viszonyáról elmondhatjuk, hogy a 10-es szimpla mozgóátlag egy adott gyertyán vett értéke nagyobb, mint a 30-as periódusú exponenciális mozgóátlag ugyanazon gyertyán vett értéke. Így szerencsénk van, erre nem kell külön feltételt kikötnünk, elég annyit megmondanunk, hogy:
Condition2=C>EMA(C,30); Vagyis, hogy a záróár legyen magasabb mint a 30-as periódusú exponenciális mozgóátlag. Így amikor a vételhez meghatározzuk a záróár és a szimpla mozgóátlag kereszteződését, akkor biztosak lehetünk benne, hogy az árfolyam a sávba lép. Vételi megbízásunk tehát a következőképpen néz ki:
Buy=Condition1 AND condition2 AND Cross(MA(C,10),C); Azaz, a rendszer akkor fog vételi jelzést adni, amikor az első és a második feltétel is igaznak minősül és ezalatt a záróár felülről metszi a 10-es periódusú szimpla mozgóátlagot. Ezzel kijelöltük e belépési pontokat. Most következik az, hogy meghatározzuk mikor zárjuk az ügyletet. Kilépési logikánkhoz is több feltételt kell megfogalmaznunk. Első megközelítésben úgy vesszük, hogy rövidebb emelkedő ciklusokat kívánunk lekereskedni, nem pedig egy nagyobb long pozíciót felépíteni. Ezért azt határozzuk, hogy akkor zárjuk le a pozíciót, ha egy nagyobb fekete gyertyát észlelünk a pozíció megnyitása után. Mit is jelent ez pontosan? Azt jelenti, hogy egy komolyabb eső nap volt az árfolyamban. Ezt a következőképpen fordítjuk le:
Condition3=O>C; Condition4=abs(O-C)*5>H-L; A 3-as feltétel (Condition3) azt fogalmazza meg, hogy a gyertya nyitó árának magasabbnak kell lennie, mint a gyertya záró árának. Ez azt jelenti, hogy az adott napon árfolyamesés történt. Viszont itt finomíthatunk egy kicsit. Nem reális azt elképzelnünk, hogy a pozíciónk
47
megnyitása után csakis fehér –azaz emelkedő- gyertyákat fogunk látni. Természetesen lesz közte fekete is. Viszont az emelkedés közben nem akarunk kiszállni, lemondva a profit nagy részéről. A gyertyákról szóló részben már említettük, hogy egy-egy gyertya, hogyan jelzi a piaci hangulatot. Vagyis attól még, hogy a gyertya nyitóára a záróár felett van, nem jelenti egyértelműen azt, hogy jelentős csökkenés történt. A piaci bizonytalanság esetén – amilyen a doji gyertya, ahol nagy a kanóc, de kicsi a gyertya teste – még nem akarunk kiszállni, hiszen nincs rá konkrét indokunk. Ezért úgy fogalmazzuk meg a negyedik feltételt (Condition4) hogy a gyertya teste (a nyitóár és a záróár különbségének abszolút értéke) legyen legalább ötször akkora, mint a teljes gyertya a kanócokkal együtt (gyertya maximuma mínusz a gyertya minimuma). Az ötszörös érték egy nagyságrendi becslés, melyen finomítani lehet a későbbiek során, de a program jelenlegi fázisában megfelelő. Ezek alapján az eladási jelzést a két feltétel egyidejű teljesülésekor fogjuk kapni. Sell=Condition3 AND Condition4; Itt egy kis kiegészítést kell tennünk. Előfordulhat, hogy egymás után több gyertyára is vételi jelzést kapunk, míg zárás csak jóval később jelenik meg. Ezt a problémát úgy tudjuk megoldani, hogy az első felmerülő vételi ill. eladási jelzés után figyelmen kívül hagyjuk a többi hasonló jelzést, addig amíg a z ellentétes ügylet meg nem történik. Vagyis a sorrend egy vétel, egy eladás lesz. Ezt a következőképpen írjuk le:
Filter=Buy OR Sell; Buy = ExRem( Buy, Sell ); Sell = ExRem( Sell, Buy ); Viszont még mindig nem vagyunk készen. Meg kell határoznunk a vétel és az eladás pontos idejét. Logikailag lehetséges, hogy a vételi jelzés észlelésekor, még az adott napon nyissunk pozíciót. Ezért a vételi árunk, mindig a vételi jel megjelenési napjának a nap végi záróára lesz. Ekkor mindig egyértelműen el tudjuk dönteni, hogy a megfogalmazott feltételek teljesülnek-e. hasonlóan járunk el az eladási jelzés estén is, itt is a nap végi záróárat alkalmazzuk.:
BuyPrice=Close; SellPrice=Close;
48
Mivel több lehetőség is adódhat egyidejűleg, illetve azalatt míg pozícióban vagyunk, ezért nem a teljes tőkénket fektetjük egy konkrét pozícióba. Ezáltal kiegyensúlyozottabb is lesz a rendszerünk, hiszen egyrészről, egy konkrét ügyletben kisebb összeg lesz, másrészről több részvény között diverzifikálhatjuk a befektetéseinket. A mostani példában minden egyes ügylet során a mindenkori tőkénk 50%-ával nyitunk pozíciót.
SetPositionSize(50,spsPercentOfEquity); Számításba veszünk még egy feltételt, amit ugyan nem írunk bele a programba, de a backtest beállításánál meg fogunk határozni. Ez pedig nem más, mint egy stop megbízás. A különböző típusú stop-okról már ejtettünk néhány szót, ez viszont most egy újdonság lesz. Azért nem beszéltünk róla, mert ilyen jellegű megbízást konkrétan nem tudunk kiadni a piacokon, de viszont a kereskedési rendszerünkkel alkalmazni tudunk. Félretéve a körülírás okozta misztikus homályt, az időstop-ról van szó. Vagyis teszünk egy olyan kikötést, hogy a pozíciót pl. 4 gyertya múlva mindenképpen lezárjuk. Azaz egy pozíciónk sem fog több ideig tartani, mint 4 gyertya. Mivel ezzel a mostani rendszerünkkel tulajdonképpen egy pullbackből nyert momentumot tradel-ünk le, ezért van helye az időstop alkalmazásának. A mostani rendszerünkben úgy határozzuk meg, hogy egy ügylet sem tarthat 6 napnál tovább, vagy az időstop-unk 6 gyertya lesz. Ezzel sikeresen lefordítottuk, az elméletben kialakított kereskedési szabályokat és eljött az ideje a tesztelésnek. Azonban mielőtt tesztelnénk, van még egy teendő, mely nagyon hasznos lesz a rendszer továbbfejlesztése szempontjából. Nagy segítséget jelentene számunkra, ha a grafikonokon be lenne jelölve és látnánk a vételi és eladási helyeket és árfolyamokat. Ezt a következőképpen érjük el:
///////////// //Indikátor// /////////////
Filter=Buy OR Sell; Buy = ExRem( Buy, Sell ); Sell = ExRem( Sell, Buy );
49
PlotOHLC(Open,High,Low,Close,"Grafikon",colorBlack,styleCandle ); Plot(MA(C,10),"MA10",colorGreen,styleLine); Plot(EMA(C,30),"EMA30",colorRed,styleLine); shape = Buy * shapeUpArrow + Sell * shapeDownArrow; PlotShapes(shape,IIf( Buy, colorGreen, colorRed )); Csinálunk egy Indikátor című részt, melyben leírjuk, hogy a program miket jelenítsen meg számunkra. Mindenek előtt megint ki kell kötnünk, hogy egy adott termék esetén vételi jelzés után csak eladási jelzést szeretnénk látni és fordítva. Ezt a formulát már alkalmaztuk. Ezen túlmenően meghatározzuk, hogy a program jelenítsen meg egy gyertya-diagramot a hozzá tartozó gyertyánkénti négy értékkel, és mindezt fekete színben. Emellett hasznos, ha a grafikonon feltűntetjük azt a két mozgóátlagot, amely számunkra az aktív kereskedési zónát határozza meg. Ezek közül az egyik a záróárak 10-es szimpla mozgóátlaga, a másik pedig a záróárak 30-as exponenciális mozgóátlaga. Az előbbi zöld, míg az utóbbi piros színben fog feltűnni a grafikonon. És a lényege az egésznek, hogy az indikátor vétel esetén egy felfelé mutató zöld, eladás esetén pedig egy lefelé mutató piros nyilat tűntet fel. Így a következő grafikont kapjuk: 4. sz.Ábra
A JP Morgan árfolyama és a vételi ill. eladási jelzések 2000. augusztus-2001 február Forrás:Amibroker
50
Ezen az ábrán nagyon jól látszik, hogy mi is az alapstratégiánk. Az emelkedő trend korrekcióiba a kedvező feltételek miatt beleveszünk, és a rövidtávú momentumot kihasználva legfeljebb 6 nap múlva lezárjuk a pozíciót. Most már tényleg minden fontosat leírtunk, amit így első körben le kellett, úgyhogy nincs más hátra, mint az első backtest. Nézzük milyen eredményt hozott!
51
6. sz.Táblázat Initial capital
All trades
Long trades
5000.00
5000.00
Ending capital
9153.60
9153.60
Net Profit
4153.60
4153.60
Net Profit %
83.07 %
83.07 %
Exposure % Net Risk Adjusted Return % Annual Return % Risk Adjusted Return % All trades Avg. Profit/Loss Avg. Profit/Loss % Avg. Bars Held
44.90 %
44.90 %
185.02 %
185.02 %
8.00 %
8.00 %
17.82 %
17.82 %
715
715 (100.00 %)
5.81
5.81
0.23 %
0.23 %
6.04
6.04
295 (41.26 %)
295 (41.26 %)
Total Profit
22558.26
22558.26
Avg. Profit
76.47
76.47
2.47 %
2.47 %
8.29
8.29
Winners
Avg. Profit % Avg. Bars Held Max. Consecutive Largest win # bars in largest win Losers Total Loss Avg. Loss Avg. Loss % Avg. Bars Held Max. Consecutive Largest loss # bars in largest loss Max. trade drawdown Max. trade % drawdown Max. system drawdown Max. system % drawdown
7
7
544.02
544.02
7
7
420 (58.74 %)
420 (58.74 %)
-18404.66
-18404.66
-43.82
-43.82
-1.35 %
-1.35 %
4.46
4.46
11
11
-299.52
-299.52
5
5
-299.52
-299.52
-11.34 %
-11.34 %
-957.76
-957.76
-17.83 %
-17.83 %
Recovery Factor
4.34
4.34
CAR/MaxDD
0.45
0.45
RAR/MaxDD
1.00
1.00
Profit Factor
1.23
1.23
Payoff Ratio
1.75
1.75
417.60
417.60
Standard Error Risk-Reward Ratio
1.25
1.25
Ulcer Index
6.08
6.08
Ulcer Performance Index
0.43
0.43
Sharpe Ratio of trades
0.56
0.56
0.0446
0.0446
K-Ratio
(forrás: AmiBroker program, teszt futtatás) Mivel long rendszert építünk, ezért a short ügyletekre vonatkozó statisztikát figyelmen kívül hagyjuk. Amit elsőként megállapíthatunk az, hogy a vizsgált időszak (2000.01.012007.11.09) az 5000$ kiinduló tőkénkből 9153$-t csináltunk. Ez 4153$ összprofitot jelent. Ez 52
a tőkére vetítve több mint 83%. Ez így nem hangzik rosszul, de figyelembe kell venni, hogy ezt majdnem 8 év alatt sikerült kitermelni, azaz az éves profitunk így kereken 8%. Mindenek előtt örülhetünk annak, hogy a rendszerünk alapvetően nyereséges, ám a 8%-os éves hozam még korántsem nevezhető kimagaslónak. Ezen felül meg kell vizsgálnunk a rendszerünk további jellemzőit. A közel 8 év alatt valamivel több, mint 700 ügyletünk volt, melynek viszont csupán 41%-t zártuk nyereséggel. Az egyéb jellemzőket nem vesszük végig, de összességében látszik, hogy még lehet csiszolni a rendszeren, mind jövedelmezőség, mind egyenletesség terén. A rendszerünk továbbfejlesztésekor az alapötletünkön nem változtatunk, hiszen akkor érdemesebb lenne egy új rendszert kitalálni. Viszont érdemes megvizsgálni, hogy a megadott paraméterek változtatásával milyen javulást tudunk elérni. Elsőként a kiszálláskor használt fekete gyertyatest méretével kapcsolatos paramétert vizsgáljuk. Mivel a jelenleg használt 5-szörös szorzót csupán saccra állapítottuk meg, most megnézzük, hogy ceteris paribus milyen érték lenne az optimális a jelenlegi környezetben. Ehhez meg kell adnunk, hogy a program melyik paramétert optimalizálja. Ehhez elnevezzük az 5-ös szorzó paraméterét és meg is határozzuk: Candlebodymultiplier=Optimize("Gyertyatest méret szorzó",5,2,12,0.5);
Ezzel a formulával megadjuk az optimalizálandó érték alapbeállítását, a minimum értékét, a maximum értékét, valamint a lépésközt. A program ez alapján végig fogja számolni az összes variációt és egy kiválasztott tényező alapján sorrendben kilistázza. De ehhez még a Condition4-et is átírjuk: Condition4=abs(O-C)*Candlebodymultiplier>H-L;
Így most már a szoftver képes lesz optimalizálni ezt az értéket. Futtassuk le az optimalizálást! Az eredmény érdekes. E szerint a tipp alapján választott 5-ös értékünk a vizsgált értékek közül a második legmagasabb profitot biztosítja. Ezek szerint becslésünk meglehetősen pontos volt. Viszont igen nagy a különbség az első és a második hely között. Míg a második helyen az elért profit, mint tudjuk 83%, addig az első helyen a 4-es értékhez tartozó profit meghaladja a 100%-t. Mivel itt csak 1 paramétert optimalizáltunk, ezért nem tudjuk a 3D-s grafikonon is megnézni az eredményeket. Viszont a három legmagasabb profithoz tartozó
53
értékek a 4, 5, 4.5. Vagyis ezek egymást követő értékek, mely mindenképpen jót jelent számunkra, hiszen valószínűleg ha ezek közül választunk, akkor elkerülhetjük a curve fitting problémát. A legmagasabb profithoz ugyan magasabb system drawdown tartozik, ám ez csak 1%-kal magasabb érték, mint az eddig használt 5-ös paraméter esetében, a profitban a különbség viszont közel 20%. Ezért érdemesebb inkább a 4-est használnunk. Azzal, hogy 4-re írjuk át a paramétert, közel 105%-ra emelkedik az összprofitunk, valamint az éves profit is 9,5% körül alakul. A többi mutató is valamelyest javul. Ez a 4-es érték jónak tűnik, de vizsgálódjunk tovább! Bizonyosodjunk meg arról, hogy a használt mozgóátlagok periódusát is jól választottuk-e meg! Ehhez definiálnunk kell ezt a két paramétert:
EMAPeriod=Optimize("EMA Period",30,2,50,1); MAPeriod=Optimize("MA Period",10,2,50,1); Ehhez megint átírjuk a vonatkozó részt:
Condition2=C>EMA(C,EMAPeriod); Buy=Condition1 AND condition2 AND Cross(MA(C,MAPeriod),C); Valamint kiiktatjuk az előbb optimalizált paramétert, hogy ezáltal a két változó egyidejű optimalizálásának eredményét grafikonon is vizsgálhassuk. Lássuk a medvét!
54
5. sz.Ábra
Forrás: Amibroker teszt futtatás A két mozgóátlag paramétereinek optimalizálása során érdekes eredményt kaptunk. A grafikon ’x’ tengelye a szimpla mozgóátlag periódusa, az ’y’ tengely az exponenciális mozgóátlag periódusa, a ’z’ tengely pedig a hozzájuk tartozó profit. Vegyük észre, hogy az eredményesség sokkal inkább függ a szimpla mozgóátlag periódusától, mint az exponenciális mozgóátlag periódusától. Ezt jelzi az 1 oszlopban végigfutó „hegygerinc”. A legnagyobb profit a bal alsó sarokban lévő meredek kiemelkedéshez tartozik, ám ha ezt választanánk nagy eséllyel a curve fitting csapdájába esnénk. Ezért inkább a grafikon bal felső tartományából választunk értéket. Ott is eléggé szabdalt ugyan a „hegyvonulat”, de mégis hosszabb összefüggő láncot alkot. Így hát a szimpla mozgóátlagnak a 3-as periódust, az exponenciálisnak pedig a 38-as periódust fogjuk kiválasztani. Behelyettesítjük ezeket az értékeket az alapbeállítások helyére. Az új értékek felhasználásával újra lefuttatunk egy backtestet. Nézzük mi változott!
55
7. sz.Táblázat All trades
Long trades
Initial capital
5000.00
5000.00
Ending capital
14131.52
14131.52
Net Profit Net Profit % Exposure %
9131.52
9131.52
182.63 %
182.63 %
56.36 %
56.36 %
324.04 %
324.04 %
Annual Return %
14.14 %
14.14 %
Risk Adjusted Return %
25.09 %
25.09 %
860
860 (100.00 %)
10.62
10.62
0.26 %
0.26 %
Net Risk Adjusted Return %
All trades Avg. Profit/Loss Avg. Profit/Loss % Avg. Bars Held
6.22
6.22
353 (41.05 %)
353 (41.05 %)
Total Profit
37230.64
37230.64
Avg. Profit
105.47
105.47
Avg. Profit %
2.83 %
2.83 %
8.71
8.71
Winners
Avg. Bars Held Max. Consecutive Largest win # bars in largest win Losers Total Loss Avg. Loss Avg. Loss % Avg. Bars Held Max. Consecutive Largest loss # bars in largest loss Max. trade drawdown
5
5
1558.12
1558.12
11
11
507 (58.95 %)
507 (58.95 %)
-28099.13
-28099.13
-55.42
-55.42
-1.52 %
-1.52 %
4.49
4.49
14
14
-562.15
-562.15
3
3
-722.98
-722.98
Max. trade % drawdown
-10.02 %
-10.02 %
Max. system drawdown
-1843.17
-1843.17
Max. system % drawdown
-22.52 %
-22.52 %
Recovery Factor
4.95
4.95
CAR/MaxDD
0.63
0.63
RAR/MaxDD
1.11
1.11
Profit Factor
1.32
1.32
Payoff Ratio
1.90
1.90
1311.02
1311.02
Standard Error Risk-Reward Ratio
0.45
0.45
12.25
12.25
Ulcer Performance Index
0.71
0.71
Sharpe Ratio of trades
0.55
0.55
0.0160
0.0160
Ulcer Index
K-Ratio
(forrás: AmiBroker program, teszt futtatás) Mint az rögtön szembetűnik, a profitunk jócskán megugrott. Több mint 14.000$ a vizsgált időszak alatt és ez nem kevesebb, mint 14%-os éves hozam. Mennyivel jobban hangzik mint a kiinduláskori évi 8%. A javulás közel 75%-os! Megállapíthatjuk még, hogy az összes ügylet 56
száma is megugrott, és csökkent a nyereséggel végződők száma. De ez azt sugallja, hogy több nagyobb nyereséggel végződő ügyletünk volt, mint korábban. És a sikeres kereskedés pedig nem abban áll, hogy csak nyereséges ügyletünk legyen, mert ez nem reális és nem is optimális célkitűzés. Kockáztatnunk kell, viszont ha nem jön be, akkor minimalizálni kell a veszteségünket. Vagyis hiába több a veszteséges ügylet, jóval kisebb rajtuk a veszteség, mint amennyit megnyerünk a nyereségeseken. Azonban meg kell jegyezni, hogy a rendszer többi mutatószáma,még messze van az elméleti tökéletestől, de ennek a dolgozatnak nem is célja az eszményi kereskedési rendszer megalkotása. Ennek a példának a célja, hogy bemutassa, hogyan valósul meg egy elképzelés a gyakorlatban. Hogyan fejlődik a rendszer fokról fokra, hogyan tökéletesedik, milyen elvek alapján fejlesztjük. Viszont most még egy nagyon fontos lépés hátra van! Még hátra van a rendszerünk főpróbája. Ebben az esetben nem igaz a színházi mondás, mely szerint ha rosszul sikerül a főpróba, akkor jó lesz az előadás. Itt a következő lépés dönti el, hogy jó irányba fejlesztettünk-e vagy az adatsor csapdájába estünk. Ugyan az optimalizált adatok közül igyekeztünk olyan párt választani, mely nem speciálisan ehhez az adatsorhoz illik, de most erről meg kell bizonyosodnunk. Eddig mindig ugyanazon az időintervallumon teszteltünk. Vagyis eddig csak az in-sample adatokat vettük figyelembe. Ez az időszak a 2000.01.01-2007.11.09-ig tartó időtartam volt. Eljött az idő, hogy leteszteljük rendszerünket az ou-of-sample adatsoron is. Ez pedig az 1997.08.18-2000.01.01-ig tartó időszakot jelenti jelen esetben. Ha éves profitunk és a többi fontosabb mutatószám is nagyjából megegyezik az eddig tapasztaltakkal, akkor megnyugodhatunk, hogy valószínűleg jól dolgoztunk, megtettük a tőlünk telhetőt. nézzük a nagy próbát!
57
Hát
8. sz.Táblázat All trades
Long trades
Initial capital
5000.00
5000.00
Ending capital
5152.33
5152.33
Net Profit
152.33
152.33
Net Profit %
3.05 %
3.05 %
Exposure %
57.59 %
57.59 %
Net Risk Adjusted Return %
5.29 %
5.29 %
Annual Return %
1.27 %
1.27 %
Risk Adjusted Return %
2.21 %
2.21 %
263
263 (100.00 %)
0.58
0.58
0.05 %
0.05 %
All trades Avg. Profit/Loss Avg. Profit/Loss % Avg. Bars Held
3.54
3.54
105 (39.92 %)
105 (39.92 %)
Total Profit
7629.91
7629.91
Avg. Profit
72.67
72.67
2.73 %
2.73 %
4.78
4.78
Winners
Avg. Profit % Avg. Bars Held Max. Consecutive Largest win # bars in largest win Losers Total Loss Avg. Loss Avg. Loss % Avg. Bars Held Max. Consecutive Largest loss # bars in largest loss
5
5
289.29
289.29
7
7
158 (60.08 %)
158 (60.08 %)
-7477.59
-7477.59
-47.33
-47.33
-1.74 %
-1.74 %
2.72
2.72
7
7
-161.98
-161.98
3
3
Max. trade drawdown
-209.08
-209.08
Max. trade % drawdown
-7.59 %
-7.59 %
Max. system drawdown
-1893.14
-1893.14
Max. system % drawdown
-30.31 %
-30.31 %
Recovery Factor
0.08
0.08
CAR/MaxDD
0.04
0.04
RAR/MaxDD
0.07
0.07
Profit Factor
1.02
1.02
Payoff Ratio
1.54
1.54
455.82
455.82
Standard Error Risk-Reward Ratio
-0.42
-0.42
Ulcer Index
13.23
13.23
Ulcer Performance Index
-0.31
-0.31
Sharpe Ratio of trades
-0.04
-0.04
-0.0119
-0.0119
K-Ratio
(forrás: AmiBroker program, teszt futtatás) Legnagyobb sajnálatunkra a végeredmény elkeserítő! Az éves profit borzasztó nagyot esett és a rendszer többi jellemzője is csapnivaló értéket mutat. Mintha ez nem is az eddig fejlesztett, csiszolgatott rendszerünk lenne, hanem csak valami idevetett kezdetleges próbálkozás. Hogy 58
hol a hiba? A legvalószínűbb, hogy a legnagyobb igyekezetünk ellenére is a curve fitting csapdájába estünk. A rendszerünk paramétereit túloptimalizáltuk az in-sample adatsorra. Annak persze nincs értelme, hogy most megint nekiálljunk változtatni, hiszen ezáltal az eddigi out-of-sample adatsort minősítenénk in-sample adatsorrá. Ezért legnagyobb fájdalmunkra el kell vetnünk ezt a rendszert. És igazából nagyon örülhetünk, hogy nagy lelkesedésünkben nem egyből élesben próbáltuk ki, hanem korrektül leteszteltük. Így valószínűleg nagyon sok pénzt, időt és csalódottságot spóroltunk meg magunknak.
3.2 Indikátor rendszer De nem szabad, hogy elveszítsük bizodalmunkat a programozott rendszerekkel kapcsolatban, ezért rögtön nekilátunk kitalálni valami mást. Az internetet böngészve –mint már arról szó volt- sok ötletet gyűjthetünk. Onnan származik ez a következő is (internet, actonforex). Ezúttal más irányból közelítjük meg a piacokat. Az előbbi rendszerben felhasználtuk a gyertya formáját és ezt kombináltuk a mozgóátlagokkal. Most viszont csakis indikátorokat fogunk felhasználni a rendszer fejlesztése során. Alapötlet a következő. A legnépszerűbb indikátorok közül kettőt fogunk számításba venni, és ezek együttes értékelése alapján generálunk vételi és eladási jelzéseket. A két használt indikátor az RSI (Relative Strength Index) és az ADX (Average Directional Index) lesz. Ami közös a két indikátorban az, hogy mindkettőt a technikai elemzés egyik legelismertebb alakja, J. Welles Wilder Jr alkotta meg a ’70-es években. Az RSI az egyik olyan indikátor, amelyet szinte minden technikai elemzéssel foglakozó ember használ. Ez az indikátor az adott értékpapír túlvett és túladott szintjét mutatja meg. a számítása meglehetősen egyszerű: RSI=100 – 100/(1+RS) ahol az RS nem más, mint az elmúlt x emelkedő nap záróárának az átlaga osztva az elmúlt x csökkenő nap átlagos záróárának a hányadosa. Az x helyére a leggyakrabban a 14-es számot szokták behelyettesíteni, vagyis 14-es periódusú RSI-t használnak.
59
Az ADX elnevezésű indikátor szintén ismert, de használata mégsem olyan gyakori, mint a fentebb említett társáé. Számolása is egy fokkal összetettebb. Mint azt a neve is sugallja, ez egy átlag, melyet két másik görbéből számítunk. Az egyik a +DMI, a másik pedig – nagy meglepetésünkre – a –DMI. A DMI (Directional Movement Index) ahogy azt a neve is sugallja az árfolyammozgás irányával kapcsolatos. A +DMI emelkedik és a –DMI csökken, amikor az árfolyam felfelé mozog, és fordítva. Ennek a kettő görbének az felhasználásával kapjuk az ADX-t, mely már az árfolyammozgás irányát nem fogja mutatni, de az árfolyamot mozgató trend erősségének mérésére szolgál. Vagyis azt mutatja meg, hogy van-e trendszerű mozgás az árfolyamban, és hogy ez milyen erősségű. Tehát rendszerünket e köré a két indikátor köré fogjuk felépíteni. Elsőként egy long rendszert fogunk leprogramozni, majd a későbbiekben megkíséreljük a rendszert kiterjeszteni a short ügyletekre is. Foglaljuk össze, hogy milyen szabályok alapján akarunk kereskedni! Akkor nyitunk long pozíciót, ha •
az árfolyam emelkedő trendben van
•
az ADX legalább egy bizonyos ütemmel emelkedik és a 14-es periódusú RSI 85 alatt van
•
az ADX nem emelkedik és a 14-es periódusú RSI 50 alatt van.
Lezárjuk a long pozíciót, ha •
az ADX nem emelkedik és a 9-es periódusú RSI 75 fölé megy
•
az árfolyam felülről metszi a 20-as periódusú mozgóátlagot.
Kezdetnek ezeket a feltételeket használjuk, de menet közben ha szükség lesz rá kiegészítéseket fogunk tenni. Most fordítsuk le a feltételeinket a program nyelvére! //Paraméterek MAPeriod=Param("MA",14,1,50,1,0); ADXPeriod=Param("ADX",10,1,50,1,0); ADXriseby=Param("ADX rise by",0.2,0.01,10,0.01,0); RSIentryPeriod=Param("RSI entry Period",14,1,50,1,0); RSIexitPeriod=Param("RSI exit Period",9,1,50,1,0);
60
RSIgetinStrongLevel=Param("RSI get in Strong Level",70,1,100,1,0); RSIgetinWeakLevel=Param("RSI Weak Level",50,1,100,1,0); RSIgetoutLevel=Param("RSI Exit Level",75,1,100,1,0); possize=Param("Positionsize",33,1,100,1,0); //Feltételek Buy1=IIf(MA(C,MAPeriod)
[(PDI(ADXPeriod) OR MDI(ADXPeriod)); Buy=Buy1 AND Buy2 AND Buy3; Sell=IIf(ADX(ADXPeriod)>(Ref(ADX(ADXPeriod),1)+ADXriseby),IIf( (RSI(RSIexitPeriod)>RSIgetoutlevel),Close,0),0); Nézzük meg, hogyan is fogalmaztuk meg a feltételeket a program nyelvén. Mivel igen sok paraméter szerepel a rendszerben, ezért külön részben elnevezzük őket, és megadunk egy tartományt, amelyen belül a későbbiekben egyszerűen változtathatjuk az értéküket. A vételi jelzéseket két csoportra osztottuk: •]
Strong Side
•
Weak Side
A Strong Side – vagyis az erős oldal – tartalmazza az erősebb feltételt azaz, hogy az ADXnek egy bizonyos mértékkel emelkednie kell és az RSI (14) nem lehet 85 felett. A Weak Side – a gyengébbik kikötésre vonatkozik, vagyis nem muszáj az ADX-nek emelkednie, de akkor az RSI(14)-nek 50 alatt kell lennie. A Buy1 tartalmazza az általános kikötést, vagyis hogy az árfolyam emelkedésben legyen. Ezt úgy fogalmazzuk meg, hogy egy szimpla mozgóátlag egy adott gyertyán vett értéke magasabb legyen, mint az őt megelőző gyertyán vett értéke.
61
A Buy2 kikötés tartalmazza a belépési feltételeket mind a Strong Side (erős oldal), mind a Weak Side (gyenge oldal) esetében. A Buy3 megint csak egy általános kikötés. Ennek lényeg az, hogy az ADX jelzéseit figyelmen kívül kell hagyni, ha az értéke kisebb, mint a +DI vagy a –DI. Vételi jelzést akkor kapunk, hogyha mind a 3 feltétel egyidejűleg teljesül. Eladási jelet akkor generál a rendszer, ha az ADX már nem emelkedik – vagy egy megadott mértéknél lassabban – és az RSI(9) a 75-ös szint fölé emelkedik. Megint szükségünk van arra, hogy a fölösleges jelzéseket kiszűrjük, ezért a már fentebb használt eljárást alkalmazzuk:
Filter=Buy OR Sell; Buy = ExRem( Buy, Sell ); Sell = ExRem( Sell, Buy ); Mindemellett a pozíciót megnyitni, vagy lezárni a jelzés utáni gyertya nyitóárán fogjuk.
SetTradeDelays( 1, 1, 0, 0 ); BuyPrice = SellPrice = Open; Valamint meghatározzuk a pozíciók méretét:
SetPositionSize(possize,spsPercentOfEquity); Ez jelenleg a mindenkori tőke 33%-a. Minden lényegeset sikerült megfogalmaznunk, úgyhogy jöhet a backtest. Ezúttal is a már korábban meghatározott részvénycsoporton fogunk tesztelni, de most az in-sample tartománynak a 2001.01.01-2007.11.09-ig tartó időszakot választjuk. Lássuk az eredményt!
62
9. sz.Táblázat All trades
Long trades
Initial capital
5000.00
5000.00
Ending capital
13872.98
13872.98
Net Profit Net Profit % Exposure %
8872.98
8872.98
177.46 %
177.46 %
84.86 %
84.86 %
209.13 %
209.13 %
Annual Return %
16.05 %
16.05 %
Risk Adjusted Return %
18.92 %
18.92 %
35
35 (100.00 %)
253.51
253.51
28.36 %
28.36 %
Net Risk Adjusted Return %
All trades Avg. Profit/Loss Avg. Profit/Loss % Avg. Bars Held
296.06
296.06
29 (82.86 %)
29 (82.86 %)
Total Profit
10599.57
10599.57
Avg. Profit
365.50
365.50
36.72 %
36.72 %
278.76
278.76
Winners
Avg. Profit % Avg. Bars Held Max. Consecutive Largest win # bars in largest win Losers Total Loss Avg. Loss Avg. Loss % Avg. Bars Held Max. Consecutive Largest loss # bars in largest loss
11
11
2189.60
2189.60
388
388
6 (17.14 %)
6 (17.14 %)
-1726.59
-1726.59
-287.76
-287.76
-12.07 %
-12.07 %
379.67
379.67
2
2
-455.21
-455.21
810
810
Max. trade drawdown
-1286.35
-1286.35
Max. trade % drawdown
-53.88 %
-53.88 %
Max. system drawdown
-1693.69
-1693.69
Max. system % drawdown
-27.37 %
-27.37 %
Recovery Factor
5.24
5.24
CAR/MaxDD
0.59
0.59
RAR/MaxDD
0.69
0.69
Profit Factor
6.14
6.14
Payoff Ratio
1.27
1.27
956.01
956.01
Standard Error Risk-Reward Ratio
1.02
1.02
Ulcer Index
8.70
8.70
Ulcer Performance Index
1.22
1.22
Sharpe Ratio of trades
0.30
0.30
0.0328
0.0328
K-Ratio
(forrás: AmiBroker program, teszt futtatás) Az előző rendszerünkhöz viszonyítva sokkal biztatóbb eredményt kaptunk. A profitunk az adott időszak alatt (mely ne felejtsük el egy évvel rövidebb, mint az előző példában) 177% felett volt, mely éves bontásban is 16%-ot jelent. Szembetűnő, hogy jóval kevesebb ügyletünk 63
volt az adott időszak alatt, mindösszesen 35 és átlagban csak minden ötödik ügyletünk zárul veszteséggel. A profit faktorunk is jóval magasabb, mint az előző rendszer esetében. Ez egyértelműen jól néz ki így elsőre. Ne felejtsük el, hogy ez idáig figyelmen kívül hagytuk a jutalékot, mely majd rontani fog az eredményen, de az amerikai részvényekkel történő kereskedés az általunk használt volumenben számottevően nem befolyásolja végeredményt. Az elején fontosabb, hogy lássuk, hogy a rendszer képes-e egyáltalán profitot termelni. A másik tényező pedig, amit eddig nem vettünk figyelembe az, hogy kereskedhetünk tőkeáttétellel is, mely megtöbbszörözné a kapott eredményt. Ezek még csak „nyers” tesztek, melyek arra szolgálnak, hogy el tudjuk dönteni, érdemes-e a rendszerrel foglalkozni vagy sem. Mivel olyan sok paraméterünk van, hogy valamennyi egyidejű optimalizálása a logikailag indokolt tartományban egy mai számítógéppel is meglehetősen hosszú időt venne igénybe, ezért kénytelenek vagyunk részekre osztani. Igazából ebben az esetben érdemesebb a paraméterek optimalizálását manuálisan elvégezni. Az ésszerűség határán belül jó megközelítéssel meg tudjuk saccolni, hogy milyen értékek hoznak kielégítő profitot a többi jellemző elfogadható értéke mellett. Ezek alapján a következőket állítjuk be: MA=14 ADX=10 ADX rise by=0.2 RSI entry period=12 RSI exit period=9 RSI get in Strong Level=80 RSI get in Weak Level=50 RSI exit Level=75 Positionsize=33 Ezekkel a beállításokkal közel hasonló eredményt kapunk mint a kezdeti beállításokkal. Mivel ezek alapjában véve elfogadható értékek, megvizsgáljuk, hogy rendszerünk működőképes-e az out-of-sample adatsoron is. Az eredmény pedig:
64
10. sz.Táblázat All trades
Long trades
Initial capital
5000.00
5000.00
Ending capital
10931.33
10931.33
Net Profit Net Profit % Exposure %
5931.33
5931.33
118.63 %
118.63 %
84.72 %
84.72 %
140.03 %
140.03 %
Annual Return %
26.15 %
26.15 %
Risk Adjusted Return %
30.87 %
30.87 %
14
14 (100.00 %)
423.67
423.67
20.37 %
20.37 %
Net Risk Adjusted Return %
All trades Avg. Profit/Loss Avg. Profit/Loss % Avg. Bars Held
176.21
176.21
11 (78.57 %)
11 (78.57 %)
Total Profit
6992.49
6992.49
Avg. Profit
635.68
635.68
28.56 %
28.56 %
166.64
166.64
Winners
Avg. Profit % Avg. Bars Held Max. Consecutive Largest win # bars in largest win Losers Total Loss
10
10
1964.75
1964.75
114
114
3 (21.43 %)
3 (21.43 %)
-1061.16
-1061.16
Avg. Loss
-353.72
-353.72
Avg. Loss %
-9.68 %
-9.68 %
211.33
211.33
Avg. Bars Held Max. Consecutive Largest loss # bars in largest loss
2
2
-782.87
-782.87
238
238
Max. trade drawdown
-1809.27
-1809.27
Max. trade % drawdown
-50.89 %
-50.89 %
Max. system drawdown
-2763.95
-2763.95
Max. system % drawdown
-21.09 %
-21.09 %
Recovery Factor
2.15
2.15
CAR/MaxDD
1.24
1.24
RAR/MaxDD
1.46
1.46
Profit Factor
6.59
6.59
Payoff Ratio
1.80
1.80
1081.18
1081.18
Standard Error Risk-Reward Ratio
2.52
2.52
Ulcer Index
8.37
8.37
Ulcer Performance Index
2.48
2.48
Sharpe Ratio of trades
0.88
0.88
0.0839
0.0839
K-Ratio
(forrás: AmiBroker program, teszt futtatás) Vagyis ez azt jelenti, hogy rendszerünk jól vizsgázott, mivel hasonló, sőt még jobb eredményeket kaptunk, mint az in-sample adatsoron. Ezek után megpróbálkozhatunk a rendszer alkalmazásával a valós kereskedésben. Később természetesen a megszerzett 65
tapasztalatok
alapján
csiszolhatunk
rajta.
pozíciómérettel kipróbálni.
66
Érdemes
viszont
kezdetben
csökkentett
4 Végszó A dolgozatomban először ismertettem a programozott kereskedési rendszerek megjelenését, azt, hogy ezt mi tette lehetővé. Szó esett a programkereskedés, mint jelenség megítéléséről, bemutattam az egyik legelismertebb ilyen típusú kereskedő rövid életrajzát. A második részben
a
programfejlesztés
elméleti
megközelítésével
foglalkoztam,
részletesen
megvizsgálva a fejlesztés különböző fázisait. Kitértem a különböző fejlesztési lehetőségekre és behatóan tanulmányoztam a fejlesztés során felmerülő hibákat, nehézségeket. Végül a dolgozat harmadik részében két konkrét rendszer fejlesztését mutattam be a kiválasztott AmiBroker nevű szoftver segítségével. Az egyik egy pullback-típusú rendszer volt, amelyet végül el kellett vetni, a másik pedig egy indikátorokra épülő rendszer volt, mely az előzővel ellentétben az utolsó teszten is jól szerepelt és ezáltal további fejlesztésre és alkalmazásra is alkalmas. Remélem, hogy dolgozatom hasznos segítség lehet a téma iránt érdeklődőknek, és nemcsak a fejlesztési koncepció terén, hanem a gyakorlati megvalósítás során is felhasználható ötletekkel szolgál.
67
Irodalomjegyzék Mark. R. Conway, Aaron N. Behle (2003), Professional Stock Trading: System Design and Automation, AcmeTrader LLC USA Jeffrey Owen Katz, Donna L. McCormick (2003),The Encyclopedia of Trading Strategies, McGraw-Hill John Hill (2000), The Ultimate Trading Guide, John Wiley&Sons Inc. Howard B. Bandy (2007), Quantitative Trading Systems, Blue Owl Press, Inc. Jack D. Schwager (1990), Market Wizards (Interviews with top traders), Collins Business Adrian Buckley (1998), Bevezetés a nemzetközi pénzügyekbe, Panem Kft. Rotyis József (2001), Tőzsdei befektetők kézikönyve, KJK-Kerszöv Kft. Helmut Hornstein (2007), Így működik: tőzsdepszihológia befektetőknek, Z-Press Kft. Robert J. Shiller (2002), Tőzsdemámor, Alinea Kft. Czékus Mihály (2004), Tőzsdelexikon, Szukits Kft. Peter L. Bernstein (1998), Szembeszállni az istenekkel – a kockázatvállalás különös története, PANEM Kft. – John Wiley & Sons Aswath Damodaran (2006), Befektetések értékelése, PANEM Kft. Richard D. Wyckoff (1919), The Day Trader’s Bible, ePublishingEtc.com (edited – revised in 2001) Edwin Lefevre (1998), Reminiscences of a Stock Operator, Fraser Pub Co. Dr. Alexander Elder (2002), Come into my Trading Toom, John Wiley & Sons Chartcenter, 2005, „Technikai elemzés” Tőzsdetanfolyam, Chartcenter Tőzsdei Szakvizsga Felkészítő (2004), Középeurópai Brókerképző Alapítvány AmiBroker User’s Manual, 2007, (version 5.0), AmiBroker Co. Kőrös Gábor, 2005, Speciális Daytrade Stratégia, OTDK dolgozat Kőrös Gábor, 2006, Tőzsde és póker, OTDK dolgozat
68
Internet hivatkozások Wikipédia, Algorithmic trading, http://en.wikipedia.org/wiki/Algorithmic_trading, letöltve: 2007.09.25. Wikipédia, Ed Seykota, http://en.wikipedia.org/wiki/Ed_Seykota, letöltve: 2007.09.25. Ed Seykota (2003), The Trading Tribe, http://www.seykota.com, letöltve: 2007/10/18. IHT (2007/10/22), Citigroup, http://www.iht.com/articles/ap/2007/07/02/business/NA-FINCOM-US-Citigroup-Automated-Trading-Desk.php, letöltve: 2007/10/22 The Economist (2006/02/02), Moving Markets in trading patterns are making technology ever more inportant, http://www.economist.com/finance/displaystory.cfm?story_id=E1_VQSVPRT, letöltve: 2007/10/26 The Economist (2007/04/15), Looking for options Derivatives drive the battle of the exchanges, http://www.economist.com/finance/displaystory.cfm?story_id=E1_JDNPSQD, letöltve: 2007/10/26 Charles Duhigg (2003/11/23), Artifical intelligence applied heavily to picking stocks, http://www.iht.com/articles/2006/11/23/business/trading.php?page=1, letöltve: 2007/10/26 Financial Times (2006/10/02), Enter algorithmic trading systems race or lose returns, http://search.ft.com/ftArticle?querytext=%22algorithmic+trading%22&aje=true&id =061002000774, letöltve: 2007/10/27 Nyilasi, Tőzsdeblog (2007/10/15), http://nyilasi.tozsdeforum.hu/blog/blog.htm, letöltve: 2007/10/30 Tradingmarkets, http://www.tradingmarkets.com/.site/stocks/commentary/guestcom/GapsLaps.cfm, letöltve: 2007/10/20 Robosztus rendszer, http:// http://traderfeed.blogsport.com/2007/02/designing-robustmechanical-trading.html, letöltve: 2007/11/02 Aranyláz, (2005), http://aranylaz.freeblog.hu/archives/2005/11/11/944020, letöltve: 2007/10/15 Aranyláz, (2006a), http://aranylaz.freeblog.hu/archives/2006/11/22/1966144, letöltve: 2007/10/15 Aranyláz, (2006b), http://aranylaz.freeblog.hu/archives/2006/06/22/1658735, letöltve: 2007/10/15
69
Amibroker, http:// www.amibroker.com/library/detail.php?id=708, letöltve: 2007/10/18 Tradingmarkets, http://www.tradingmarkets.com/.site/stocks/commentary/editorial/NewResearch-on-PowerRatings-Entries-and-Exits.cfm, letöltve: 2007/11/05 Pullback, http://www.swing-trade-stocks.com/pullbacks.html, letöltve: 2007/11/10 Actonforex, http:// www.actionforex.com/articles_library/technical_analysis_articles/ combining_rsi_and_adx_20041108196, letöltve: 2007/11/10
70