我對金融一無所知,但對我而言,如果您想知道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