Allmänt meddelande

Collapse
No announcement yet.

Backtestning innan Pro versionen

Collapse
X
 
  • Filter
  • Klockan
  • Show
Clear All
new posts

  • Backtestning innan Pro versionen

    Hej,
    Jag har behov av att kunna backtesta strategier.
    Har tidigare provat två andra enkla program med vinsttest funktion, men vill kunna omsätta idén till skript i NAT och testa i så lik miljö som möjligt, till rimlig tid förstås..

    Har läst runt en del på forumet. Har några allmänna frågor kring backtestning och några specifika för AT8. I väntans tider på NAT Pro.

    Är tacksam för tips, för att komma igång.

    Test data
    För OMX strategier. Bör man använda OMX30 Index eller terminer. Några för- och nackdelar?

    Om det är bättre med terminsdata. Kan man exportera datat, klippa ihop ett antal terminsmånader till ett nytt "instrument" och importera?
    Tanken är att det ska gå fortare att testa en längre period i ett svep.
    Möjlighet att dela in olika tidsperioder med olika börklimat och optimera.


    AT8 frågor
    Har AT8 intradagsdata på index och termin?
    Hur långt tilbaka finns det komplett data?

    Hur behöver ordermodellen utformas för att funka i AT8?
    Tittar jag på testbänken ser det ut som man har köp och säljskript

    Om man ska testa en strategi som kan ligga Long, Likvid och Short.
    Använder man då 4 ordermodeller/skript, två för repektive håll och testkör dem var för sig, Och räknar manuellt ihop?

    Kan man se Signal, Vinstkura och Instrument-kurva i graf?

    Av att läst andra trådar har jag sammanställt detta:
    • Backtestning görs i minutupplösning om du har Animering påslaget i Analysbänken.
    • Använda cmpref() för att köra simulering i 1 minut och annan upplösning samtidigt.
    • Att Animering är påslaget så att man får signal under hela perioderna precis som det blir "live".
    • Returvärdet i Inställningar i Analysbänken. Välj köp- och säljkurs så stämmer det oftast väldigt bra med verkligheten.
    • Man kan studera avkastningen i diagrammet efter en körning via högerklick > Visa analysbänkens delrapporter. Kan se hur drawdowns påverkar resultatet är att välja periodisering tex per vecka eller månad.
    Last edited by jimmy; 2012-05-06, 20:46.

  • #2
    NickTrader,
    Du postade detta avancerade skript i annan tråd, vad var anledningen till att du skrev det, är det något som inte gick att få fram med testfunktionen i AT8 eller annan anledning?

    Vill förstå vilka förutsättningar jag får för nedlagd tid att förska testa något i AT8 eller med NAT (ditt skript).


    Ursprungligen postat av NickoTrader Visa inlägg
    Lägger ut mitt backtestningascript. Med hjälp av detta tycker jag mig kunna se att antal affärer är av betydelse, beroende på hur träffsäker strategin är för övrigt.

    Sök på "Villkor" i texten så kan ni stoppa in era egna finurliga villkor, och backtesta dem.

    Ändra datum för hur långt bakåt ni vill backtesta under sektionen {Datum för terminen}

    Där det står {Beräkna ack vinst...} måste man vara uppmärksam på vad man stoppar in. Tänk på att i "backtest", alltså på historiska data, så ser AutoTrader endast H,L och C, inte vad som händer inne i stapel vilket gör denna sortens backtest mycket svår.

    Ändra kriterier under sektionen {Variabler att labba med} i början av scriptet.

    Vinstkurvan ritas gul i grafen.

    Tänkt innehav ritas i Analys1
    Affärer long/short i Analys 2.

    Om ni stoppar in detta script på index så ska det se ut som bilden.

    Håll till godo, hoppas det kan hjälpa oss framåt. Med reservation för eventuella fel och brister...


    ***************

    {Globala variabler
    640: Innehav
    641: Senaste tradekurs
    642: PT-kurs
    643: Ack vinst
    644: Förhindrar köp i samma riktning efter PT
    645: Förhindrar sälj i samma riktning efter PT
    646: Förhindrar fler köp den dan
    }

    {Variabler att labba med}
    test:=and(1,1)
    kprofittarget:=5 {PT köp}
    sprofittarget:=5 {PT sälj}
    ksllevel:=3.0 {stoploss köp}
    ssllevel:=3.0 {stoploss sälj}
    maxaffärer:=2 {max antal affärer per dag}
    grundnivå:=1010 {vilken nivå utfallskurvan startar på}
    profitdivider:=1 {dividerar utfallet. För visning endast}

    {long}
    kdatum_ok:=or(test,eqv(int(d),int(date())))
    kinnehav_ok:=if(test,eqv(GetGVar(640),0),Le(Portfolio(v),0))
    kperiod2:=Gt(Frac(d),0.399)

    {short}
    sdatum_ok:=or(test,eqv(int(d),int(date())))
    sstängning:=le(mult(1440,sub(market(c),if(test,frac(d),frac(date())))),15)
    sinnehav_ok:=if(test,eqv(GetGVar(640),0),Ge(Portfolio(v),0))
    speriod2:=Gt(Frac(d),0.399)

    {Datum för terminen. Nollar värdena innan rätt datum}
    {feldatum:=lt(int(d),int(Date(20120214)))} {2C}
    {feldatum:=lt(int(d),int(Date(20120114)))} {2B}
    {feldatum:=lt(int(d),int(Date(20111216)))} {2A}
    {feldatum:=lt(int(d),int(Date(20110715)))} {1G}
    feldatum:=lt(int(d),int(Date(20120124))) {INDEX}

    SetGVarIf(0,643,feldatum)
    SetGVarIf(0,640,feldatum) {Sätt innehav till 0 om fel datum}
    SetGVarIf(c,641,feldatum) {Sätt köp/säljkurs till senaste close om innan rätt datum}
    SetGVarIf(0,646,feldatum) {Nolla antal affärer innan rätt datum}
    innehav_ejnoll=not(eqv(GetGVar(640),0)) {används för att se om beräkning av vinst ska göras}

    {long}
    köppet=and(ge(mult(1440,sub(market(c),if(test,frac(d),frac(date())))),20),not(feldatum))

    {short}
    söppet=and(ge(mult(1440,sub(market(c),if(test,frac(d),frac(date())))),20),not(feldatum))

    i15(

    {Trend}
    mavg=mov(c,6,e)
    trendp=and(gt(aref(mavg,1),aref(mavg,2)),gt(sub(aref(h,1),aref(mavg,2)),0.0)) {positiv}
    trendn=and(lt(aref(mavg,1),aref(mavg,2)),gt(sub(aref(mavg,2),aref(l,1)),1.0)) {negativ}

    {long. Villkor för long}
    ksignalk0=gt(c,aref(c,1))
    ksignalk1=and(trendp,ksignalk0)
    ksignalk2=and(gt(macd(n),macd(t)),ksignalk1)
    köp1=And(And(ksignalk2,kperiod2),köppet)
    köp2=and(And(And(And(köp1,kinnehav_ok),kdatum_ok),1),lt(GetGVar(646),maxaffärer))

    draw(mult(ksignalk0,5),2,dgsbf)

    {Lägg in globala flaggor}
    ktriggerkurs=add(aref(h,1),0.25)

    SetGVarIf(sub(add(sub(GetGVar(641),ktriggerkurs),GetGVar(643)),0.25),643,and(köp2,innehav_ejnoll)) {Beräkna ack vinst om säljpris finns}
    SetGVarIf(add(ktriggerkurs,0.0),641,köp2) {Köpkurs = föregående H + 0.5 + koeff }
    SetGVarIf(1,640,köp2) {Innehav.}
    SetGVarIf(add(GetGVar(641),kprofittarget),642,köp2) {Lägg in profit target globalt. Close + PT}
    SetGVarIf(0,645,köp2) {Minns inte PT för sälj längre}
    SetGVarIf(Add(GetGVar(646),1),646,köp2) {Addera till antal affärer}

    {short. Villkor för short}
    ssignals0=lt(c,aref(c,1))
    ssignals1=and(trendn,ssignals0)
    ssignals2=and(lt(macd(n),macd(t)),ssignals1)
    sälj1=And(And(ssignals2,speriod2),söppet)
    sälj2=And(And(And(And(sälj1,sinnehav_ok),sdatum_ok),1),lt(GetGVar(646),maxaffärer))

    draw(mult(ssignals0,5),9,rsbf)

    {Lägg in globala flaggor}
    striggerkurs=sub(aref(l,1),0.25)

    SetGVarIf(sub(add(sub(striggerkurs,GetGVar(641)),GetGVar(643)),0.25),643,and(sälj2,innehav_ejnoll)) {Beräkna ack vinst om köppris finns}
    SetGVarIf(sub(striggerkurs,0.0),641,sälj2) {Säljkurs = triggernivå - 0.5}
    SetGVarIf(-1,640,sälj2) {Innehav}
    SetGVarIf(sub(GetGVar(641),sprofittarget),642,sälj2) {Lägg in profit target globalt. Close - PT}
    SetGVarIf(0,644,sälj2) {Minns inte PT för köp längre}
    SetGVarIf(Add(GetGVar(646),1),646,sälj2) {Addera till antal affärer}

    {--------------------------------------------------------------------------------------------------}


    {Exit long stop loss/profit target. Borde egentligen gå i 1 minuters ******************* }
    exitlongSLSignal=lt(l,sub(GetGVar(641),ksllevel))
    exitlongPTSignal=ge(h,GetGVar(642))
    exitlongPTinnehav=if(test,gt(GetGVar(640),0),Gt(Portfolio(v),0))

    exitlongPT=and(or(exitlongSLSignal,exitlongPTSignal),exitlongPTinnehav)
    SetGVarIf(0,640,exitlongPT) {Nolla innehav}
    SetGVarIf(add(sub(if(exitlongSLSignal,sub(0,ksllevel),kprofittarget),0.25),GetGVar(643)),643,exitlongPT) {Beräkna ack vinst +PT/-SL -0.25}
    SetGVarIf(add(sub(if(exitlongSLSignal,sub(0,ksllevel),kprofittarget),0.25),GetGVar(641)),641,exitlongPT) {Säljkurs / Nollning}
    SetGVarIf(1,644,exitlongPT) {Minns PT}

    {exit long stängning}
    exitlongstängning=le(mult(1440,sub(market(c),if(test,frac(d),frac(date())) ) ),15)
    exitlonginnehav=if(test,gt(GetGVar(640),0),Gt(Portfolio(v),0))
    exitlongtrailstop=and(and(and(lt(c,aref(l,2)),lt(c,aref(l,2))),lt(c,aref(l,3))),0)

    exitlongstängtot=And(or(exitlongtrailstop,exitlongstängning),exitlonginnehav)
    SetGVarIf(0,640,exitlongstängtot)
    SetGVarIf(add(sub(sub(c,GetGVar(641)),0.25),GetGVar(643)),643,exitlongstängtot) {Beräkna ack vinst dvs}
    SetGVarIf(c,641,exitlongstängtot) {Säljkurs / Nollning}
    SetGVarIf(0,644,exitlongstängning) {Minns inte PT}
    SetGVarIf(0,646,exitlongstängning) {Nolla antal affärer}
    mult(exitlongstängtot,10)

    {Rita flagga för PT och stängning}
    draw(Mult(or(sälj2,or(exitlongstängtot,exitlongPT)),-100),3,rddf) {säljflagga i analys 2}

    {--------------------------------------------------------------------------------------------------}
    {Exit short stop loss/profit target. Borde egentligen gå i 1 minuters ******************* }
    exitshortSLSignal=gt(h,add(GetGVar(641),ssllevel))
    exitshortPTSignal=le(l,GetGVar(642))
    exitshortPTinnehav=if(test,Lt(GetGVar(640),0),Lt(Portfolio(v),0))

    exitshortPT=and(or(exitshortPTSignal,exitshortSLSignal),exitshortPTinnehav)
    SetGVarIf(0,640,exitshortPT) {Nolla innehav}
    SetGVarIf(add(sub(if(exitshortSLSignal,sub(0,ssllevel),sprofittarget),0.25),GetGVar(643)),643,exitshortPT) {Beräkna ack vinst dvs +PT/-SL -0.25}
    SetGVarIf(add(sub(if(exitshortSLSignal,ssllevel,sub(0,sprofittarget)),0.25),GetGVar(641)),641,exitshortPT) {Säljkurs / Nollning}
    SetGVarIf(1,645,exitshortPT) {Minns PT}

    {exit short stängning}
    exitshortstängning=le(mult(1440,sub(market(c),if(test,frac(d),frac(date())))),15)
    exitshortinnehav=if(test,Lt(GetGVar(640),0),Lt(Portfolio(v),0))
    exitshorttrailstop=and(and(and(gt(c,aref(h,2)),gt(c,aref(h,2))),gt(c,aref(h,3))),0)

    exitshortstängtot=And(or(exitshorttrailstop,exitshortstängning),exitshortinnehav)
    SetGVarIf(0,640,exitshortstängtot)
    SetGVarIf(add(sub(sub(GetGVar(641),c),0.25),GetGVar(643)),643,exitshortstängtot) {Beräkna ack vinst}
    SetGVarIf(c,641,exitshortstängtot) {Köpkurs / Nollning}
    SetGVarIf(0,645,exitshortstängning) {Minns inte PT}
    SetGVarIf(0,646,exitshortstängning) {Nolla antal affärer}

    draw(Mult(or(köp2,or(exitshortstängtot,exitshortPT)),100),4,dgddf) {säljflagga i analys 2}


    {Rita innehav och transkurser}
    draw(mult(GetGVar(640),95),5,dgda) {simulerat innehav i analys 1}
    draw(GetGVar(641),6,mqb) {köp/säljkurs}
    draw(add(grundnivå,div(GetGVar(643),profitdivider)),7,bae) {Ack vinst}
    draw(add(grundnivå,div(GetGVar(643),profitdivider)),8,yqb) {Ack vinst}

    {Mult(exitshortinnehav,10)}
    )

    Comment


    • #3
      Hej Jimmy!

      När jag började utveckla mitt backtestningsscript så visste jag inte att man kunde få prova på AT8 och dess backtestmiljö. Samtidigt så har jag haft svårt att få till datat i AT8. Det funkar inget vidare att fylla på börsdata bakåt tycker jag.

      Sedan är det väldigt värdefullt tycker jag att ha en kurva där man direkt kan se vilka perioder ens skript går bra och inte så bra, samt att man med parameterjusteringar direkt kan se om den blir rakare eller ojämnare.

      Att den har sina nackdelar är jag medveten om, främst att det är väldigt svårt att få till en "live"-liknande testning, särskilt om man måste scripta funktioner som egentligen går i 15m till att bli "live" 15m baserat på minutdata.

      Jag backtestar nu bara på OMXS30 och signalerar även skarpt på det för att det är så mycket enklare att få en sammanhängande period. Nackdelen kan vara att det inte finns volym i index och därmed fungerar tex inte MFI. Den kan man ju dock ta in som CmpRef från exempelvis en termin.

      Hoppas detta ger dig ytterligare kött på benen

      Comment


      • #4
        Samtidigt så har jag haft svårt att få till datat i AT8. Det funkar inget vidare att fylla på börsdata bakåt tycker jag.
        Nej detta funkar inte alls för mig när det gäller termins data. Finns det något sätt att importera/få till komplett data när det gäller terminer - gäller även den nu aktuella maj terminen.

        Comment


        • #5
          Vad menar du med komplett data?
          Du kan köra kundservice och ladda från datakatalogen för NAT.

          Comment


          • #6
            Ursprungligen postat av Henric Visa inlägg
            Vad menar du med komplett data?
            Du kan köra kundservice och ladda från datakatalogen för NAT.
            Uh att ladda ner från NAT har jag inte ens tänkt på... Det är ju kanon i så fall. Jag göra det omgående imorgon

            Tack för hjälpen!

            Comment


            • #7
              Stort tack!

              nu fick jag in data in i AT8 från NAT katalogen.

              Kryssade instrument att ladda.
              Ladda från CD-skiva
              C:\ProgramData\NordnetAutoTrader\Data\

              Comment


              • #8
                Ursprungligen postat av jimmy Visa inlägg
                Stort tack!

                nu fick jag in data in i AT8 från NAT katalogen.

                Kryssade instrument att ladda.
                Ladda från CD-skiva
                C:\ProgramData\NordnetAutoTrader\Data\
                Revelation eller hur

                Comment


                • #9
                  Hej!
                  Jag undrar om ni sparar tickkurser i kundservice redan nu som man kan ha användning för sedan då Proversionen släpps då man vill backtesta?
                  mvh
                  Bertil

                  Comment


                  • #10
                    Ja, sedan årsskiftet när vi byggde ut med fler marknader ligger det tickkurser på Kundservice.

                    Comment

                    Working...
                    X