Upload
david-szabolcs
View
21
Download
5
Embed Size (px)
DESCRIPTION
Programozott kereskedési rendszerek
Citation preview
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.
3
TARTALOMJEGYZÉK
1 A programkereskedés kialakulása...................................................................................... 6
1.1 Ed Seykota.................................................................................................................. 8
1.2 Programozott kereskedés megítélése ......................................................................... 9
2 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 Ötlet.......................................................................................................................... 18
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 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
3 Megvalósítás .................................................................................................................... 46
3.1 Pullback Kereskedési Rendszer ............................................................................... 46
3.2 Indikátor rendszer..................................................................................................... 59
4 Végszó.............................................................................................................................. 67
4
Ábrajegyzék
1. sz. Ábra ................................................................................................................ 15
2. sz. Ábra ................................................................................................................ 20
3. sz. Ábra ................................................................................................................ 43
4. sz. Ábra ................................................................................................................ 50
5. sz. Ábra ................................................................................................................ 55
5
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
6
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
7
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 50-
50%-ban történik a nap első ill. a nap második felében.
8
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
9
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 ’29-
es 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
10
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.
11
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.
12
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.
13
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
14
Á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
15
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
16
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öz-
ill. sajáttőke-arányos nyereség, EPS (Earning Per Share) – egy részvényre jutó eredmény, az
osztalékfizetési ráta.
17
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
18
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,
19
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
20
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
21
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
22
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
23
felfelé, akkor az első emelkedő gyertya után belevehetünk és egyúttal a lokális alj alatt stop-
polhatunk 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,
24
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.
25
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
26
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
27
ú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.
28
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
29
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.
30
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
31
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.
32
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
33
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.
34
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.
35
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.
36
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
37
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.
38
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.
39
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.
40
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ó.
41
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
42
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.
43
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
44
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-of-
sample 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.
45
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.
46
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
47
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
48
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;
49
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 );
50
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
51
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!
52
6. sz.Táblázat All trades Long trades
Initial capital 5000.00 5000.00
Ending capital 9153.60 9153.60
Net Profit 4153.60 4153.60
Net Profit % 83.07 % 83.07 %
Exposure % 44.90 % 44.90 %
Net Risk Adjusted Return % 185.02 % 185.02 %
Annual Return % 8.00 % 8.00 %
Risk Adjusted Return % 17.82 % 17.82 %
All trades 715 715 (100.00 %)
Avg. Profit/Loss 5.81 5.81
Avg. Profit/Loss % 0.23 % 0.23 %
Avg. Bars Held 6.04 6.04
Winners 295 (41.26 %) 295 (41.26 %)
Total Profit 22558.26 22558.26
Avg. Profit 76.47 76.47
Avg. Profit % 2.47 % 2.47 %
Avg. Bars Held 8.29 8.29
Max. Consecutive 7 7
Largest win 544.02 544.02
# bars in largest win 7 7
Losers 420 (58.74 %) 420 (58.74 %)
Total Loss -18404.66 -18404.66
Avg. Loss -43.82 -43.82
Avg. Loss % -1.35 % -1.35 %
Avg. Bars Held 4.46 4.46
Max. Consecutive 11 11
Largest loss -299.52 -299.52
# bars in largest loss 5 5
Max. trade drawdown -299.52 -299.52
Max. trade % drawdown -11.34 % -11.34 %
Max. system drawdown -957.76 -957.76
Max. system % drawdown -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
Standard Error 417.60 417.60
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
K-Ratio 0.0446 0.0446
(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.01-
2007.11.09) az 5000$ kiinduló tőkénkből 9153$-t csináltunk. Ez 4153$ összprofitot jelent. Ez
53
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ó
54
é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!
55
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!
56
7. sz.Táblázat All trades Long trades
Initial capital 5000.00 5000.00
Ending capital 14131.52 14131.52
Net Profit 9131.52 9131.52
Net Profit % 182.63 % 182.63 %
Exposure % 56.36 % 56.36 %
Net Risk Adjusted Return % 324.04 % 324.04 %
Annual Return % 14.14 % 14.14 %
Risk Adjusted Return % 25.09 % 25.09 %
All trades 860 860 (100.00 %)
Avg. Profit/Loss 10.62 10.62
Avg. Profit/Loss % 0.26 % 0.26 %
Avg. Bars Held 6.22 6.22
Winners 353 (41.05 %) 353 (41.05 %)
Total Profit 37230.64 37230.64
Avg. Profit 105.47 105.47
Avg. Profit % 2.83 % 2.83 %
Avg. Bars Held 8.71 8.71
Max. Consecutive 5 5
Largest win 1558.12 1558.12
# bars in largest win 11 11
Losers 507 (58.95 %) 507 (58.95 %)
Total Loss -28099.13 -28099.13
Avg. Loss -55.42 -55.42
Avg. Loss % -1.52 % -1.52 %
Avg. Bars Held 4.49 4.49
Max. Consecutive 14 14
Largest loss -562.15 -562.15
# bars in largest loss 3 3
Max. trade drawdown -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
Standard Error 1311.02 1311.02
Risk-Reward Ratio 0.45 0.45
Ulcer Index 12.25 12.25
Ulcer Performance Index 0.71 0.71
Sharpe Ratio of trades 0.55 0.55
K-Ratio 0.0160 0.0160
(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
57
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. Hát
nézzük a nagy próbát!
58
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 %
All trades 263 263 (100.00 %)
Avg. Profit/Loss 0.58 0.58
Avg. Profit/Loss % 0.05 % 0.05 %
Avg. Bars Held 3.54 3.54
Winners 105 (39.92 %) 105 (39.92 %)
Total Profit 7629.91 7629.91
Avg. Profit 72.67 72.67
Avg. Profit % 2.73 % 2.73 %
Avg. Bars Held 4.78 4.78
Max. Consecutive 5 5
Largest win 289.29 289.29
# bars in largest win 7 7
Losers 158 (60.08 %) 158 (60.08 %)
Total Loss -7477.59 -7477.59
Avg. Loss -47.33 -47.33
Avg. Loss % -1.74 % -1.74 %
Avg. Bars Held 2.72 2.72
Max. Consecutive 7 7
Largest loss -161.98 -161.98
# bars in largest loss 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
Standard Error 455.82 455.82
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
K-Ratio -0.0119 -0.0119
(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
59
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.
60
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);
61
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)<Ref(MA(C,MAPeriod),1),Close,0); //Strong Side //Weak Side Buy2=IIf(ADX(ADXPeriod)<(Ref(ADX(ADXPeriod),1)+ADXriseby),IIf((RSI(RSIentryPeriod)<RSIgetinStrongLevel),Close,0),IIf((RSI(RSIentryPeriod)<RSIgetinWeakLevel),Close,0)); Buy3=ADX(ADXPeriod)>(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 ADX-
nek 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.
62
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!
63
9. sz.Táblázat All trades Long trades
Initial capital 5000.00 5000.00
Ending capital 13872.98 13872.98
Net Profit 8872.98 8872.98
Net Profit % 177.46 % 177.46 %
Exposure % 84.86 % 84.86 %
Net Risk Adjusted Return % 209.13 % 209.13 %
Annual Return % 16.05 % 16.05 %
Risk Adjusted Return % 18.92 % 18.92 %
All trades 35 35 (100.00 %)
Avg. Profit/Loss 253.51 253.51
Avg. Profit/Loss % 28.36 % 28.36 %
Avg. Bars Held 296.06 296.06
Winners 29 (82.86 %) 29 (82.86 %)
Total Profit 10599.57 10599.57
Avg. Profit 365.50 365.50
Avg. Profit % 36.72 % 36.72 %
Avg. Bars Held 278.76 278.76
Max. Consecutive 11 11
Largest win 2189.60 2189.60
# bars in largest win 388 388
Losers 6 (17.14 %) 6 (17.14 %)
Total Loss -1726.59 -1726.59
Avg. Loss -287.76 -287.76
Avg. Loss % -12.07 % -12.07 %
Avg. Bars Held 379.67 379.67
Max. Consecutive 2 2
Largest loss -455.21 -455.21
# bars in largest loss 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
Standard Error 956.01 956.01
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
K-Ratio 0.0328 0.0328
(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
64
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:
65
10. sz.Táblázat All trades Long trades
Initial capital 5000.00 5000.00
Ending capital 10931.33 10931.33
Net Profit 5931.33 5931.33
Net Profit % 118.63 % 118.63 %
Exposure % 84.72 % 84.72 %
Net Risk Adjusted Return % 140.03 % 140.03 %
Annual Return % 26.15 % 26.15 %
Risk Adjusted Return % 30.87 % 30.87 %
All trades 14 14 (100.00 %)
Avg. Profit/Loss 423.67 423.67
Avg. Profit/Loss % 20.37 % 20.37 %
Avg. Bars Held 176.21 176.21
Winners 11 (78.57 %) 11 (78.57 %)
Total Profit 6992.49 6992.49
Avg. Profit 635.68 635.68
Avg. Profit % 28.56 % 28.56 %
Avg. Bars Held 166.64 166.64
Max. Consecutive 10 10
Largest win 1964.75 1964.75
# bars in largest win 114 114
Losers 3 (21.43 %) 3 (21.43 %)
Total Loss -1061.16 -1061.16
Avg. Loss -353.72 -353.72
Avg. Loss % -9.68 % -9.68 %
Avg. Bars Held 211.33 211.33
Max. Consecutive 2 2
Largest loss -782.87 -782.87
# bars in largest loss 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
Standard Error 1081.18 1081.18
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
K-Ratio 0.0839 0.0839
(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
66
tapasztalatok alapján csiszolhatunk rajta. Érdemes viszont kezdetben csökkentett
pozíciómérettel kipróbálni.
67
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.
68
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
69
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-FIN-
COM-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-robust-
mechanical-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
70
Amibroker, http:// www.amibroker.com/library/detail.php?id=708, letöltve: 2007/10/18 Tradingmarkets, http://www.tradingmarkets.com/.site/stocks/commentary/editorial/New-
Research-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