在python中复制excel解算器函数以获得所需的输出

2024-06-26 13:41:27 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我从第一年到第四年都有现金流 cf=[30,45,52,67]

和贴现率(零息票) rt=[.02,03,04,05]

在python中,计算PV是直截了当的fwd

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

现在,如果我想我的净现值是180(假设),我只需在excel中运行一个solve,这将调整我的“rt”(通过添加一个全面的价差)

enter image description here 如何在python中复制相同的内容?我见过/使用SciPy优化用于其他目的,但不确定如何在这里使用它(或者是否有其他解决方案)


Tags: importnumpypandasforasnpcfpd
1条回答
网友
1楼 · 发布于 2024-06-26 13:41:27

您可以使用来自scipy.optimizenewton(牛顿-拉斐逊方法的实现)解决您的问题

newton需要一个起点和一个单一参数的函数,当您到达目标时,该参数的计算结果为零(这不是真的,newton也可以接受多个变量的函数,但是…),因此我们编写了一个函数,它接受您的参数并返回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选择一个更具描述性的名称

相关问题 更多 >