
2026年重磅升级已全面落地!欢迎加入专注财经数据与量化投研的【数据科学实战】知识星球!您将获取持续更新的《财经数据宝典》与《量化投研宝典》,双典协同提供系统化指引;星球内含300篇以上独有高质量文章,深度覆盖策略开发、因子分析、风险管理等核心领域,内容基本每日更新;同步推出的「量化因子专题教程」系列(含完整可运行代码与实战案例),系统详解因子构建、回测与优化全流程,并实现日更迭代。我们持续扩充独家内容资源,全方位赋能您的投研效率与专业成长。无论您是量化新手还是资深研究者,这里都是助您少走弯路、事半功倍的理想伙伴,携手共探数据驱动的投资未来!
对于量化分析师来说,从基于规则的交易策略转向数据驱动的机器学习模型,是一次关键的进化。传统的统计套利依赖预定义的相关性,而机器学习则能帮助我们发现历史数据中复杂的非线性模式。
本文将带你从零开始,使用线性回归构建一个时间序列动量策略,预测标普 500 指数(SPY)的收益。更重要的是,我们还会演示量化机器学习中最常见的陷阱——过拟合。
在开始之前,我们需要理清三个容易混淆的概念:
人工智能(AI) 是自动化智力任务的广泛努力。一个基于规则的算法(比如"当 50 日均线突破 200 日均线时买入")属于 AI,但不属于 ML。
机器学习(ML) 是 AI 的一个子集,系统从数据中学习规则,而不是被显式编程。我们输入过去的收益率(输入)和未来的收益率(输出),模型自己找出其中的关系。
深度学习(DL) 是 ML 的一个子集,使用多层神经网络来学习数据表示。
本文使用的是监督学习,因为我们有一个带标签的数据集:我们知道与历史指标(特征)相关的实际过去收益率(标签)。
线性回归是量化机器学习的"Hello World",它试图用线性方程建模因变量 y(未来收益率)与自变量 X(过去收益率)之间的关系。
在金融领域,数据充满噪音。当模型学习的是"噪音"(随机市场波动)而非"信号"(实际趋势)时,就发生了过拟合。
欠拟合:模型太简单(比如用直线拟合曲线)。
过拟合:模型太复杂(比如用高次多项式连接每一个数据点)。它在历史数据上看起来完美,但在新数据上表现糟糕。
首先,导入必要的库并获取 SPY ETF 的历史数据:
import numpy as npimport pandas as pdimport yfinance as yfimport matplotlib.pyplot as pltfrom sklearn.linear_model import LinearRegressionfrom sklearn.metrics import mean_squared_errorfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import PolynomialFeatures# 下载 SPY 的历史数据# 使用较长的时间窗口以确保有足够的数据点df = yf.download('SPY', start='2013-01-01', end='2026-01-01')# 计算每日收益率df['Return'] = df['Close'].pct_change()# 删除由 pct_change 产生的 NaN 值df.dropna(inplace=True)print(f"数据加载完成:共 {len(df)} 个交易日的数据。")print(df.head())动量策略的核心假设是:过去的表现会影响未来的结果。我们创建"滞后"特征,使用 t-1、t-2 等时刻的收益率来预测 t 时刻的收益率:
# 创建滞后特征(信号)# 使用过去 5 天的收益率来预测今天的收益率lags = 5for i in range(1, lags + 1): df[f'Lag_{i}'] = df['Return'].shift(i)# 删除由 shift 操作产生的 NaN 值df.dropna(inplace=True)# 定义特征矩阵 X 和目标变量 yfeature_cols = [f'Lag_{i}' for i in range(1, lags + 1)]X = df[feature_cols]y = df['Return']print("特征矩阵 X(前 5 行):")print(X.head())我们绝不能在用于训练的同一数据上评估模型。在时间序列金融数据中,我们不能随机打乱数据(因为时间顺序很重要),必须按时间顺序划分:
# 划分为训练集(80%)和测试集(20%)# shuffle=False 对于时间序列数据至关重要X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, shuffle=False)print(f"训练集大小:{len(X_train)}")print(f"测试集大小:{len(X_test)}")实例化模型并在训练数据上拟合:
# 初始化模型lr_model = LinearRegression()# 训练模型lr_model.fit(X_train, y_train)# 查看学习到的系数(即 Theta 值)print("截距(偏置):", lr_model.intercept_)print("系数(权重):", lr_model.coef_)来看看简单模型预测收益率的效果如何:
# 在测试集上进行预测y_pred = lr_model.predict(X_test)# 计算均方误差(MSE)mse = mean_squared_error(y_test, y_pred)print(f"均方误差(线性模型):{mse:.8f}")# 可视化:预测值 vs 实际值(取前 100 个样本便于观察)plt.figure(figsize=(12, 6))plt.plot(y_test.values[:100], label='实际收益率', alpha=0.7)plt.plot(y_pred[:100], label='预测收益率', alpha=0.7, linestyle='--')plt.title('线性回归:实际 vs 预测收益率(前 100 个测试样本)')plt.legend()plt.show()你会注意到,预测值相比实际波动几乎是一条"平线"。这就是欠拟合——线性关系太弱,无法捕捉市场噪音。
为了理解过拟合,我们故意让模型变得过于复杂,添加多项式特征:
# 创建多项式特征(4 次方——高度复杂)poly = PolynomialFeatures(degree=4)X_train_poly = poly.fit_transform(X_train)X_test_poly = poly.transform(X_test)# 在复杂数据上训练新模型poly_model = LinearRegression()poly_model.fit(X_train_poly, y_train)# 分别在训练集和测试集上预测y_train_pred_poly = poly_model.predict(X_train_poly)y_test_pred_poly = poly_model.predict(X_test_poly)# 计算误差train_mse = mean_squared_error(y_train, y_train_pred_poly)test_mse = mean_squared_error(y_test, y_test_pred_poly)print(f"训练集 MSE(多项式模型):{train_mse:.8f}")print(f"测试集 MSE(多项式模型):{test_mse:.8f}")结果解读:训练集 MSE 很低(拟合良好),但测试集 MSE 很高(拟合糟糕)。模型"记住"了训练数据,但无法泛化到新数据。
问:为什么 y_pred 几乎是一条接近零的直线?
答:这在金融收益率数据中是正常现象。每日收益率非常接近零,过去收益率的"信号"很弱。这证实了简单的线性关系通常不足以进行原始价格预测,需要更复杂的特征或正则化。
问:为什么在 train_test_split 中要设置 shuffle=False?
答:金融数据是有时间顺序的。如果打乱数据,你可能会用 2022 年的数据去预测 2015 年的数据,这就是"前视偏差"——通过知道未来来作弊。必须始终保持时间线完整。
本文建立了量化机器学习实验的完整流程:数据加载 → 特征工程 → 训练/测试集划分 → 建模 → 评估。
我们发现,简单的线性回归容易欠拟合金融数据(模型太简单),而高次多项式回归则容易过拟合(模型记住了噪音)。
那么如何找到"恰到好处"的平衡点呢?答案在于正则化技术。在后续文章中,将会介绍 Ridge、Lasso 和 ElasticNet 回归,通过数学方法惩罚模型复杂度,从而改进交易策略。
2026年全面升级已落地!【数据科学实战】知识星球核心权益如下:
星球已沉淀丰富内容生态——涵盖量化文章专题教程库、因子日更系列、高频数据集、PyBroker实战课程、专家深度分享与实时答疑服务。无论您是初探量化的学习者,还是深耕领域的从业者,这里都是助您少走弯路、高效成长的理想平台。诚邀加入,共探数据驱动的投资未来!
好文推荐
1. 用 Python 打造股票预测系统:Transformer 模型教程(一)
2. 用 Python 打造股票预测系统:Transformer 模型教程(二)
3. 用 Python 打造股票预测系统:Transformer 模型教程(三)
4. 用 Python 打造股票预测系统:Transformer 模型教程(完结)
6. YOLO 也能预测股市涨跌?计算机视觉在股票市场预测中的应用
9. Python 量化投资利器:Ridge、Lasso 和 Elastic Net 回归详解
好书推荐