我尝试使用下面的代码找到多项式函数的根。多项式是根据需要设置的,但我的问题是scipy.optimize.newton(f, yields_0)
只返回一个值,当我期望它返回一个列表时。我不知道如何解决这个问题。我知道这不是设置函数f
的最佳方式,但我不知道列表rhs - bond.price
中每个bond
的{{1}}如何。 bonds
只能处理返回单个值的函数吗?如果是这样,我该如何重写下面的代码?
scipy.optimize.newton()
答案 0 :(得分:1)
我不清楚你的代码到底在做什么,但我可以给你一个快速计算债券收益率的例子。假设流量是0,1,2等的现金流量列表。flows[0]
是价格的负值,flows[1]
是第一张优惠券,...,流量[-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
这假定第一张优惠券是在购买保证金之后的六个月内支付的,就像您的代码中的情况一样。产量是每六个月一次,你必须将其调整为年产量。如果您想要更通用的方法,可以在购买日期的任何时间段内支付第一张优惠券,您将无法使用多项式。
我没有测试过这段代码;它可能有错误。