计算红宝石的IRR

时间:2012-02-05 00:59:26

标签: ruby finance stocks quantitative-finance

任何人都可以帮我一个计算一系列股票交易的内部收益率的方法吗?

让我们说场景是:

$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年)。

6 个答案:

答案 0 :(得分:8)

我终于找到了我想要的东西: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

然而,它给了我一些麻烦。我尝试了六个不同的测试用例,其中一个会引发一个我无法调试的异常。但是这个Finance gem中的xirr()方法适用于我可以抛出的每个测试用例。

答案 1 :(得分: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购买了A股100,它的收盘价在下周攀升并跌至98,103,101,100,99,104

然后,您必须超越HPR和HPY以获得多种回报。在这种情况下,您可以计算ARR和GRR。试试这些arithmetic rate of returngeometric rate of return的在线计算器。

但是如果您有投资的日期安排,那么这些都不适用。然后,您将不得不求助于非正规现金流量的IRR。 IRR是定期现金流的内部收益率。对于非正规现金流量,例如股票交易,使用XIRR一词。 XIRR是一个Excel函数,用于计算不规则现金流的内部收益率。要查找XIRR,您需要一系列现金流和现金流的日期安排。

Finance.ThinkAndDone.com比你在RubyQuiz和Wiki上引用的文章更详细地解释了IRR。关于Think&amp; amp;的IRR文章完成使用Newton Raphson方法和正割方法解释IRR计算,使用NPV方程设置为0或盈利指数方程设置为1.该网站还提供在线IRR和XIRR计算器

答案 2 :(得分: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(无论方便),并使用取幂将其转换为年费率。您必须在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])

答案 3 :(得分:1)

您可以使用Exonio库:

https://github.com/Noverde/exonio

并像这样使用它:

Exonio.irr([-100, 39, 59, 55, 20]) # ==> 0.28095

答案 4 :(得分:0)

我认为,为了能够理解您的情景,主要问题是缺少每个股票的现金流,这是计算任何类型的IRR的基本要素,没有这些,没有一个公式可以使用。如果您澄清这一点,我可以帮助您解决问题

Heberto del Rio

答案 5 :(得分:0)

有新的宝石'finance_math'可以很容易地解决这个问题

https://github.com/kolosek/finance_math