2016-02-28 20 views
0

我是新來的scipy和python。我已經搜索了相當廣泛的工具,在Python中找到類似於Excel Solver的工具,而且scipy似乎非常強大。我的問題有點簡單。我試圖找出一系列現金流量的折現率,以便CF的現值之和等於一個特定的價值。使用Scipy找到目標值Python

如果我運行代碼,我得到了這個錯誤信息。 1500是我的目標值,所以我儘量減少我的目標值和f(DR)之間的差異。

RuntimeWarning:溢出在乘法 DRfactor遇到[I] = DRfactor [I-1] *(1 + DR的[I])

任何和所有的幫助是非常讚賞

import numpy as np 
import scipy as sp 
import scipy.optimize 


def f(DR): 
    CFs = [100]*50 
    DRs = [np.nan]*50 
    DRfactor = [np.nan]*50 
    for i in range(0,50): 
     if 0<=i<=4: 
      DRs[i] = DR 
     else: 
      DRs[i] = (DRs[i-1]-0.1)*0.9+0.1 

     if i == 0: 
      DRfactor[i] = 1+DRs[i] 
     else: 
      DRfactor[i] = DRfactor[i-1]*(1+DRs[i]) 

    CFPV = np.divide(CFs, DRfactor) 
    CFsum = np.sum(CFPV) 

    return (CFsum - 1500)**2 

print (f(0.05)) 

sol = sp.optimize.minimize(f, 0.05) 
sol.x 
+0

我還不確定這是爲什麼,但是如果你在乘法之後放一個打印,你的代碼就可以正常工作。 – user1862770

+0

我跑了這個並在警告處打印出了數值,它給出了DRfactor [i-1] = [2.51650823e + 304]'和'DRs [i] = [3.97637700e + 11]'。看起來像算法的問題。 – tom10

+0

Excel求解器返回0.0416111292046818,我相信python可以做得更好。可能我使用了錯誤的scipy函數? – Timescape

回答

0

我弄清楚了。 scipy.optimize.newton可以將f(DR)清零並給出0.041611073570941355這與Excel解算器給出的答案相同。