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