Python金融数据分析(原书第2版)
上QQ阅读APP看书,第一时间看更新

3.3 利用SciPy求根

在开始编写求根算法之前,你可以先看一下关于scipy.optimize的文档[1],SciPy包含了基于Python的一系列科学计算功能。这些开源的第三方库可能更适用于计算。

3.3.1 求根标量函数

scipy.optimize模块包含bisectnewtonbrentqridder等求根函数,下面用SciPy实现前述示例:

070-01

运行上述代码,输出如下结果:

070-02

可以看出SciPy得出的结果与之前非常相近。

SciPy为每种函数的实现设定了明确的条件。例如,二分法的常规函数调用如下:

071-01

该函数会返回f的零点。f(a)和f(b)不能是相同的符号。某些情况下,这些约束难以全部满足。例如,求解非线性隐含波动率模型时,波动率值不能为负。现实情况中,不修改函数条件很难求出波动率函数的根,我们需要根据实际情况自己编写合适的求根算法。

3.3.2 通用非线性求解器

scipy.optimize模块还包含多维通用求解器,其中rootfsolve函数具有如下特征:

  • root(fun, x0[, args, method, jac, tol, ...]):求一个向量函数的根。
  • fsolve(func, x0[, args, fprime, ...]):求一个函数的根。

返回的输出作为字典对象。再次使用前述非线性函数作为输入函数,得到以下输出:

071-02

初始预估值为5,最终的根收敛到1.241 896 56,这与我们之前得到的答案非常接近。接下来输入-5作为初始预估值:

071-03

输出结果显示,该算法不收敛,返回与之前结果有偏差的根。如果我们看一下图,会发现曲线周围有许多点非常接近根。求解器会在保持理想精度的情况下,用最短时间求得最接近的答案。


[1]这是一个常用的Python第三方库,在前面的章节中我们已经下载。——译者注