hétfő, július 08, 2013

Money Management I. rész - Stop-loss kezelés

Többször is említettem, hogy elengedhetetlenül fontos a Money Management (továbbiakban MM).
Miért is?

Azért, mert az MM-nek kettős feladata van egy forex robot esetében.
Az egyik feladat a kockázatkezelés, a másik pedig a nyereség maximalizálása. Ez utóbbi gondoskodik egyébként a gyengén teljesítő robot nyereségességéről, míg a kockázatkezelés a veszteségek minimalizálásáról.

A kockázatkezelés helytelen altgoritmizálása lehet ugyanolyan káros, mint az, ha rossz a robotunk pozíció nyitása. A kockázatkezelés legegyszerűbb módszeréül robot készítők többnyire az egyszerű stop-loss-t szokták választani, ami nem rossz döntés, de két hátránya van :

  • ha túl közel van, akkor a visszateszteknél kiüti és ezzel megakadályozza a hosszabb trendekben való részvételt, jól lehet a veszteség is alacsony marad, de a nyereség is
  • ha túl messze van, akkor ugyan benne tudunk maradni a hosszú trendekben, de hosszú távon sajnos - a nagy távolság miatt - komoly veszteségeket termel. Ne felejtsük el, hogy a piac 30%-ban trendel csak, a többi részében oldalazik. 
Mi lehet a megoldás? 
Kockázatot kezelni úgy lehet, ha tudja az ember, miféle kockázatra kell felkészülnie. A fenti két hátrány az, ami a legkomolyabb kockázat, ha stop-loss-t használunk, ha nem használunk, akkor viszont fel kell készülni a teljes számla elvesztésére! 
Tehát, hogyan védekezhetünk a fenti két esetben? A válasz egyszerűnek tűnik, de persze nem az. Az egyik megoldás az, ha követő stopot használunk. 

Követő stop esetében a legkomolyabb kérdés természetesen az, hogy milyen távolságban legyen a stop vonal az árhoz viszonyítva, illetve az is fontos szempont, hogy mikor kezdjük el húzni a stopot az ár után. 
A távolság persze szubjektív, tehát egy adott devizapár esetén ki kell kísérletezni backtest-tel, esetleg meg lehet próbálni optimalizálni is. Nyilván két fontos tényező befolyásolja:
  1. az egyik a spread, 
  2. a másik pedig az, hogy mit enged meg a bróker legkisebb stop távolságnak (stoplevel paraméter).
Ha meg van a távolság, akkor már csak azt kell eldönteni, hogy mikor kezdjük el húzni a stop vonalat. Erre három lehetőségünk adódik :
  1. Az árfolyam pozitív elmozdulása esetén azonnal - itt ugyebár el tudjuk érni azt, hogy a veszteségünket a lehető legkisebbre csökkentsük, de ezzel persze csak ámítjuk magunkat, mert ezt a módszert akkor választjuk, ha túl messze van a stop az ártól. Nagyjából mindig lesz veszteség, kisebb-nagyobb, mert a stoplevel túlságosan magas, vagy az időtáv kicsi.
  2. Amikor az árfolyam pozitív irányba elmegy legalább egy spread-nyit, akkor nullába húzzuk (breakeven stop, azaz fedezeti stop) és innentől indulhat a stop húzás - ami jó módszer arra, hogy legrosszabb esetben veszteség és nyereség nélkül jöjjünk ki a pozícióból. Igen ám, de a legtöbb brókernél a stoplevel, azaz a minimális stop távolság jóval nagyobb, mint a spread, tehát ez nem minden esetben járható. Ráadásul a kezdeti stop távolság itt is fontos tényező.
  3. Amikor az árfolyam pozitív irányba mozdul el, több, mint egy spread-nyit, és már valamekkora nyereség is realizálható lenne (1:1 Risk reward esetén természetesen ez a nyereség meg kell egyezzen a stop-loss veszteségével és ez az ideális), akkor a stop vonalunkat behúzzuk a spread határára és onnan húzzuk az ár után, ahogy megy felfelé - ez szintén jó módszer lehetne, ha a 2-es pontban említett akadály nem állna fenn a bróker oldaláról. Ekkor ugyanis vagy nyereséges, vagy stop-loss-nyi veszteséges pozíciókat zárnánk, és ha jól választjuk meg a minimális nyereség mértékét, és a stratégiánk találati aránya 50%-nál jobb, akkor máris nyereséges stratégiát alkotottunk.
A fentiekből látható, hogy kulcs kérdés a jó bróker megválasztása, amikor is a spread-ek alacsonyak és természetesen a stoplevel is alacsony, vagy esetleg nincs. 
Persze azonnal rávágja mindenki, hogy ezek bizony az ECN brókerek, ahol persze magas összeggel lehet csak tőkét nyitni. Pedig bármilyen hihetetlen, vannak nem ECN brókerek, aki stoplevel nélkül (akár tized PIP-pel az ár alatt) engednek stop-loss vonalat húzni, alacsony a belépési tőke és a spread-ek sem eget verőek!

Ilyen bróker az LMAX Exchange is. Bátran ajánlom, jó feltételekkel lehet náluk számlát nyitni!

Van azonban a fenti három módszernél egy sokkal jobb módszer is, ha már sikerült jó brókernél számlát nyitni! A módszert az szülte, hogy nyilvánvalóan nehéz jó teszteket futtatni, hogy eltaláljuk az optimális stop távolságot, ami minden piaci helyzetben megállja a helyzetét.
Egy jó forex robot képes alkalmazkodni a piaci helyzethez és képesnek kell lennie olyan stop távolságokat számítani, ami minden esetben jó. Na jó, de hogyan?

Ha fix stop távolságot használ a robot, akkor ha túl kicsi, gyorsan kiüti az árfolyam. Ha túl nagy, akkor a veszteséges pozíció zárások lesznek többségben és elúszik a pénzünk. Ha teszteket futtatunk, akkor láthatóvá válik ez a probléma. Ezen egy rendkívül egyszerű módszerrel lehet úrrá lenni. Ha a piac trendel, akkor lehet nagy stop távolságokat hagyni, ha pedig oldalazik, akkor ajánlatos minél kisebbeket választani, és inkább stoppolódjunk ki, ha nem megy semerre sem a piac. 
Erre tökéletes megoldás a piac volatilitásának figyelése, amikor is az ATR indikátor siet a segítségünkre. Van persze, aki a Parabolic SAR-t használja, de saját tapasztalatom az, hogy a Parabolic későn reagál és sokszor nehéz jól paraméterezni, hogy megbízható stop-okat adjon. Ehelyett ha long pozíciót nyitunk, akkor az előzőleg bezárt gyertya kanóc aljára ráteszünk egy ATR értéket és annyival lejjebb húzzuk meg a stop-loss vonalunkat (mínusz a spread természetesen), short esetén természetesen a kanóc tetejére számolunk rá ATR-nyit (és még egy spread-nyit). Finomításképpen be lehet iktatni egy szorzót, amely tovább növelheti a stop távolságot, de többnyire ez felesleges, mert az ATR stop húzás kellőképpen igazodik a piachoz.
Ha trendel a piac, akkor kellő stop távolságot tart, hogy a visszatesztek és a counter trendek esetében ne csapja ki az árfolyam a stopot, de amikor oldalazásba kezd a piac, akkor a volatilitás is csökken, közelebb kerül a stop-loss és ha esetleg megfordul a trend, a lehető legkisebb veszteséggel tudjuk realizálni a profitot. 

Ez talán a lehető legjobb stratégia a kockázatkezelésre. Nyilván ez nem minden devizapárnál jön be, de a legtöbbnél igen. A legjobban fluktuáló piacok azok, ahol ezt kamatoztatni lehet, tehát a major párokra kell koncentrálnunk, és persze a lehető legkisebb spread-del rendelkező párokra.

Az MM másik aspektusa - a kockázatkezelés mellett - a nyereségek maximalizálása. A nyereségek maximalizálásának is többféle módja létezik, bár a közös bennük mindig az úgynevezett pozíció építés nevű technika.

Erről azonban a következő post-ban lesz szó, hamarosan!

Addig is gondolkodtatónak íme egy indikátor, amely a lehetséges ATR stop-okat mutatja a gyertyák felett és alatt.


 //+------------------------------------------------------------------+  
 //|                           ATRStop.mq4 |  
 //|                  Copyright © 2010, János Antal |  
 //|                 http://tozsdecapak.blogspot.com |  
 //+------------------------------------------------------------------+  
 #property copyright "Copyright © 2010, János Antal"  
 #property link   "http://tozsdecapak.blogspot.com"  
   
 #property indicator_chart_window  
 #property indicator_buffers 2  
 #property indicator_color1 DodgerBlue  
 #property indicator_color2 Red  
   
 extern  int  ATR=50;  
 extern  int  Multiplier=1;  
 extern  bool Body=0;  
   
 double UP[], DN[];  
   
 int init()  
 {  
   SetIndexStyle(0,DRAW_LINE,0,2);  
   SetIndexBuffer(0,UP);  
   SetIndexLabel(0,"UP");  
   
   SetIndexStyle(1,DRAW_LINE,0,2);  
   SetIndexBuffer(1,DN);  
   SetIndexLabel(1,"DN");  
 }  
   
 int start()  
 {  
   int  counted_bars=IndicatorCounted();  
   double _ATR;  
     
   int limit = Bars-counted_bars;  
     
   for(int i=0;i<=limit;i++)  
   {  
    _ATR=iATR(Symbol(),Period(),ATR,i);  
    if (!Body)  
    {  
      UP[i]=iHigh(Symbol(),Period(),i)+_ATR*Multiplier;  
      DN[i]=iLow(Symbol(),Period(),i)-_ATR*Multiplier;  
    }else  
    {  
      if (iOpen(Symbol(),Period(),i) > iClose(Symbol(),Period(),i))    // Piros gyertya  
      {  
       UP[i]=iOpen(Symbol(),Period(),i)+_ATR*Multiplier;  
       DN[i]=iClose(Symbol(),Period(),i)-_ATR*Multiplier;  
      }else if (iOpen(Symbol(),Period(),i) < iClose(Symbol(),Period(),i)) // Zöld gyertya  
      {  
       UP[i]=iClose(Symbol(),Period(),i)+_ATR*Multiplier;  
       DN[i]=iOpen(Symbol(),Period(),i)-_ATR*Multiplier;  
      }else if (iOpen(Symbol(),Period(),i) == iClose(Symbol(),Period(),i)) // Doji gyertya  
      {  
       UP[i]=iOpen(Symbol(),Period(),i)+_ATR*Multiplier;  
       DN[i]=iClose(Symbol(),Period(),i)-_ATR*Multiplier;  
      }  
    }  
   }  
 }  

És némi magyarázat a kódhoz :

  • ATR : ez természetesen az ATR indikátor periódus paramétere
  • Multiplier : ez az a bizonyos szorzó, egész szám! Ennyiszeresére szorozza fel a normál ATR értéket
  • Body : ha 0 értékre állítjuk, akkor a gyertya kanócokra számítja rá az ATR értéket, ha bármi másra, akkor gyertya testre számol rá ATR-nyit
A kék vonal a short pozíciók lehetséges stop-loss pontjait köti össze, a piros pedig a long-okét. Természetesen minden esetben az előző gyertyára számított értéket van értelme figyelembe venni, hiszen az aktuális gyertya még nem zárult be, vagyis folyamatosan változ(hat)nak az értékek.

Jó nézelődést!