【问题标题】:replicating an excel solver function in python to get required output在python中复制一个excel求解器函数以获得所需的输出
【发布时间】:2021-02-19 22:38:41
【问题描述】:

假设我从第 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 优化用于其他目的,但不确定如何在这里使用它(或者是否有任何其他解决方案)

【问题讨论】:

    标签: python optimization scipy solver


    【解决方案1】:

    您可以使用scipy.optimize 中的newton(牛顿-拉夫森方法的实现)解决您的问题。

    newton 需要一个起点和一个单一参数的函数,当你达到目标时,它的计算结果为零(这不是真的,newton 也可以接受多个变量的函数,但是……)所以我们编写一个函数,接受你的参数并返回newton所需的函数,最后我们调用newton,初始值为0

    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 选择一个更具描述性的名称……

    【讨论】:

    • 完美!!感谢您的代码和解释 - 最有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    • 2021-05-24
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    相关资源
    最近更新 更多