2011-07-31 28 views
6

Các trang web ActiveState Recipes có chức năng thực hiện Internal Rate of Return bằng Python:Phương pháp số được sử dụng trong việc thực hiện IRR này là gì?

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 

Mã này trả về giá trị đúng (ít nhất là trong vài ví dụ mà tôi đã kiểm tra đối Excel), nhưng tôi muốn biết tại sao .

  • Nó dường như không thực hiện Phương pháp Newton (không phái sinh) hoặc Phương pháp bảo mật (chỉ theo dõi một lần lặp).
  • Cụ thể, định nghĩa của biến đầu tư là phần tử ngân lưu đầu tiên (và việc sử dụng tiếp theo) gây nhầm lẫn cho tôi.

Bất kỳ ý tưởng nào?

Trả lời

4

Phương pháp này được gọi là lặp lại điểm cố định; xem ví dụ bài viết trên Wikipedia http://en.wikipedia.org/wiki/Fixed_point_iteration.

Ý tưởng là nếu rate chứa giá trị đúng (có nghĩa là, IRR), sau đó NPV là zero, do đó tuyên bố

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

sẽ không thay đổi rate. Vì vậy, một khi bạn tìm thấy IRR, sự lặp lại sẽ không thay đổi nó. Cố định điểm lặp đôi khi hội tụ với giá trị chính xác và đôi khi nó không. Các ví dụ về @Gareth và @unutbu cho thấy ở đây nó không phải lúc nào cũng hội tụ.

Tiêu chí hội tụ như sau. Viết báo cáo cập nhật trong vòng lặp như

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

Bây giờ, nếu đạo hàm của phía bên tay phải liên quan đến rate là giữa 1 và -1, sau đó phương pháp hội tụ. Tôi không thể ngay lập tức nhìn thấy trong trường hợp này là gì.

Bạn có thể tự hỏi tại sao lặp không làm

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

mà không investment biến kỳ lạ. Thật vậy, tôi tự hỏi như vậy; đó cũng sẽ là một phương pháp điểm cố định hội tụ với IRR nếu điều kiện phái sinh được thỏa mãn. Đoán của tôi là điều kiện phái sinh được thỏa mãn trong một số trường hợp cho phương pháp mà bạn đã đưa ra, và không cho phương thức mà không có investment.

3

Dường như không có thật với tôi. Sự hội tụ quá chậm để sử dụng thực tế.

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

Dường như không có thật với tôi.

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

Tôi nghĩ bạn đang mong đợi câu trả lời -0.5. (0,5 sẽ là IRR cho các dòng tiền [-100, 150].) Nhưng không có thật trong mọi trường hợp! –

+0

@Gareth Rees: Phải, cảm ơn. – unutbu

Các vấn đề liên quan