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

Programozott kereskedési rendszerek

Embed Size (px)

DESCRIPTION

Programozott kereskedési rendszerek

Citation preview

Page 1: Programozott kereskedési rendszerek

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.

Page 2: Programozott kereskedési rendszerek

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

Page 3: Programozott kereskedési rendszerek

4

Ábrajegyzék

1. sz. Ábra ................................................................................................................ 15

2. sz. Ábra ................................................................................................................ 20

3. sz. Ábra ................................................................................................................ 43

4. sz. Ábra ................................................................................................................ 50

5. sz. Ábra ................................................................................................................ 55

Page 4: Programozott kereskedési rendszerek

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

Page 5: Programozott kereskedési rendszerek

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

Page 6: Programozott kereskedési rendszerek

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.

Page 7: Programozott kereskedési rendszerek

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

Page 8: Programozott kereskedési rendszerek

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

Page 9: Programozott kereskedési rendszerek

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.

Page 10: Programozott kereskedési rendszerek

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.

Page 11: Programozott kereskedési rendszerek

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.

Page 12: Programozott kereskedési rendszerek

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

Page 13: Programozott kereskedési rendszerek

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

Page 14: Programozott kereskedési rendszerek

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

Page 15: Programozott kereskedési rendszerek

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.

Page 16: Programozott kereskedési rendszerek

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

Page 17: Programozott kereskedési rendszerek

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,

Page 18: Programozott kereskedési rendszerek

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

Page 19: Programozott kereskedési rendszerek

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

Page 20: Programozott kereskedési rendszerek

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

Page 21: Programozott kereskedési rendszerek

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

Page 22: Programozott kereskedési rendszerek

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,

Page 23: Programozott kereskedési rendszerek

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.

Page 24: Programozott kereskedési rendszerek

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

Page 25: Programozott kereskedési rendszerek

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

Page 26: Programozott kereskedési rendszerek

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.

Page 27: Programozott kereskedési rendszerek

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

Page 28: Programozott kereskedési rendszerek

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.

Page 29: Programozott kereskedési rendszerek

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

Page 30: Programozott kereskedési rendszerek

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.

Page 31: Programozott kereskedési rendszerek

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

Page 32: Programozott kereskedési rendszerek

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.

Page 33: Programozott kereskedési rendszerek

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.

Page 34: Programozott kereskedési rendszerek

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.

Page 35: Programozott kereskedési rendszerek

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

Page 36: Programozott kereskedési rendszerek

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.

Page 37: Programozott kereskedési rendszerek

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.

Page 38: Programozott kereskedési rendszerek

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.

Page 39: Programozott kereskedési rendszerek

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

Page 40: Programozott kereskedési rendszerek

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

Page 41: Programozott kereskedési rendszerek

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.

Page 42: Programozott kereskedési rendszerek

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

Page 43: Programozott kereskedési rendszerek

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.

Page 44: Programozott kereskedési rendszerek

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.

Page 45: Programozott kereskedési rendszerek

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

Page 46: Programozott kereskedési rendszerek

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

Page 47: Programozott kereskedési rendszerek

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;

Page 48: Programozott kereskedési rendszerek

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 );

Page 49: Programozott kereskedési rendszerek

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

Page 50: Programozott kereskedési rendszerek

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!

Page 51: Programozott kereskedési rendszerek

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

Page 52: Programozott kereskedési rendszerek

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ó

Page 53: Programozott kereskedési rendszerek

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!

Page 54: Programozott kereskedési rendszerek

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!

Page 55: Programozott kereskedési rendszerek

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

Page 56: Programozott kereskedési rendszerek

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!

Page 57: Programozott kereskedési rendszerek

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

Page 58: Programozott kereskedési rendszerek

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.

Page 59: Programozott kereskedési rendszerek

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);

Page 60: Programozott kereskedési rendszerek

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.

Page 61: Programozott kereskedési rendszerek

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!

Page 62: Programozott kereskedési rendszerek

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

Page 63: Programozott kereskedési rendszerek

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:

Page 64: Programozott kereskedési rendszerek

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

Page 65: Programozott kereskedési rendszerek

66

tapasztalatok alapján csiszolhatunk rajta. Érdemes viszont kezdetben csökkentett

pozíciómérettel kipróbálni.

Page 66: Programozott kereskedési rendszerek

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.

Page 67: Programozott kereskedési rendszerek

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

Page 68: Programozott kereskedési rendszerek

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

Page 69: Programozott kereskedési rendszerek

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