卡尔曼滤波交易:这个指标如何运作,什么时候真正有用

交易中的卡尔曼滤波是一种递归平滑器:它把自己的预测与每根新K线加权融合,以此估计价格的“真实”水平,权重即增益,由过程噪声 Q 和测量噪声 R 决定。最简单的单状态版本最终会收敛成一条 EMA;只有加入速度状态或自适应噪声设置,滞后才会真正降低。
卡尔曼滤波指标常被包装成“零滞后”均线来卖。但只要把数学算一遍,就会看到完全不同的结论:常见的一维版本最终会收敛成一条普通 EMA,而它的周期完全可以由两个输入参数算出来。这篇 Quantum Algo 指南会演示这个计算过程,手算五根K线,解释真正更低的滞后从何而来(速度状态、自适应噪声),并介绍卡尔曼滤波公开记录最好的应用场景:配对交易中随时间变化的对冲比率。文中还附有一个计算器,你可以用自己的价格数据来验证。
经得起公开验证的指标。
一个引擎,四款精准工具:Gold(XAU)Scalper、机构级 Gravity Zone、Zeno 动量振荡指标,以及面向股票的 Zeno Stocks。
为什么交易者要在价格图上加卡尔曼滤波
每一笔成交价都混合了两样东西:市场“真正”所在的位置,以及来自订单簿、点差和急躁交易者的噪声。均线试图通过对固定窗口取平均来把两者分开。卡尔曼滤波的做法不同:它持续维护一个对真实水平的最佳估计,同时记录这个估计有多不确定;每当新K线到来,它就判断该更相信这根K线,还是更相信自己的估计。
整个技巧就在于这个判断。如果滤波器对自己没把握、而价格比较干净,它就会紧跟价格;如果它很有把握、而价格噪声很大,它几乎不动。它分配给每根新K线的权重叫作卡尔曼增益,而且每根K线都会重新计算一次。
这种方法源自工程领域,而不是金融市场。鲁道夫·卡尔曼于 1960 年在《Journal of Basic Engineering》上发表了《A New Approach to Linear Filtering and Prediction Problems》,随后 NASA Ames 研究中心 Stanley Schmidt 团队的早期实现被用进了阿波罗导航计算机。交易者借用它来做三件事:
- A smoothed trend line that you read like a moving average.
- A trend-plus-slope estimate that projects momentum forward to cut lag.
- A time-varying hedge ratio for pairs and spread trading, which is where it has the strongest track record in published quant work.
大多数文章讲到“它会自适应,所以更好”就停了。真正有用的结论要具体得多,而这要从公式讲起。
卡尔曼滤波公式,逐行拆解

在价格平滑中,交易者几乎总是使用最简单的版本:只有一个隐藏状态(真实价格水平),并假设它像随机游走一样漂移。统计学家把它称为局部水平模型。每根K线都要经历两个阶段:预测和更新。
Predict: x⁻ = x(t−1) P⁻ = P(t−1) + QGain: K = P⁻ ÷ (P⁻ + R)Update: x(t) = x⁻ + K × (price − x⁻) P(t) = (1 − K) × P⁻| 符号 | 名称 | 在图表上的含义 |
|---|---|---|
| x | 状态估计值 | 你画在图上的那条滤波线 |
| P | 估计方差 | 滤波器对自己这条线有多不确定 |
| Q | 过程噪声 | 你认为真实水平每根K线实际会移动多少 |
| R | 测量噪声 | 你认为每一笔价格的噪声有多大 |
| K | 卡尔曼增益(0 到 1) | 最新“意外偏差”中被加到这条线上的比例 |
慢慢读一遍更新公式:新估计值 = 旧估计值 + K × 意外偏差。这和指数移动均线的形式完全一样,EMA 加上的是 α × 意外偏差。唯一的区别是:EMA 的 α 由你固定设定,而 K 是根据 P、Q 和 R 计算出来的。
通用的卡尔曼滤波使用矩阵(状态转移矩阵 F、观测矩阵 H,以及 Q 和 R 的协方差矩阵),因此可以同时追踪多个隐藏值。上面的一维版本只是其中一个特例:所有量都只是一个数。
Q 和 R 如何在平滑度与灵敏度之间取舍
下面这个事实,大多数卡尔曼指标页面都避而不谈:在一维模型中,增益经过几十根K线后就会稳定在一个固定值,而这个值只取决于比值 q = Q ÷ R。把两者同时放大十倍,结果毫无变化。
Steady-state gain: K∞ = ( −q + √(q² + 4q) ) ÷ 2, where q = Q ÷ REquivalent EMA length: N = 2 ÷ K∞ − 1一旦 K 稳定下来,这个滤波器在数学上就与 α = K∞ 的 EMA 完全等价。教科书《Forecasting: Principles and Practice》从另一个方向给出了同样的联系:简单指数平滑可以写成一个新息状态空间模型,其状态方程为 level(t) = level(t−1) + α × error。
| q = Q ÷ R | 稳态增益 K∞ | 相当于多少周期的 EMA | 特点 |
|---|---|---|---|
| 0.001 | 0.031 | ≈ 63 根K线 | 非常平滑,反应慢 |
| 0.01 | 0.095 | ≈ 20 根K线 | 波段趋势基准线 |
| 0.05 | 0.200 | 9 根K线 | 短期趋势 |
| 0.1 | 0.270 | ≈ 6.4 根K线 | 快速 |
| 0.5 | 0.500 | 3 根K线 | 紧贴价格 |
| 1.0 | 0.618 | ≈ 2.2 根K线 | 几乎就是原始价格 |
这张表是本指南中最实用的内容。TradingView 上一个使用很广的开源卡尔曼脚本默认 Q = 0.01、R = 0.1,比值为 0.1。进入稳态后,这条线的加权方式大约相当于一条 6 周期 EMA。知道了这一点,你就不必再猜某个参数到底有什么效果,而是可以把它对应到一条你早已熟悉的均线上。
手算一个五根K线的卡尔曼滤波
我们用六个收盘价来运行这个滤波器:100.00、101.20、100.60、102.10、103.00、102.40。参数设置:Q = 0.1,R = 1,初始估计值 x = 100.00(第一个收盘价),初始方差 P = 1。
| K线 | 收盘价 | P⁻ = P + Q | 增益 K | 估计值 x | 新的 P |
|---|---|---|---|---|---|
| 1 | 101.20 | 1.1000 | 0.5238 | 100.6286 | 0.5238 |
| 2 | 100.60 | 0.6238 | 0.3842 | 100.6176 | 0.3842 |
| 3 | 102.10 | 0.4842 | 0.3262 | 101.1012 | 0.3262 |
| 4 | 103.00 | 0.4262 | 0.2988 | 101.6686 | 0.2988 |
| 5 | 102.40 | 0.3988 | 0.2851 | 101.8772 | 0.2851 |
第 1 根K线完整计算
- 预测:x⁻ = 100.00,P⁻ = 1 + 0.1 = 1.1。
- 增益:K = 1.1 ÷ (1.1 + 1) = 0.5238。
- 意外偏差:101.20 − 100.00 = 1.20。
- 更新:x = 100.00 + 0.5238 × 1.20 = 100.6286。
- 新的方差:P = (1 − 0.5238) × 1.1 = 0.5238。
这些数字说明了什么
增益每根K线都在下降:0.52、0.38、0.33、0.30、0.29,正朝着上表中的稳态值 0.270 靠拢。在增益较高的阶段,滤波器追价比它的稳态 EMA 更积极。同样的数据,用 α 固定为 0.270 的 EMA 计算,第 5 根K线收在 101.697;卡尔曼线则收在 101.877,更贴近价格,而这完全是预热阶段造成的。
接下来是一个让人不太舒服的对比。一条以 100 为初始值的普通 5 周期 EMA(α = 0.333)在第 5 根K线收在 101.916,比卡尔曼线还要贴近价格。所以“卡尔曼比 EMA 更快”这种说法,完全取决于你拿哪条 EMA、用哪组 Q/R 来比较。把这些收盘价粘贴到下方的计算器里,就能逐一核对每个数字。
如何为你的市场和周期选择 Q 和 R
第一次读卡尔曼代码的人,大多会对这一点感到意外:在经典线性滤波器中,增益序列根本不看价格。P、P⁻ 和 K 只取决于 Q、R 和初始 P。你甚至可以在图表加载之前就把每一根K线的增益算出来。价格只通过意外偏差这一项进入计算。这就是为什么决定行为的是 Q ÷ R 这个比值,而不是交易品种;也是为什么一个 Q 和 R 固定的脚本,在比特币上和在 EUR/USD 上的表现完全一样。
初始方差 P 在最初几十根K线里确实有影响。相对 R 偏大的 P 会让这条线一开始就跳到价格附近;极小的 P 则会让它慢慢爬。把初始估计值设为第一个收盘价、并让 P 等于 R,是一个中性的选择。
这是起点,不是神奇参数
下面是一组合理的初始设置,以 q = Q ÷ R 表示,选取依据是交易者在各个周期上常用的均线长度。它们只是测试的起点,并不是经过优化的数值。
| 用途 | 常用周期 | 初始 q | 相当于 |
|---|---|---|---|
| 剥头皮基准线 | 1 到 5 分钟 | 0.05 到 0.1 | EMA 6 到 9 |
| 日内趋势 | 15 分钟到 1 小时 | 0.01 | EMA 20 |
| 波段方向 | 4 小时到日线 | 0.002 到 0.005 | EMA 28 到 45 |
| 中长线趋势 | 日线到周线 | 0.0005 到 0.001 | EMA 63 到 89 |
用数据估计 Q 和 R
如果你想要比“对齐某条 EMA”更有理论依据的方法,可以直接估计这两种噪声。R 是价格围绕其底层水平的方差:取一条平滑的参考线,逐根计算收盘价减去参考线的差值,再求这组残差的方差。Q 则是参考线本身逐根变化量的方差。在一个平静的交易周里,流动性好的股指期货通常会得出很小的 q;遇到新闻驱动的一周,它就会跳升。统计学家通常改用极大似然法来拟合这两个值,Python 和 R 里的状态空间工具就是这么做的,但残差法已经足以让你把数量级估对。
无论用哪种方法,波动率发生变化后都要重新检查。在平静行情中估计出的比值,正是一条上个月看起来完美的卡尔曼线、这个月却严重滞后的最常见原因。
卡尔曼滤波的滞后真的比 EMA 小吗?

简短回答:一维水平滤波器在预热完成后并不会。它的滞后与它所收敛到的那条 EMA 完全一样。所谓“更低滞后”的说法来自另外三个来源,而每一种都有代价。
- Warm-up and resets. A high starting P makes the early gain large, so the line snaps to price at the start of the chart. Some scripts inflate P after big moves to get the same effect mid-chart. That reduces lag right after shocks and increases noise right after shocks.
- Adaptive Q and R. Scripts that scale R or Q with ATR or standard deviation change the gain with volatility. That is closer in spirit to Kaufman's adaptive moving average than to a classic Kalman filter, and it adds parameters you have to tune.
- A velocity state. This is the real one. If the model tracks level and slope, the prediction step projects the trend forward, so the line keeps up in a steady trend. It also overshoots at turns, the same trade-off you see with the Hull moving average.
这些都不是免费的午餐。趋势中滞后更低,必然会在别处表现为更多的过冲和更多的来回打脸。卡尔曼框架给你的,是一种有理论依据的方式来设定这个取舍,外加一条不确定性带(来自 P),这是均线无法提供的。
双状态版本:水平 + 速度
恒速模型增加了第二个隐藏值:每根K线的斜率。预测步骤变成“下一个水平 = 水平 + 斜率;下一个斜率 = 斜率”。由于只有水平是可观测的,滤波器会根据价格不断带来的意外偏差来推断斜率。
State: [level, slope] F = [[1, 1], [0, 1]] H = [1, 0]Predict: level⁻ = level + slope, slope⁻ = slope, P⁻ = F·P·Fᵀ + Q实际使用中,它的表现像一条平滑过的线性外推,感觉上类似滚动的线性回归线,只是采用递归方式更新。斜率状态本身就很有用:把它画成振荡器,它就成了一条平滑的变化率曲线,趋势反转时会穿越零轴。
Eric Benhamou 在 2016 年的论文《Trend Without Hiccups: A Kalman Filter Approach》中,用一年的 E-mini S&P 500 日线数据,把几种此类模型与 DEMA 和 TEMA 做了比较。这些模型是在同一年的数据上调参的,没有做样本外测试,所以论文报告的收益只能当作演示,不能当作存在优势的证据。
配对交易中的卡尔曼对冲比率
卡尔曼滤波的名声正是在这里赢来的。在配对交易中,你按比率 β 持有一个资产、对冲另一个资产,使价差呈均值回归。用一次回归得出的固定 β 会逐渐失效;滚动回归又迫使你选择一个回看周期。卡尔曼方法把 β(以及截距)视为以随机游走方式漂移的隐藏状态,并在每根K线上更新它们。
Observation: priceY(t) = β₀(t) + β₁(t) × priceX(t) + noiseState: β(t) = β(t−1) + small random changeErnest Chan 在《Algorithmic Trading: Winning Strategies and Their Rationale》(Wiley,2013)一书中用 EWA 和 EWC 这两只国家 ETF 演示了这种方法,使其在散户量化圈流行起来。这个滤波器还会附带给你两样东西:预测误差 e(t),也就是价差本身;以及它的方差,其平方根的作用类似于移动标准差。你可以像在价差上使用布林带那样交易它:当 e(t) 跌破 −k × √方差 时做多价差,当它升破 +k × √方差 时做空价差。
QuantStart 的系列文章把这种方法应用到了 TLT 和 IEI 两只美国国债 ETF 上。在其 QSTrader 回测中(日线数据,2009 年 8 月至 2016 年 8 月,阈值为一个标准差),文章报告的年复合增长率(CAGR)为 8.73%,夏普比率为 0.75,最大回撤为 15.79%,并明确说明未扣除交易成本,回撤持续时间长达 777 天。最后这个数字才是最诚实的:即便是教科书级别的配对滤波器,也可能两年都创不出新的资金曲线高点。关于逆势押注价差过度拉伸的更多逻辑,请参阅我们的均值回归交易指南。
在 TradingView 上设置卡尔曼滤波指标
TradingView 没有内置卡尔曼滤波,所以你需要用社区脚本。在指标对话框中搜索“Kalman”,会出现几十个结果:普通的水平滤波器、随 ATR 缩放的自适应版本、经卡尔曼平滑的 RSI 以及各种振荡器变体。添加之前,先在描述或源码中检查四件事:
- Which model. One state (level) or two (level and velocity)? A one-state script will behave like an EMA once warmed up.
- Which inputs. Separate Q and R, or a single "smoothness" input? If separate, compute q = Q ÷ R and look it up in the table above.
- Adaptive scaling. If Q or R is multiplied by ATR or standard deviation, the line will change character between quiet and volatile sessions. Our ATR guide explains what that volatility input measures.
- Repainting. A forward filter that only uses past bars does not repaint. A Kalman smoother (which runs backward over the data) does, and it will look magical on historical charts. Our guide to non-repainting indicators shows how to test this with bar replay.
一套实用的调参流程
- 选一个你在该市场和周期上已经信任的 EMA 长度,比如 1 小时图上的 20。
- 换算一下:α = 2 ÷ 21 = 0.095。这对应 q ≈ 0.01,所以先设 Q = 0.01、R = 1。
- 把两条线叠加在一起。预热结束后,它们应该几乎重合。如果确实重合,说明这个脚本是水平滤波器,你也就知道了它的基准。
- 在此之后再去尝试:自适应缩放、速度状态或不同的 q。每次只改一处,并以样本外K线来评判效果。
如果你还不熟悉脚本和输入参数,我们的TradingView 平台指南介绍了如何添加、保存指标以及把指标存为模板。
卡尔曼滤波 vs EMA、ALMA 和 McGinley Dynamic
这些工具都在回答同一个问题:这根K线上,线应该移动多少?只是它们用来回答的机制各不相同。
| 平滑器 | 如何设定速度 | 稳定趋势中的滞后 | 主要风险 |
|---|---|---|---|
| EMA | 固定 α = 2 ÷ (N + 1) | 中等,恒定不变 | 不是太慢就是太吵,永远无法两头兼顾 |
| 卡尔曼(水平) | 增益来自 Q、R 和 P;最终稳定在固定值 | 预热后与其等价 EMA 相同 | 把预热阶段的速度误当成优势 |
| 卡尔曼(水平 + 速度) | 增益加斜率外推 | 低 | 在拐点处过冲 |
| ALMA | 高斯权重向近期K线偏移(offset、sigma) | 低到中等 | offset 设得太高会变得跳动 |
| McGinley Dynamic | 速度随价格与均线之比自动调整 | 中等,在暴跌中追赶得更快 | 在急速上涨中可能落后 |
| KAMA | 方向与噪声之比(效率比率) | 干净趋势中滞后低,震荡中走平 | 区间结束后重新启动较慢 |
如果你想要一个同时告诉你噪声带有多宽的滤波器,卡尔曼胜出:P 免费给了你一个不确定性估计。如果你只想要一条线,ALMA 或一条选得好的 EMA 更容易理解和推敲。如果想看一种基于另一类平滑方法的通道型替代方案,请参阅高斯通道指南。
卡尔曼滤波在实盘中会在哪里失灵
- Regime changes. Q and R are guesses about how much the market moves and how noisy it is. A Q tuned on a quiet month will lag badly in a news-driven trend; one tuned on a trending month will whipsaw in a range. Checking whether the market is trending or mean-reverting first, for example with the Hurst exponent, tells you which regime you are tuning for.
- Overfitting. With adaptive multipliers, velocity noise, initial P and a signal threshold, a "simple" Kalman system easily has five or six free parameters. Optimize them on one sample and the backtest will look clean. Hold back at least a third of your data and test once.
- Fat tails. The filter assumes Gaussian noise. One gap or flash spike creates a huge surprise, and the line jumps by K times that surprise. Clip extreme surprises or filter on a steadier input such as the bar's median price.
- Broken pairs. In pairs trading, the filter will keep updating β even when the relationship has truly ended. It adapts to a broken spread instead of warning you. Pair it with a periodic cointegration check.
- The smoother trap. Backward-looking Kalman smoothers use future bars. Any backtest built on them is invalid.
- Crossover systems. Price crossing a Kalman line whipsaws exactly as much as price crossing the equivalent EMA. Changing the name of the average does not fix crossover noise; filters like a Supertrend band or a volatility buffer do.
使用卡尔曼线的三种合理方式

- Trend bias. Use a slow setting (q around 0.001 to 0.01) as a bias line. Above and rising, look for longs; below and falling, look for shorts. Same job as a 50-period average, with a P-based band to show how far price can stray before the bias is in doubt.
- Slope oscillator. With the two-state model, plot the velocity state. Zero crosses mark trend flips with less noise than a raw momentum oscillator, similar in spirit to the MACD histogram.
- Spread z-score. For pairs or for price vs its own Kalman line, divide the surprise by √P⁻ (or by the forecast-error standard deviation). That gives a self-scaling z-score for mean-reversion entries.
卡尔曼滤波也常作为预处理步骤出现在更复杂的模型中。如果你对这个方向感兴趣,我们的机器学习交易指标指南介绍了平滑后的输入如何喂给分类器。
卡尔曼滤波与 Quantum Algo
卡尔曼线很好地回答了“趋势朝哪个方向、噪声有多大”这个问题,但它不是一套入场系统。这种分工正好契合我们在 Quantum Algo 打造工具的思路:用较慢的卡尔曼设置作为方向过滤器,再让择时工具负责入场和风险。Zeno 的信号自带止损和目标位,因此由卡尔曼方向决定你只能做哪一边,再由 Zeno 决定何时入场、风险定在哪里。黄金上,Zeno Gold 可用于各个周期;指数 CFD 上,Zeno Stocks 覆盖 NAS100 和 SPX500。
如果你更想用免费开源的工具,Adaptive Trend Sentinel 是一条自适应趋势线,可以和卡尔曼脚本并排对比;Supertrend Engine 则加入了波动率缓冲,以减少交叉信号的来回打脸。QuantumAlgo 的所有免费脚本都在免费指标页面上,Academy 则从基本原理讲起趋势过滤器。
◆ 互动检查
您对 卡尔曼滤波 了解多少?
交易者常问的 卡尔曼滤波 问题
它是一种递归估计器,从带噪声的价格中追踪一个隐藏值,通常是真实价格水平或对冲比率。每根K线它都会先预测,再测量意外偏差,然后按增益进行修正,而增益取决于过程噪声 Q 和测量噪声 R。
不一定。单状态卡尔曼滤波会收敛成一条 EMA,所以预热之后滞后与之相同。它的优势在于能提供不确定性估计,并且可以加入速度状态或随时间变化的参数。可以对照我们的均线指南来比较。
在简单模型中,只有 Q ÷ R 这个比值起作用。比值约 0.01 时相当于 20 周期 EMA,0.05 相当于 9 周期 EMA,0.5 相当于 3 周期 EMA。从你已经在用的 EMA 周期出发,换算过来即可。
只使用过去K线的前向卡尔曼滤波不会重绘。而卡尔曼平滑器会在数据上反向运行,因此会重绘。在相信任何回测之前,先检查脚本的源码。
TradingView 没有内置的卡尔曼指标,但有很多社区脚本实现了它,包括自适应版本和经卡尔曼平滑的振荡器。要检查脚本用的是单状态还是双状态,以及它如何设定 Q 和 R。
它估计两个资产之间随时间变化的对冲比率。预测误差就是价差,其方差决定入场带,因此当价差拉伸超过其标准差的某个倍数时,你就去交易这个价差。
鲁道夫·卡尔曼(Rudolf E. Kálmán),他于 1960 年在《Journal of Basic Engineering》上发表了这一方法。它的一个早期实现曾被用于阿波罗导航计算机。
它是最新意外偏差中被加到估计值上的比例,介于 0 和 1 之间。它等于 P⁻ ÷ (P⁻ + R),所以当滤波器没把握、价格干净时增益高;当滤波器有把握、价格噪声大时增益低。
它只能在自身模型下预测下一步,而对于水平版本来说,这个预测就是上一个估计值。它负责平滑和估计,并不能预测拐点。
参考资料与相关指南
接下来阅读
- 移动平均线
- Hull 移动平均线
- Kaufman 自适应移动平均线(KAMA):懂得何时停止移动的平均线
- 均值回归交易:完整策略指南
- 线性回归通道:如何绘制、解读和交易
- 不重绘指标:可靠信号完整指南
- 免费 TradingView 指标
- Zeno — 高级引擎
主要来源
- Wikipedia — Kalman filter
- UNC Chapel Hill (Welch & Bishop) — An Introduction to the Kalman Filter
- QuantStart — Dynamic Hedge Ratio Between ETF Pairs Using the Kalman Filter
- QuantStart — Kalman Filter-Based Pairs Trading Strategy in QSTrader
- Hudson & Thames ArbitrageLab — Kalman Filter
- Hyndman & Athanasopoulos — Forecasting: Principles and Practice, Simple exponential smoothing
- MathWorks — Algorithmic Trading: Winning Strategies and Their Rationale (Ernest P. Chan)