6

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に対してチェックしたいくつかの例では)が、その理由を知りたいと思います。

  • ニュートン法(導関数なし)または割線法(1回の反復のみを追跡する)の実装ではないようです。
  • 特に、最初のキャッシュフロー要素としての投資変数の定義(およびその後の使用)は私を混乱させます。

何か案は?

4

3 に答える 3

4

この方法は、固定小数点反復と呼ばれます。たとえば、ウィキペディアの記事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)

ここで、に関する右辺の導関数がrate1から-1の間にある場合、メソッドは収束します。どのような状況でこれが当てはまるのかすぐにはわかりません。

なぜ反復が行われないのか不思議に思うかもしれません

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

奇妙なinvestment変数なし。確かに、私は同じことを疑問に思いました。これは、微分条件が満たされた場合にIRRに収束する固定小数点法でもあります。私の推測では、あなたが与えた方法では、ある状況では微分条件が満たされ、。なしの方法では満たされないと思いますinvestment

于 2011-08-01T08:01:48.980 に答える
3

それは私には偽物のようです。収束が遅すぎて実際に使用できません。

>>> irr([-100, 100]) # expecting answer 0
0.00990099009900991
于 2011-08-01T00:09:29.153 に答える
2

私にも偽物のようです。

>>> irr([-100,50],100000)  # expecting answer -0.5
0.0
于 2011-08-01T00:32:31.933 に答える