在 python 中复制 excel 求解器函数以获得所需的输出
replicating an excel solver function in python to get required output
假设我从第 1 年到第 4 年都有现金流
cf = [30,45,52,67]
和折扣率(零息)
rt = [.02,.03,.04,.05]
在python
中直接计算 PV
import numpy as np
import pandas as pd
cf = [30,45,52,67]
rt = [.02,.03,.04,.05]
sum([x[0]/(1+x[1])**(i+1) for i,x in enumerate(zip(cf,rt))])
给我输出
173.1775
现在,如果我希望我的 NPV 为 180(假设),我将简单地 运行 在 excel 中求解,这将调整我的“rt”(通过在板)
如何在 python 中复制相同内容?我已经看到/使用过 SciPy 优化用于其他目的,但不确定我如何在这里使用它(或者是否有任何其他解决方案)
您可以使用 scipy.optimize
.
中的 newton
(Newton-Raphson 方法的实现)解决您的问题
newton
需要一个起点和一个单一参数的函数,当您达到目标时该参数的计算结果为零(这不是真的,newton
也可以接受多个函数变量,但是......)所以我们写了一个函数接受你的参数和 returns newton
需要的函数,最后我们调用 newton
初始值为零
In [25]: from scipy.optimize import newton
...: cf = [30,45,52,67]
...: rt = [.02,.03,.04,.05]
...:
...: def make_fun(cf, ret, val):
...: def fun(d):
...: return val-sum([x[0]/(1+x[1]+d)**(i+1)for i,x in enumerate(zip(cf,rt))])
...: return fun
...:
...: newton(make_fun(cf, rt, 180), 0)
Out[25]: -0.014576385759418057
编辑:当然您可以为 make_fun
选择一个更具描述性的名称……
假设我从第 1 年到第 4 年都有现金流 cf = [30,45,52,67]
和折扣率(零息) rt = [.02,.03,.04,.05]
在python
中直接计算 PVimport numpy as np
import pandas as pd
cf = [30,45,52,67]
rt = [.02,.03,.04,.05]
sum([x[0]/(1+x[1])**(i+1) for i,x in enumerate(zip(cf,rt))])
给我输出
173.1775
现在,如果我希望我的 NPV 为 180(假设),我将简单地 运行 在 excel 中求解,这将调整我的“rt”(通过在板)
您可以使用 scipy.optimize
.
newton
(Newton-Raphson 方法的实现)解决您的问题
newton
需要一个起点和一个单一参数的函数,当您达到目标时该参数的计算结果为零(这不是真的,newton
也可以接受多个函数变量,但是......)所以我们写了一个函数接受你的参数和 returns newton
需要的函数,最后我们调用 newton
初始值为零
In [25]: from scipy.optimize import newton
...: cf = [30,45,52,67]
...: rt = [.02,.03,.04,.05]
...:
...: def make_fun(cf, ret, val):
...: def fun(d):
...: return val-sum([x[0]/(1+x[1]+d)**(i+1)for i,x in enumerate(zip(cf,rt))])
...: return fun
...:
...: newton(make_fun(cf, rt, 180), 0)
Out[25]: -0.014576385759418057
编辑:当然您可以为 make_fun
选择一个更具描述性的名称……