2011-11-02 140 views
1

我不知道如何遞歸計算投資回報率,其中本金未知,只有利率和利率的持續時間已知。遞歸收益率(RoR)

例如,如果我有兩年10%(或0.1)的投資,回報率將等於0.21(或21%)。這是計算非遞歸方式,

0.21 = 2 * 0.1 + (0.1^2) 
// or 
ror = duration * rate + (rate^duration) 

因爲我可能不想只知道最後的計算,但間歇年投資的,我必須遞歸地做到這一點(例如,如果持續時間爲5年,我想知道第一年,第二年等之後的收益率)。

由於這是一種算法,C#不是必需的,但是這是什麼,我會在被編程它

+0

爲什麼不計算持續時間= 1,2,3,...的RoR?無需遞歸。 – svick

回答

2

遞歸地計算最簡單的是1.0 +回報率:

double calculateRateOfReturnPlus1(double rate, int periods) { 
    if (periods == 0) 
    return 1.0; 
    return (1.0 + rate) * calculateRateOfReturnPlus1(rate, periods - 1); 
} 

這將返回速率= 0.1時爲1.21,週期= 2時爲1.331,速率= 0.1時爲1.331,週期= 3。然後,您可以減去1.0以獲得純粹的RoR。或者,也可以直接計算回報率是這樣的:

double calculateRateOfReturn(double rate, int periods) { 
    if (periods == 0) 
    return 0.0; 
    return (1.0 + rate) * (calculateRateOfReturn(rate, periods - 1) + 1.0) - 1.0; 
} 

此外,可以迭代地計算回報率是這樣的:

double calculateRateOfReturn(double rate, int periods) { 
    double RoR = 1.0; 
    for (int i = 0; i < periods; i++) { 
    RoR = RoR * (1.0 + rate); 
    } 
    return RoR - 1.0; 
} 

最後兩個函數返回0.21率= 0.1,週期= 2和0.331對於速率= 0.1,週期= 3。

在實踐中,將單純依靠Math.Pow()功能:

double calculateRateOfReturn(double rate, int periods) { 
    return Math.Pow(1.0+rate, periods) - 1.0; 
} 
+0

現在,當試圖計算多年的費率變化(例如年1 = 0.1,年2-4 = 0.08,年5 = 0.02等)並將其與另一組數據進行比較時,樂趣開始了。謝謝你的幫助! – bafromca

+0

當利率發生變化時,應該用所有年份的利率數組替換利率。這在迭代形式中是最簡單的,因爲迭代變量i可以用於從數組中爲每年/迭代檢索正確的速率。在遞歸形式中,需要爲此添加另一個參數。 –

-1

我已經在電子表格中做了類似的「造型」,而要做到這一點最簡單的方法是計算每年的複利,然後在另一列中計算連續年份之間的差異。

如果您仍想使用遞歸計算每年(或任何其他期間),則可以輸入計算結果(從1開始)作爲下一期間的主體。

所以週期0 「速度」 將是1,那麼週期1是1.1,期間2是1.21等

1

一個LINQ版本:

double rate = 0.1; 
int totalYears = 5; 

var results = Enumerable.Range(1, totalYears).Select(i => new { Year = i, RoR = Math.Pow(1 + rate, i) - 1 }); 

這給你的回報率在這段時間內每年。