第三章:信息理论在金融中的应用

大家好,我是老张。今天我们来聊聊信息理论在金融里的那些事儿。

说实话,刚入行那会儿,我觉得信息论跟交易八竿子打不着。直到有一次,我在处理高频数据时发现——有些行情数据看似丰富,其实全是噪音。那一刻我才意识到,信息度量才是量化交易的底层逻辑。

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 信息熵效率指标

我个人比较喜欢用熵值来度量信息效率。具体做法是:

  1. 计算原始价格序列的熵值 H_original
  2. 对序列进行随机打乱,计算打乱后的熵值 H_shuffled
  3. 计算效率指标:E = H_original / H_shuffled

如果E接近1,说明序列接近随机,市场效率高。如果E明显小于1,说明存在可预测的结构,市场效率低。

实际案例:我在2023年分析过A股和美股的信息效率。结果发现,A股在开盘后30分钟内信息效率较低,存在明显的套利机会。而美股在开盘后5分钟内就已经基本消化了隔夜信息。

知识体系总览

下面这张图是我自己整理的,把本章的核心逻辑串起来了。

信息理论在金融中的应用 - 知识体系 信息论基础 自信息 互信息 KL散度 金融时间序列熵值计算 近似熵 样本熵 信息效率度量方法 游程检验 方差比检验 熵效率指标 核心目标:用信息论工具量化市场效率,发现交易机会

这张图把本章的核心逻辑串起来了。从信息论基础出发,到熵值计算,再到信息效率度量,最后回到交易应用。你想想看,其实每一步都是环环相扣的。

最后说一句:信息论在金融中的应用远不止这些。比如,你还可以用互信息做因子筛选,用KL散度做分布偏移检测,用熵值做风险度量。这些内容,我们后面的章节会陆续展开。

专注资料整理