尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

LSTM预测套利时机:从价差回归到配对交易的完整技术路线

LSTM预测套利时机:从价差回归到配对交易的完整技术路线 很多人第一次接触 LSTM 时间序列预测都是从股票涨跌预测开始的。拿过去 60 天的收盘价喂给模型让它预测明天的价格然后据此决定买卖。结果往往很残酷训练集上表现不错一到实盘就不灵了。问题不在 LSTM而在任务设计本身——预测绝对价格的方向本质上是一个信噪比极低的问题你很难从历史价格中稳定地预测出未来几块钱的涨跌。但如果你换一个任务比如预测价差的回归时机情况就完全不同了。这也是为什么“LSTM 预测套利时机”这类论文思路值得认真拆解。它没有试图用 LSTM 去预测市场方向而是把 LSTM 用在了一个数学性质更好的任务上预测两个高度相关资产之间价差的未来走势从而判断套利窗口何时打开、何时关闭。本文就来拆解这类论文的完整思路、核心代码、验证方法以及在实际工程中容易踩的坑。先给结论LSTM 在套利时机预测中最有价值的用法不是预测价格本身而是预测价差的异常状态何时收敛。把任务从“回归预测”改成“状态识别 时机判断”模型的稳定性会上一个台阶。读完这篇文章你会理解这个判断背后的逻辑也能照着跑通一个最小的 LSTM 套利时机预测 Demo。1. 这篇论文分享要解决什么问题关于 LSTM 做量化投资业界有一个普遍的误区只要模型够复杂就能从历史价格中学会预测未来。于是大量玩家把 LSTM、GRU、Transformer 往 K 线上堆期望模型能看穿市场。结果往往是回测曲线漂亮得惊人实盘账户亏得让人沉默。为什么因为金融时间序列包含两种成分可预测的规律和不可预测的噪声。价格序列里噪声的比例极高尤其是日线级别的数据。LSTM 虽然能捕捉长期依赖但它并不能创造信息——如果输入特征里本身就没有足够强的预测信号模型只会把噪声也一起学进去造成严重的过拟合。套利时机预测之所以更适合 LSTM是因为它把问题转换了不预测方向预测关系我们不问“BTC 明天是涨是跌”而是问“BTC 和 ETH 的价差偏离均值之后什么时候会回归”。前者受无数不可知因素影响后者受到均值回归这一统计规律的约束。不预测长期预测短期形态套利窗口通常很短模型只需要判断未来几个时间步内的收敛概率这正是序列模型擅长的局部模式识别。不追求高赔率追求高胜率套利交易的单笔收益通常不高但胜率高、回撤小。模型不需要“神预测”只需要比随机开仓稍微准一点在扣除手续费后仍然为正期望。所以这篇文章真正想讲的不是某篇具体论文的复现而是一条被论文反复验证、可以落地的技术路线用 LSTM 对价差序列建模输出套利时机的概率信号再通过回测验证其有效性。无论你以后看哪篇论文这条主线都是通用的。2. LSTM 的核心概念与适用范围2.1 为什么是 LSTM而不是普通 RNN 或 Transformer要理解 LSTM 为什么适合这类任务先要理解传统 RNN 的问题。RNN循环神经网络的设计初衷是处理序列数据。它的核心结构是隐状态相当于一个不断更新的“记忆体”。每个时间步网络读取当前输入结合上一时刻的隐状态输出当前结果并更新记忆。问题在于当序列很长时梯度在反向传播过程中会不断连乘导致梯度过小梯度消失或过大梯度爆炸。梯度消失意味着网络几乎无法学习到“很久以前”的信息也就是长期依赖捕捉不到。LSTM长短期记忆网络在 1997 年由 Hochreiter 和 Schmidhuber 提出本质上是给 RNN 加了一套“门控机制”。它引入了三个门门名称作用通俗理解遗忘门决定要丢弃上一时刻记忆中的哪些信息决定“忘掉什么”输入门决定当前输入中有哪些信息值得写进记忆决定“记住什么”输出门决定当前隐状态输出哪些信息决定“对外展示什么”这套门控机制让信息可以沿着时间维度长距离传递而不衰减因此 LSTM 在很长一段时间里是时间序列预测、自然语言处理、语音识别等任务的主流模型。那为什么现在很多 NLP 任务被 Transformer 取代了因为 Transformer 通过自注意力机制可以并行计算长距离依赖关系训练效率远高于按时间步展开的 LSTM。但在量化场景下LSTM 仍然有不可替代的优势数据规模小金融日线数据的样本量通常只有几千到几万条Transformer 这类大模型在小样本上非常容易过拟合而 LSTM 的参数规模更可控。序列依赖更强LSTM 天然建模时间顺序而 Transformer 需要额外位置编码来区分先后关系。解释性更友好LSTM 的隐藏状态可以可视化为时间序列特征便于分析模型关注的周期。2.2 LSTM 在时间序列预测中的典型工作方式在时间序列预测任务中LSTM 的标准工作方式如下滑窗采样把连续的一段时间步特征作为输入把未来一段时间的值作为标签。特征标准化金融数据通常要归一化到 [0,1] 或均值为 0、方差为 1 的分布。有监督学习将时间序列预测转化为有监督学习输入为历史窗口输出为未来值。滚动预测预测完一个时间步后把预测值拼回输入序列进行下一步预测或者直接预测多步。这种模式本身并没有问题问题在于你拿它来预测什么。预测资产价格方向时模型要拟合的映射是“历史价格 - 未来价格”这个映射几乎不存在稳定的统计规律。预测价差回归时模型要拟合的映射是“历史价差状态 - 未来收敛概率”这个映射背后有均值回归机制支撑模型更容易学到有效特征。3. 套利时机的统计逻辑为什么要预测价差在股票、期货、加密货币市场**配对交易Pairs Trading**是最经典的统计套利策略之一。它的核心逻辑是找到两个走势高度相关的资产当它们的价差或者对数价差偏离历史均值时做空价差偏高的资产、做多价差偏低的资产等待价差回归均值后平仓获利。举个例子。假设你观察到 A 股票和 B 股票长期走势几乎同步价差稳定在 0 到 2 元之间波动。某天价差突然涨到 3 元说明 A 相对 B 太贵了。这时候你做空 A、做多 B等两者价差回到 2 元以内后平仓赚取价差收敛的收益。这个策略的关键问题只有一个价差偏离后会不会回归何时回归如果价差偏离是暂时的回归会带来利润如果价差偏离是结构性的比如 A 公司基本面恶化价差可能永远不回归套利就会变成接飞刀。所以准确估计价差的回归概率和回归时间是整个策略盈利的核心。LSTM 在这里的角色就是利用历史价差序列和相关的市场数据学习价差偏离后的动态演化规律输出未来 N 个时间步内价差收敛的概率。这种建模方式和单纯预测价格相比有本质优势价差是一个相对指标剔除了市场整体涨跌带来的噪声。比如加密货币市场整体大跌时BTC 和 ETH 可能都在跌但它们之间的价差可能基本不变。模型不需要预测市场方向只需要预测相对关系。这里需要补充一个统计概念协整Cointegration。两个非平稳序列如果它们的某个线性组合是平稳序列就说它们存在协整关系。协整是配对交易的理论基础。在实际工程中我们在建模之前会先做协整检验比如 ADF 检验、Engle-Granger 两步法只有协整关系稳定的资产对才值得做价差套利。LSTM 的输入特征里可以包含价差本身、成交量差异、波动率等但底层的套利机会仍然依赖协整关系。4. 环境准备与数据说明本文代码基于以下环境读者可以根据实际环境调整版本操作系统Windows / Linux / macOS 均可Python 版本3.8 及以上深度学习框架TensorFlow 2.x或 PyTorch本文示例使用 TensorFlow 2.x 的 Keras 接口数据处理库NumPy、Pandas科学计算库SciPy用于统计检验绘图库Matplotlib安装依赖的命令如下pip install tensorflow pandas numpy scipy matplotlib需要注意的是如果你的机器没有 NVIDIA GPUTensorFlow 会自动使用 CPU 训练。对于本文这种小型示例CPU 训练完全够用。数据方面为了演示方便可以使用任何两个高度相关的资产价格序列。加密货币领域常用的配对包括 BTC/USDT 和 ETH/USDT传统金融领域可以使用同一板块的两只股票。本文示例从实际工程角度出发假设你已经准备好两个资产的日线收盘价数据格式为 CSV包含date、asset1_price、asset2_price三列date,asset1_price,asset2_price 2024-01-01,42000,3100 2024-01-02,42500,3120 2024-01-03,43000,3150 ...在正式开始建模之前用 Pandas 加载数据并做协整检验是一个稳妥的做法。如果两个资产之间不存在协整关系后面的一切预测都是建立在沙子上的城堡。5. 核心流程拆解整个 LSTM 预测套利时机的流程分为六个步骤5.1 数据预处理从价格到价差首先计算价差序列。最常用的两种方式简单价差spread price1 - price2对数价差log_spread log(price1) - log(price2)对数价差的优势在于它自动处理了价格量级差异。如果 BTC 价格是 42000ETH 价格是 3100直接相减得到的价差会被 BTC 主导价差的相对波动难以体现。取对数后两者处于同一量级更容易建模。5.2 协整检验确定套利逻辑成立使用 ADF 检验价差序列是否平稳。如果 p 值小于 0.05说明价差序列是平稳的也就是说两个资产之间存在协整关系均值回归逻辑成立。5.3 构造标签定义“套利时机”这是整个流程中最关键、也最容易出错的一步。我们需要定义什么样的时刻是“好的套利时机”一种常见定义方式是如果未来 N 个时间步内价差从当前偏离位置回归到均值附近比如偏离度小于某个阈值则当前时刻标记为 1正样本否则标记为 0负样本。这个 N 就是预测窗口它决定了你把“套利”的时间尺度定义在多长。这一步的工程实现需要注意标签的是用未来数据计算的因此在训练集和验证集划分时需要防止未来数据泄漏。具体方法是按时间顺序切分而不是随机切分同时保证训练集里的标签不会用到验证集时间范围内的未来数据。5.4 特征构造除了价差本身还可以加入以下特征价差的滚动均值比如 20 日均线价差滚动标准差当前价差偏离均值的 z-score成交量数据如果有市场整体波动率指标特征不是越多越好。金融数据中很多特征之间存在高度共线性多余的噪声特征反而会降低模型泛化能力。从论文和工程经验看价差的短周期形态过去 20~60 个时间步的数据通常是最重要的特征其他特征更像是锦上添花。5.5 LSTM 模型建模输入为过去 L 个时间步的特征序列输出为未来 N 个时间步内价差回归的概率。这是一个二分类问题损失函数使用二元交叉熵。一个典型的 LSTM 模型结构输入层形状为 (L, feature_dim)LSTM 层32 或 64 个隐藏单元可以堆叠 1~2 层Dropout 层防止过拟合Dense 层输出 1 个节点激活函数为 sigmoid5.6 回测验证模型训练完成后不能只看准确率。准确率是一个全局指标但套利策略关心的是每一笔交易的盈亏比、胜率、最大回撤。因此需要把模型的预测信号转换成交易逻辑开仓、平仓、止损然后在一段历史数据上做回测。6. 完整示例代码实现下面我们用一个最小可运行的示例把上述流程串起来。为了让代码尽量独立可跑示例使用模拟生成的价格序列实际使用时替换成真实市场数据即可。6.1 生成模拟数据并计算价差import numpy as np import pandas as pd import matplotlib.pyplot as plt # 设置随机种子保证结果可复现 np.random.seed(42) # 生成模拟的两个资产价格序列 # 假设两者存在协整关系价差围绕均值波动 n 1000 t np.arange(n) # 共同趋势项 trend np.cumsum(np.random.randn(n) * 0.1) 100 # 资产1 共同趋势 随机噪声 price1 trend np.random.randn(n) * 0.5 # 资产2 共同趋势 噪声 可回归的价差偏离 spread_true np.sin(t / 50) * 2 np.random.randn(n) * 0.1 price2 trend spread_true - np.random.randn(n) * 0.5 # 计算价差 spread price1 - price2 df pd.DataFrame({ price1: price1, price2: price2, spread: spread }) print(df.head())这段代码生成了两个有共同趋势的资产序列价差呈现周期性波动。实际工作中应该读取真实行情数据这里只是用模拟数据演示完整流程。6.2 协整检验from statsmodels.tsa.stattools import adfuller # ADF 检验价差是否平稳 adf_result adfuller(df[spread]) print(fADF 统计量: {adf_result[0]:.4f}) print(fp 值: {adf_result[1]:.4f}) if adf_result[1] 0.05: print(价差序列平稳存在协整关系适合做配对交易) else: print(价差序列非平稳建议重新选择资产对或改用对数价差)如果 p 值大于 0.05说明价差不满足均值回归条件继续做预测没有统计基础。6.3 构造训练样本和标签这里定义一个函数给定价差序列和参数历史窗口lookback未来窗口horizon回归阈值threshold构造有监督学习的输入输出。def create_dataset(spread, lookback60, horizon5, threshold1.0): X, y [], [] spread_mean spread.mean() spread_std spread.std() # 使用 z-score 归一化价差 spread_norm (spread - spread_mean) / spread_std for i in range(lookback, len(spread) - horizon): # 输入过去 lookback 天的价差序列 X.append(spread_norm[i - lookback:i]) # 标签未来 horizon 天内价差是否回归到均值附近 future spread_norm[i:i horizon] if np.any(np.abs(future) threshold): y.append(1) else: y.append(0) return np.array(X), np.array(y)标签逻辑是在未来horizon个时间步内只要价差 z-score 绝对值小于threshold就认为套利时机成立标签为 1。这样定义的好处是模型学习的不再是精确的价差数值而是“价差可能在哪个窗口回归”的概率。6.4 构建 LSTM 模型import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dense, Dropout from tensorflow.keras.optimizers import Adam # 划分训练集和验证集注意按时间顺序切分 X, y create_dataset(df[spread].values) split int(len(X) * 0.8) X_train, X_test X[:split], X[split:] y_train, y_test y[:split], y[split:] # LSTM 输入需要形状 (样本数, 时间步数, 特征数) X_train X_train.reshape((X_train.shape[0], X_train.shape[1], 1)) X_test X_test.reshape((X_test.shape[0], X_test.shape[1], 1)) model Sequential([ LSTM(32, return_sequencesTrue, input_shape(X_train.shape[1], 1)), Dropout(0.2), LSTM(16, return_sequencesFalse), Dropout(0.2), Dense(1, activationsigmoid) ]) model.compile( optimizerAdam(learning_rate0.001), lossbinary_crossentropy, metrics[accuracy] ) model.summary()这里使用了两层 LSTM 加 Dropout 的结构。第一层return_sequencesTrue是为了向第二层 LSTM 输出完整的序列信息第二层只返回最后时刻的隐状态接 Dense 输出二分类概率。Dropout 放在 LSTM 层之间可以有效缓解小样本上的过拟合问题。6.5 训练模型history model.fit( X_train, y_train, batch_size32, epochs30, validation_data(X_test, y_test), verbose1 )训练过程输出中关注val_accuracy的变化。由于正负样本可能不均衡准确率并不完全可靠更好的指标是 AUCROC 曲线下面积。如果发现验证集准确率远低于训练集说明过拟合严重可以增加 Dropout 比例、减少模型层数、增加数据量。6.6 预测与可视化# 预测测试集 y_pred_prob model.predict(X_test) y_pred (y_pred_prob 0.5).astype(int) # 绘制真实标签与预测概率 plt.figure(figsize(12, 5)) plt.subplot(2, 1, 1) plt.plot(y_test, labelTrue Label) plt.title(True Labels (1套利时机, 0无机会)) plt.legend() plt.subplot(2, 1, 2) plt.plot(y_pred_prob, labelPredicted Probability, colororange) plt.title(LSTM Predicted Probability) plt.legend() plt.tight_layout() plt.show()这张图能直观告诉你的信息是模型输出的概率曲线在真实标签为 1 的区间是否明显抬升。如果两者错位较大说明模型没有学到有效的时间规律需要调整特征或标签定义。7. 运行结果与效果验证模型训练完成后如何判断“预测套利时机”的任务是否真的成功了这里提供三个层次7.1 分类指标计算测试集上的准确率、精确率、召回率和 AUCfrom sklearn.metrics import accuracy_score, precision_score, recall_score, roc_auc_score print(f测试集准确率: {accuracy_score(y_test, y_pred):.4f}) print(f精确率: {precision_score(y_test, y_pred):.4f}) print(f召回率: {recall_score(y_test, y_pred):.4f}) print(fAUC: {roc_auc_score(y_test, y_pred_prob):.4f})在套利时机预测中召回率比准确率重要。准确率高可能只是因为负样本占多数模型把大部分样本都预测为 0。而召回率代表“有多少套利机会被模型发现了”如果这个值太低策略会错过大量交易机会。AUC 是一个综合指标在 0.8 以上说明模型有较好的区分能力。7.2 策略回测仅仅看分类指标还不够。你需要模拟真实交易当模型输出概率超过某个阈值时开仓价差回归后平仓价差继续扩大时止损。回测的核心参数开仓阈值模型预测概率超过多少时建仓平仓条件价差回归到均值附近止损条件价差偏离超过历史统计的某个极端值交易成本手续费、滑点回测代码框架如下def backtest(y_pred_prob, spread_norm, threshold0.5, take_profit0.2, stop_loss2.0): position 0 equity [0] spread_values spread_norm[split:] for i in range(len(y_pred_prob)): if position 0 and y_pred_prob[i] threshold: # 开仓 position 1 elif position 1: if abs(spread_values[i]) take_profit: # 价差回归平仓获利 equity.append(equity[-1] abs(spread_values[i])) position 0 elif abs(spread_values[i]) stop_loss: # 止损 equity.append(equity[-1] - abs(spread_values[i])) position 0 else: equity.append(equity[-1]) else: equity.append(equity[-1]) return np.array(equity)现实中的回测更复杂需要考虑信号延迟、持仓时间、资金管理等因素。但上面这个基础版本已经能回答一个关键问题模型产生的信号在扣除交易成本之前是否具备正期望。7.3 失败第一步排查如果回测结果不理想第一步不是调参而是检查数据。按以下顺序排查标签是否合理取出一些负样本位置人工查看价差在该位置后半段是否真的没有回归。如果很多“负样本”其实价差在更长窗口内也回归了说明你的horizon定义过短。训练集和测试集之间是否存在数据泄漏如果特征计算使用了整个时间段的均值、标准差比如全局归一化测试集的信息会渗入训练过程。正确做法是在训练集上计算均值、标准差再应用到测试集。正负样本是否极端不均衡如果负样本占比超过 90%模型很容易全预测 0。此时可以考虑调整标签定义或使用 class weight、Focal Loss 处理。8. 常见问题与排查思路问题现象可能原因排查方式解决方案训练集准确率高验证集准确率低模型过拟合比较训练和验证的 loss 曲线增大 Dropout、减少 LSTM 层数、增加样本量所有预测结果都接近 0正负样本不均衡统计 y_train 中 1 的比例调整标签阈值、使用 class weight、欠采样负样本回测显示亏损交易成本未计入检查回测代码中是否包含手续费在每次开平仓中扣除手续费和滑点AUC 始终徘徊在 0.5 附近特征与标签无相关关系检查资产对是否真的存在协整关系更换资产对或调整价差计算方式LSTM 训练速度慢序列过长或模型过深查看模型参数量和输入序列长度缩短 lookback、减少 LSTM 隐藏单元数量预测结果出现明显的滞后LSTM 学习到了相邻时间步的恒等映射查看特征和标签的时间对齐情况确认没有把未来信息错位到当前时刻用图表检查数据对齐确保 label 的时间戳严格晚于特征价差回归后模型才给出高概率标签定义偏保守模型倾向于延迟预测统计预测概率最高的时间点和价差回归时间点的差值考虑缩小horizon或调整标签生成策略很多初次尝试 LSTM 套利建模的读者会在这里发现问题往往不在模型结构而在数据和标签处理上。这是时间序列机器学习项目的常态也是为什么本文花了较大篇幅讲数据构造和标签定义而不只是堆模型代码。9. 最佳实践与工程建议9.1 先做协整后上模型LSTM 再强大也不能从无规律的序列中挖掘出规律。在建模之前先用 ADF 检验、Hurst 指数等方法确认价差存在均值回归特性。如果协整检验不通过任何预测模型都是白搭。这是整个流程中成本最低、收益最高的一步。9.2 标签设计比模型结构更影响结果很多论文实验证明LSTM 的结构层数、隐藏单元数量对最终结果的影响远小于标签定义方式的影响。在预测套利时机这个任务里“什么是套利时机”本身就是一个人为定义。horizon设太短模型学不到回归信号horizon设太长套利机会的时效性又会被稀释。建议多试几组参数观察不同配置下模型在验证集上的行为而不是一上来就调网络结构。9.3 严格防止未来数据泄漏这是时间序列建模中最常见、也最致命的错误。以下操作容易造成数据泄漏在构造整个数据集之后再做全局 MinMaxScaler用全部数据计算均值、标准差再划分训练集和测试集特征中包含未来时间窗口的统计量。正确做法是先把数据按时间顺序切分再在训练集上拟合缩放器用同一缩放器转换测试集。所有特征在构造那一刻只能使用当前时刻或过去时刻的信息。9.4 把模型定位为“信号发生器”而不是“策略”LSTM 的输出只是一个概率信号它本身不是完整的交易策略。完整的策略需要叠加仓位管理、止损、风控。 在工程落地时建议把模型和策略分成两个模块模型模块输入特征输出概率负责“判断时机好不好”策略模块接收概率结合资金和风控规则负责“要不要交易、交易多少”。这种分层设计的好处是模型可以独立迭代策略规则也可以单独调整不会因为改了一个参数就牵动整个系统。9.5 交易成本永远要提前考虑价差套利的单笔利润通常很薄可能只有 0.5% 到 2%。如果手续费和滑点占比过高LSTM 预测得再准也很难盈利。在回测阶段就要把手续费、滑点和资金占用成本加入收益计算。如果加入成本后策略失去正期望说明信号强度不足以覆盖交易摩擦应该继续优化模型或调整交易频率。9.6 多周期验证一套模型在某个时间段表现好可能是因为那段时间恰好适合该策略。更稳妥的做法是跨多个不同行情阶段震荡、趋势、高波动、低波动滚动回测。LSTM 模型的结构相对稳定但金融市场的统计特征是随时间变化的当模型在近期数据上的表现持续下滑时就需要考虑重新训练或调整特征。9.7 合规与风险提示最后必须说明本文提供的代码和思路仅用于技术研究和教学目的。在实际参与金融市场交易前请确认你所在地区和所属机构的相关规定确保所有操作合法合规。量化交易涉及真实资金风险历史回测表现不代表未来收益入市前请做好充分的风险评估。10. 总结与后续学习方向这篇文章围绕“LSTM 预测套利时机”拆解了一条完整的技术链路。核心判断可以概括为三句话第一LSTM 在金融时间序列上的价值不在预测价格方向而在预测价差关系和回归时机。第二套利时机预测任务要想成功协整检验和标签设计比模型结构重要得多。数据质量决定模型上限模型结构只是逼近这个上限。第三从模型信号到真实收益之间还隔着交易成本、仓位管理和风控规则。任何脱离成本和风控的模型评测在工程上意义都有限。如果你打算继续深入建议按这个顺序学习配对交易的统计基础掌握协整、均值回归、z-score 等概念理解套利的底层逻辑。LSTM 的进阶变体了解 Seq2Seq、Attention-LSTM、Transformer 在时间序列预测中的应用分析它们与 LSTM 的优劣。强化学习方向LSTM 负责感知和时间建模强化学习负责决策和仓位管理两者结合是量化研究的活跃方向。实盘验证与监控从模拟盘到小资金实盘建立模型监控链路跟踪预测分布漂移。LSTM 不是万能的但它在一类“有规律可循的相对价值预测”任务上仍然是一个值得深入研究的工具。套利时机预测恰恰属于这类任务。建议你把本文的代码在真实数据上跑一遍先跑通流程再逐步调整特征、标签和模型结构。只有亲手处理过数据对齐、协整检验、标签泄漏和回测成本才能真正理解 LSTM 在量化场景里的价值边界。
返回列表