金融数据分析:非线性问题

金融数据分析•目录 金融数据分析•类别 finanical


内容是使用Jupyter Notebook写的,它比较便利编写公式和调试代码.这里的内容是粘贴的,所以代码的排版可能存在无法直接执行.

非线性与金融

非线性模型预测波动性,衍生工具价格,计算风险价值

非线性模型不一定可以推断出全局最优解

数值求根方法通常收敛到最近的局部最优解

非线性建模

隐含波动率模型

BCM定价
$$C(S, t) = Se^{-qT}N(d_1) - Ke^{-rT}N(d_2)$$

$$d_1 = \frac{ln(S/K + (r -q + \sigma^2/2)T}{\sigma \sqrt{T}}$$

$$d_2 = d_1 - \sigma \sqrt{T}$$

马尔科夫机制转换模型

$$y_t = x_1D_t + x_2(1-D_t) + \varepsilon_i$$

门限自回归模型

$$y_t = (a_1 + b_1y_{t-d})D_t + (a_2 + b_2y_{t-d})(1-D_t) + \varepsilon_i$$

平滑转换模型

通过逻辑函数$G(y_{t-1}; \; \gamma, \; c)$

$$G(y_{t-1}; \; \gamma, \; c) = \frac{1}{1 + e^{-\gamma (y_{t-d} - c)}}$$

$$y_t = (a_1 + b_1 y_{t-d})(1-G(y_{t-1}; \; \gamma, \; c)) + (a_2 + b_2 y_{t-d})G(y_{t-1}; \; \gamma, \; c) + \varepsilon_i$$

非线性模型求根算法概述

求根法是一个迭代过程,需要一个起始点或估计的根。估计根可能会收敛得到函数解,可能收敛到非所求根,也可能根本无解。

近似根的估计没有统一方法。

增量法

对于任意起点$a$,假定对于增量$d_x$,$f(a+dx)$、$f(a+2dx)$、$f(a+3dx)$、$f(a+4dx)$,函数值符号改变时表明求得一个解。

收敛时间过长,不够实用,但是它是最简单的。

import numpy as np

def incremental_search(f, a, b, dx):
    fa = f(a)
    c = a + dx
    fc = f(c)
    n = 1

    while np.sign(fa) == np.sign(fc):
        if a >= b:
            return a - dx, n

        fa = fc
        c += dx
        fc = f(c)
        n += 1

    if fa ==0:
        return c - dx, n
    elif fc == 0:
        return c, n
    else:
        return (2 * c - dx) / 2., n
y = lambda x: x**3. + 2.*x**2 - 5
root, iterations = incremental_search(y, -5., 5., 0.001)
root, iterations

二分法

不要求求导,非光滑函数一样适用。但是迭代时间长。

原理应该根据名字很好理解,就是每次寻找函数在区间两段异号,然后不停的二分,缩小区间。

def bisection(f, a, b, tol=0.1, maxiter=10):
    n = 1

    while n <= maxiter:
        c = (a + b) * 0.5
        if f(c) == 0 or abs(a - b) * 0.5 < tol:
            return c, n

        n += 1
        if f(c) < 0:
            a = c
        else:
            b = c
    return c, n
y = lambda x: x**3. + 2.*x**2 - 5
root, iterations = bisection(y, -5., 5., 0.001, 100)
root, iterations

牛顿迭代法

牛顿-拉夫逊法

$$x_1 = x - \frac{f(x)}{f’(x)}$$

表示切与x轴相交于点$x_1$,也表示$f$在点$x_1$的一阶泰勒展开式

则$$f(x_1 + \Delta x) = 0$$

需要初始值,计算$f(x)、f’(x)$

当函数有不止一个跟或计算达到局部极值时,无法进行下一步计算

def newton(f, df, x, tol=0.001, maxiter=100):
    n = 1

    while n <= maxiter:
        x1 = x - f(x) / df(x)
        if abs(x1 - x) < tol:
            return x1, n
        else:
            x = x1
            n += 1
    return None, n
y = lambda x: x**3. + 2.*x**2 - 5
dy = lambda x: 3*x**2 + 4*x
root, iterations = newton(y, dy, 5., 0.00000001, 100)
root, iterations

割线法

准牛顿迭代法

$$y = \frac{f(b) - f(a)}{b - a}(c - b) + f(b)$$

$$c = b - f(b) \frac {b - a}{f(b) - f(a)}$$

超线性收敛, 无需求导,速度快于二分小于牛顿迭代。

但是牛顿迭代法运算量大(浮点),割线法在绝对时间上占据优势

def secant(f, a, b, tol=0.0001, maxiter=100):
    n = 1

    while n <= maxiter:
        c = b - f(b) * (b - a) / (f(b) - f(a))
        if abs(c - b) < tol:
            return c, n

        a = b
        b = c
        n += 1

    return None, n
y = lambda x: x**3. + 2.*x**2 - 5
root, iterations = secant(y, -5.0, 5., 0.00000001, 100)
root, iterations

求根法综合应用

  1. 利用速度较快的割线法将问题收敛至误差值,或达到最大收敛次数。
  2. 一旦达到预设误差值,切换至二分法求解

Brent

Brent结合了二分法、割线法、逆二次插值法,尽可能使用割线法或逆二次插值法,必要时采用二分法。

scipy.optimize.brentq

Scipy求解

bisect、 newton、 brentq、 ridder

这些函数返回时,需要$f(a)$、$f(b)$异号。但是实际情况,往往不尽如意,约束难以满足。

比如非线性隐含波动率,波动率值不允许为负值。现实活跃的市场中,几乎无法在不修改函数条件的情况下求出波动率函数的根。需要根据自己的求根方法编写程序。

通用非线性求解器

root、fsolve


博主个人能力有限,错误在所难免.
如发现错误请不要吝啬,发邮件给博主更正内容,在此提前鸣谢.
Email: JentChang@163.com (来信请注明文章标题,如果附带链接就更方便了)
你也可以在下方的留言板留下你宝贵的意见.
建议邮件,它可以很快的被我发现,留言板的数据库我十年半月登录一次


上一篇
Special Explanation Special Explanation
我取消了版权限制的复制,这样可以直接复制完整的代码便于调试.但是有些代码我是在Notebook上写的,排版可能有点问题,但是我想那应该不是什么解决不了的. 最近东西比较多,我要一边找东西一边学习东西.所以更新上可能会比较缓慢,另外我发现写这
2019-03-25
下一篇
金融数据分析:线性问题 金融数据分析:线性问题
金融数据分析•目录 金融数据分析•类别 finanical 内容是使用Jupyter Notebook写的,它比较便利编写公式和调试代码.这里的内容是粘贴的,所以代码的排版可能存在无法直接执行. 金融中的线性问题传统的投资组合管理中,资产
2019-03-02
目录