当前位置:首页>python>用 Python 玩转量化交易:手把手教你构建第一个机器学习策略

用 Python 玩转量化交易:手把手教你构建第一个机器学习策略

  • 2026-09-29 20:28:35
用 Python 玩转量化交易:手把手教你构建第一个机器学习策略

2026年重磅升级已全面落地!欢迎加入专注财经数据与量化投研的【数据科学实战】知识星球!您将获取持续更新的《财经数据宝典》与《量化投研宝典》,双典协同提供系统化指引;星球内含300篇以上独有高质量文章,深度覆盖策略开发、因子分析、风险管理等核心领域,内容基本每日更新;同步推出的「量化因子专题教程」系列(含完整可运行代码与实战案例),系统详解因子构建、回测与优化全流程,并实现日更迭代。我们持续扩充独家内容资源,全方位赋能您的投研效率与专业成长。无论您是量化新手还是资深研究者,这里都是助您少走弯路、事半功倍的理想伙伴,携手共探数据驱动的投资未来!

引言

对于量化分析师来说,从基于规则的交易策略转向数据驱动的机器学习模型,是一次关键的进化。传统的统计套利依赖预定义的相关性,而机器学习则能帮助我们发现历史数据中复杂的非线性模式。

本文将带你从零开始,使用线性回归构建一个时间序列动量策略,预测标普 500 指数(SPY)的收益。更重要的是,我们还会演示量化机器学习中最常见的陷阱——过拟合。

核心概念速览

AI、ML 与 DL 的区别

在开始之前,我们需要理清三个容易混淆的概念:

人工智能(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年全面升级已落地!【数据科学实战】知识星球核心权益如下:

  1. 1. 双典系统赋能:获赠《财经数据宝典》与《量化投研宝典》完整文档,凝练多年实战经验,构建系统化知识框架;
  2. 2. 量化因子日更教程(2026重磅新增):每日更新「量化因子专题教程」,配套完整可运行代码与实战案例,深度拆解因子构建、回测与优化全流程;
  3. 3. 量化文章专题教程库:300+篇星球独有高质量教程式文章,系统覆盖策略开发、因子研究、风险管理等核心领域,内容基本每日更新,并配套精选学习资料与实战参考;
  4. 4. PyBroker实战课程:赠送《PyBroker-入门及实战》视频课程,手把手教学,快速掌握量化策略开发技能;
  5. 5. 财经数据支持:定期更新国内外财经数据,为策略研发提供精准、可靠的数据基础;
  6. 6. 顶尖学者与行业专家分享:年度邀请学术界博士与业界资深专家开展前沿论文精讲与实战案例分享,不少于4场,直击研究前沿与产业实践;专家直连答疑:与核心开发者及领域专家实时互动,高效解决投研实战难题;
  7. 7. 专业社群与专属福利:加入高质量交流社群,获取课程折扣及更多独家资源。

星球已沉淀丰富内容生态——涵盖量化文章专题教程库、因子日更系列、高频数据集、PyBroker实战课程、专家深度分享与实时答疑服务。无论您是初探量化的学习者,还是深耕领域的从业者,这里都是助您少走弯路、高效成长的理想平台。诚邀加入,共探数据驱动的投资未来!

好文推荐

1. 用 Python 打造股票预测系统:Transformer 模型教程(一)

2. 用 Python 打造股票预测系统:Transformer 模型教程(二)

3. 用 Python 打造股票预测系统:Transformer 模型教程(三)

4. 用 Python 打造股票预测系统:Transformer 模型教程(完结)

5. 揭秘隐马尔可夫模型:因子投资的制胜武器

6. YOLO 也能预测股市涨跌?计算机视觉在股票市场预测中的应用

7. 金融 AI 助手:FinGPT 让你轻松掌握市场分析

8. 量化交易秘籍:为什么专业交易员都在用对数收益率?

9. Python 量化投资利器:Ridge、Lasso 和 Elastic Net 回归详解

10. 掌握金融波动率模型:完整 Python 实现指南

好书推荐

最新文章

随机文章