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 知识体系总览
下面这张图帮你理清本章的核心逻辑:
这张图把四个核心概念串起来了。你会发现,有效市场假说是理论基础,信息比率是策略层面的衡量,价格发现和信息份额则是微观结构层面的具体计算。
我的建议:做量化交易,不要只盯着一个指标。把信息比率和信息份额结合起来看——前者告诉你策略赚不赚钱,后者告诉你钱是从哪里赚来的。两者都好的策略,才值得上实盘。
好了,信息效率这块就聊到这儿。记住一句话:市场永远在变,但信息效率的衡量方法不会变。掌握了这些工具,你就能在任何市场里找到自己的信息优势。