文章

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

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

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

引言

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

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

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

AffineModel 类与模板方法模式

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

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

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

SimulateMethod 类与策略模式

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

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

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

KalmanFilterAffineModel

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

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

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

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

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

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

Helper 类与包装器模式

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

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

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

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

源代码

Affine Term-Structure Models: Theory and Implementation

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

延伸阅读

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

本文由作者按照 CC BY 4.0 进行授权