递归收益率(RoR)
本文关键字:RoR 收益率 递归 | 更新日期: 2023-09-27 18:12:57
我不知道如何递归地计算投资回报率,本金是未知的,只有利率和利率的持续时间是已知的。
例如,如果我以10%(或0.1)的价格投资2年,RoR将等于0.21(或21%)。这是非递归计算的,
0.21 = 2 * 0.1 + (0.1 ^ 2)
// or
ror = duration * rate + (rate ^ duration)
由于我可能不仅想知道最终的计算结果,而且还想知道该投资的间歇年份,因此我必须递归地进行计算(例如,如果持续时间为5年,我想知道第一年,第二年等之后的回报率是多少)。
因为这是一个算法,c#不是必需的,但这是我将编程它。
最简单的递归计算是1.0+RoR:
double calculateRateOfReturnPlus1(double rate, int periods) {
if (periods == 0)
return 1.0;
return (1.0 + rate) * calculateRateOfReturnPlus1(rate, periods - 1);
}
当rate=0.1, periods=2时返回1.21,当rate=0.1, periods=3时返回1.331。然后可以减去1.0来获得纯RoR。或者,您可以像这样直接计算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;
}
同样,您可以像这样迭代地计算RoR:
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;
}
最后两个函数对于rate=0.1, periods=2返回0.21,对于rate=0.1, periods=3返回0.331。
在实践中,只需依赖Math.Pow()
函数:
double calculateRateOfReturn(double rate, int periods) {
return Math.Pow(1.0+rate, periods) - 1.0;
}
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 });
这是这段时间内每年的回报率。
我在电子表格中做过类似的"建模",最简单的方法是计算每年的复利,然后在另一列计算连续年份之间的差。
如果你仍然想使用递归计算每年(或任何其他时期),你可以输入计算结果(从1开始)作为下一个时期的本金。
周期0 "rate"为1,周期1为1.1,周期2为1.21,等等