2011-11-02 314 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 }); 

这给你的回报率在这段时间内每年。