2013年2月21日 星期四

about PositionSizing


程式交易小學堂─期貨投機事業的王道
接觸交易一段時間沒有掛掉被抬出場,又開始了解到所謂"平注必輸"背後所代表的觀念之後,就會開始走向在交易中的部位大小配置,除了我個人在「期貨程式交易SOP」一書中發表的『交易策略回春術』這樣在每次進場依照市場波動程度決定部位大小的方式外,還有廣為大家所聽聞過,卻也往往難以有系統的實作套用在交易策略上或是驗證的"試單進場→做對(賺錢)加碼→做錯(賠錢)快砍"的部位管理方法。這裡就是要以一個很簡單的順勢交易策略為基底,去驗證這些部位管理方式的效用。

先把要作為實驗的基底策略做點描述,取了條簡單算數平均線,參數 Len 與 參數 Len*3 各一條,也就是兩條一短一長的均線,當短均線在長均線以上時,突破當天高點就進場。而當短均線在長均線以下就離場。沒有其他濾網,很簡單的突破策略。

程式碼如下:
input:Len(20);
var:N(2);


Condition1= Average(C,Len) > Average(C,Len*3);


if Condition1 then 
  begin

    if marketposition=0 then
      buy N share next bar HighD(0) stop;
  
  end

else
  sell next bar market;


因為我們會需要在後續的 PositionSizing 做口數變化,所以作為基底對照的這個策略,我們先看看從頭到尾都是下單2口的回測績效圖。


然後,我把進場口數套上我書上所講的方法去決定口數大小,限制在1~3口內變化。看起來,不論就績效曲線的平穩度或是風險報酬比都有明顯提昇。


但是,我們做程式交易,最希望的當然是讓電腦勸自動交易並藉著交易策略的正期望值,讓我們的帳戶也能達到所謂”複利”的效應(make a wish)。先把基底對照策略做點修改,讓帳戶餘額可以納進去策略內而成為有最基本資金管理的系統。這部份我們需要先做個決定:我要用多少錢來做一單位(2口)?除了,我書上所寫的『策略下架與資金準備』的方式外,有軟體可以借助。看下圖的測試,這裡我們就取用 70萬(50+10*2)來做為每一單位所需的資金,起始資金2百萬。


下圖就是起始資金2百萬,每70萬做一單位(2口),依資金量大小決定進場實作幾個單位的部位大小。這張圖將會是後來所有 PositionSizing 的對照基礎。我們希望看到採用的 PZ 技術可以得到在相同時間內,更好的績效表現,而評估的標準只比較兩樣:一個是 DrawDown %,這個反應未來策略上線後全自動資金管理,的可能資金損失比例,也就是風險。另一個是總獲利,因為採取的測試時間長度一樣,就不費心的去轉化成年化報酬了。


下圖是先用資金量決定做幾個單位,而每單位內以市場波動程度決定 1~3口內變化。所以,資金量高而下較多單位時,實際上不見得會下較多口數,比如當單位口數是1單位時因市場波動為3口時,下單的口數會比2單位但市場波動口數為1口時更多。在這裡我們可以看到起始資金都是 2百萬開始交易,中間歷經 49%的 資金損失,但獲利比單純只用資金量決定做單位但單位內口數不變化的多出 15倍以上,如果以風險報酬的角度看,這有著更好的風險報酬(其實很恐怖啦,誰受得了資金被腰斬啊!)。


接著,我要測試看看如果把每單位(2口)的進場一律拆成先進場1口(試單),之後當部位出現獲利(做對)了,再於相同訊號出現時讓第2口進場,如果第1口進場後沒有獲利就不會再加碼,只會等著出場訊號而清倉。至於單位數則是用資金量來決定,一樣是每70萬做一個單位,起始資金200萬。
程式碼需要做修改(我做了部分保留)如下,當然,MultiCharts 的加碼設定是要打開的:
input:Len(20);
var:N(2);


Condition1= Average(C,Len) > Average(C,Len*3);

N=....;


if Condition1 then 
  begin

    if marketposition=0 then
      buy N/2 share next bar HighD(0) stop;

    if marketposition>0 and C>PosTradeEntryPrice( 0, CurrentEntries-1 ) 
       and PosTradeCount(0)<=1
    then
      buy N/2 share next bar HighD(0) stop;
  
  end

else
  sell next bar market;


這種模式下,訊號圖表會長成這樣。


從回測報表看來資金回挫%雖然有比基底對照組少了1%,風險有下降,但是這樣的效果其實幾乎可以無視,而獲利這部份沒有看到增加,也沒有減少很多。或許這樣的分批進場實在是分批的太少次,很難有明顯效應也不一定。總之,這個模式下,我們看不到有風險報酬提高的作用。


再來的方式就比較複雜一點了,這是把單點進場 PositionSizing 與 分批進場結合在一起。一開始的起始資金200萬就能做兩個單位,我讓他先計算出資金量的最大單位數後,讓每次進場訊號都以市場波動決定單位內的口數。因此分批進場的部份只的是把單位數分批,資金組量能做兩個單位,就分兩批,能做五個單位就分五批。


上面這個回測報表相對前面再每個進場點只是把最大單位數(有波動決定口數)一次丟進去,明顯的風險下降:從 49% 降到 33%,這裡看到"分批進場"有出現降低風險的作用了,但是獲利部分也被大幅稀釋,就風險報酬比來說其實是下降的。

資金管理並不是只有上述幾種模式,也可以是先定好目前資金可以容許多少損失下決定好最大口數,然後讓每個分批進場點以波動決定每個進場點的口數大小,但是不限制分幾批。比如現在可以最多持有 10口,每個進場用波動決定口數,可能是 1+1+1+1+1+1+1+1+1+1=10 也可以是 2+3+1+1+1+2=10 也能是 3+1+4+2=10 ... 。


從以上的幾種模式資金管理模式來看,我大致下個結論,分批進場在口數變化比較多的時候才能有效的降低風險,但得用績效去交換,換言之這是用績效的犧牲去換得風險的降低。然而,獲利往往必須有好市場才可得,風險的降低才是延續交易生命的關鍵所在。拉高風險報酬比則以每次單點進場時的口數變化效果較好。


PS. 做這種實驗測試,很容易就讓我頭昏失神,所以以上敘述過程有錯也別怪我,歡迎提出看法與疑問,謝謝。不過,別要求我把 Code 放出來 XD

熱門文章