После проверки RATE
функция в Excel является внутренней нормой доходности, в частности, для аннуитета.
Есть несколько способов приблизиться к этому в R.
В ванильным R, как uniroot
и polyroot
функции могут быть использованы для решения для скорости, но это занимает немного возился вокруг:
Рассмотрим следующее в Excel:
=RATE(10,-100,800)
который производит значение:
4.2775%
Сейчас в R:
Вы можете написать функцию для поставки в uniroot:
> f <- function(i,n,a) a - (1-(1+i)^(-n))/i > uniroot(f, interval=c(1e-9,1), 10, 800/100, tol=1e-6)$root [1] 0.04277498
В качестве альтернативы вы можете использовать polyroot, но вам нужно найти реальный корень, который находится между 0 и 1 (в дальнейшем я использую 1 + i, а не i, потому что это проще, и поэтому нужен корень между 1 и 2):
> res <- polyroot( c(1, rep(0,10-1), -(800/100+1), 800/100) ) > Re(res)[ abs(Im(res))<1e-9 ] -0.7622679 1.0000000 1.0427750
Если во второй строке извлекаются действительные корни полиномиального уравнения в терминах (1 + i), а вы хотите получить значение, большее 1 (1.0427750), из которого вычтите 1.
Вы также можете использовать более общие внутренние нормы доходности для этой проблемы, указав вектор денежных потоков, соответствующий аннуитету.
Вы правы, что
FinCal::discount.rate
, по сути, делает то же самое, что и RATE, но похоже, что округляет все свои показатели до трех значащих цифр, ничего не говоря об этом, даже, насколько я вижу, в помощи. Если для вас важна большая точность, это может быть проблемой.
(Альтернатива для большей точности - взять выходные данные этой discount.rate
функции и сделать один шаг Ньютона-Рафсона, что должно быть намного лучше.)