20、信息效率:有效市场假说检验、信息比率、价格发现、信息份额计算

聊到市场微观结构,有个绕不开的话题——信息效率。说白了,就是价格到底能不能反映信息?反映得有多快?

我早年做CTA策略的时候,总觉得市场是无效的,随便一个均线突破就能赚钱。后来亏了几次大的,才意识到——嗯,市场比我想象的要聪明得多。今天我们就来拆解一下信息效率的四个核心维度。

20.1 有效市场假说:三种形态与检验方法

有效市场假说(EMH)是金融学的基石之一。它把市场效率分成三个层次:

  • 弱式有效:价格已反映所有历史交易信息。技术分析无效。
  • 半强式有效:价格已反映所有公开信息。基本面分析无效。
  • 强式有效:价格已反映所有信息,包括内幕消息。没人能持续跑赢市场。

我在项目中遇到过最典型的案例是:用自相关检验来判断弱式有效。如果收益率序列的自相关系数显著不为零,说明历史价格能预测未来——市场就是弱式无效的。

核心检验方法:

  • 自相关检验(Ljung-Box Q统计量)
  • 游程检验(Runs Test)
  • 方差比检验(Lo-MacKinlay)
  • 事件研究法(Event Study)

给你看一段我常用的自相关检验代码:

import numpy as np
import pandas as pd
from statsmodels.stats.diagnostic import acorr_ljungbox

def emh_weak_test(returns, lags=[5, 10, 20]):
    """
    弱式有效市场检验 - Ljung-Box
    """
    result = acorr_ljungbox(returns, lags=lags, return_df=True)
    result['significant'] = result['lb_pvalue'] < 0.05
    return result

# 示例:对某股票日收益率检验
returns = pd.Series(np.random.randn(1000) * 0.02)
test_result = emh_weak_test(returns)
print(test_result)

你想想看,如果p值都大于0.05,说明历史价格没有预测能力——市场是弱式有效的。反之,你就找到了一个潜在的套利机会。

避坑指南:我曾经在检验时忽略了数据频率的影响。日频数据往往表现出弱式有效,但高频数据(比如分钟级)经常能检测到显著的自相关性。所以检验前一定要明确你的交易频率。

20.2 信息比率:衡量策略的信息效率

信息比率(IR)是衡量超额收益稳定性的指标。公式很简单:

IR = (策略收益率 - 基准收益率) / 跟踪误差

跟踪误差就是超额收益的标准差。IR越高,说明你每承担一单位主动风险,能获得多少超额回报。

我个人习惯把IR分成三个档次:

IR范围 评价 实际含义
< 0.5 较差 策略没有信息优势
0.5 - 1.0 良好 有一定信息处理能力
> 1.0 优秀 信息效率很高,值得实盘

计算代码也很直接:

def information_ratio(strategy_returns, benchmark_returns):
    """
    计算信息比率
    """
    excess_returns = strategy_returns - benchmark_returns
    tracking_error = np.std(excess_returns, ddof=1)
    ir = np.mean(excess_returns) / tracking_error
    return ir

# 示例
strat = np.random.randn(252) * 0.01 + 0.0005
bench = np.random.randn(252) * 0.01
ir = information_ratio(strat, bench)
print(f"信息比率: {ir:.3f}")

实战技巧:我建议用滚动窗口计算IR,而不是只看全样本。因为策略的信息效率会随时间变化。比如某个月IR突然暴跌,可能是市场结构变了,也可能是你的因子失效了。

20.3 价格发现:谁在主导价格变动?

价格发现,说白了就是新信息如何融入价格的过程。在多个相关资产中,哪个市场最先反映信息?哪个市场对价格发现的贡献更大?

举个例子:沪深300股指期货和沪深300ETF,哪个先动?通常期货领先现货,因为期货交易成本低、杠杆高、机构参与多。

衡量价格发现有两个经典模型:

  • Hasbrouck信息份额(IS):基于协整关系的方差分解
  • Gonzalo-Granger永久-暂时模型(GG):基于误差修正系数的分解

我当年做期现套利时,就靠这个来判断开仓时机。如果期货的信息份额突然飙升,说明期货在引领现货——这时候做空期货、做多现货的套利机会就来了。

20.4 信息份额计算:实战代码

信息份额的计算稍微复杂一点,但核心逻辑很清晰。我们以两个价格序列为例:

import statsmodels.api as sm
import numpy as np

def hasbrouck_information_share(price1, price2):
    """
    Hasbrouck信息份额计算
    """
    # 1. 构建协整回归
    model = sm.OLS(price1, sm.add_constant(price2))
    result = model.fit()
    coint_vector = np.array([1, -result.params[1]])
    
    # 2. 构建误差修正模型(VECM)
    # 这里简化处理,实际需要完整VECM估计
    spread = price1 - result.params[1] * price2 - result.params[0]
    spread_lag = spread.shift(1).dropna()
    
    # 3. 计算误差修正系数
    dp1 = price1.diff().dropna()
    dp2 = price2.diff().dropna()
    
    # 4. 信息份额 = 误差修正系数的平方占比
    # 实际计算需要Cholesky分解,这里展示简化版本
    alpha1 = np.cov(dp1, spread_lag)[0,1] / np.var(spread_lag)
    alpha2 = np.cov(dp2, spread_lag)[0,1] / np.var(spread_lag)
    
    share1 = alpha1**2 / (alpha1**2 + alpha2**2)
    share2 = alpha2**2 / (alpha1**2 + alpha2**2)
    
    return share1, share2

# 示例
np.random.seed(42)
n = 1000
common = np.cumsum(np.random.randn(n))  # 共同因子
noise1 = np.random.randn(n) * 0.5
noise2 = np.random.randn(n) * 0.3
p1 = common + noise1
p2 = common + noise2

s1, s2 = hasbrouck_information_share(p1, p2)
print(f"资产1信息份额: {s1:.3f}")
print(f"资产2信息份额: {s2:.3f}")

注意:信息份额的估计对样本区间非常敏感。我曾经用不同时间段算同一个品种,结果信息份额从0.7变成了0.3。后来发现是那段时期政策突变,导致市场结构发生了根本性变化。所以建议用滚动窗口来观察信息份额的稳定性。

20.5 知识体系总览

下面这张图帮你理清本章的核心逻辑:

信息效率知识体系 信息效率 有效市场假说 信息比率 价格发现 信息份额计算 弱式有效 半强式有效 强式有效 自相关/游程/方差比检验 IR计算 IR评价标准 滚动窗口IR Hasbrouck IS GG模型 协整与误差修正 Cholesky分解 方差分解 滚动窗口估计 核心目标:衡量信息融入价格的速度与程度

这张图把四个核心概念串起来了。你会发现,有效市场假说是理论基础,信息比率是策略层面的衡量,价格发现和信息份额则是微观结构层面的具体计算。

我的建议:做量化交易,不要只盯着一个指标。把信息比率和信息份额结合起来看——前者告诉你策略赚不赚钱,后者告诉你钱是从哪里赚来的。两者都好的策略,才值得上实盘。

好了,信息效率这块就聊到这儿。记住一句话:市场永远在变,但信息效率的衡量方法不会变。掌握了这些工具,你就能在任何市场里找到自己的信息优势。

交易系统化学习资料 微信Strategy888888