Allmänt meddelande

Collapse
No announcement yet.

Volume Profile

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

  • Volume Profile

    Det snackas mycket om volume profile på nätet. Jag har inte satt mig in i exakt hur det fungerar egentligen, men gjorde en snabb test enligt min tolkning:

    1. En eller flera toppar i volymen visar att marknaden omsatt mest pengar vid en viss prisnivå, vilket tolkas som den "rätta" prislappen enligt marknaden. Det låter rimligt, och borde därmed kunna utgöra en "vägdelare" för om man ska köpa eller blanka osv.

    2. Testmodellen definierar topp i volym som 10 perioders EMA på volym, och en stapel i mitten ska vara högre än de båda staplarna till vänster och höger.

    3. De fyra senaste topparna enligt definition i punkt 2 returnerar varsin prisnivå med Find()-kommandot. Dessa fyra prisnivåer vägs samman till en "medelnivå" som anses vara marknadens rätta pris på aktien. Priset ska alltså tendera att återvända till den här nivån.

    4. En köpgräns skulle kunna definieras som prisnivån i punkt 3 minus 1 standardavvikelse för de senaste 20 staplarna. Om kursen når över senaste 5 staplarnas High men fortfarande är under köpgränsen köps aktien.

    5. En säljgräns definieras som prisnivån i punkt 3 plus 1 standardavvikelse för de senaste 20 staplarna. Om kursen når över denna gräns och därefter faller under de två föregående staplarnas Low säljs aktien.



    Ingen stoploss finns i systemet i nuläget, det är bara tänkt för att se om vi kan hitta en bra modell som kan användas generellt. Jag tänkte att forumet skulle kunna utveckla det och ta det vidare. Det kanske allra viktigaste till att börja med är ju att avgöra om min tolkning är någorlunda rätt, eller om jag är helt ute och cyklar.





    Bifogar lite simulerade resultat.




    i60(
    vmed=ema(v,10)
    vbota=and(lt(aref(vmed,2),aref(vmed,1)),lt(aref(vmed,2),aref(vmed,3)))
    vbotb=and(lt(aref(vmed,3),aref(vmed,4)),lt(aref(vmed,4),aref(vmed,5)))
    vbotc=and(vbota,vbotb)
    vtoppa=and(gt(aref(vmed,2),aref(vmed,1)),gt(aref(vmed,2),aref(vmed,3)))
    vtoppb=and(gt(aref(vmed,3),aref(vmed,4)),gt(aref(vmed,4),aref(vmed,5)))
    vtoppc=and(vtoppa,vtoppb)
    toppv1=find(vtoppc,100,aref(c,2),1)
    toppv2=find(vtoppc,100,aref(c,2),2)
    toppv3=find(vtoppc,100,aref(c,2),3)
    toppv4=find(vtoppc,100,aref(c,2),4)
    price=div(add(add(toppv1,add(toppv2,toppv3)),toppv4),4)
    level=sub(price,stdev(c,20))
    draw(price,2,dgqbw)
    draw(level,3,bqbw)
    draw(vmed,4,bav)
    ej_innehav=le(portfolio(v),0)
    köp1=and(and({vbotc}1,lt(c,level)),ej_innehav)
    köp2=and(köp1,gt(c,hhv(aref(h,1),5)))
    mult(köp2,10)






    i60(
    vmed=ema(v,10)
    vbota=and(lt(aref(vmed,2),aref(vmed,1)),lt(aref(vmed,2),aref(vmed,3)))
    vbotb=and(lt(aref(vmed,3),aref(vmed,4)),lt(aref(vmed,4),aref(vmed,5)))
    vbotc=and(vbota,vbotb)
    vtoppa=and(gt(aref(vmed,2),aref(vmed,1)),gt(aref(vmed,2),aref(vmed,3)))
    vtoppb=and(gt(aref(vmed,3),aref(vmed,4)),gt(aref(vmed,4),aref(vmed,5)))
    vtoppc=and(vtoppa,vtoppb)
    toppv1=find(vtoppc,100,aref(c,2),1)
    toppv2=find(vtoppc,100,aref(c,2),2)
    toppv3=find(vtoppc,100,aref(c,2),3)
    toppv4=find(vtoppc,100,aref(c,2),4)
    price=div(add(add(toppv1,add(toppv2,toppv3)),toppv4),4)
    level=add(price,stdev(c,20))
    innehav=gt(portfolio(v),0)
    sell1=and(hhv(gt(c,level),3),innehav)
    sell2=and(sell1,lt(c,llv(aref(l,1),2)))
    mult(sell2,10)
    )




    )
    Attached Files

  • #2
    Spännande! jag handlar inte VP själv men har en polare som handlar bonds med VP, han tipsade mig om bloggen trade2fade.com, där finns mycket bra material. Risken jag ser med din tolkning är att endast toppar i volym används för att hitta "fair value" medans traditionell VP hittar området med all volym. Men det ser ju ut som en bra början iaf!

    Comment


    • #3
      Som Holfve22 säger så letar man inte efter toppar på volymkurvan utan man betraktar all volym för hela diagrammet/undersökningsintervallet.

      Vad man letar efter är prisintervall/prisområden inom vilka summan av all volym är markant högre än inom andra prisintervall. Dessa prisintervall tjänar sedan som stöd/motståndsnivåer för framtida agerande. Man tillåter inte köp om kursen befinner sig inom ett motståndsintervall exempelvis. Samma sak med sälj.

      Comment


      • #4
        Ok, men det borde ju bli bra nära samma sak? Om man tar ut priserna vid de senaste volymtopparna borde man ju få den prisnivå ungefär där det omsatts mest. Jag testade först att utlösa köp när man precis passerat en volymbotten också, tanken är i så fall att det pris där det omsatts minst är "mest fel" vilket bör innebära störst chans till korrigering. Fick dock bättre resultat med den signal som triggar nu, men jag ska fortsätta labba lite med volymbottnar.

        Comment


        • #5
          Nja, för att uttrycka sig lite mer strikt så ska man göra en volymdistribution på prisaxeln och det är inte riktigt samma sak.

          Comment


          • #6
            http://www.youtube.com/watch?v=TpAWzm-a4Pw&feature=plcp

            Här har du en bra beskrivning Rikard, kan börja titta vid 1:40. Som du nämner är även lågvolymområden viktiga då de visar unfair value och det troliga är att priset rör sig tillbaka till högvolymområdet igen, fair value

            Comment


            • #7
              Ursprungligen postat av Holfve22 Visa inlägg
              http://www.youtube.com/watch?v=TpAWzm-a4Pw&feature=plcp

              Här har du en bra beskrivning Rikard, kan börja titta vid 1:40. Som du nämner är även lågvolymområden viktiga då de visar unfair value och det troliga är att priset rör sig tillbaka till högvolymområdet igen, fair value
              Huvudkonceptet med VP är volym(eller tid) per pris. Skulle det gå att göra den beräkningen på något sätt? Rikards metod verkar vara en bra approximation och utgångspunkt. Jag har inte tittat närmare på modellen, men det skulle vara intressant att prova ett volymviktat medelvärde.

              Comment


              • #8
                Kanske går att göra ett medelvärde som efterliknar det ganska bra men problemet är att du inte kan urskilja ett volymområde från ett annat. Tanken med Volymbulan som uppstår är ju att korta unfair highs och köpa unfair lows i rangen som bildas. När priset sedan trendar iväg så uppstår en ny volymbula vid nytt fair price. Kanske går att lösa med att endast handla när medelvärdet intre har någon lutning. Men eftersom volym- och prisinfo finns så borde väl inte den tekniska lösningen med att rita volym per pris istället för tid vara ett hinder?

                Comment


                • #9
                  Diagrammen för VP ritas med pris och tid, samt volym i prisaxeln. Det görs nog inte på en kafferast. Det går nog att göra scriptvägen. Tar nog mycket resurser, samt att det inte går att se visuellt. Vi har kommit lite off topic. Vi diskuterar två saker. VP generellt och vidareutveckling av Rikards volymmodell.

                  Comment


                  • #10
                    Ah, helt klart intressant! =)

                    Comment


                    • #11
                      Lite mer labb visar att den numera klassiska MFI-dippen (3 perioder) sammanfaller väldigt väl med den volymbotten som kan användas att trigga köpsignal under förutsättning att kursen befinner sig minst 1 standardavvikelse under det sammanvägda värdet av de fyra tidigare priserna vid volymtoppar. Låter det krångligt? Bara lugn, det ÄR lite lurigt!

                      Jag ökade omfånget till 120-minutersstaplar och fick bättre resultat genomgående dessutom. Senaste scriptversionerna:


                      Köp:


                      i120(
                      mval=mov(mfi(3),3,e)
                      mbot=and(lt(aref(mval,2),5),gt(aref(mval,1),aref(mval,2)))
                      mtopp=and(gt(aref(mval,2),95),lt(aref(mval,1),aref(mval,2)))
                      vmed=linreg(mov(v,3,s),5)
                      vbota=and(lt(aref(vmed,2),aref(vmed,1)),lt(aref(vmed,2),aref(vmed,3)))
                      vbotb=and(lt(aref(vmed,3),aref(vmed,4)),lt(aref(vmed,4),aref(vmed,5)))
                      vbotc=and(vbota,vbotb)
                      vtoppa=and(gt(aref(vmed,2),aref(vmed,1)),gt(aref(vmed,2),aref(vmed,3)))
                      vtoppb=and(gt(aref(vmed,3),aref(vmed,4)),gt(aref(vmed,4),aref(vmed,5)))
                      vtoppc=and(vtoppa,vtoppb)
                      toppv1=find(vtoppc,100,aref(c,2),1)
                      toppv2=find(vtoppc,100,aref(c,2),2)
                      toppv3=find(vtoppc,100,aref(c,2),3)
                      toppv4=find(vtoppc,100,aref(c,2),4)
                      price=div(add(add(toppv1,add(toppv2,toppv3)),toppv4),4)
                      level=sub(price,mult(1.0,stdev(c,20)))
                      draw(price,2,dgqbw)
                      {draw(level,3,bqbw)}
                      draw(vmed,4,bav)
                      ej_innehav=le(portfolio(v),0)
                      köp1=and(and(hhv(mbot,4),lt(c,level)),ej_innehav)
                      köp2=and(köp1,gt(c,hhv(aref(h,1),2)))
                      köp3=and(mbot,ej_innehav)
                      mult(köp2,10)
                      )



                      Sälj:

                      i120(
                      mval=mov(mfi(3),3,e)
                      mtopp=and(gt(aref(mval,2),95),lt(aref(mval,1),aref(mval,2)))
                      vmed=linreg(mov(v,3,s),5)
                      vbota=and(lt(aref(vmed,2),aref(vmed,1)),lt(aref(vmed,2),aref(vmed,3)))
                      vbotb=and(lt(aref(vmed,3),aref(vmed,4)),lt(aref(vmed,4),aref(vmed,5)))
                      vbotc=and(vbota,vbotb)
                      vtoppa=and(gt(aref(vmed,2),aref(vmed,1)),gt(aref(vmed,2),aref(vmed,3)))
                      vtoppb=and(gt(aref(vmed,3),aref(vmed,4)),gt(aref(vmed,4),aref(vmed,5)))
                      vtoppc=and(vtoppa,vtoppb)
                      toppv1=find(vtoppc,100,aref(c,2),1)
                      toppv2=find(vtoppc,100,aref(c,2),2)
                      toppv3=find(vtoppc,100,aref(c,2),3)
                      toppv4=find(vtoppc,100,aref(c,2),4)
                      price=div(add(add(toppv1,add(toppv2,toppv3)),toppv4),4)
                      level=add(price,mult(1,stdev(c,20)))
                      innehav=gt(portfolio(v),0)
                      sell1=and(and(hhv(mtopp,4),gt(c,level)),innehav)
                      sell2=and(sell1,lt(c,llv(aref(l,1),3)))
                      sell3=and(mtopp,innehav)
                      mult(sell2,10)
                      )



                      Lite resultat:

                      ABB
                      Totalt Avkastning 38358.62 kr 51.20% på 23 affärer under 3330:13:59 timmar
                      Av dessa blankat 0 st med avkastning 0.00 kr 0.00%
                      Innehav 18 st med vinst 58869.91 kr 78.56%
                      Innehav 5 st med förlust -20511.29 kr -27.37%
                      Blankning 0 st med vinst 0.00 kr 0.00%
                      Blankning 0 st med förlust 0.00 kr 0.00%



                      ALFA

                      Totalt Avkastning 26977.77 kr 35.99% på 27 affärer under 3218:23:59 timmar
                      Av dessa blankat 0 st med avkastning 0.00 kr 0.00%
                      Innehav 20 st med vinst 52849.30 kr 70.52%
                      Innehav 7 st med förlust -25871.53 kr -34.53%
                      Blankning 0 st med vinst 0.00 kr 0.00%
                      Blankning 0 st med förlust 0.00 kr 0.00%


                      ATCO-A
                      Totalt Avkastning 68935.24 kr 92.00% på 28 affärer under 3089:51:00 timmar
                      Av dessa blankat 0 st med avkastning 0.00 kr 0.00%
                      Innehav 22 st med vinst 82400.44 kr 109.97%
                      Innehav 6 st med förlust -13465.20 kr -17.97%
                      Blankning 0 st med vinst 0.00 kr 0.00%
                      Blankning 0 st med förlust 0.00 kr 0.00%


                      INVE
                      Totalt Avkastning 14781.76 kr 19.71% på 22 affärer under 3556:34:59 timmar
                      Av dessa blankat 0 st med avkastning 0.00 kr 0.00%
                      Innehav 15 st med vinst 42797.36 kr 57.12%
                      Innehav 7 st med förlust -28015.60 kr -37.41%
                      Blankning 0 st med vinst 0.00 kr 0.00%
                      Blankning 0 st med förlust 0.00 kr 0.00%


                      SAND

                      Totalt Avkastning 13452.80 kr 17.96% på 24 affärer under 3914:01:59 timmar
                      Av dessa blankat 0 st med avkastning 0.00 kr 0.00%
                      Innehav 17 st med vinst 56400.80 kr 75.24%
                      Innehav 7 st med förlust -42948.00 kr -57.28%
                      Blankning 0 st med vinst 0.00 kr 0.00%
                      Blankning 0 st med förlust 0.00 kr 0.00%



                      Speciellt ABB och SAND är intressanta eftersom kursen har fallit under testperioden men systemet uppvisar vinst. (allt annat är ju ointressant eftersom man annars lika gärna kunder köpt och behållt)


                      Comment


                      • #12
                        Hej,

                        Vilket tidsomfång är testet gjort på (t.ex. Antal dagar, månader)?

                        Jag ser det står under ca "3330-3900" timmar (är det 138 dygn, 391 börsdagar?) och fick det till ett snitt på ca 6 dygn per trade om det var 23 st. Men det är väll i affär eller är det timmar total simulering?, hur mycket utanför affär i så fall?

                        Insatsen 100ksek?

                        Comment


                        • #13
                          Det är simulerat sedan jan 2010. Fast insats 75 k för ett konto på 100 k, så den procentuella avkastningen ska man inte titta så noga på i det här skedet. Tanken är mest att hitta en fungerande algoritm, och därefter pynta med procentuella insatssript kanske för att få automatisk återinvestering. Slutligen kan det kanske bli en ny standardmodell i AT som alla kan ha nytta av.

                          Comment


                          • #14
                            Här är ett annat tips på volymviktat medelvärde:

                            p1:=20
                            p2:=5
                            omsattKr:=mult(v,c)
                            e1:=ema(omsattKr,p1)
                            draw(ema(c,p2),2,rqb)
                            div(e1,ema(v,p1))



                            Comment


                            • #15
                              Ursprungligen postat av Rikard Nilsson Visa inlägg
                              Här är ett annat tips på volymviktat medelvärde:

                              p1:=20
                              p2:=5
                              omsattKr:=mult(v,c)
                              e1:=ema(omsattKr,p1)
                              draw(ema(c,p2),2,rqb)
                              div(e1,ema(v,p1))



                              Ett alternativ:
                              Pwvap:=div(sum(mult(c,v),20),sum(v,20))

                              Comment

                              Working...
                              X