halo 的技术博客

返回

一句话版本#

「这段行情有多可预测」不必是玄学。把收益序列压成涨跌符号串,估计它的香农熵率:熵 = 1 bit/符号意味着彻底随机——任何模型、任何算力,方向命中率的数学上限就是 50%;熵每低一分,就说明序列里多一分可以被模型捕捉的结构。熵是模型无关的可预测性上界度量。


为什么要度量「可预测性」本身#

量化研究的常规流程是:造特征 → 训模型 → 看样本外命中率。这个流程有一个隐藏的逻辑漏洞:当模型样本外表现差时,你分不清是模型不行还是这段数据本来就没东西可学

这两种失败模式的处方完全相反。模型不行 → 换模型、加特征;数据没结构 → 换标的、换频率、换采样方式,在这段数据上继续堆模型是纯粹的浪费(以及过拟合温床)。

信息论提供了一个分流器。对一个平稳随机过程,香农熵率度量「已知全部历史后,下一个符号还剩多少不确定性」。关键性质:熵率给出了任何预测器错误率的下界(Fano 不等式)。熵率 1 bit/符号的二值序列,全知全能的预测器命中率也只有 50%——这不是工程限制,是数学定理。

所以在堆模型之前先测熵:如果这段数据的符号熵接近 1,省下 GPU 钱;如果显著低于 1,那么值得追问结构在哪。

从收益到符号:为什么要二值化#

直接对连续收益估熵需要估计概率密度,样本效率极低且对分箱方式敏感。AFML(《Advances in Financial Machine Learning》第 18 章)的做法是先离散化——最简版本是二值化:

import numpy as np

def to_signs(returns):
    """收益 -> 涨跌符号串(1=涨, 0=跌),零收益剔除或并入前值"""
    r = np.asarray(returns)
    r = r[r != 0]
    return (r > 0).astype(int)
python

二值化扔掉了幅度信息,只保留方向序列的时序结构。这是刻意的:方向可预测性正是大多数中低频策略的盈利来源,而幅度动态(波动聚集)我们已经有 GARCH 家族去建模。让熵特征专注回答一个窄问题:涨跌方向的排列有没有模式

熵估计器用两个,互为交叉验证:

插入式(plug-in)块熵:数长度为 ww 的所有滑动窗口词频,代入香农公式,除以 ww 归一到每符号比特:

def plugin_entropy(bits, w=3):
    n = len(bits) - w + 1
    words = {}
    for i in range(n):
        key = tuple(bits[i:i+w])
        words[key] = words.get(key, 0) + 1
    p = np.array(list(words.values())) / n
    return -np.sum(p * np.log2(p)) / w
python

Kontoyiannis LZ 估计器:基于 Lempel-Ziv 压缩思想——在历史中找当前位置往后的最长可匹配前缀,匹配长度越长说明序列越可压缩、熵越低。它能捕捉插入式方法看不到的长程结构,代价是收敛更慢。

实验一:同波动率,不同熵#

构造三条 4000 符号的序列,符号波动率完全相同,只有时序结构不同:

  • iid 随机游走:每步独立抛硬币
  • 动量机制:以 0.75 概率延续上一步方向
  • 均值回复机制:以 0.75 概率翻转上一步方向

三种机制的价格路径与熵对比

左图是三条路径——动量机制走出大开大合的趋势,均值回复挤成一条锯齿,随机游走居中。右图是熵读数:

机制插入式块熵 (w=3)理论熵率
iid 随机游走0.99961.0
动量(延续概率 0.75)0.8840.811
均值回复(翻转概率 0.75)0.8800.811

三个读数:

  1. iid 序列的熵几乎精确等于 1。这是估计器的 sanity check——对无结构序列不产生假信号。
  2. 动量和均值回复的熵几乎一样低。两种机制都是一阶马尔可夫链、参数对称,理论熵率同为 0.811。熵探测器对「有没有记忆」敏感,对「记忆的方向」色盲。这既是局限(它不告诉你该做趋势还是做反转)也是优势——一个特征同时覆盖两类可交易结构,方向判断留给下游模型。
  3. 块熵读数 0.884 高于理论值 0.811。因为 w=3 的块熵只捕捉三符号窗口内的结构,是真熵率的上界;LZ 估计器(0.73 vs iid 的 0.88)能看到更长程的可压缩性,相对排序一致。

实验二:熵与命中率的一一对应#

上面只有三个点。把动量机制的延续概率从 0.5 扫到 0.92,每个参数下同时计算块熵和最优单步预测器(预测方向延续)的命中率:

熵与最优命中率的单调关系

一条干净的单调曲线:熵 1.0 对应命中率 0.5,熵 0.594 对应命中率 0.923。没有例外点,没有平台区。

这张图是熵特征的价值主张:不训练任何模型,你就知道这段数据上模型性能的天花板在哪。如果实测熵 0.98 而你的模型报告 58% 样本外命中率——不要高兴,先查泄漏,因为熵说这段数据撑不起这个数字。熵特征反过来做模型审计,比做信号本身更锋利。

实验三:滚动熵监测机制切换#

真实市场不会好心地保持单一机制。构造一条 5000 符号的切换序列:iid → 动量段(1500-2400)→ iid → 均值回复段(3600-4300)→ iid,用 300 符号滚动窗口跟踪块熵:

机制切换序列上的滚动熵

滚动熵把两个有记忆段都从背景里挖了出来:iid 背景段均值 0.995,动量段掉到 0.890,均值回复段 0.910。两类结构段的熵谷清晰可辨,且结构消失后熵迅速回到 1 附近——这个特征天然自带「结构已死」的退出信号。

注意两个诚实细节:熵谷相对背景的深度只有 0.1 bit 左右,检测需要窗口积累(300 符号),机制切换后有约窗口长度一半的滞后;窗口内混入两种机制时读数是稀释的加权平均。滚动熵是慢变量,适合做环境特征,不适合做逐 bar 触发器。

两个会让熵特征变成毒药的工程坑#

坑一:块长过大 + 样本不足 = 系统性假信号。 插入式估计量在有限样本下有向下的偏差:当 2w2^w 接近样本量 nn 时,大多数词只出现一两次,词频分布被人为压平之后熵反而被低估。实验:对纯 iid 序列(真熵率 = 1)扫描块长和样本量:

块长-样本量的偏差实验

n=300 时用 w=8,纯随机序列测出 0.7 的「低熵」——这个假信号的幅度比实验三里真实结构的信号(0.89)还强。用错参数,熵特征会让你在纯噪声里「发现」可预测性,这是所有下游过拟合的完美起点。经验法则:2wn2^w \ll n,日频数据 300 日窗口下 w 不要超过 4;同时永远跑一个 iid 基准对照,确认当前参数下随机序列的熵读数确实贴近 1。

坑二:绝对值不可信,只能做相对比较。 LZ 估计器对 iid 序列只测得 0.88 而非 1——有限样本偏差是所有熵估计器的通病,且偏差大小依赖序列长度和估计器细节。正确用法是同参数、同窗口下的横向与纵向比较:今天的熵 vs 过去一年的熵分位数、标的 A vs 标的 B。拿绝对读数对照理论阈值做判断(「熵 < 0.9 就开仓」)是把估计偏差当成了信号。

AFML 定位:环境特征,不是择时开关#

熵特征在 AFML 体系里的标准用法与 BSADF 一致:不做独立的择时开关,做元标注二级模型的环境特征。逻辑链条:

  • 一级模型(趋势、反转、任何 alpha 逻辑)产生方向信号
  • 二级模型决定「这个信号值不值得下注、下多大」
  • 熵特征回答的正是二级模型的核心问题:当前环境里到底有没有可预测结构——低熵时段,一级模型的信号背后更可能有真实结构支撑;熵贴近 1 的时段,再漂亮的信号形态也大概率是噪声的巧合排列

具体入模的形态:滚动熵水平、熵的 20 日变化、熵在过去一年中的分位数。三个都是慢变量,与价格类特征相关性低,是特征矩阵里少见的正交信息源。

A 股注记:日频二值化在 A 股有一个制度性噪声源——涨跌停板日的方向符号被截断机制污染(想卖卖不掉的跌停日第二天大概率续跌,这是制度造成的伪动量)。建议对连续涨跌停日做符号合并或剔除,否则熵特征会把制度摩擦误读为可预测结构。另外 T+1 使得日内符号序列对隔日交易者不可执行,熵特征的采样频率应与策略的实际决策频率对齐。

结语#

熵特征回答的是量化研究里最该先问却最少被问的问题:这段数据里到底有没有东西可学。它不生成信号,它给所有信号定价。花在熵审计上的十分钟,经常能省掉花在死数据上的十天。


参考文献:

  • López de Prado, M. (2018). Advances in Financial Machine Learning, Chapter 18: Entropy Features. Wiley.
  • Kontoyiannis, I. et al. (1998). Nonparametric entropy estimation for stationary processes and random fields, with applications to English text. IEEE Transactions on Information Theory.
  • Cover, T. & Thomas, J. (2006). Elements of Information Theory, 2nd ed. Wiley.
微观结构熵特征:用信息论度量价格序列的可预测性
https://blog.halo26812.eu.org/blog/entropy-features-microstructure
Author halo
Published at 2026年7月30日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨