12. 弹性回归分析:线性回归模型、弹性系数估计、显著性检验
说到弹性回归,我得先跟你聊聊一个常见的误区。
很多人一上来就搞复杂的机器学习模型,什么随机森林、XGBoost全往上堆。结果呢?模型跑出来,解释性一塌糊涂。你问他「价格弹性到底是多少?」他答不上来。
我个人习惯是:先做线性回归,把弹性系数摸清楚。这是基本功,也是最能跟交易对手、风控部门沟通的语言。
12.1 为什么是线性回归?
市场深度和价格弹性之间,其实存在一个很朴素的关系:
订单簿越薄,价格对成交量的敏感度越高。
换句话说,弹性系数就是「每单位成交量变化,导致价格变化的百分比」。这个系数,用线性回归就能估计出来。
你想想看,我们做量化交易,最怕什么?最怕模型过拟合。线性回归虽然简单,但它的参数有明确的金融含义。这一点,黑箱模型做不到。
核心公式:
ΔP/P = β × (ΔQ/Q) + ε
其中 β 就是我们要估计的弹性系数。
12.2 弹性系数估计:从数据到参数
我在项目中遇到过一个问题:直接用原始价格和成交量做回归,结果弹性系数总是偏小。
后来发现,问题出在对数变换上。
正确的做法是:
- 取价格的对数:ln(P)
- 取成交量的对数:ln(Q)
- 对这两个对数序列做一阶差分
- 用差分后的序列做线性回归
为什么要这么做?因为弹性系数的定义本身就是「百分比变化之比」。对数差分恰好能捕捉这个百分比变化。
import numpy as np
import statsmodels.api as sm
# 假设我们有价格和成交量数据
price = np.array([100.0, 100.5, 101.2, 100.8, 101.5])
volume = np.array([1000, 1200, 1500, 1100, 1600])
# 对数变换
log_price = np.log(price)
log_volume = np.log(volume)
# 一阶差分
d_log_price = np.diff(log_price)
d_log_volume = np.diff(log_volume)
# 添加常数项
X = sm.add_constant(d_log_volume)
# OLS回归
model = sm.OLS(d_log_price, X)
results = model.fit()
print(results.summary())
避坑指南:我曾经直接用原始数据跑回归,结果弹性系数是0.3,看起来挺合理。但换成对数差分后,系数变成了0.8。为什么?因为原始数据忽略了价格水平的差异。100块涨1%和200块涨1%,绝对变化量差了一倍。对数变换能消除这个「水平效应」。
12.3 显著性检验:别被假相关骗了
弹性系数估计出来了,然后呢?
你得问自己一个问题:这个系数真的显著吗?
说白了,就是「成交量变化真的能解释价格变化吗?」
显著性检验主要看三个指标:
| 指标 | 含义 | 判断标准 |
|---|---|---|
| p-value | 系数为零的概率 | < 0.05 才算显著 |
| t-statistic | 系数与其标准误的比值 | 绝对值 > 1.96 显著 |
| R-squared | 模型解释了多少价格变化 | 越高越好,但别迷信 |
我记得有一次,跑出来的弹性系数p-value是0.08。乍一看不显著,但仔细检查数据,发现那段时间市场有重大新闻冲击。去掉异常值后,p-value降到了0.01。
注意:p-value显著不代表因果关系成立。它只告诉你「这个系数不太可能是零」。至于为什么成交量会影响价格,那是金融理论要回答的问题。
12.4 实战中的弹性回归流程
我建议你按照这个流程来:
- 数据清洗:去掉开盘、收盘前后的异常数据
- 对数变换:对价格和成交量取对数
- 差分处理:消除非平稳性
- 回归估计:用OLS估计弹性系数
- 残差检验:检查残差是否白噪声
- 稳健性检验:换时间窗口、换频率再跑一次
嗯,这里要注意:第5步很多人会跳过。但残差如果有自相关,说明你的模型漏掉了重要变量。比如,你可能忽略了买卖价差的影响。
12.5 弹性系数的交易含义
弹性系数估计出来后,怎么用?
我给你举个例子:
- 如果 β = 0.5,意味着成交量增加1%,价格平均上涨0.5%
- 如果 β = 2.0,意味着成交量增加1%,价格平均上涨2%
后者说明市场深度很差,一点点成交量就能把价格打飞。这种时候,你的交易策略就得小心了——大单子要拆成小单,不然滑点会让你亏死。
我的经验:在流动性好的股票上,弹性系数通常在0.1-0.3之间。如果某只股票的弹性系数突然跳到0.8以上,我会立刻警惕——要么是信息泄露,要么是市场深度在恶化。
12.6 本章小结
弹性回归分析,说白了就是回答一个问题:成交量变化,到底能撬动多少价格变化?
线性回归模型给了我们一个简洁的答案。但记住,简洁不等于简单。对数变换、显著性检验、残差分析,每一步都有坑。我踩过的坑,希望你别再踩一遍。