說起資金管理,大約都會耳聞過 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
第二個參數是讀取幾筆資料做計算,也就是,這並不是讀取圖表上所有的資料。緣由請參考凌波微步大的文章:(哇!他可能發現洩漏太多秘密,我找不到文章的連結了!)
第三個參數是分辨,你要餵給它的數值是否來自"策略",比如要讀策略的損益,需填 true,如果只是餵開、高、低、收、量等等這些無關策略的數據,填 false。
然後,我就拿 Kelly formula 與 Optimal F 當做 圖表績效-KPI ,做一下模擬測試,看看基於 Kelly 精神衍生或是進化版的 Optimal F,使用來給策略績效做評分的話,是否有什麼差異?從這個測試結果來看,很明顯,在這個地方... 沒有什麼差異,都有效,但沒有比 Kelly 厲害到哪去,還要多跑迴圈 XD