Какой числовой метод используется в этой реализации IRR? - PullRequest
6 голосов
/ 01 августа 2011

На сайте ActiveState Recipes есть функция, реализующая Внутренняя норма прибыли в Python:

def irr(cashflows, iterations=100):
    """The IRR or Internal Rate of Return is the annualized effective 
       compounded return rate which can be earned on the invested 
       capital, i.e., the yield on the investment.

       >>> irr([-100.0, 60.0, 60.0, 60.0])
       0.36309653947517645
    """
    rate = 1.0
    investment = cashflows[0]
    for i in range(1, iterations+1):
        rate *= (1 - npv(rate, cashflows) / investment)
    return rate

Этот код возвращает правильные значения (по крайней мере, для парыпримеров, которые я проверял в Excel), но я хотел бы знать, почему .

  • Похоже, что это не реализация метода Ньютона (без производных) илиметод Secant (отслеживает только одну итерацию).
  • В частности, определение инвестиционной переменной как первого элемента денежного потока (и его последующего использования) смущает меня.

Есть идеи?

Ответы [ 3 ]

4 голосов
/ 01 августа 2011

Метод называется итерацией с фиксированной точкой;см., например, статью в Википедии http://en.wikipedia.org/wiki/Fixed_point_iteration.

Идея состоит в том, что если rate содержит правильное значение (то есть IRR), то NPV равно нулю, поэтому утверждение

rate *= (1 - npv(rate, cashflows) / investment)

не изменится rate.Таким образом, как только вы найдете IRR, итерация не изменит его.Итерация с фиксированной точкой иногда сходится к правильному значению, а иногда нет.Примеры @Gareth и @unutbu показывают, что здесь они не всегда сходятся.

Критерий сходимости заключается в следующем.Запишите оператор обновления в цикле как

rate = rate * (1 - npv(rate, cashflows) / investment)

Теперь, если производная правой части по rate находится между 1 и -1, то метод сходится.Я не могу сразу увидеть, при каких обстоятельствах это имеет место.

Вы можете удивиться, почему итерация не обходится без

rate *= (1 - npv(rate, cashflows))

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

3 голосов
/ 01 августа 2011

Мне кажется это подделкой. Сходимость слишком медленная для практического использования.

>>> irr([-100, 100]) # expecting answer 0
0.00990099009900991
2 голосов
/ 01 августа 2011

Мне тоже кажется фальшивым.

>>> irr([-100,50],100000)  # expecting answer -0.5
0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...