2012-02-05 49 views
1

任何人都可以用一種方法來計算一系列股票交易的內部收益率嗎?用紅寶石計算內部收益率

假設的場景是:

$10,000 of stock #1 purchased 1/1 and sold 1/7 for $11,000 (+10%) 
$20,000 of stock #2 purchased 1/1 and sold 1/20 for $21,000 (+5%) 
$15,000 of stock #3 purchased on 1/5 and sold 1/18 for $14,000 (-6.7%) 

這應該是有幫助的:http://www.rubyquiz.com/quiz156.html

但我無法弄清楚如何,因爲他們假定每個返回的週期爲適應任何的解決方案持續一段時間(1年)。

+0

這不應該很難做,但你有沒有計算過數學?如果你可以發佈數學過程,它會讓知道Ruby的人更容易(但已經解決了一生中足夠的數學問題)來幫助你。 – SimonMayer 2012-02-05 01:10:02

+0

西蒙,我還沒有計算出數學,但是這個維基百科頁面解釋了它:http://en.wikipedia.org/wiki/Internal_rate_of_return和我上面鏈接到的rubyquiz頁面顯示了在ruby中更簡單的實現。但是我不明白這個數學運算能夠讓rubyquiz中的更簡單的解決方案適應我給出的更一般的示例場景。 – 2012-02-07 00:16:12

+0

@KeithSchacht,我在我的答案中添加了一個例子,顯示如何從您給出的例子中獲取每日現金流量,並將這些數據用作'irr()'的輸入。如果這有助於您解決問題,請接受+ upvote! – 2012-02-08 20:02:47

回答

7

我終於找到正是我一直在尋找:http://rubydoc.info/gems/finance/1.1.0/Finance/Cashflow

gem install finance 

爲了解決我原先公佈的方案:

include Finance 
trans = [] 
trans << Transaction.new(-10000, date: Time.new(2012,1,1)) 
trans << Transaction.new(11000, date: Time.new(2012,1,7)) 
trans << Transaction.new(-20000, date: Time.new(2012,1,1)) 
trans << Transaction.new(21000, date: Time.new(2012,1,20)) 
trans << Transaction.new(-15000, date: Time.new(2012,1,5)) 
trans << Transaction.new(14000, date: Time.new(2012,1,18)) 

trans.xirr.apr.to_f.round(2) 

我也發現了這個簡單的方法:https://gist.github.com/1364990

但是,它給了我一些麻煩。我試了六個不同的測試用例,其中一個會引發一個我從未能夠調試的異常。但是這個財務寶石中的xirr()方法適用於我可以拋出的每個測試用例。

1

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

亞歷克斯,我明白你在說什麼,但我不知道如何去適應它。以上述情景爲例,您可以說輸入內容如下: irr([]) – 2012-02-06 04:42:45

+0

我只是注意到我的評論被截斷了。我想問的是:我如何從該網站修改IRR方法來支持我的情景作爲輸入? – 2012-02-06 16:54:24

+0

@KeithSchacht,我只是在維基百科上做了一些閱讀,併爲你添加了更多信息。 – 2012-02-06 19:10:53

2

對於有初始值和最終值的投資,因爲是你的榜樣的情況下包括購買價格,賣出價格和持有期限的數據,您只需找到持有期收益率。

保持時間,產率是通過從保持期間返回減去1來計算

HPY = HPR - 1 
HPR = final value/initial value 
HPY = 11,000/10,000 - 1 = 1.1 - 1 = 0.10 = 10% 
HPY = 21,000/20,000 - 1 = 1.05 - 1 = 0.05 = 5% 
HPY = 14,000/15,000 - 1 = 0.9333 - 1 = -0.0667 = -6.7% 

本文解釋holding period return and yield

也可以使用下面的公式按年的保持週期回報和保持週期收率 AHPR = HPR ^(1/n) AHPY = AHPR - 1

上述公式僅適用於您有單個期間回報的情況,例如您的例子樂股票購買和銷售。

然而,如果你有多個收益,例如,您購買的股票一上1/1的100和它的收盤價在未來一週上漲和下跌至98,103,101,100,99,104

然後你將不得不超越什麼HPR和HPY多種回報。在這種情況下,您可以計算ARR和GRR。嘗試使用這些在線計算器arithmetic rate of returngeometric rate of return

但是,如果你有你的投資日期時間表,那麼這些都不適用。那麼您將不得不尋求尋找不正常現金流量的內部收益率。內部收益率是定期現金流量的內部收益率。對於股票交易等非正常現金流量,使用術語XIRR。 XIRR是一個Excel函數,用於計算非正常現金流的內部收益率。要找到XIRR,您需要一系列現金流量和現金流量的日期時間表。

Finance.ThinkAndDone.com解釋IRR比您在RubyQuiz和Wiki上引用的文章更詳細。關於Think &的IRR文章完成使用Newton Raphson方法和Secant方法解釋IRR計算,使用NPV方程設置爲0或盈利指數方程設置爲1.該網站還提供在線IRR和XIRR計算器

+0

感謝您的解釋。我仍然不確定如何將它變成我可以使用的方法,但是我找到了一個可以實現這個技巧的現有庫。我會將它作爲未來可能遇到此問題的人的答案發布。 – 2012-02-10 04:07:27

+0

你不清楚你想在你的原始問題中做什麼。正如我在答覆中所述,XIRR是一系列非週期性現金流量的內部收益率。 XIRR返回單一價值的回報率。然而,在您的原始文章中,您要求計算多個交易的多個費率 – 2012-02-10 09:20:16

0

我相信爲了能夠理解您的情景的主要問題是缺乏每個股票的現金流量,這是計算任何類型IRR的基本要素,沒有這些,沒有一個公式可以使用。如果您澄清這個我可以幫你解決你的問題

埃韋爾托爾德里奧