4、定价引擎设计:定价模型选择、收益率曲线构建与实时更新

定价引擎,说白了就是做市系统的「大脑」。

你报出去的每一个价格,背后都是它在算。算得快不准,亏钱;算得准不快,丢单。我见过不少团队,模型选得花里胡哨,结果上线第一天就被市场打脸。嗯,这里头门道不少。

4.1 定价模型选择:Nelson-Siegel vs Svensson

做债券定价,第一步是选模型。我个人习惯,先看你要做的是国债还是信用债。

Nelson-Siegel(NS)模型,最经典的那个。公式长这样:

y(τ) = β₀ + β₁ * (1 - e^(-τ/λ)) / (τ/λ) + β₂ * ((1 - e^(-τ/λ)) / (τ/λ) - e^(-τ/λ))

三个参数 β₀、β₁、β₂,分别控制长期水平、短期斜率和中期曲率。λ 是衰减因子。

优点?参数少,拟合快。我在做国债做市系统时,NS模型基本够用。尤其流动性好的关键期限,误差能控制在1bp以内。

Svensson 模型,是NS的升级版。多了一个β₃和一个λ₂:

y(τ) = β₀ + β₁ * (1 - e^(-τ/λ₁)) / (τ/λ₁) 
       + β₂ * ((1 - e^(-τ/λ₁)) / (τ/λ₁) - e^(-τ/λ₁))
       + β₃ * ((1 - e^(-τ/λ₂)) / (τ/λ₂) - e^(-τ/λ₂))

多出来的参数,专门处理第二个「驼峰」。信用债或者期限结构复杂时,Svensson明显更准。

我的经验:

  • 国债做市 → NS模型,够快够稳
  • 信用债/含权债 → Svensson,多一个驼峰参数很关键
  • 实时场景 → 优先NS,参数少收敛快

我曾经在信用债系统里硬用NS模型,结果10年期附近误差跑到3bp。换成Svensson后,误差直接降到0.5bp。你想想看,3bp在百亿规模下是什么概念?

4.2 收益率曲线构建:从插值到拟合

模型选好了,接下来就是构建曲线。这里有两个流派:

流派一:插值法

直接用市场报价点,插出整条曲线。常见的有:

  • 线性插值:简单粗暴,但导数不连续
  • 三次样条:平滑,但容易过拟合
  • 单调三次Hermite:兼顾平滑和单调性,我个人比较喜欢

流派二:参数拟合法

用NS或Svensson模型,拟合所有观测点。好处是曲线光滑,坏处是计算量大。

实际做市系统中,我建议这样搭配:

场景 方法 原因
盘前准备 参数拟合(Svensson) 精度优先,计算时间充裕
盘中实时 插值法(Hermite) 速度优先,微调即可
收盘后 全量拟合+校验 用于次日基准曲线

注意:插值法对异常点非常敏感。我曾经遇到过一笔错误报价,导致整条曲线扭曲。一定要加异常检测,比如用3-sigma规则过滤。

4.3 债券定价计算:从曲线到价格

曲线有了,定价就是套公式。但这里有个坑——现金流处理。

标准公式:

P = Σ (CFᵢ / (1 + y/2)^(tᵢ * 2))

其中 CFᵢ 是第 i 期现金流,y 是到期收益率,tᵢ 是剩余年限。

实际做市时,要考虑:

  • 应计利息:上次付息日到结算日的利息
  • 工作日调整:付息日落在周末怎么办?
  • 计息基准:ACT/365?ACT/ACT?不同市场不一样

我建议把现金流计算单独封装成一个模块。因为不同债券的付息频率、计息规则差异很大。封装好了,后面加新券种就方便了。

4.4 实时定价更新机制

做市系统最核心的能力——实时更新。

市场报价每秒都在变,你的定价引擎必须跟上。我设计过一套三层更新机制:

  1. 事件驱动层:收到新报价,立即触发局部重算
  2. 定时刷新层:每100ms全量刷新一次,防止遗漏
  3. 异常回退层:如果计算超时(>50ms),直接使用上一帧价格

这里有个关键点:不要每次都用全量拟合。我见过一个团队,每次报价更新都跑Svensson拟合,结果延迟飙到200ms。后来改成局部插值+定时全量拟合,延迟降到5ms以下。

实时定价的黄金法则:

  • 90%的更新用插值法,10ms内完成
  • 9%的更新用局部拟合,50ms内完成
  • 1%的更新触发全量拟合,放在后台异步执行

4.5 架构示意图

下面这张图,是我做债券做市系统时画的定价引擎核心流程。你看一眼就明白了:

定价引擎核心流程 市场报价输入 是否全量更新? 插值法(Hermite) 延迟 < 10ms 参数拟合(Svensson) 延迟 < 50ms 债券定价计算 输出买卖报价 图:定价引擎三层更新机制

这张图里,核心就是那个菱形决策节点。每次报价进来,先判断是不是全量更新。不是的话,走左边插值法,10ms搞定。是的话,走右边参数拟合,50ms内完成。两条路最终汇合到定价计算模块。

千万别小看这个决策逻辑。我见过一个团队,所有更新都走参数拟合,结果系统在波动率大的时候直接崩溃。加了决策分支后,系统吞吐量提升了8倍。

4.6 避坑指南

最后,分享几个我踩过的坑:

  • 参数初始化:NS模型的β₀初始值,最好用最长期限的收益率。我一开始随便设,结果拟合经常不收敛。
  • 异常报价过滤:一定要加。我曾经因为一个错误报价,导致整条曲线扭曲了30秒。
  • 缓存策略:最近10次拟合结果缓存起来。如果新报价和缓存差异小于0.5bp,直接复用。
  • 精度 vs 速度:实时场景下,1bp精度就够了。别为了0.1bp的精度把延迟搞到100ms以上。

我个人习惯,在系统里加一个「定价引擎健康面板」。实时显示:当前延迟、拟合次数、异常报价数。出了问题,一眼就能看到。

好了,定价引擎的核心就这些。模型选型、曲线构建、实时更新,环环相扣。做得好,你的报价就是市场最优;做得不好,你就是在给市场送钱。

专注资料整理