2012-02-05 115 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的基本要素,没有这些,没有一个公式可以使用。如果您澄清这个我可以帮你解决你的问题

埃韦尔托尔德里奥