Strategia ja sen testaus: Osa8

Pörssisysteemejä testataan useammin väärin kuin oikein. Yksi klassinen esimerkki on, että käytetään indikaattorin laskennassa sellaisia arvoja mitä ei laskentahetkellä vielä ole olemassa. Eli katsotaan takaisinlaskennassa tulevaisuuteen. Pekka Valkonen kehotti lukemaan Kari Laakson artikkelin Piksussa ja innostuin tästä testaamaan Coppock-indeksiä.  Koodasin AmiBrokeriin Coppock-indeksi koodin:

SetPositionSize(1,spsShares );
MonthPrice = TimeFrameGetPrice( "C", inMonthly, -1 );
Coppock = WMA(ROC(MonthPrice,14)+ROC(MonthPrice, 11),10);
Plot(Coppock, "Coppock", colorRed);

Tässä tein oikein eli käytin edellisen kuukauden close arvoa (oletan, että minulla on päivä-data) rivi 2. Jos olisin käyttänyt arvo 0, eli tätä kuuta niin olisin katsonut tulevaisuuteen. Tietäisin jo mikä on kuukauden close-arvo vaikka käyn vain päiväarvoja lävitse. Tämä virhe on yleisempi kuin harvinainen, kun käytämme eri ajanindikaattoreita samassa kuvassa. Alla on piirretty Coppock-indikaattori OMXH25 indeksiin.

 

4 thoughts on “Strategia ja sen testaus: Osa8

  1. Sir

    Hei,

    Siinä tulikin esille mielenkiintoinen ohjelma, jota en ole ennen noteerannut. Amibroker siis.

    Miten tuohon softaan saisi OMXH quotet? Saako nämä päivittymään automaattisesti?

     

    -Sir

    1. Data feed

      Data ostetaan erikseen. Voit käyttää ilmaisia lähteitä, kuten yahoota. Mutta siellä ei ole suomen kursseja, joten joudut ostamaan ne esignalilta. Esignalilta saa lähes kaikkialle datan reaaliaikaisena, se ei tosin ole aivan halpaa. Katso http://www.esignal.com sivulta. Heillä on oma ohjelma, mutta mielestäni Amibroker on parempi. Se on paljon joustavampi.

  2. Oikea Coppock-indikaattorin koodi

    Hei Jarno,

    Vältit tulevaisuuteen katsomisen Amibroker-koodissasi, mutta muuten se on melko pielessä mm. ROCit tulevat kaavassasi päivien jaksoilta eikä kuukausien kuten pitäisi.

    Alla on oikea alkuperäinen Coppock-indikaattori (päiväkuvaajassa arvo vaihtuu vain kuun ensimmäisenä päivänä) ja aikavälejä päiviksi muuttaen tehty nopeammin reagoiva Coppock Daily. Alinna olevassa kuvassa näkyy molemmat indikaattorit HEX25 EOD-kurssista laskettuna.

    Olen rakentanut eri strategioiden toteutuksia mm. kotimaisille ja ulkomaisille osakkeille ja rahastoille Amibrokeria hyödyntäen useiden vuosien ajan. Kauttani saa edullisesti EOD-kursseja mm. Helsingin osakkeet ja indeksit sekä Suomessa myytävät rahastot. Autan tarvittaessa rakentamaan Amibroker-indikaattoreita tai vaikka täysin automatisoidun päiväkaupankäyntijärjestelmän.

    Parhain terveisin,

    Jaakko

    jaakko.valli@tut.fi

     

    // Coppock Indicator

    // (C) Vallum Oy 2009-

    TimeFrameSet(inMonthly);

    Coppock=WMA(ROC(Close,11)+ROC(Close,14),10);

    TimeFrameSet(inDaily);

    Coppock_monthly=TimeFrameExpand(Coppock,inMonthly);

    UpOrDn=Flip(Coppock_monthly>Ref(Coppock_monthly,-1),Coppock_monthly<Ref(Coppock_monthly,-1));

    GreenOrRed=IIf(UpOrDn==1,colorGreen,colorRed);

    Plot(Coppock_monthly,"Coppock",GreenOrRed);

     

    // Coppock Daily Indicator

    // (C) Vallum Oy 2009-

    Coppock_daily=WMA(ROC(Close,233)+ROC(Close,296),210);

    UpOrDn=Flip(Coppock_daily>Ref(Coppock_daily,-1),Coppock_daily<Ref(Coppock_daily,-1));

    GreenOrRed=IIf(UpOrDn==1,colorGreen,colorRed);

    Plot(Coppock_daily,"Coppock_daily",GreenOrRed);

     

     

    1. Olet oikeassa!

      Koodissani käytettiin kuukausiarvoja käyttäen TimeFrameGetPrice funktiota. 
      Mutta tein kieltämättä virheen timeframen kanssa kun laskin ROC ja WMA, laskin ne päiväarvoista. 
      Näissä tekee helposti virheitä joten täytyy olla tarkempana. 
      http://en.wikipedia.org/wiki/Coppock_curve. 

       

      SetPositionSize(1,spsShares );

      TimeFrameSet(inMonthly);

      CoppockMonthly = WMA((ROC(C,14)+ROC(C, 11)),10);

      TimeFrameRestore();

      DayCoppock = TimeFrameExpand( CoppockMonthly, inMonthly);

      Plot(DayCoppock, "Coppock", colorRed);

       

      Buy = DayCoppock<0 AND Ref(DayCoppock, -1)<Ref(DayCoppock, 0);

      Sell = DayCoppock>0 AND Ref(DayCoppock, -1)>Ref(DayCoppock, 0);

      Buy = ExRem( Buy, Sell );

      Sell = ExRem( Sell, Buy );

      Ajoin tämän DJIA indeksin kanssa ja saimme kauppoja seuraavasti:
       

      Tämä tyyli tuottaa kauppoja varsin harvoin, mutta se löytää varsin kivasti halpoja ostohetkiä. Tämän 
      indikaattorin hyvyyttä on vaikea arvioida, koska kauppoja tulee niin harvoin.
      
      Tästäkin esimerkistä huomataan, että nämä tällaiset ohjelmat mitkä soveltuvat backtestaukseen ovat tehokkaita
      ja varsin yksinkertaisia käyttää vaikka niillä on mahdollista testata myös hyvin mutkikkaita systeemejä.
      
      Kiitos vielä Jaakko kun huomasit virheen.
      

Comments are closed.

Related Posts