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 实时定价更新机制
做市系统最核心的能力——实时更新。
市场报价每秒都在变,你的定价引擎必须跟上。我设计过一套三层更新机制:
- 事件驱动层:收到新报价,立即触发局部重算
- 定时刷新层:每100ms全量刷新一次,防止遗漏
- 异常回退层:如果计算超时(>50ms),直接使用上一帧价格
这里有个关键点:不要每次都用全量拟合。我见过一个团队,每次报价更新都跑Svensson拟合,结果延迟飙到200ms。后来改成局部插值+定时全量拟合,延迟降到5ms以下。
实时定价的黄金法则:
- 90%的更新用插值法,10ms内完成
- 9%的更新用局部拟合,50ms内完成
- 1%的更新触发全量拟合,放在后台异步执行
4.5 架构示意图
下面这张图,是我做债券做市系统时画的定价引擎核心流程。你看一眼就明白了:
这张图里,核心就是那个菱形决策节点。每次报价进来,先判断是不是全量更新。不是的话,走左边插值法,10ms搞定。是的话,走右边参数拟合,50ms内完成。两条路最终汇合到定价计算模块。
千万别小看这个决策逻辑。我见过一个团队,所有更新都走参数拟合,结果系统在波动率大的时候直接崩溃。加了决策分支后,系统吞吐量提升了8倍。
4.6 避坑指南
最后,分享几个我踩过的坑:
- 参数初始化:NS模型的β₀初始值,最好用最长期限的收益率。我一开始随便设,结果拟合经常不收敛。
- 异常报价过滤:一定要加。我曾经因为一个错误报价,导致整条曲线扭曲了30秒。
- 缓存策略:最近10次拟合结果缓存起来。如果新报价和缓存差异小于0.5bp,直接复用。
- 精度 vs 速度:实时场景下,1bp精度就够了。别为了0.1bp的精度把延迟搞到100ms以上。
我个人习惯,在系统里加一个「定价引擎健康面板」。实时显示:当前延迟、拟合次数、异常报价数。出了问题,一眼就能看到。
好了,定价引擎的核心就这些。模型选型、曲线构建、实时更新,环环相扣。做得好,你的报价就是市场最优;做得不好,你就是在给市场送钱。