2015年1月31日 星期六

函數(_SortinoRatio):索丁諾比率 by 日權益

上回做了用來比較策略表現品質的 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 的理解有錯?