2019年3月27日 星期三

Portfolio商品池建立與資金使用:隨機、隨機、再隨機

在建立多商品投資組合的時候,如果你不是把在清單上的所有商品都同時交易或會為尚未發生訊號的商品保留待用資金的話,務必想想本文以下的內容!

我用一個很簡單的突破交易策略,以 S&P 500 成分股為商品監視清單,在 Portfolio Trader 上做回測,但是我要以有限的資金對先發生訊號的商品先投入資金,每次符合就投入 1% 的資金,並且個別商品最高只能佔用 20% 的資金,只有買入或出場,不放空,直到已經佔用資金的商品出場或減碼才釋放資金給其他的商品使用。


可想而知,我不可能對商品池中所有的商品都持有,甚至在清單中很大部分的商品,根本不會產生交易動作,只是被監視著,有可能是從未發生訊號,也有可能是出訊號時卻資金用罄。因為如果每一個訊號投入 1% ,表示同時有一百個訊號就讓我就把錢用完了,只要商品池的廣度大於 100個,就必然產生資金排擠效應。



在 PT 中的設定就把商品清單建立,並掛上一個訊號。但是... 因為 PT 的執行順序是會依照商品清單的順序(請參考第9頁),且用來測試的這個策略是會有資金排擠效應的。商品清單排在比較前面的商品因為在每個循環先被執行,就更容易拿到資金而排擠了順序在後面的商品,那麼~這個商品清單順序的影響會有多大呢?

所以,以下這段程式碼,用來把已經建立的商品清單,做隨機排序,打亂重組一下,多製造幾個排序不同,但成分內容相同的商品清單。
var: j(0), k(0), lines(0), get(""), isUsed(false), output("");
array: symbols[](""), newSymbols[]("");



if LastBarOnChart then begin

  once begin
    
    array_setmaxindex( symbols, 1 );
    array_setmaxindex( newSymbols, 1 );
    
    lines= 0;
    while get<>"Not readed." begin
      lines= lines+1;
      array_setmaxindex( symbols, array_getmaxindex(symbols)+1 );
      array_setmaxindex( newSymbols, array_getmaxindex(newSymbols)+1 );
      get= _readString( "F:\WatchList.txt", lines );
      if get<>"Not readed." then  symbols[lines]= get;
    end;


    k= 1;
    while k<lines begin

      get= symbols[ceiling(Random(lines))];
      isUsed= false;
      for j=1 to lines begin
        if get= newSymbols[j] then begin
          isUsed= true;
        end;
      end;

      if isUsed=false then begin
        newSymbols[k]= get;
        k= k+1;
      end;
      
    end;
    
  

    output= "";
    for j=1 to lines-1 begin
      output= output + newSymbols[j] + iffString(j<lines-1, newline, "");
    end;
    _writeTXT( "F:\NewSymbols.csv", output );

  end;
  
end;


接下來,我複製了幾個一樣的 PT,只是商品清單的順序不同。


來看一下這僅僅只有商品順序差異,但成分,訊號、資金使用方式都相同的策略,在回測績效上會有多少差異?


我不知道你看到這樣的回測結果有什麼感覺?同一個策略,選擇哪些商品來準備投入資金有隨機性,誰先發生訊號而先拿走資金看起來對績效表現也很具隨機性!

如果你使用 PT 做回測、執行,也剛好是策略會在商品池中有資金排擠效應的話,建議你也多做幾個一樣內容、順序不同的把商品清單去看看績效差異有多少?想想、想想、再想想...

ps. https://www.multicharts.com/trading-software/index.php/PortfolioEntriesPriority