4

numpy と独自のコードを使用して NPV を計算していますが、結果が異なります。私はどこかで間違いを犯しているに違いない。ポインターはありますか?

// Solution 1
r = .06
flows = {0:1200, 3:-450, 6:-450, 15:-450}
print  sum([C/(1+r)**i for i,C in flows.iteritems()])
// => 317

// Solution using numpy's npv function
flows = zeros(16)
flows[0] = 1200
flows[3] = -450
flows[6] = -450
flows[15]= -450
print np.npv(r, flows)
// => 299
4

2 に答える 2

6

(ドキュメントに記載されているにもかかわらず) np.npvt = 0 ではなく t = 1 で合計を開始するように見えます。

In [56]: r = 0.06

In [57]: R = r+1

In [58]: (1200/R**0 - 450/R**3 - 450/R**6 - 450/R**15)
Out[58]: 317.16980210661666

In [59]: (1200/R**0 - 450/R**3 - 450/R**6 - 450/R**15)/R
Out[59]: 299.21679444020435

In [64]: np.npv(r, flows)*(1+r)
Out[64]: 317.16980210661683

実際、np.npvは次のように定義されています

def npv(rate, values):
    values = np.asarray(values)
    return (values / (1+rate)**np.arange(1,len(values)+1)).sum(axis=0)
于 2012-08-12T17:03:50.670 に答える
1

これはで修正されましたnumpy 1.8

Financial.npv の修正

npv 関数にバグがありました。ドキュメントに記載されている内容とは反対に、0 から M - 1 ではなく、1 から M までのインデックスを合計しました。この修正により、返される値が変更されます。mirr 関数は npv 関数を呼び出しましたが、問題を回避したため、これも修正され、mirr 関数の戻り値は変更されていません。

NumPy 1.8.0 リリースノート

で使用するnp.npvと、次のnumpy 1.8ようになります。

import numpy as np

r = .06

flows = np.zeros(16)
flows[0] = 1200
flows[3] = -450
flows[6] = -450
flows[15]= -450

result = np.npv(r, flows)

結果:

>>> result
317.16980210661666
于 2013-11-24T18:04:35.850 に答える