用LSTM神经网络模型训练期货高频数据
由lizhuo111创建,最终由lizhuo111 被浏览 193 用户
高频交易经常被提起,却始终蒙着一层神秘面纱,仿佛那只是金字塔尖那一小撮人的玩物。今天我们就从期货高频数据下手,去揭开神秘面纱的一角,并尝试搭建神经网络模型对高频数据进行预测,抛砖引玉,希望能让对金融数据分析,量化交易,人工智能感兴趣的朋友有所收获。我们已经将本文的全部源数据+源代码+python环境打包好,做到开箱即用, 文末有获取方式,欢迎大家下载自己动手继续学习和研究。
先看我们最终的模型结果,在训练集和测试集上的表现:
下面开始探索数据。
交易时间
以本文要研究的螺纹钢(RB)为例, 与股票不同,期货不仅在工作日白天交易,很多品种还有夜盘, 每个交易日就是从夜盘开始计算的。
行情频率
期货的实时行情频率为2笔/秒, 一个小时7200笔, 全天就是7200*5.75= 41400笔 大家有个概念就好,就是期货Tick高频数据,一个期货合约全天快照的数据量是4万多笔。当然这是理论值,实际情况由于各种原因吧,我们拿到的数据实际上会略少有理论值,但基本都在4万条左右。 我们统计一下2023.02.06--2023.02.10这一周内RB2305这个合约每天的快照数量。可以看到和理论值是很接近了。
今天我们就以RB2305在2023.02.06-2023.02.07这两天的数据作为我们的分析对象,共82000多条记录。对于一个数据分析入门来说,这已经是不小的数据量了, 随着我们能力的提升,后面会从合约数量和时间长度的维度进行更大数据量的扩展。
看看原始数据结构
字段含义
为了更方便进行分析和训练,我们把原始tick数据合成固定频率的标准K线数据。 pandas的resample函数可以很方便地进行时间频率的转换,下面代码就可以进行数据转换(本文以10s为例,大家可以自己尝试其他频率的数据),不同字段的合成规则略有不同。
计算K线的对数收益率:
10秒频率相对于2笔/秒的原始数据,时间间隔放大了20倍, 数据量就小了20倍,所以合成后的K线数据共计4000多条。
合成后的K线数据如图所示
我们用mplfinance库对合成后的K线数据绘图,上方主图是价格(Price)走势,下方副图是成交量(Volume):
K线对数收益率的分布图:
下面我们用这个合成后的10秒K线数据进行LSTM神经网络训练。 LSTM(Long Short Term Memory) 长短周期记忆神经网络是循环神经网络RNN的一种, 也是具有循环神经网络的链式结构, 一般用于时间序列的预测。模型的原理我们放在后面文章来探讨,本文我们先用Pytorch构建一个简单的LSTM网络,在训练和参数调整的过程中去学习和体会模型。 任何模型训练,首先要选择特征和目标。 本次训练我们选取的特征是最新价(Close), 开盘价(Open), 成交量(Volume)
训练目标是预测1分钟后的价格, 将1分钟后的价格数据和当前时间点的特征数据对齐,方便后续处理。
数据预处理 1)标准化 我们使用sklearn的MinMaxScaler 分别对特征(data)和目标(label)进行标准化。
2)时间序列转换 RNN的输入是特征数据的时间序列,根据指定的时间序列长度(seq_length),我们把标准化后的特征和标签数据进行转换,使其满足网络的输入格式要求。
3)训练集,测试集数据拆分 根据指定的训练数据比例(split_ratio), 将转换后的数据拆分成训练集和测试集,并转换为torch的Variable格式。
4) 装入DataLoader 把训练数据和测试数据分别载入DataLoader, 构建train_loader和test_loader,方便后续的模型训练
模型构建 下面构建一个简单的LSTM网络
模型参数
训练模型
训练过程的损失函数变化如下
模型评估
下图是残差分布,可以看到测试集和训练集的残差大部分分布是[-10,10]的区间内,测试集的残差波动略大于训练集,总体上还是符合我们的预期。
当然这只是拿小数据量在小模型上的一次测试,目的还是让大家熟悉一下数据处理和模型的构建流程。如果要据此构建可以交易的量化模型,还有很长的路要走,后面我会陪着大家在这条路上一步步地向前走,和大家共同成长。
我已经将本文用到的全部源数据+源代码+Python环境打包好了,做到开箱即用,一键运行,感兴趣的朋友可以下载,自己尝试不同的参数和特征,自己多动手才是学习的最佳途径。
关注同名公众号可获取源数据下载地址,感谢您的支持!