2

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

假设场景是:

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

4

6 回答 6

9

我终于找到了我想要的东西: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() 方法适用于我可以扔给它的每个测试用例。

于 2012-02-10T04:05:19.460 回答
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%

这篇文章解释了持有期的回报和收益率

您还可以使用以下公式将持有期回报和持有期收益率年化 AHPR = HPR^(1/n) AHPY = AHPR - 1

上述公式仅适用于您有单期收益的情况,例如股票买卖的情况。

然而,如果你有多重回报,例如,你以 1/1 的价格以 100 的价格购买了股票 A,它在接下来一周的收盘价攀升并下跌至 98、103、101、100、99、104

然后,您将不得不超越 HPR 和 HPY 的多重回报。在这种情况下,您可以计算 ARR 和 GRR。试试这些在线计算器算术回报率几何回报率

但是,如果您有投资的日期时间表,那么这些都不适用。然后,您将不得不求助于寻找不规则现金流的内部收益率。IRR 是周期性现金流的内部收益率。对于股票交易等不规则现金流,使用术语 XIRR。XIRR 是一个 Excel 函数,用于计算不规则现金流的内部收益率。要找到 XIRR,您需要一系列现金流和现金流的日期时间表。

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

于 2012-02-09T11:05:32.897 回答
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 添加到irr()方法的输出(这样 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])
于 2012-02-05T15:33:01.407 回答
1

您可以使用 Exonio 库:

https://github.com/Noverde/exonio

并像这样使用它:

Exonio.irr([-100, 39, 59, 55, 20]) # ==> 0.28095
于 2016-04-18T11:22:48.063 回答
0

我认为,为了能够理解您的情况,主要问题是每只股票都缺乏现金流,这是计算任何类型的内部收益率的基本要素,没有这些,任何公式都不能使用. 如果您澄清这一点,我可以帮助您解决问题

赫伯托·德尔里奥

于 2013-03-04T22:11:21.173 回答
0

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

https://github.com/kolosek/finance_math

于 2015-03-05T09:24:42.567 回答