第三章:信息理论在金融中的应用
大家好,我是老张。今天我们来聊聊信息理论在金融里的那些事儿。
说实话,刚入行那会儿,我觉得信息论跟交易八竿子打不着。直到有一次,我在处理高频数据时发现——有些行情数据看似丰富,其实全是噪音。那一刻我才意识到,信息度量才是量化交易的底层逻辑。
3.1 熵与信息度量
先问个问题:什么是信息?
你可能会说,信息就是数据。但信息论之父香农告诉我们:信息 = 不确定性减少的量。
举个例子。如果一只股票明天100%涨停,那这个消息的信息量是0。因为它没有减少任何不确定性。但如果一只股票明天有50%概率涨、50%概率跌,那这个消息的信息量就很大。
核心公式:香农熵
H(X) = -Σ p(x) · log₂ p(x)
单位:比特(bit)
我在项目中遇到过这样一个场景:分析某只股票的涨跌分布。如果涨跌概率各50%,熵值就是1比特。如果涨的概率是90%,跌的概率是10%,熵值大约是0.47比特。你看,确定性越高,熵越小。
个人经验:我习惯用熵值来筛选交易品种。熵值太低的品种,说明市场已经形成一致预期,这时候进去往往接盘。熵值适中的品种,反而有交易机会。
3.2 香农信息论基础
香农信息论有三个核心概念,我一个个说。
3.2.1 自信息
自信息衡量单个事件的信息量。公式很简单:
I(x) = -log₂ p(x)
概率越小的事件,发生时带来的信息量越大。比如,一只股票突然涨停,如果平时涨停概率只有1%,那这个事件的信息量就是-log₂(0.01) ≈ 6.64比特。
3.2.2 互信息
互信息衡量两个变量之间的依赖关系。说白了,就是知道X能帮我们减少多少对Y的不确定性。
I(X;Y) = H(X) - H(X|Y)
我在做因子筛选时经常用这个。比如,我想知道成交量变化和价格变化之间有没有关系,就计算它们的互信息。如果互信息接近0,说明这两个变量基本独立,这个因子就没用。
3.2.3 相对熵(KL散度)
KL散度衡量两个概率分布之间的差异。公式:
D_KL(P||Q) = Σ p(x) · log₂(p(x)/q(x))
嗯,这里要注意:KL散度不是对称的。也就是说,D_KL(P||Q) ≠ D_KL(Q||P)。
避坑指南:我曾经在回测中直接用KL散度做分布匹配,结果发现方向搞反了。后来我改用对称化的JS散度(Jensen-Shannon divergence),才解决了这个问题。
3.3 金融时间序列的熵值计算
金融数据跟普通数据不一样。它有自相关性、异方差性,还有肥尾特征。所以计算熵值时,不能直接套用标准方法。
3.3.1 近似熵(ApEn)
近似熵是Pincus在1991年提出的,专门用来衡量时间序列的复杂性。值越大,说明序列越随机。
def approximate_entropy(data, m=2, r=0.2):
"""
计算近似熵
m: 嵌入维度(通常取2)
r: 相似容限(通常取0.2倍标准差)
"""
N = len(data)
# 构建m维向量
patterns = [data[i:i+m] for i in range(N-m+1)]
# 计算相似度
phi_m = 0
for i in range(len(patterns)):
count = 0
for j in range(len(patterns)):
if max(abs(patterns[i][k] - patterns[j][k]) for k in range(m)) <= r:
count += 1
phi_m += np.log(count / (N-m+1))
phi_m /= (N-m+1)
# 构建m+1维向量
patterns_next = [data[i:i+m+1] for i in range(N-m)]
phi_m1 = 0
for i in range(len(patterns_next)):
count = 0
for j in range(len(patterns_next)):
if max(abs(patterns_next[i][k] - patterns_next[j][k]) for k in range(m+1)) <= r:
count += 1
phi_m1 += np.log(count / (N-m))
phi_m1 /= (N-m)
return phi_m - phi_m1
实战建议:我一般用近似熵来识别市场状态切换。当熵值突然下降时,往往意味着市场即将进入趋势行情。当熵值持续高位时,大概率是震荡市。
3.3.2 样本熵(SampEn)
样本熵是近似熵的改进版,消除了自匹配偏差。计算更稳定,但速度稍慢。
def sample_entropy(data, m=2, r=0.2):
N = len(data)
patterns = [data[i:i+m] for i in range(N-m)]
patterns_next = [data[i:i+m+1] for i in range(N-m-1)]
B = 0 # m维匹配对数
A = 0 # m+1维匹配对数
for i in range(len(patterns)):
for j in range(i+1, len(patterns)):
if max(abs(patterns[i][k] - patterns[j][k]) for k in range(m)) <= r:
B += 1
if i < len(patterns_next) and j < len(patterns_next):
if max(abs(patterns_next[i][k] - patterns_next[j][k]) for k in range(m+1)) <= r:
A += 1
if B == 0:
return float('inf')
return -np.log(A / B)
3.4 信息效率的度量方法
信息效率,说白了就是市场对信息的反应速度和质量。一个信息效率高的市场,价格能快速、准确地反映新信息。
3.4.1 弱式有效市场检验
最常用的方法是检验价格序列是否具有可预测性。如果序列是随机的,说明市场是弱式有效的。
| 检验方法 | 原理 | 适用场景 |
|---|---|---|
| 游程检验 | 检验价格涨跌的序列是否随机 | 日频数据 |
| 方差比检验 | 比较不同时间尺度的方差 | 高频数据 |
| BDS检验 | 检验非线性依赖关系 | 复杂金融序列 |
3.4.2 信息熵效率指标
我个人比较喜欢用熵值来度量信息效率。具体做法是:
- 计算原始价格序列的熵值 H_original
- 对序列进行随机打乱,计算打乱后的熵值 H_shuffled
- 计算效率指标:E = H_original / H_shuffled
如果E接近1,说明序列接近随机,市场效率高。如果E明显小于1,说明存在可预测的结构,市场效率低。
实际案例:我在2023年分析过A股和美股的信息效率。结果发现,A股在开盘后30分钟内信息效率较低,存在明显的套利机会。而美股在开盘后5分钟内就已经基本消化了隔夜信息。
知识体系总览
下面这张图是我自己整理的,把本章的核心逻辑串起来了。
这张图把本章的核心逻辑串起来了。从信息论基础出发,到熵值计算,再到信息效率度量,最后回到交易应用。你想想看,其实每一步都是环环相扣的。
最后说一句:信息论在金融中的应用远不止这些。比如,你还可以用互信息做因子筛选,用KL散度做分布偏移检测,用熵值做风险度量。这些内容,我们后面的章节会陆续展开。