递归收益率(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#不是必需的,但这是我将编程它。

递归收益率(RoR)

最简单的递归计算是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,等等