上回做了用來比較策略表現品質的 Sharpe Ratio 值的計算函數。
這回,我們來計算 Sortino Ratio。什麼是 Sortino Ratio?請看:http://goo.gl/VrrRF8。而 Sortino Ratio 與 Sharpe Ratio 的差異,主要就在不把賺錢的波動當做風險,而只把賠錢的波動程度視為風險。
從該介紹的解說來看,似乎只是把 Sharpe Ratio 中計算標準差的部份,改成只有計算賠錢的而已。因此,我直接把 _SharpeRatio 這個函數拿來修改成如下,差異就在藍色的部份。函數名稱: _SortinoRatio,參數值三個,依序是計算近幾日、是否再投資模式、起始資金。
input:calcDays(Numeric),reInvestment(Numeric),initialMoney(Numeric);
array:equDayend[500](0),dayProfit[500](0);
var:avgDayProfit(0),stddevProfit(0),temp(0);
var:tradeDays(0),started(0);
if i_marketposition<>0 and started=0 then
begin
tradeDays=1;
started=1;
end;
if sessionlastbar and started=1 then
begin
tradeDays= tradeDays+1;
_arrayShift(equDayend,1);
equDayend[1]= i_OpenEquity;
_arrayShift(dayProfit,1);
if equDayend[2]<>0 and reInvestment=1 then
dayProfit[1]= (equDayend[1]-equDayend[2])/equDayend[2];
if initialMoney<>0 and reInvestment=0 then
dayProfit[1]= (equDayend[1]-equDayend[2])/initialMoney;
end;
if tradeDays>calcDays and (reInvestment=0 or reInvestment=1) then
begin
avgDayProfit= Average_a(dayProfit,calcDays);
value7=0;
value8=0;
for value1=1 to calcDays begin
if dayProfit[value1]<0 then begin
value7 = value7 + Square(dayProfit[value1] - avgDayProfit);
value8 = value8 + 1;
end;
end;
if value7>0 and value8>0 then
stddevProfit = SquareRoot(value7/value8);
temp= (avgDayProfit/stddevProfit)*SquareRoot(252);
_SortinoRatio= iff(sessionlastbar, temp[1], temp);
end;
對照一下 _SharpeRatio 與 _SortinoRatio 兩個函數的差異處,如下圖兩個框起處:
由上可知,就是作為分母的標準差部分不同而已, _SharpeRatio 使用的是內建的陣列標準差。 然後,我們接著看一下 _SortinoRatio 用來做分母計算的部份與內建的陣列標準差的差異。
基本上,我就是把標準差的部份改成只有抓"賠錢"的部分來算而已。這樣,應該就符合 Sortino Ratio 的描述了吧?實際上,我沒有去做驗算,希望朋友做一下驗算看看,或是這樣對 Sortino Ratio 的理解有錯?