数据与算法

金融时间序列特征选择:互信息与非线性相关性的底层计算

在量化交易里,最容易把账户绞杀的,不是模型不够复杂,而是你把一堆看起来相关、实际上只在某段行情里同步跳动的特征,塞进了模型。…

金融时间序列特征选择:互信息与非线性相关性的底层计算

价格、成交量、盘口不平衡、波动率、资金费率、期限价差、新闻情绪,这些变量在图表上经常一起上涨或下跌。于是很多交易者拿皮尔逊相关系数扫一遍,看到某个特征与未来收益相关,就开始加权、调参、回测。回测曲线很漂亮,实盘一开,滑点先吃掉一层,信号衰减再扫掉一层,剩下的仓位被噪声直接击穿。

问题不在于相关系数没有用,而在于金融时间序列根本不是一块干净的线性数据。它高维、高噪声,变量之间还经常存在非线性依赖。一个特征可能在上涨趋势中有效,在震荡盘里失效;也可能只有当波动率超过某个区间后,才开始对未来收益产生信息贡献。

这正是互信息进入金融时间序列特征选择的地方。它不急着问两个变量是不是沿着一条直线运动,而是追问:知道特征 \(X\) 之后,我们对目标 \(Y\) 的不确定性到底减少了多少?

皮尔逊相关系数看的是一条直线,互信息盯的是变量之间有没有藏着一条你还没看见的通道。

超越线性相关:为什么金融数据不能只看皮尔逊系数

皮尔逊相关系数的优势很明确:计算快,解释简单,适合快速判断两个变量的线性同步程度。

如果某个特征上涨时,未来收益也稳定上涨,下降时未来收益同步走弱,那么皮尔逊系数能够把这种线性关系压缩成一个数。正相关、负相关、接近零,交易者一眼就能看懂。

但金融市场最危险的地方,恰恰是很多有效关系并不长成一条直线。

低相关,不等于没有信息

假设一个特征 \(X\) 只有在绝对值很大时才有用:

  • 当 \(X\) 接近零,未来收益没有明显方向;
  • 当 \(X\) 显著为正,未来收益倾向上涨;
  • 当 \(X\) 显著为负,未来收益也倾向上涨;
  • 中间区域是噪声,两头才有信号。

这是一种典型的非线性关系。\(X\) 的正负方向本身未必决定收益方向,真正有用的是它的幅度。此时,皮尔逊相关系数可能接近零,因为正负两侧的线性贡献互相抵消。

但从交易角度看,这个特征并非没有价值。你可能需要的不是简单地做多 \(X\),而是识别它是否进入极端区间,再配合波动率、成交量或趋势状态决定是否开仓。

再比如,盘口不平衡对短周期价格变化的影响可能不是线性递增的。买方挂单从略弱变成略强,价格未必立即反应;只有当不平衡达到某个程度,同时卖一档流动性被连续吃掉,价格才出现快速位移。把所有样本塞进一条直线,得到的只是平均结果,真正的临界区间被冲淡了。

时间序列还有一层麻烦:相关性会漂移

金融变量不是静止不动的物理量。市场状态变化时,变量之间的关系会跟着切换。

趋势行情里,成交量放大可能伴随价格延续;震荡行情里,成交量放大又可能意味着冲高回落。期货基差在正常市场中反映期限结构,在流动性紧张时则可能被强平、逼空或资金调度扭曲。新闻情绪对大盘指数的作用,也可能在平稳时段非常有限,到了宏观数据公布或突发事件阶段,突然变成冲击源。

所以你不能只计算一次相关系数,然后把结果写死进策略。

真正需要问的是:

1. 这个特征与目标之间是否存在非线性依赖?

2. 这种依赖在不同市场状态下是否保持?

3. 特征提供的是新信息,还是重复了其他变量已经提供的信息?

4. 计算出来的关系能否在交易成本和执行延迟之后留下收益?

5. 信号失效时,系统是减仓、停机,还是继续拿账户去试错?

互信息主要回答第一个问题,也能为第二、第三个问题提供分析工具。但它不是盈利按钮。把互信息分数直接当成买卖信号,和把单一指标交给交易机器人没有本质区别,最终都会在异常行情里爆仓。

互信息的数学本质:看熵减少了多少

互信息的核心思想并不复杂。

设 \(X\) 是一个特征,\(Y\) 是目标变量。目标可以是未来一段时间的收益,也可以是涨跌分类、波动率状态或某种事件标签。

互信息定义为:

\[

I(X;Y)=H(X)-H(X|Y)

\]

其中:

  • \(H(X)\) 表示变量 \(X\) 的熵,可以理解为 \(X\) 自身的不确定性;
  • \(H(X|Y)\) 表示已知 \(Y\) 后,\(X\) 剩下的不确定性;
  • \(I(X;Y)\) 表示知道一个变量后,另一个变量的不确定性减少了多少。

换句话说,如果观察到 \(X\) 之后,你对 \(Y\) 的判断几乎没有任何改善,那么互信息接近零。如果 \(X\) 携带了关于 \(Y\) 的有效信息,互信息就会升高。

离散变量下,互信息也可以写成联合分布与边缘分布的形式:

\[

I(X;Y)=\sum_{x,y}p(x,y)\log\frac{p(x,y)}{p(x)p(y)}

\]

联合熵通常写作:

\[

H(X,Y)=-\sum_{x,y}p(x,y)\log p(x,y)

\]

互信息具有非负性:

\[

I(X;Y)\geq 0

\]

只有当 \(X\) 与 \(Y\) 相互独立时,互信息才等于零。

这里有一个交易者经常忽略的细节:互信息测量的是共享信息量,不是方向。

互信息很高,只能说明 \(X\) 与 \(Y\) 之间存在依赖关系,不能直接说明 \(X\) 上升会让 \(Y\) 上升,也不能说明开多还是开空。它不像带符号的相关系数那样,直接给出正负方向。

因此,互信息筛选之后,仍然要继续判断:

  • 方向关系是正向还是反向;
  • 关系是否集中在某些分位区间;
  • 变量领先目标还是滞后目标;
  • 信号出现后,收益窗口是几分钟、几根K线,还是更长周期;
  • 加入其他特征后,这个信息是否仍然存在。

只看互信息分数不看方向,等于知道枪里有子弹,却不知道枪口朝哪里。

互信息与皮尔逊相关系数的区别

比较维度皮尔逊相关系数互信息
主要刻画线性相关程度共享信息量与统计依赖
是否需要分布假设对线性关系和数据结构有较强依赖不需要预先设定变量之间的线性关系
能否捕获非线性对复杂非线性关系不敏感可以捕获线性与非线性依赖
是否带方向有正负号非负,只表示依赖强弱
结果解释变量是否同步增减知道一个变量后,另一个变量的不确定性减少多少
工程难点对异常值、非平稳性敏感对样本量、估计方法、分箱或密度估计敏感
适合用途快速判断线性关系非线性特征发现与过滤式筛选

这张表不能被理解成互信息全面取代皮尔逊系数。市场数据样本有限、噪声很重时,互信息估计本身也会抖动。尤其是高维特征池里,候选变量越多,越容易有某些变量只是碰巧在历史样本中获得高分。

实战中更稳妥的方式,是把两者放在不同位置:

  • 用皮尔逊系数观察线性暴露和特征冗余;
  • 用互信息捕捉非线性依赖;
  • 用滚动样本检查关系是否漂移;
  • 用严格的时间切分验证信号是否能穿过样本外。

不要迷信某一个指标。市场不会因为你换了一个统计量,就停止扫损。

过滤式特征筛选:先把垃圾挡在模型门外

基于互信息的特征筛选属于过滤式方法。它直接利用数据的统计特性,对每个特征与目标之间的关系评分,然后筛掉低分变量。

过滤式方法的特点是:在模型训练之前完成筛选,和具体模型相对独立。

这与包裹式、嵌入式方法不同:

  • 过滤式方法先看数据本身的统计关系,计算成本通常较低;
  • 包裹式方法把特征子集放进模型里反复训练,直接比较模型表现,但计算压力更大;
  • 嵌入式方法在模型训练过程中完成选择,例如某些正则化模型或树模型的特征重要性。

在金融数据里,过滤式筛选很有价值,因为原始特征池经常膨胀得失控。你从价格、成交量、订单簿、期货、宏观和文本数据中不断制造滞后项、滚动项、差分项、分位数项,几十个基础变量很快就能扩展成几百甚至几千个候选特征。

模型越大,不代表信号越强。很多时候只是让噪声拥有了更多藏身的位置。

用互信息筛选单个特征

如果目标是分类任务,例如预测未来若干周期涨跌,可以使用 [Python 的 sklearn.feature](/articles/pythonliang-hua-xi-tong-zhen/)_selection.mutual_info_classif 计算特征与分类目标之间的互信息得分。

如果目标是连续收益、波动率或价格变化量,则可以使用 mutual_info_regression

这里要先把标签定义清楚。

例如,目标变量可以是:

\[

Y_t=

\begin{cases}

1,& r_{t,t+h}>0\\

0,& r_{t,t+h}\leq 0

\end{cases}

\]

其中 \(r_{t,t+h}\) 是从时点 \(t\) 到未来 \(t+h\) 的收益。

也可以直接使用连续收益:

\[

Y_t=r_{t,t+h}

\]

二者不是一回事。

分类目标会把收益幅度压缩成方向,适合研究涨跌信息;回归目标保留收益大小,但受到极端值和厚尾分布的影响更明显。你用哪一种,取决于策略实际执行什么。如果交易系统最后只做多做空,分类标签有参考价值;如果系统根据预期收益和风险调整仓位,连续目标更贴近执行。

正确的时间切分比高分更重要

互信息筛选不能在全量数据上先算完,再切分训练集和测试集。这样会把测试区间的信息泄露到特征选择阶段。

正确流程应该遵循时间顺序:

1. 用训练区间计算互信息分数;

2. 根据训练区间的结果选出候选特征;

3. 固定筛选规则,把特征应用到验证区间;

4. 在验证区间评估方向、收益、回撤和换手;

5. 最后再用完全未参与决策的样本外区间做确认。

如果你先看到全周期表现,再回头决定保留哪些特征,哪怕模型没有看过测试标签,测试集也已经被你间接使用了。

这类泄露非常隐蔽。回测报告里可能没有任何一行代码直接读取未来收益,但你在全样本上选特征、选分箱、选滞后阶数,已经把未来结构偷偷塞回了策略。

单变量高分,不代表加入模型后仍有价值

假设成交量变化、盘口不平衡和短期波动率都与未来收益具有较高互信息。你把三者放进模型,模型得到的未必是三份独立信息。

它们可能共同反映了一个潜在状态:市场正在从低流动性进入快速交易阶段。单独计算时,三个特征都得分;放在一起后,第二个、第三个特征提供的新增信息可能明显下降。

这就是边际信息的问题。

在第一轮筛选中,可以用互信息评估单变量与目标的依赖;在第二轮筛选中,则要研究条件关系或冗余关系。简单一点,可以同时观察特征之间的相关性、互信息或聚类结构,把高度重复的一组变量压缩成少数代表特征。更严格的方式,则需要在模型中进行递进式加入,观察每个变量进入后对样本外表现的增量。

不要被排名榜骗了。排名第一到第十的十个特征,可能只是同一个盘口状态的十种写法。

特征选择不是选出一群最会预测的变量,而是留下几种互不重复、能经受时间切分的有效信息。

从开仓到平仓:互信息筛选如何落到交易动作

统计分数最终必须落到开仓、持仓和退出。否则你得到的只是研究表格,不是交易系统。

下面用一个抽象的短周期期货策略说明这个过程。这里不是某个真实品种的历史复盘,而是为了拆解逻辑,避免把统计指标误当成买卖按钮。

假设你有三个候选变量:

  • \(X_1\):过去若干周期的盘口买卖量不平衡;
  • \(X_2\):成交量相对近期基准的变化;
  • \(X_3\):短周期波动率。

目标 \(Y\) 是未来固定持有窗口内的收益。

第一步,分别计算 \(I(X_1;Y)\)、\(I(X_2;Y)\)、\(I(X_3;Y)\)。如果 \(X_1\) 分数较高,不能立即开多。你还需要把 \(X_1\) 分成若干状态,观察不同区间对应的未来收益分布。

如果只有极端买方不平衡区间表现出正收益,而中间区间没有方向,那么信号条件就不应该写成“\(X_1\) 越大越做多”,而应该写成“\(X_1\) 进入极端区域后,再检查成交量与波动状态”。

第二步,观察特征的时间滞后。

盘口不平衡可能对未来几秒或几分钟有影响,波动率则可能对更长窗口的风险状态有影响。若你把所有特征都对齐到同一个时间点,再用一个统一持有期解释,模型会把领先关系和同步关系混在一起。

第三步,建立入场和退出的分工。

一个实用的系统不应该让单一的互信息得分负责所有动作:

  • 互信息负责发现特征与目标之间是否存在依赖;
  • 方向统计负责判断做多还是做空;
  • 波动率负责调整止损距离和仓位;
  • 流动性指标负责判断能否执行;
  • 退出规则负责在信号衰减或交易逻辑破坏时扫损。

假设信号触发后,你开多期货合约。随后盘口不平衡回落,但价格尚未触及止损。如果策略逻辑依赖的是持续的买方吃货,那么信号核心已经被破坏,继续持仓就不是执行纪律,而是在等市场替你找借口。

相反,如果互信息只说明波动率状态与未来收益幅度有关,而没有提供方向,那么波动率只能参与仓位和风险控制,不能单独触发开仓。

这就是统计发现与交易决策的边界。你必须把每个特征的职责拆开,否则所有变量都会被粗暴地塞进一个预测分数里,最后没人知道亏损到底是方向错、时机错,还是成本错。

交易成本会重新排列特征价值

一个在预测层面有信息的变量,到了执行层面未必值得交易。

短周期信号尤其容易被以下因素绞杀:

  • 买卖价差;
  • 下单延迟;
  • 盘口深度不足;
  • 成交滑点;
  • 高频换手带来的手续费;
  • 价格跳跃导致的止损偏移。

如果一个特征只能预测未来极短时间内非常微弱的价格变化,那么互信息分数再好看,也可能抵不过一次扫损。

因此,筛选目标不能只用未来收益方向。至少还要观察:

  • 信号对应的收益幅度是否覆盖成本;
  • 不同波动状态下的收益是否稳定;
  • 触发后价格是否已经完成主要位移;
  • 实盘下单时是否存在明显滑点;
  • 信号频率是否让策略进入过度交易。

别把回测里的收盘价成交当成现实。市场不会按你的表格整齐地给你成交。你看到的是一根K线,账户面对的是价差、排队、冲击和成交不完整。

非线性因果推断:互信息不是因果证明

互信息能发现依赖,但依赖关系不等于因果关系。

成交量和未来收益之间互信息很高,可能是成交量推动了价格,也可能是价格先动之后吸引交易量,还可能是第三个变量同时影响了二者。比如重大消息到来时,价格、成交量和波动率一起变化。单变量互信息只能告诉你它们共享信息,不能告诉你谁在驱动谁。

时间序列里还存在自相关问题。

金融价格、收益、波动率和订单流往往带有不同程度的时间依赖。如果不处理滞后结构,当前特征与未来目标之间的关系可能只是共同趋势或市场状态持续造成的假象。

传统线性格兰杰因果检验在高维、强自相关和非线性场景下会遇到限制。它依赖线性预测框架,变量之间的非线性关系、条件依赖和复杂滞后结构可能让结果发生偏移。

PCMCI算法的思路更适合处理高维时间序列因果分析。它结合了PC-stable筛选与瞬时条件独立性测试,也就是MCI,通过先筛选候选父节点,再在条件变量的控制下检验关系,减少无关变量和间接关系的干扰。

PCMCI解决的不是预测,而是结构

把PCMCI放进量化研究流程时,不能把它包装成自动印钞机。

它更适合回答这些问题:

  • 哪些历史变量与当前目标存在时间方向上的条件依赖?
  • 某个特征的作用是否在控制其他变量后仍然存在?
  • 一个变量看似有效,是否只是另一个变量的影子?
  • 影响关系集中在哪些滞后期?
  • 变量之间是否存在瞬时关联或间接传导?

例如,价格收益 \(r_t\)、成交量变化 \(v_t\)、波动率 \(\sigma_t\) 和资金流指标 \(f_t\) 同时进入分析。单纯看互信息,可能发现四个变量都与未来收益相关。经过条件独立性筛选后,某些变量的关系会消失,说明它们提供的主要是重复信息,或者只是通过其他变量间接传导。

但即使PCMCI筛出了一条看起来清晰的关系,也不能跳过样本外验证。因果结构可能随市场制度、交易参与者和流动性条件变化。一个在趋势行情里成立的滞后关系,到了震荡或极端波动阶段,可能直接失效。

相关、预测和因果要分三层看

研究报告里最常见的混乱,是把下面三个概念混成一个结论:

1. 相关:两个变量在统计上同步或依赖;

2. 预测:知道一个变量后,未来目标的预测误差下降;

3. 因果:在控制其他条件后,对某变量进行干预会改变目标。

互信息主要属于第一层,也可以服务第二层;PCMCI用于探索第三层的时间结构,但仍然依赖数据质量、条件独立性检验和模型假设。

你不能因为某个特征与未来收益互信息高,就写成它推动了收益。也不能因为某个滞后变量通过因果筛选,就认定它在实盘中一定能赚钱。

严谨的表达应该是:该变量在特定样本和条件设定下,与目标存在可观测的非线性依赖或时间条件关系。然后继续做滚动验证、稳定性分析和成本评估。

交易研究不是论文里的漂亮箭头。箭头一旦落到盘面上,就要面对滑点和爆仓。

概率密度估计与分箱:互信息分数从哪里来

互信息的理论定义很干净,工程计算却没有那么干净。

核心难点在于:你通常不知道真实的联合概率分布 \(p(x,y)\)。你必须根据有限样本估计它。样本怎么分箱、如何估计密度、如何处理连续变量、如何应对异常值,都会影响最终分数。

分箱法直观,但箱子不是越多越好

对连续金融变量进行分箱,是最容易理解的做法。

例如,把波动率按分位区间切成若干状态,把未来收益按上涨、震荡、下跌划分类别,再统计每个组合出现的频率。得到联合概率和边缘概率后,就可以计算互信息。

分箱的优点是直观,结果容易解释。你可以直接看到:

  • 高波动区间是否对应更大的收益绝对值;
  • 极端盘口不平衡是否对应方向偏移;
  • 某个情绪指标处于低位或高位时,未来收益分布是否发生变化。

但分箱数量会带来明显影响。

箱子太少,非线性结构会被压平。所有极端状态被塞进一个大箱子,临界区域消失。箱子太多,样本被切得过碎,很多组合只出现少数几次,互信息会被偶然频数牵着走。

尤其在金融时间序列里,样本并不等于有效样本。连续的行情片段存在自相关,异常波动又会造成样本分布偏斜。表面上有很多K线,不代表每个状态都有足够独立的观察。

事实材料并没有给出适用于所有策略的最优概率密度估计方法或分箱参数,这一点必须说清楚。不存在一组固定箱数,可以覆盖股票、期货、不同周期和不同市场状态。分箱方案需要结合样本量、变量分布、目标定义和验证结果决定,不能把经验参数硬焊进系统。

非参数估计更灵活,也更吃样本

除了分箱,还可以采用核密度估计、近邻方法等非参数思路估计互信息。它们不强行假设数据符合某种简单分布,因此面对复杂非线性关系时更灵活。

代价是计算和稳定性问题。

样本不足时,局部密度估计会受到极端点影响;样本维度升高后,距离和邻域的统计意义会变弱;窗口不同,结果还可能出现明显变化。金融数据的厚尾、跳跃和状态切换,会进一步增加估计难度。

工程上需要重点观察的不是一次得分,而是分数在不同设定下是否保持方向一致:

  • 更换时间窗口后,排名是否完全翻转;
  • 调整分箱或估计方式后,强信号是否消失;
  • 去掉极端行情后,依赖关系是否仍然存在;
  • 滚动计算时,分数是否只在少数月份突然升高;
  • 样本外区间中,特征是否仍然带来误差下降。

如果一个特征只有在某种分箱方式下排名第一,换一种合理的设定就跌出候选集,它不是被市场确认的信号,而是被参数碰巧捞出来的噪声。

互信息估计的几个实战陷阱

第一,异常值会改变分布结构

期货价格在突发消息或强平链条中可能快速跳跃。收益序列的极端值会改变分箱边界,也会影响密度估计。直接把所有异常点当成普通样本,可能让互信息分数被极少数事件主导。

但这不意味着应该随意删除异常值。极端行情可能正是策略需要识别的状态。更合理的处理方式,是区分研究目的:

  • 如果你要研究常态行情下的信号,应单独评估异常状态;
  • 如果策略专门交易突破或波动扩张,就不能把极端样本粗暴抹掉;
  • 如果异常点来自数据错误、时间戳错位或重复成交,则必须清洗。

数据清洗不是把难看的点删掉,而是分辨它究竟是市场事实还是数据事故。

第二,目标窗口会改变互信息

同一个特征,对未来一根K线、未来十根K线和未来一天的收益,互信息可能完全不同。

盘口特征的有效期通常更短,宏观或情绪变量的影响窗口可能更长。你必须先确定交易系统持仓周期,再定义目标窗口。否则你筛选出来的特征与实际交易动作不在一个时间尺度上。

第三,滚动计算会暴露关系漂移

全样本互信息只给出一个平均结果,而平均值经常掩盖状态切换。

更接近实战的做法,是按照时间滚动计算。观察某个特征在不同阶段的互信息、方向关系和样本外表现。你不需要把每个窗口都变成独立策略,但至少要知道信号是在持续工作,还是只靠某段行情撑起整条净值曲线。

如果某特征在训练期互信息很高,进入验证期后迅速跌落,同时换手和滑点上升,系统就应该降低权重或停止使用,而不是继续加仓等待它重新灵验。

从特征分数到模型构建:别让非线性变成过拟合

互信息筛选出来的变量,最终可能进入逻辑回归、树模型、神经网络或其他机器学习模型。不同模型对特征形态的要求不同,互信息排名不能直接决定模型结构。

线性模型能够提供较强解释性,但需要你主动构造非线性表达,例如分位数、交互项、状态变量和变换后的特征。树模型可以自动捕捉一部分阈值和交互关系,但容易在高维噪声中不断切分。深度学习模型表达能力更强,却也更容易把数据中的偶然结构记下来。

互信息高,模型未必更好

特征与目标之间存在依赖,不代表它能改善模型。

原因包括:

  • 特征信息已经被其他变量覆盖;
  • 关系只存在于训练期;
  • 信号强度不足以覆盖交易成本;
  • 特征的时间戳存在错位;
  • 目标标签定义与实际执行不一致;
  • 模型无法稳定学习这种关系;
  • 该特征在实盘中不可及时获得。

因此,模型评估不能停留在准确率或损失函数。量化交易至少要把预测结果翻译成执行层指标:

  • 收益曲线是否依赖少数极端交易;
  • 最大回撤是否集中在某个市场状态;
  • 换手是否过高;
  • 加入交易成本后是否仍然保留优势;
  • 信号延迟一个周期后是否彻底失效;
  • 不同时间段、品种和参数下是否出现同方向结果。

不要因为模型的分类准确率提高,就默认策略赚钱。交易收益由方向、幅度、仓位、成本和退出共同决定。一个准确率不错的模型,如果错误集中在大亏损行情里,照样能把账户击穿。

需要区分筛选集和执行集

研究阶段可以保留更多候选特征,用来分析市场结构。执行阶段则必须更加克制。

建议把特征分成三类:

  • 核心特征:在多个时间窗口和样本外阶段都保持相对稳定;
  • 状态特征:只用于判断趋势、波动、流动性或市场环境;
  • 观察特征:统计上有依赖,但稳定性或执行价值不足,暂不进入实盘。

这比把所有高分特征直接堆进模型更可靠。

例如,互信息显示波动率与未来收益绝对值相关,但方向不稳定。它可以作为仓位收缩和止损调整的状态特征,却不应被强行解释成做多信号。盘口不平衡可能有方向性,但只在流动性充足时有效,那么流动性条件就是它的过滤器,而不是可有可无的辅助指标。

一个成熟的量化系统不会让每个特征都发号施令。它会明确谁负责发现机会,谁负责确认环境,谁负责限制风险。

数据清洗:互信息计算之前,先处理时间轴

金融大数据研究最容易被忽略的部分,往往不是算法,而是数据。

互信息对联合分布敏感,时间戳一旦错位,计算出来的依赖关系就会失真。你以为特征 \(X_t\) 预测 \(Y_{t+1}\),实际可能把 \(t+1\) 时刻才出现的数据提前塞进了 \(t\) 的特征。

常见问题包括:

  • 不同数据源时间戳精度不一致;
  • 股票、期货和加密资产交易时段不同;
  • 新闻发布时间与可见时间不同;
  • 盘口数据与K线聚合区间没有严格对齐;
  • 复权处理影响历史价格和收益标签;
  • 缺失值被错误填充,制造了虚假的连续性;
  • 合约换月后,价格序列出现结构断点。

数据清洗时,必须记录每个特征真正可获得的时间。不是数据表里有这个字段,就代表交易系统在决策时能看到它。

以新闻情绪为例,文章的发布时间、抓取时间和进入策略数据库的时间可能不同。若你用文章最终收录时间对齐行情,回测很容易产生未来信息泄露。以期货数据为例,主力合约切换、夜盘时段和结算价口径也会影响目标构造。

互信息不会替你发现这些错误。它只会非常认真地给错误数据打出一个漂亮分数。

缺失值不能随便补

金融数据中的缺失,可能代表数据源中断,也可能代表市场在该时段没有交易。两者含义完全不同。

用均值填充盘口变量,可能制造一个市场从未出现过的平稳状态;用前值填充波动率,可能把数据中断伪装成风险不变;删除所有缺失行,又可能造成不同数据源的时间轴错位。

处理方式要与变量含义一致,并且在训练和测试阶段保持同样规则。更重要的是,缺失本身有时就是信息:流动性消失、交易暂停、行情源断开,都可能与风险状态有关。但这种信息必须明确标注,不能让模型自己从错误填充值里猜。

如何判断互信息筛选是否真正有用

一个特征筛选流程是否有效,不看图表上的相关热力图,而看它能否在严格验证下减少噪声、改善模型和执行。

可以按下面的顺序推进:

1. 先固定目标定义

明确预测的是未来方向、连续收益、波动率还是事件发生。持仓窗口、标签生成时点和交易执行时点必须一致。

2. 建立基础对照组

不要一上来就使用互信息筛选。先用简单的基线特征和基础模型,知道没有这套方法时策略表现如何。

3. 计算单变量互信息

在训练区间内计算特征与目标之间的互信息,记录估计方式、时间窗口和预处理规则。

4. 同步检查线性关系与冗余

互信息高的特征,需要与皮尔逊相关系数、特征间依赖和业务含义一起分析。高互信息不代表新信息。

5. 按时间滚动评估

不只看全样本排名,观察不同阶段的得分和方向是否漂移。关系只在单一行情里成立,就不能直接进入实盘。

6. 放入模型重新验证

比较加入特征前后的样本外误差、换手、回撤和成本后收益。筛选的价值必须体现为模型和策略层面的增量。

7. 做延迟与成本压力测试

将信号延迟、成交价格、滑点和手续费纳入评估。短周期信号经不起执行层的粗暴摩擦,必须提前暴露。

8. 设置失效处理机制

当互信息、方向稳定性或样本外表现持续下降时,明确减仓、停用或重新训练的条件。没有退出机制的模型,和没有止损的仓位一样危险。

这个流程的关键不是复杂,而是拒绝事后挑结果。你要在看见样本外表现之前,先把选择规则写下来。否则每一次排名变化,都可能被解释成你想听的故事。

最后:非线性相关性不能替你承担亏损

金融时间序列特征选择的真正难点,不是找到一个比皮尔逊系数更高级的指标,而是承认市场关系本身不稳定、不完整,而且随时会被成本和制度变化改写。

互信息的价值在于,它能绕开单纯线性假设,发现变量与目标之间隐藏的非线性依赖。它适合做特征发现和过滤式筛选,也能帮助你识别极端状态、阈值关系和非线性结构。PCMCI则进一步把问题推进到高维时间序列的条件依赖与因果结构分析。

但互信息没有方向,不能证明因果,也不能保证样本外有效。分箱、密度估计、样本量、异常值、时间窗口和数据泄露,任何一个环节出错,最后的分数都可能变成诱人的陷阱。

你真正需要建立的,不是一个拥有最高互信息分数的特征库,而是一套能经受时间切分、成本冲击和市场状态切换的研究流程。特征必须知道自己的职责,模型必须接受样本外审判,交易系统必须在逻辑失效时主动收缩。

盘面不会因为你的算法名字里有“机器学习”就手下留情。互信息只能帮你看见暗处的线索,至于你是否带着过大的仓位冲进去,最后仍然由账户余额负责判决。

相关阅读: 趋势跟踪与均值回归:两大主流算法策略的底层逻辑与适用边界.

常见问题

互信息和皮尔逊相关系数有什么区别?
皮尔逊相关系数主要衡量线性相关程度,并带有正负方向;互信息衡量变量之间的共享信息量,可以捕捉线性和非线性依赖,但结果非负,不能直接说明做多还是做空。
互信息很高就能直接作为买卖信号吗?
不能。互信息只能说明特征与目标之间存在依赖,仍需判断方向、滞后关系、收益窗口、交易成本和样本外稳定性。
如何避免互信息特征筛选中的数据泄露?
应先在训练区间计算互信息并选择候选特征,再将固定的筛选规则应用于验证区间,最后使用完全未参与决策的样本外区间确认结果。不能先用全量数据筛选特征,再划分训练集和测试集。
为什么单变量互信息高的特征,加入模型后可能没有价值?
多个特征可能共同反映同一个潜在市场状态,因此单独计算时都得分较高,组合使用后新增信息却会下降。还可能存在训练期关系、时间戳错位、标签定义不一致或信号强度无法覆盖交易成本等问题。
分箱数量会怎样影响互信息结果?
箱子太少可能压平非线性结构,箱子太多则会使样本过度分散,导致分数受到偶然频数影响。分箱方案需要结合样本量、变量分布、目标定义和验证结果决定,不能使用一组固定参数覆盖所有策略。
PCMCI能否证明某个特征一定会带来交易收益?
不能。PCMCI用于探索高维时间序列中的时间条件依赖和因果结构,但结果仍受数据质量、条件独立性检验和模型假设影响,必须继续进行样本外验证、稳定性分析和成本评估。