zoukankan      html  css  js  c++  java
  • 仿射期限结构模型:理论与实现——实现部分

    仿射期限结构模型:理论与实现——实现部分

    本文介绍如何以面向对象的方式实现 Affine Term-Structure Models: Theory and Implementation 中的算法,并适当的使用设计模式使代码尽可能的优雅。

    引言

    金融工程领域的模型和方法之间既有强烈的共性,又有鲜明的个性,这使得“设计模式”的应用顺理成章。

    金融计算程序中常见的几个设计模式有:

    • 模板方法模式
    • 策略模式
    • 包装器模式

    AffineModel 类与模板方法模式

    首先要实现的是 AffineModel 类,它主要负责模拟因子、短期利率和零息利率的路径。

    对于仿射模型来说,由因子计算短期利率和零息利率的过程是一致的,这部分代码放到基类中,具体的派生类(VasicekCIR)只要专注实现模拟因子路径的计算就可以了。

    基类规划整体计算流程,派生类分别实现整体流程中的细节,这便是“模板方法模式”典型的应用场景。

    SimulateMethod 类与策略模式

    在当前案例中,因子路径的模拟可以使用 Euler 和 MIlstein 这类通用的离散方法,也可以使用卡尔曼滤波框架下的转移矩阵法。

    上述方法仅需要知道模型非常基本的信息(例如漂移项、扩散项和参数)便可以工作,因此可以独立于 AffineModel 类存在,而又被 AffineModel 对象使用。

    将方法抽象成类,再提供给其他类使用,这便是“策略模式”典型的应用场景。

    KalmanFilterAffineModel

    KalmanFilterAffineModel 类负责根据零息利率的历史数据估计出模型参数,整个计算过程围绕观测系统和转移系统中出现的五个关键矩阵展开:

    • 观测矩阵
    • 观测截矩矩阵
    • 转移矩阵
    • 转移截矩矩阵
    • 转移协方差矩阵

    模型参数蕴涵在这五个矩阵中,借由矩阵和利率数据,通过卡尔曼滤波算法可以算出特定模型参数对应的似然函数值,通过最大化似然函数值就可以估计利率数据对应的模型参数。

    在当前案例中,五个矩阵中的前四个仅和模型参数有关,且算法一致,可以放到基类中,最后一个由各个派生类自己实现。

    似然函数的计算也由各个派生类自己实现,而最优化部分的代码放在基类中。KalmanFilterAffineModel 类展示了一个中规中矩的面向对象设计案例,稍稍用到了“模板方法模式”。

    KalmanFilterVasicek 在似然函数的计算部分借助快速卡尔曼滤波(FKF)。

    Helper 类与包装器模式

    KalmanFilterAffineModel 类中计算关键矩阵的时候涉及到仿射模型中 (A( au))(B( au)) 的计算,而这部分代码已经出现在 AffineModel 类中。

    为了仅复用这部分代码,而不是其他,需要在 AffineModel 类的外侧套一层“壳”,屏蔽一些接口。Helper 类充当了这个角色,有选择的暴露出接口 A(tau)B(tau)KalmanFilterAffineModel 类使用。

    复用某些类已有的代码,而以不同的接口形式呈现,并为其他类所用,这便是“包装器模式”典型的应用场景。

    KalmanFilterAffineModel 类和 Helper 类之间是策略模式的关系。

    源代码

    Affine Term-Structure Models: Theory and Implementation

    注意:CIR 的部分运行速度很慢,未被充分测试。

    延伸阅读

    《仿射期限结构模型:理论与实现——理论部分》

  • 相关阅读:
    vue-webpack介绍
    vue-ES6模块化的导入和导出
    vue-前端模块化
    vue-插槽作用域的使用
    vue-具名插槽的使用
    vue-插槽的基本使用
    vue-父组件获取子组件对象实例
    IO(六)
    IO(五)
    关于overflow:hidden
  • 原文地址:https://www.cnblogs.com/xuruilong100/p/12641475.html
Copyright © 2011-2022 走看看