寻根功能问题

Issue with Root finding function

我正在尝试使用以下代码求多项式函数的根。多项式是根据需要设置的,但我的问题是 scipy.optimize.newton(f, yields_0) return 只是一个值,而我期望它是 return 一个列表。我不知道如何解决这个问题。我知道这不是设置函数 f 的最佳方法,但我不知道如何为列表 bonds 中的每个 bond rhs - bond.pricescipy.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。

我还没有测试过这段代码;它可能有错误。