熵特征:排列熵与样本熵
波动率告诉你价格动了多少,熵告诉你价格怎么动。趋势序列和震荡序列的波动率相同,但熵差别很大。这种差别就是一个特征。
熵特征:超越波动率
波动率是价格变化的标准度量。它由收益的方差(或标准差)算出。高波动率序列“噪声大”,低波动率序列“平静”。这有用但不完整。两个序列可以有同样的波动率,但性格完全不同:一个平滑趋势,另一个来回震荡。波动率分不出它们,熵可以。
熵特征量化价格序列的复杂度。趋势序列熵低(价格朝着某个方向走,下一步有一定可预测性)。震荡序列熵高(下一步几乎是随机的)。波动率相同,熵不同,可预测性也不同。熵特征捕捉的正是这一点。
金融时间序列中两种主要形式是排列熵和样本熵。两者都定义良好、计算快、作为机器学习模型的特征也很有用。
参考是 Bandt & Pompe(2002)的排列熵和 Richman & Moorman(2000)的样本熵。两者都是经典。
(Bandt, C., & Pompe, B., “Permutation Entropy: A Natural Complexity Measure for Time Series,” Physical Review Letters, 88(17), 2002, p. 174102。)
(Richman, J. S., & Moorman, J. R., “Physiological Time-Series Analysis Using Approximate Entropy and Sample Entropy,” American Journal of Physiology, 278(6), 2000, pp. H2039–H2049。)
为什么波动率不够
一个简单的例子。两个收益序列,日波动率都是 1.5%。
序列 A:
这是一个震荡序列,经常反转。每日收益和前一天大致相反。滞后 1 自相关是负的。
序列 B:
这是一个趋势序列,正收益持续。每日收益和前一天类似。滞后 1 自相关是正的。
两个序列方差相同,波动率相同,但性格差别很大。看 A 的交易员会预期反转;看 B 的交易员会预期趋势延续。
熵特征捕捉了这种差异。排列熵对 A 高(收益的排序模式不可预测),对 B 低(模式更有规律)。
(Pincus, S. M., “Approximate Entropy as a Measure of System Complexity,” Proceedings of the National Academy of Sciences, 88(6), 1991, pp. 2297–2301。)
排列熵
思路:统计时间序列中“序数模式”的频率。
对序列 和嵌入维度 ,在序列上滑动长度为 的窗口。对每个窗口,排序并记录排列模式(例如 表示第二个值最大,第一个最小,第三个居中)。计算每种排列模式的频率。排列熵就是模式分布的 Shannon 熵:
其中求和遍历所有 种排列, 是模式 在序列中出现的频率。
归一化:除以 ,得到 之间的值。0 表示只出现一种模式(完全规律)。1 表示所有模式等可能(完全随机)。
:。排列熵在 ,除以 归一化到 。
:。动态范围更大,但需要更多数据才能稳定估计。
金融序列的典型选择: 或 ,使用 100–500 个观测的滚动窗口来估计模式频率。
(Bandt & Pompe, 2002。)
为什么排列熵在金融里有效
关键洞见是:排列熵度量序列的结构,而不仅仅是变化的幅度。两个方差相同但结构不同的序列,排列熵也不同。
趋势序列有更少的不同序数模式(主要是“涨-涨-涨”或“跌-跌-跌”模式)。排列熵低。
震荡序列有很多不同模式(涨-跌交替模式)。排列熵高。
状态切换(例如从趋势到震荡)表现为排列熵上升。回到趋势表现为熵下降。
对机器学习来说,滚动排列熵就是一个特征。它随时间变化,变化和未来收益相关。包含排列熵的模型经常胜过不包含的模型,特别是在波动率本身信息量不足的状态下。
(Bandt & Pompe, 2002。)
样本熵
样本熵思路类似,但定义不同。对序列 ,嵌入维度 和容差 :
- 构造所有长度为 的子序列:。
- 计算满足 、 的 对数。记为 。
- 对长度为 的子序列重复。计算满足 的对数。记为 。
- 样本熵是 。
样本熵越高,序列越“随机”(长度 处比长度 处更少相似模式)。样本熵越低,序列越“规律”(长度 处的模式与长度 处的模式相似)。
金融序列的典型参数: 或 ,( 是序列的标准差)。容差 应该按序列的方差缩放。
样本熵对 的选择比排列熵对自己的参数更敏感。 太小,没有匹配对,样本熵无定义。 太大,所有对都匹配,样本熵为零。标准选择是 。
(Richman & Moorman, 2000。)
排列熵 vs 样本熵
两者都有用。它们捕捉略不同的东西。
排列熵:聚焦在序数结构上(哪个值最大、哪个次大等)。对序列的单调变换(例如 或平方根)不变。计算快。
样本熵:聚焦在基于数值的相似性上(绝对意义上子序列有多接近)。对序列的尺度敏感。计算更慢。
对金融序列,通常优先用排列熵,因为:
- 更快(没有嵌套循环遍历子序列对)。
- 对单调变换不变(这让它对价格还是对数价格的选择更稳健)。
- 超参数更少(只有 和窗口大小;没有 )。
样本熵在以下情况下更优:
- 模式的幅度重要(例如区分小幅和大幅变动)。
- 序列有明显聚集(例如波动率聚集),而排列熵可能捕捉不到。
机器学习中,两者都可以用作特征。它们之间的冗余度中等:相关但不完全一样。两个都用会有帮助。
具体实现
import numpy as np
from itertools import permutations
def permutation_entropy(series, m=3, window=100):
"""Rolling permutation entropy.
series: 1D numpy array.
m: embedding dimension.
window: rolling window size.
"""
pe = np.full(len(series), np.nan)
for i in range(window, len(series)):
sub = series[i - window:i]
# Get ordinal patterns
patterns = []
for j in range(len(sub) - m + 1):
pattern = tuple(np.argsort(sub[j:j+m]))
patterns.append(pattern)
# Compute pattern frequencies
unique, counts = np.unique(patterns, axis=0, return_counts=True)
probs = counts / counts.sum()
# Shannon entropy
pe[i] = -np.sum(probs * np.log(probs + 1e-10))
# Normalize
pe[i] /= np.log(np.math.factorial(m))
return pe
函数返回滚动排列熵序列。前 window 个观测是 NaN。
对 10 年日频序列(2,500 个观测),、窗口 100,纯 Python 计算需要几秒。用 Numba 或向量化实现会更快。
选 m
: 种可能模式。每种模式有一个频率。序列至少需要 6 个观测做稳定估计;100 以上更好。
: 种可能模式。每种模式需要更多观测才能可靠估计。窗口大小 200 以上更好。
: 种模式。窗口需要 500 以上。
权衡:更大的 捕捉更多结构(更多不同模式),但需要更多数据。对 5–10 年的日频金融序列, 或 比较常见。
一个有用的诊断:对不同 计算排列熵,看哪个变化最大。变化最大的那个信息量最高(前提是估计稳定)。
(Bandt & Pompe, 2002。)
选窗口大小
滚动窗口决定熵特征适应变化的市场条件有多快。
小窗口(50–100 个观测):快速适应状态切换。估计噪声更大。适合高频策略。
大窗口(200–500 个观测):估计更平滑。适应更慢。适合波段或仓位策略。
对日频数据,100–200 的窗口是典型值。对日内数据(分钟 bar),50–100 根 bar 的窗口合适。
一个有用的对比:对多个窗口大小计算排列熵,把它们分别当作特征。模型可以学到对特定数据集最具有预测力的窗口。
熵特征能带来什么
波动率捕捉不到的信息。
一个简单的测试:计算收益的自相关和滚动排列熵。它们相关吗?
趋势市场:收益有正自相关,排列熵低。它们负相关。
震荡市场:收益有负自相关,排列熵高。它们正相关。
状态过渡:收益自相关不稳定,排列熵飙升(序列变得不可预测)。熵是有信息量的。
稳定状态:两个度量都稳定。熵增加的信息很少。
所以熵特征在状态切换时最有用。包含熵特征的模型能比只用波动率的模型更早发现状态切换。
多尺度熵
一种改进:在多个尺度上计算熵。
思路:对序列降采样(例如每 5 个观测取一个,从日数据得到周数据),在每个尺度上计算熵。得到的“多尺度熵”轮廓在多个时间跨度上描述序列的特征。
趋势市场在所有尺度上熵都低。震荡市场在所有尺度上熵都高。状态依赖的市场在不同尺度上熵不同。
多尺度熵计算量更大但信息更多。机器学习中可以作为向量特征(每个尺度的熵)。
典型设置:在 1、2、4、8、16 这些尺度上计算熵(也就是日、2 日、周、双周、月)。结果特征向量每个观测有 5 个熵值。
(Costa, M., Goldberger, A. L., & Peng, C. K., “Multiscale Entropy Analysis of Complex Physiologic Time Series,” Physical Review Letters, 89(6), 2002, p. 068102。)
把熵和其他特征结合
熵特征和其他特征结合时最有用。它们不是波动率的替代品,而是补充。
一个有用的特征集:
- 已实现波动率(收益的滚动标准差)。
- 偏度和峰度(滚动)。
- 排列熵(滚动)。
- 样本熵(滚动)。
- 多尺度熵轮廓(滚动)。
在这个特征集上训练的模型同时捕捉了价格序列的幅度(波动率)和结构(熵)。综合信息比单用任何一种更有预测力。
一个回测对比:只用波动率特征的模型夏普 1.0。加上熵特征后同样的模型夏普 1.3。熵特征给夏普增加了 30%,主要来自对状态切换的捕捉。
常见陷阱
五种陷阱。
陷阱 1:用了错的嵌入维度。
时只有 2 种可能模式(涨-跌、跌-涨)。熵基本上是二值。用 。
陷阱 2:用了太小的窗口。
窗口 20、 时,最多有 17 个序数模式,但可能有 24 种。模式频率估计不可靠。窗口应该 。
陷阱 3:在原始价格序列上算熵,而不是在收益上。
价格的排列熵被趋势主导(价格在平均意义上总是上涨)。在收益或分数阶差分价格上算熵。
陷阱 4:忘了归一化。
排列熵应该除以 归一化到 。不归一化,不同 值的熵不可比。
陷阱 5:把熵当作一个数字。
排列熵随时间变化。熵的序列才是特征,不是最近一个值。用滚动熵作为连续特征。
什么时候不用熵特征
三种情况。
情况 1:序列非常短。
如果序列少于 200 个观测,熵估计不可靠。用波动率代替。
情况 2:高度趋势序列。
在强趋势中(例如加密货币牛市),整段时间内排列熵都接近零。特征没信息量。用动量代替。
情况 3:高度随机序列。
在本质上是白噪声的序列中(金融里罕见,但某些高频数据有可能),整段时间内排列熵都接近一。特征没信息量。用波动率或其他特征。
大多数其他情况(大多数金融序列),熵特征能增加信息。它们在状态切换时特别有用,状态切换正是交易决策最重要的时刻。
符号聚合近似变体
一种相关方法是符号聚合近似(SAX),它把时间序列离散化为符号,再在符号序列上算熵。
算法:
- 把时间序列标准化到均值 0、标准差 1。
- 把范围分成 个等长区间(例如 )。
- 根据每个标准化值落在哪个区间,给它分配一个符号。
- 形成符号序列(例如“abacbbc…”)。
- 计算符号分布的熵(类似排列熵)。
SAX 比排列熵快,因为它处理符号而不是序数模式。它对嵌入维度的选择也不那么敏感。
对金融序列,原始价格序列对排列熵来说噪声太大时,SAX 有用。符号离散化相当于一个去噪步骤。
典型选择: 个符号(或“字母表大小”),窗口 50–100 个观测。得到的熵在 ,除以 归一化到 。
(Lin, J., Keogh, E., Lonardi, S., & Chiu, B., “A Symbolic Representation of Time Series, with Implications for Streaming Algorithms,” Proceedings of the 8th ACM SIGMOD Workshop on Research Issues in Data Mining and Knowledge Discovery, 2003, pp. 2–11。)
转移熵
对多资产或多特征数据,转移熵度量两个序列之间的有向信息流。
从序列 到 的转移熵是:
用文字说:在已知 自己的过去的情况下 的熵,减去在已知 自己的过去和 的过去的情况下 的熵。如果第二个更低, 提供了关于 的信息(也就是存在信息转移)。
金融应用中,转移熵可以识别资产之间的领先-滞后关系。资产 可能领先资产 一天,意味着 的收益能预测 的收益。转移熵量化了这种领先-滞后关系。
从 到 的转移熵高,说明 对 有信息量。这个特征可以用来从 的近期行为预测 。
(Bossomaier, T., Barnett, L., Harré, M., & Lizier, J. T., An Introduction to Transfer Entropy, Springer, 2016。)
熵特征在实务中能带来什么
捕捉时间序列性格而不只是其汇总统计的模型。改善通常让夏普或信息系数提升 10%–30%,具体取决于数据集和策略。
一个有用的对比:
| 使用的特征 | 夏普 | IC |
|---|---|---|
| 仅收益 | 0.8 | 0.03 |
| 收益 + 波动率 | 1.0 | 0.04 |
| 收益 + 波动率 + 熵 | 1.3 | 0.05 |
| 所有特征 | 1.4 | 0.055 |
熵特征贡献了 0.3 的夏普,主要来自状态检测。趋势市场熵低,模型依赖动量。震荡市场熵高,模型依赖均值回归。两者结合能适应状态。
代价是计算:熵特征比收益或波动率计算慢。对 10 年日频序列 100 滞后,计算排列熵需要几秒。对有数百万观测的日内数据,可能需要几分钟。生产中用快速实现(NumPy 向量化)。
更大的视角
熵特征属于更广泛的一类:结构特征,捕捉时间序列的性格,而不只是它的汇总统计。其他结构特征包括:
- Hurst 指数:度量长期记忆。
- 分形维数:度量自相似性。
- Lyapunov 指数:度量对初始条件的敏感度(混沌)。
- 去趋势波动分析:度量长期相关。
对金融序列,排列熵和样本熵是最实用的:它们计算快、理论成熟、提供有用的特征。其他的更学术,更慢。
教训是:包含结构特征的模型能比只用汇总统计(均值、方差、自相关)的模型捕捉更多信息。结构特征在非平稳环境中特别有用,因为结构本身随时间变化。
(Richman & Moorman, 2000;Bandt & Pompe, 2002。)