三次样条插值_利率期限结构模型之一——逐点递推法(插值法)和样条函数法...

点击上方蓝色字体,关注我们!

9650aa42969d727069530b94711dfef0.gif文末有excel文件下载,供各位读者需要时使用

8b2fc0d7ae7e3f31ffec72a4aefb6bb6.png

众所周知,市场上债券的到期期限和付息时间往往不是均匀分布的,即便采用解鞋带法(bootstrapping)根据债券的价格来计算收益率,也只能得到有限个期限点上的数据。如何利用这一部分有限个已知点的值,计算出其他点的值,也是一个值得研究的问题。

在上一篇文章《利率期限结构模型综述》中,我们知道静态模型可以分为参数模型和非参数模型两种,其中参数模型又包括直接推导法、逐点递推法、样条函数法、参数拟合法和最大平滑法等。上述模型中的一部分就可以用来解决上面的问题,其中实际应用中使用较多的是逐点递推法和样条函数法

逐点递推法就是利用已知期限的即期利率,通过插值来获取未知期限的即期利率,主要包含有线性、非线性插值法和线性规划法三种技术。

一、线性插值法

线性插值法是最简单的一种插值法,将存在数据的两个点用直线连接,直线上的各点就是缺失的各点。

65fce8111481702f95e27e44b3a6cd16.png

如上图所示,已知A点和B点的坐标8646338aaa7ffdd818605b29859f8632.png,那么对于任意一个位于A点和B点之间的C点,假如其横坐标为x,那么我们由公式

14ef21ec5fb60aed01fe9f17d0b12737.png

就可以得到其纵坐标

c2e6ef5c3ff0a657e914d577d12c0ff1.png

线性插值法优点在于简单易算,但是生成的曲线将会是不连续、不可导的折线,不仅没有数学上的美感,而且也与实际情况不相符。

二、非线性插值法

与线性插值主要依据两点之间的斜率所不同的是,非线性插值考虑了三点形成的曲率,使得曲线更加平滑。主要包括多项式插值法和样条函数法,其中前者有拉格朗日(Lagrange)插值法、牛顿(Newton)插值法、埃尔米特(Hermite)插值法,后者有三次样条法等。

(一)多项式法

1.拉格朗日插值法

拉格朗日插值法的基本思想是构建多项式,设函数354877323714008f36b117b37a955a75.png在区间66fdef6a21ad1ec7f608c5992874c1af.png上有定义,且已知在b46ab220fb2719b9e8270cc1ca5ed2af.png这n+1个点上的值分别为dc1c60d56cd77e5956cdf813c5827302.png。则存在一个次数不超过n的多项式

15fcf4f2707200b71ca8800715b51acc.png

满足b2f70fb744878db1d9b046ab823fb014.png6ba9a0beea7494001aa74d14f315d16c.png,并且满足上述条件的多项式c44c3f4a162a157eaee3077227e4e59e.png是唯一的。

算法的具体计算方法如下,对某个多项式函数,已知有给定的k+1个取值点:

  • 14
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设已知的三维空间点坐标及向量分别存储在 $P$ 和 $N$ 两个 $n \times 3$ 的矩阵中,其中 $n$ 表示点的数量。 首先,我们需要构造 B 样条基函数。这里我们使用经典的 Cox-de Boor 公式进行计算。具体实现如下: ```matlab function [N, U] = bspline_basis(u, k, t) % u: 点的位置 % k: B样条的次数 % t: 节点向量 % N: B样条基函数 % U: 扩展过的节点向量 n = numel(t) - k - 1; % B样条的数量 U = [t(1:k) u t(n+1:n+k)]; % 扩展节点向量 N = zeros(n, numel(u)); % 存储 B样条基函数 for i = 1:numel(u) for j = 1:n if U(j) <= u(i) && u(i) < U(j+1) N(j,i) = 1; end end end for d = 2:k for j = 1:n if N(j,i) ~= 0 alpha = (u(i) - U(j)) / (U(j+d-1) - U(j)); N(j,i) = alpha * N(j,i-1) + (1-alpha) * N(j+1,i-1); end end end end ``` 接下来,我们可以使用 B 样条对点和向量进行。具体实现如下: ```matlab function [P_interpolated, N_interpolated] = bspline_interpolation(P, N, num_points, degree) % P: 原始点的坐标 (n x 3) % N: 原始点的向量 (n x 3) % num_points: 后的点数 % degree: B样条的次数 % 构造节点向量 n = size(P, 1); t = linspace(0, 1, n+degree+1); t = [zeros(1,degree) t(1:end-degree)]; % 构造点的位置 u = linspace(0, 1, num_points); % 计算 B样条基函数 [Nu, U] = bspline_basis(u, degree, t); % 对点坐标 [Nn, ~] = bspline_basis(u, degree, t); % 对向量 % 计算后的点坐标和向量 P_interpolated = zeros(num_points, 3); N_interpolated = zeros(num_points, 3); for i = 1:3 P_interpolated(:,i) = Nu * P(:,i); N_interpolated(:,i) = Nn * N(:,i); end end ``` 这里我们使用了与点坐标相同的节点向量和 B 样条基函数向量进行。实际上,我们也可以使用不同的节点向量和 B 样条基函数向量进行,以达到更好的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值