2011-07-31 6 views
6

ActiveState Recipes 사이트는 파이썬에서 Internal Rate of Return을 구현하는 기능이있다 :이 코드는 (적어도 내가 엑셀에 대해 검사 한 예 부부를위한) 올바른 값을 반환이 IRR 구현에 사용 된 수치 적 방법은 무엇입니까?

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 

을,하지만 난 알고 싶습니다 이유 .

  • 뉴턴의 방법 (파생물 없음) 또는 시컨트 방법 (한 번의 반복 만 추적)의 구현으로 보이지 않습니다.
  • 특히, 첫 번째 현금 흐름 요소로 투자 변수를 정의하면 (그리고 이후에 사용하는 경우) 나를 혼란스럽게합니다.

아이디어가 있으십니까?

답변

4

이 방법을 고정 소수점 반복이라고 부릅니다. 예를 들어 위키 백과 문서 http://en.wikipedia.org/wiki/Fixed_point_iteration을 참조하십시오.

아이디어는 rate가 올바른 값을 (즉, IRR, 인)이 포함 된 경우

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

rate이 변경되지 않습니다 문 있도록, 다음 NPV가 0 점이다. 따라서 일단 IRR을 찾으면 반복이 변경되지 않습니다. 고정 소수점 반복은 때때로 올바른 값으로 수렴하고 때로는 그렇지 않습니다. @Gareth와 @unutbu의 예는 여기가 항상 수렴하지는 않는다는 것을 보여줍니다.

수렴 기준은 다음과 같습니다. rate에 대하여 우측의 유도체 1과 -1 사이 인 경우, 지금

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

같은 루프의 갱신 명령을 작성하고 상기 방법은 수렴한다. 이 상황이 어떤 상황에서 나는 즉시 볼 수 없습니다. 반복이 이상한 investment 변수없이

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

을하지 않는 이유

당신은 궁금 할 수 있습니다. 사실 나는 그와 같은 것을 궁금해했다. 파생 조건이 충족되면 IRR로 수렴하는 고정 소수점 방법이 될 수도 있습니다. 제 생각에는 어떤 상황에서는 당신이 준 방법에 대해 미분 조건이 만족되고, investment이없는 방법에는 만족되지 않는다고 생각합니다.

3

나에게는 가짜입니다. 융합이 너무 느려 실용적이지 않습니다.

>>> irr([-100, 100]) # expecting answer 0 
0.00990099009900991 
2

나도 나쁘게 보입니다.

>>> irr([-100,50],100000) # expecting answer -0.5 
0.0 
+0

나는 당신이 대답 -0.5를 기대하고 있다고 생각한다. (0.5는 현금 흐름에 대한 IRR이 될 것입니다. [-100, 150]) 그러나 어쨌든 가짜입니다! –

+0

@ 가레스리스 : 맞아, 고마워. – unutbu

관련 문제