仿射期限结构模型:理论与实现——实现部分
本文介绍如何以面向对象的方式实现《Affine Term-Structure Models:Theory and Implementation》中的算法,并适当的使用设计模式使代码尽可能的优雅。。
仿射期限结构模型:理论与实现——实现部分
引言
金融工程领域的模型和方法之间既有强烈的共性,又有鲜明的个性,这使得“设计模式”的应用顺理成章。
金融计算程序中常见的几个设计模式有:
- 模板方法模式
- 策略模式
- 包装器模式
AffineModel
类与模板方法模式
首先要实现的是 AffineModel
类,它主要负责模拟因子、短期利率和零息利率的路径。
对于仿射模型来说,由因子计算短期利率和零息利率的过程是一致的,这部分代码放到基类中,具体的派生类(Vasicek
和 CIR
)只要专注实现模拟因子路径的计算就可以了。
基类规划整体计算流程,派生类分别实现整体流程中的细节,这便是“模板方法模式”典型的应用场景。
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 的部分运行速度很慢,未被充分测试。