2017年3月31日 星期五

函數(_OptimalF):Optimal F

說起資金管理,大約都會耳聞過 Kelly formula,也會聽過它其實用在交易上的問題很大。後來有以 Kelly 精神生出了 Optimal F。而它的來由與計算方法,我就不多贅述,請自行參考:牧清華的文章

要把 Kelly formula 寫成 MultiCharts 函數在策略中或是其他引用,算是一小片蛋糕。這一篇要分享的是,我一開始看了牧清華介紹,覺得計算很麻煩的 Optimal F。


請自行新增一個數值型函數:_OptimalF。code 如下(歡迎幫忙除錯與回報,因為我沒多做驗算 XD):
input: theData(Numeric), watchDays(Numeric), isOnStrategy(TrueFalse);
array: DATAs[](0), DATAsCopy[](0), HPRs[](1), Geo_Mean[101](1);
var: maxLoss(0), maxMeans(0), j(0), k(0), temp(1);
var: MP(0), passDays(0), isHasTraded(false);


once begin
  array_setmaxindex( DATAs, watchDays+1 );
  array_setmaxindex( DATAsCopy, watchDays+1 );
  array_setmaxindex( HPRs, watchDays+1 );
end;



MP= i_MarketPosition;
if MP<>MP[1] then isHasTraded= true;

if isOnStrategy= true then
  begin
    if isHasTraded and sessionlastbar then 
      begin
        _arrayShift( DATAs );
        DATAs[1]= theData;
        passDays= passDays + 1;
      end;
  end
else
  begin
    _arrayShift( DATAs );
    DATAs[1]= theData;
    passDays= passDays + 1;
  end;


if watchDays > 0 and passDays > watchDays then begin
  
  array_copy( DATAs, 1, DATAsCopy, 1, watchDays );
  maxLoss= minlist( Lowest_a( DATAsCopy, watchDays ), -1 );

  for k= 0 to 99 begin

    temp= 1;
    for j=1 to watchDays begin
      HPRs[j]= 1 + k/100 * ( -DATAsCopy[j] / maxLoss );
      temp= temp * HPRs[j];
    end;
  
    Geo_Mean[k]= power( temp, 1/watchDays );

  end;


  maxMeans= 0;
  _OptimalF=0;

  for k=0 to 99 begin
    if Geo_Mean[k] > maxMeans then begin
      maxMeans= Geo_Mean[k];
      _OptimalF= k;
    end;
  end;
  
end;


函數中有三個參數,第一個是指輸入的數據,看你是要餵給它每日損益、勝率、什麼鬼東西,或是 K棒價格、成交量,隨便你,但會需要區分數據的來源是否從策略訊號產生的?(見第三個參數)這個函數寫成如果是策略產生的資料只在每天的最後一根K棒才會讀取資料,如果你要改成每根 Bar 都會讀取資料的話,程式碼中的 and SessionLastBar 去除掉即可。換言之,目前的程式碼是,當你要餵策略產出的資訊給它,會只讀取每天最後的數據,但是非策略的數據,則是每根K棒都會讀。請依自身需要加以改寫。


第二個參數是讀取幾筆資料做計算,也就是,這並不是讀取圖表上所有的資料。緣由請參考凌波微步大的文章:(哇!他可能發現洩漏太多秘密,我找不到文章的連結了!)

第三個參數是分辨,你要餵給它的數值是否來自"策略",比如要讀策略的損益,需填 true,如果只是餵開、高、低、收、量等等這些無關策略的數據,填 false。

然後,我就拿 Kelly formula 與 Optimal F 當做 圖表績效-KPI ,做一下模擬測試,看看基於 Kelly 精神衍生或是進化版的 Optimal F,使用來給策略績效做評分的話,是否有什麼差異?從這個測試結果來看,很明顯,在這個地方... 沒有什麼差異,都有效,但沒有比 Kelly 厲害到哪去,還要多跑迴圈 XD


順便隨意拉了 MC 內建的訊號到圖表上,放上 Kelly(紅色)與 optimal F(白色)的指標圖,做一下對照。