寻根功能问题
Issue with Root finding function
我正在尝试使用以下代码求多项式函数的根。多项式是根据需要设置的,但我的问题是 scipy.optimize.newton(f, yields_0)
return 只是一个值,而我期望它是 return 一个列表。我不知道如何解决这个问题。我知道这不是设置函数 f
的最佳方法,但我不知道如何为列表 bonds
中的每个 bond
rhs - bond.price
。 scipy.optimize.newton()
只能处理 return 是单个值的函数吗?如果是这样,我该如何重写下面的代码?
yields_list = []
rhs_list = []
def f(yields):
for bond in bonds:
rhs = 0
bond_cashflow_series = bond.to_cash_flows().amounts
vals_fromseries = bond_cashflow_series.values
for i in range(0, len(vals_fromseries), 1):
rhs = rhs + vals_fromseries[i]/(1+yields)**(i+1)
return rhs_list.append(rhs - bond.price)
yields_0 = 0.2
list_required = scipy.optimize.newton(f, yields_0)
我不清楚你的代码到底在做什么,但我可以给你一个快速计算债券收益率的例子。假设 flows 是时间 0、1、2 等的现金流列表。flows[0]
是价格的负数,flows[1]
是第一张息票,...,flows[-1] 是最终优惠券+兑换价值。
from numpy.polynomial.polynomial import Polynomial
# pv is present value as function of the discount rate
pv = Polynomial(flows)
f1 = pv.deriv(1)
f2 = pv.deriv(2)
v0 = 1/(1+yield_0)
v = scipy.optimize.newton(pv, v0, fprime=f1, fprime2=f2)
yield = 1.0/v -1
这里假设第一张息票是在购买债券后的六个月内支付的,您的代码中似乎就是这种情况。收益率是每六个月的收益率,您必须将其调整为年收益率。如果你想要一个更通用的方法,即可以在购买日期后的任何时间支付第一张优惠券,你将无法使用 Polynomial。
我还没有测试过这段代码;它可能有错误。
我正在尝试使用以下代码求多项式函数的根。多项式是根据需要设置的,但我的问题是 scipy.optimize.newton(f, yields_0)
return 只是一个值,而我期望它是 return 一个列表。我不知道如何解决这个问题。我知道这不是设置函数 f
的最佳方法,但我不知道如何为列表 bonds
中的每个 bond
rhs - bond.price
。 scipy.optimize.newton()
只能处理 return 是单个值的函数吗?如果是这样,我该如何重写下面的代码?
yields_list = []
rhs_list = []
def f(yields):
for bond in bonds:
rhs = 0
bond_cashflow_series = bond.to_cash_flows().amounts
vals_fromseries = bond_cashflow_series.values
for i in range(0, len(vals_fromseries), 1):
rhs = rhs + vals_fromseries[i]/(1+yields)**(i+1)
return rhs_list.append(rhs - bond.price)
yields_0 = 0.2
list_required = scipy.optimize.newton(f, yields_0)
我不清楚你的代码到底在做什么,但我可以给你一个快速计算债券收益率的例子。假设 flows 是时间 0、1、2 等的现金流列表。flows[0]
是价格的负数,flows[1]
是第一张息票,...,flows[-1] 是最终优惠券+兑换价值。
from numpy.polynomial.polynomial import Polynomial
# pv is present value as function of the discount rate
pv = Polynomial(flows)
f1 = pv.deriv(1)
f2 = pv.deriv(2)
v0 = 1/(1+yield_0)
v = scipy.optimize.newton(pv, v0, fprime=f1, fprime2=f2)
yield = 1.0/v -1
这里假设第一张息票是在购买债券后的六个月内支付的,您的代码中似乎就是这种情况。收益率是每六个月的收益率,您必须将其调整为年收益率。如果你想要一个更通用的方法,即可以在购买日期后的任何时间支付第一张优惠券,你将无法使用 Polynomial。
我还没有测试过这段代码;它可能有错误。