Deep learning with long short-term memory networks for financial market predictions
论文目标
篇论文回答一个很现实的问题:
💡“机器学习能不能用来预测股市涨跌?尤其是用‘深度学习’(Deep Learning)里的 LSTM 模型?”
作者选了一个经典的测试对象:S&P 500 指数的所有成分股(1992–2015年)。目标是:每天预测明天的每只股票—— 👉 明天会不会“涨得比市场中位数高”。
基础知识
LSTM
全称:Long Short-Term Memory Network(长短期记忆网络)它是深度学习里的一种 循环神经网络(RNN)。它的厉害之处在于:
- 能“记住”时间序列中的长远关系;
- 不容易“遗忘”或“爆炸梯度”。
如果股票在过去几周一直慢慢上涨,普通模型可能只看最近几天,但 LSTM 可以“记得”之前那几周的趋势。
训练方法
数据准备
- 数据:S&P 500 成分股(1992–2015)每日总收益。
- 每个月底 S&P 500 的所有成分股名单
- 对于“曾经在S&P 500出现过的所有股票”,下载从 1990 年 1 月到 2015 年 10 月的 每日“总收益指数”。
- 这个指标包含:
- 股票价格变化
- 分红(dividend)
- 拆股(stock split)等公司行为
数据划分
他们把整个1990–2015年的数据分成一个个“研究周期”(study period)。
每个 study period = 训练集(750天) + 测试集(250天) 相当于:
- 3年用于模型学习
- 1年用于真实预测验证
想象你有一条长长的时间线:
|<--- 750天训练 --->|<-- 250天交易(测试) -->|
|<--- 1000天 (study period) ------------------>|
然后窗口向前滚动250天,重复下一段
这样:
- 模型不会“偷看未来”;
- 每一段的交易期都是真正样本外预测;
- 一共得到23个独立的预测期。
关于股票数量 (ni)
在每个训练期结束时,S&P 500 大约有 500 支股票(实际上略有波动)。
- 训练集包含当时所有 S&P 500 成分股;
- 有些股票历史数据不足750天(比如新上市的)→ 用它已有的部分;
- 测试集同样包含这些股票;
- 如果一只股票在交易期中途退市,就只用到退市那天为止。
✅ 退市股票不会被删除,因为那是现实中真实发生的情况。
特征与目标生成
LSTM 是“时间序列模型”,输入必须是“按时间排序的连续数据序列”。他们选用的唯一特征是:
📊 每支股票的每日收益率序列(daily return)
股票价格: $$ P_t^s = \text{第 }t\text{ 天股票 }s\text{ 的价格} $$ 简单收益率(return): $$ R_{t,m}^s = \frac{P_t^s}{P_{t-m}^s} - 1 $$ 他们使用 m = 1(即一天的收益率),所以: $$ R_t^s = \frac{P_t^s}{P_{t-1}^s} - 1 $$
特征标准化(Normalization)
在训练集上计算平均值和标准差: $$ \tilde{R}t^s = \frac{R_t^s - \mu $$ 目的:消除不同股票波动率差异}}}{\sigma_{\text{train}}
构建 LSTM 输入序列
他们设定:
⏱ 每次输入 = 过去 240天 的标准化收益序列(大约1个交易年)
例如:
| 序列编号 | 输入序列(240天收益) | 输出目标(第241天) |
|---|---|---|
| 1 | R(1…240) | R241 |
| 2 | R(2…241) | R242 |
这样每只股票就有很多“重叠”的训练样本。
整个训练集(每个研究周期)包含约:
- 380,000 个序列样本
- 255,000 用于训练
- 125,000 用于测试
模型预测任务是:
🧩 判断“明天这只股票的收益是否高于市场中位数”
验证模型是否有效
他们用了两类验证方法:
- 统计层面的验证(模型预测准确率、信息含量)
- 经济层面的验证(用预测结果模拟交易,检验是否赚钱)
| 阶段 | 内容 | 验证目的 |
|---|---|---|
| 📊 预测验证 | 检查模型是否正确预测了「明天哪支股票会跑赢中位数」 | 看分类准确率是否优于随机猜测(50%) |
| 💰 交易模拟 | 按预测信号建仓、计算组合收益 | 看能否在真实市场赚到钱 |
| 🔁 滚动测试 | 在23个不重叠时间窗口上重复训练+测试 | 检验模型稳定性与鲁棒性 |
| ⚖️ 基准对比 | 与 Random Forest、DNN、Logistic Regression 对比 | 验证 LSTM 是否真正优于传统模型 |
论文结果(大致值)
| 模型 | 平均预测准确率 | 是否显著高于 50% |
|---|---|---|
| Logistic Regression | ≈ 50.2 % | ❌ 否 |
| Deep Neural Net | ≈ 51.5 % | ⚠️ 较弱 |
| Random Forest | ≈ 53.1 % | ✅ 显著 |
| LSTM (核心模型) | ≈ 54.4 % | ✅✅ 高显著性 |
交易策略
📊 模型每天都会预测: 每只股票明天的表现(收益)是否会高于市场中位数。
于是:
- 如果模型预测它会跑赢市场中位数(Label = 1) → 代表“明天强势”
- 如果预测它会落后于市场中位数(Label = 0) → 代表“明天弱势”
💡 交易逻辑: 每天根据预测结果买强(long),卖弱(short),构建一个市场中性组合(market-neutral portfolio)。
S&P 500
S&P 500 Index = Standard & Poor’s 500 Stock Index中文名:标准普尔500指数 。它是一个代表美国股市整体表现的 股票价格指数。 由美国标准普尔公司(Standard & Poor’s, 简称 S&P Global)编制和维护。
- 里面包含了 500 家美国大型上市公司
- 这些公司大多在纽约证券交易所 (NYSE) 或纳斯达克 (NASDAQ) 上市,覆盖了几乎所有主要行业
SP500 有什么作用
S&P 500 是世界上最重要、最常用的股市指数之一。通常被视为 “美国股市整体表现的晴雨表”
简单理解:
- 如果 S&P 500 涨了,美国股市整体在上涨;
- 如果它跌了,说明市场普遍在下跌。
它怎么计算出来的
S&P 500 是一个 市值加权指数(market capitalization weighted index):
- 每家公司在指数中的权重 = 公司市值(股价 × 股票数量)
- 大公司(例如 Apple、Microsoft)权重大;
- 小公司(例如某些区域银行)权重小。
举个例子:
Apple 占 S&P 500 的大约 7% 左右。 如果 Apple 股价大涨,指数整体也会被明显拉高。
成分股怎么选出来的
入选标准(简化版)包括:
- 公司总部必须在美国;
- 总市值要足够大(目前约在百亿美元级别以上);
- 股票要流通性好(交易活跃);
- 财务要健康(有盈利);
- 行业分布要均衡。
所以,S&P 500 的成员不是固定的,会随时间变化。 这就是论文中提到的“要消除生存者偏差”的原因。
怎么获得
很多研究者把历史 S&P 500 构成整理好上传到了 Kaggle
https://www.kaggle.com/datasets/andrewmvd/sp-500-stocks
里面有
sp500_index.csvS&P 500 指数的每日收盘价(Index Value)
也可以用python的库
import yfinance as yf
symbols = ["AAPL", "MSFT", "GOOG", "AMZN", "META", "JPM", "XOM"]
data = yf.download(symbols, start="2010-01-01", end="2020-01-01")["Adj Close"]