我对金融一无所知,但对我而言,如果您想知道6个月以上的回报率,那么在复利两次时应该是等于年利率的利率。如果你想知道3个月的利率,那么应该是等于复利4倍时的年利率等的利率。这意味着从任意时期的年收益率转换为利率与计算根源密切相关。如果您将年度回报率表示为原始金额的比例(即将20%回报率表示为1.2,将100%回报率表示为2.0等),则可以通过取这个数字的平方根来得到6个月的回报率。
Ruby有一个非常方便的方法来计算各种复杂的根:指数运算符**
。
n ** 0.5 # square root
n ** (1.0/3.0) # 3rd root
...等等。
所以我认为你应该能够通过对收益的年增长率转换为一个任意的时期:
yearly_return ** (days.to_f/365)
同样转换每天,每周或每月率或返回到年增长率:
yearly_return = daily_return ** 365
yearly_return = weekly_return ** 52
yearly_return = monthly_return ** 12
...等等。根据我所看到的(从阅读维基百科文章),IRR计算实际上并不依赖于所用的时间段。如果您提供一系列年度现金流量作为输入,您将获得年度费率。如果您提供一系列每日现金流量作为输入,您将获得每日费率等等。
我建议您使用您链接的解决方案之一来计算每日或每周现金流量(无论哪种方便)的内部收益率,并使用指数将其转换为年度利率。你必须在irr()
方法的输出中加1(这样10%的回报将是1.1而不是0.1等)。
使用日常现金流你给的例子,你可以这样做让日常IRR:
irr([-30000,0,0,0,-15000,0,11000,0,0,0,0,0,0,0,0,0,0,14000,0,21000])
这不应该很难做,但你有没有计算过数学?如果你可以发布数学过程,它会让知道Ruby的人更容易(但已经解决了一生中足够的数学问题)来帮助你。 – SimonMayer 2012-02-05 01:10:02
西蒙,我还没有计算出数学,但是这个维基百科页面解释了它:http://en.wikipedia.org/wiki/Internal_rate_of_return和我上面链接到的rubyquiz页面显示了在ruby中更简单的实现。但是我不明白这个数学运算能够让rubyquiz中的更简单的解决方案适应我给出的更一般的示例场景。 – 2012-02-07 00:16:12
@KeithSchacht,我在我的答案中添加了一个例子,显示如何从您给出的例子中获取每日现金流量,并将这些数据用作'irr()'的输入。如果这有助于您解决问题,请接受+ upvote! – 2012-02-08 20:02:47