Расчет IRR в рубине - PullRequest
       67

Расчет IRR в рубине

2 голосов
/ 05 февраля 2012

Может ли кто-нибудь помочь мне с методом, который вычисляет IRR серии биржевых сделок?

Скажем, сценарий:

$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 ]

8 голосов
/ 10 февраля 2012

Я наконец-то нашел именно то, что искал: 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 () в этом финансовом геме работал для каждого тестового примера, который я мог использовать.

2 голосов
/ 09 февраля 2012

Для инвестиций, которые имеют начальную и конечную стоимость, как в случае с данными вашего примера, которые включают цену покупки, цену продажи и период владения, вам нужно только найти доход за период владения.

Доходность периода владения рассчитывается путем вычитания 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, и цена ее закрытия на следующей неделе поднялась и упала до 98, 103, 101, 100, 99, 104

Тогда вам придется смотреть за пределы того, что HPR и HPY для множественных возвратов. В этом случае вы можете рассчитать ARR и GRR. Попробуйте эти онлайн-калькуляторы для арифметической нормы прибыли и геометрической нормы прибыли .

Но тогда, если бы у вас был график для ваших инвестиций, то ни один из них не применим. Затем вам придется прибегнуть к поиску IRR для нерегулярных денежных потоков. IRR - это внутренняя норма доходности периодических денежных потоков. Для нерегулярных денежных потоков, таких как торговля акциями, используется термин XIRR. XIRR - это функция Excel, которая рассчитывает внутреннюю норму прибыли для нерегулярных денежных потоков. Чтобы найти XIRR, вам потребуется ряд денежных потоков и график дат для денежных потоков.

Finance.ThinkAndDone.com объясняет IRR гораздо более подробно, чем статьи, которые вы цитировали на RubyQuiz и Wiki. В статье IRR о Think & Done объясняется вычисление IRR с помощью метода Ньютона Рафсона и метода Секанта с использованием либо уравнения NPV, установленного на 0, либо уравнения индекса доходности, установленного на 1. На сайте также представлены онлайн-калькуляторы IRR и XIRR

1 голос
/ 18 апреля 2016

Вы можете использовать библиотеку Exonio:

https://github.com/Noverde/exonio

и использовать ее следующим образом:

Exonio.irr([-100, 39, 59, 55, 20]) # ==> 0.28095
1 голос
/ 05 февраля 2012

Я ничего не знаю о финансах, но для меня имеет смысл, что если вы хотите узнать норму прибыли за 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])
0 голосов
/ 05 марта 2015

Существует новый гем 'finance_math', который решает эту проблему очень просто

https://github.com/kolosek/finance_math

0 голосов
/ 05 марта 2013

Я считаю, что основной проблемой для того, чтобы понять ваш сценарий, является отсутствие денежного потока для каждой акции, что является важным компонентом для расчета любого типа IRR, без них ни одна из формул может быть использован. Если вы уточнить это, я могу помочь вам решить вашу проблему

Хеберто дель Рио

...