第19章:统计学习在定价中的应用:线性回归、岭回归、Lasso在价差预测中的应用
做市商的核心工作是什么?说白了,就是预测价差。
你报出的买价和卖价之间的那点差距,就是你的利润来源。但价差不是拍脑袋定的,它受波动率、订单流、库存风险等多种因素影响。我做了这么多年交易,发现一个规律:能用统计模型解决的问题,就别靠直觉。
这一章,我们来聊聊线性回归、岭回归和Lasso这三个经典统计学习方法,怎么用在价差预测上。
19.1 为什么是统计学习?
很多人一听到「机器学习」就兴奋,觉得神经网络才是王道。但说实话,在金融高频场景下,简单模型往往更可靠。
我个人的习惯是:先用线性模型跑一遍,看看效果。如果线性模型能解释80%的价差变化,那何必上复杂模型?
统计学习的优势在于:
- 可解释性强:你能清楚知道每个特征对价差的影响
- 计算速度快:毫秒级出结果,适合实时交易
- 过拟合风险低:正则化方法天然防过拟合
核心观点:价差预测本质上是一个回归问题。我们想用历史数据,找到影响价差的关键因子,然后预测下一秒的最优价差。
19.2 线性回归:最朴素的价差预测模型
线性回归假设价差与特征之间存在线性关系。公式很简单:
spread = β₀ + β₁·volatility + β₂·order_imbalance + β₃·inventory + ε
其中:
- volatility:最近N笔交易的波动率
- order_imbalance:买卖订单的不平衡度
- inventory:当前库存水平
我在项目中遇到过一个问题:直接用普通最小二乘法(OLS)拟合,结果R²很高,但回测效果很差。为什么?因为特征之间存在多重共线性。
举个例子,波动率和订单不平衡度往往是相关的——波动大的时候,订单不平衡度也高。这会导致系数估计不稳定,今天跑出来的β₁是正数,明天就变成负数了。
避坑指南:我曾经在ETH-USDT的做市策略中,直接用线性回归预测价差,结果实盘第一天就亏了。后来发现,是因为波动率特征和库存特征高度相关,导致模型在极端行情下完全失效。
19.3 岭回归:解决多重共线性
岭回归在线性回归的基础上,加了一个L2正则化项。它的目标函数是:
min ||y - Xβ||² + λ||β||²
这个λ(lambda)是超参数,控制正则化的强度。λ越大,系数越趋向于0,但不会完全变成0。
岭回归的好处是:即使特征高度相关,它也能给出稳定的系数估计。
我建议你在做价差预测时,优先尝试岭回归。原因有三:
- 金融数据天生存在多重共线性,岭回归天然适合
- 它不会把特征完全剔除,保留了所有信息
- 调参简单,交叉验证就能找到最优λ
小技巧:在实际交易中,我通常用5折交叉验证来选择λ。如果λ太大,模型会欠拟合;λ太小,又解决不了共线性问题。一般λ在0.1到10之间比较合适。
19.4 Lasso回归:特征选择利器
Lasso回归用的是L1正则化:
min ||y - Xβ||² + λ||β||₁
和岭回归不同,Lasso会把不重要的特征系数直接压缩到0。这意味着它自带特征选择功能。
你想想看,做市商通常有几十个候选特征——波动率、成交量、买卖价差、深度、订单到达率等等。但真正有用的可能只有三五个。Lasso能帮你自动筛选出最重要的因子。
我记得有一次做BTC永续合约的价差预测,初始特征有20多个。用Lasso跑完后,只剩4个特征有非零系数:
| 特征 | 系数 | 说明 |
|---|---|---|
| 波动率(1分钟) | 0.42 | 波动越大,价差越大 |
| 订单不平衡度 | 0.31 | 买卖压力越大,价差越大 |
| 库存水平 | 0.18 | 库存越高,价差越大(风险补偿) |
| 时间因子 | -0.09 | 临近收盘,价差缩小 |
其他16个特征系数全为0。这说明什么?做市商真正需要关注的,就是这4个核心因子。
经验之谈:Lasso的λ选择很关键。λ太小,特征选得太多;λ太大,有用的特征也被剔除了。我一般用信息准则(AIC/BIC)辅助选择,而不是单纯依赖交叉验证。
19.5 三种模型的对比与选择
说了这么多,到底该用哪个?我整理了一个对比表:
| 模型 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 线性回归 | 特征少、无共线性 | 简单、可解释性强 | 对共线性敏感 |
| 岭回归 | 特征多、有共线性 | 系数稳定、保留所有特征 | 不能做特征选择 |
| Lasso | 特征多、需要筛选 | 自动特征选择、模型简洁 | 可能过度压缩 |
我个人习惯是:先用Lasso做特征筛选,再用岭回归做最终预测。这样既保留了Lasso的特征选择能力,又利用了岭回归的稳定性。
19.6 实战代码示例
下面是一个简单的Python示例,展示如何用这三种模型预测价差:
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.model_selection import cross_val_score
# 假设我们有历史数据
# features: volatility, order_imbalance, inventory, time_factor
# target: spread
X = np.random.randn(1000, 4) # 1000个样本,4个特征
y = 0.5 * X[:, 0] + 0.3 * X[:, 1] + 0.2 * X[:, 2] - 0.1 * X[:, 3] + np.random.randn(1000) * 0.1
# 线性回归
lr = LinearRegression()
lr_scores = cross_val_score(lr, X, y, cv=5, scoring='neg_mean_squared_error')
print(f"线性回归 MSE: {-lr_scores.mean():.4f}")
# 岭回归
ridge = Ridge(alpha=1.0)
ridge_scores = cross_val_score(ridge, X, y, cv=5, scoring='neg_mean_squared_error')
print(f"岭回归 MSE: {-ridge_scores.mean():.4f}")
# Lasso
lasso = Lasso(alpha=0.01)
lasso_scores = cross_val_score(lasso, X, y, cv=5, scoring='neg_mean_squared_error')
print(f"Lasso MSE: {-lasso_scores.mean():.4f}")
# 查看Lasso选中的特征
lasso.fit(X, y)
print(f"Lasso系数: {lasso.coef_}")
注意:实际交易中,特征需要做标准化处理。因为不同特征的量纲差异很大——波动率可能是0.01级别,库存可能是100级别。不做标准化,正则化项会失效。
19.7 知识体系图
下面这张图展示了本章的核心逻辑:
19.8 总结
统计学习在价差预测中,不是花架子,是真能赚钱的工具。
线性回归给你一个基准,岭回归帮你稳定系数,Lasso帮你筛选特征。三者配合使用,基本能覆盖大部分做市场景。
最后提醒一句:模型再漂亮,也要回测验证。我见过太多人在回测里赚得盆满钵满,实盘一跑就崩。原因往往是——数据泄露、未来函数、或者过拟合。
嗯,这一章就到这里。记住:简单模型,用好了就是利器。