策略分享

用LSTM神经网络模型训练期货高频数据

由lizhuo111创建,最终由lizhuo111 被浏览 168 用户

高频交易经常被提起,却始终蒙着一层神秘面纱,仿佛那只是金字塔尖那一小撮人的玩物。今天我们就从期货高频数据下手,去揭开神秘面纱的一角,并尝试搭建神经网络模型对高频数据进行预测,抛砖引玉,希望能让对金融数据分析,量化交易,人工智能感兴趣的朋友有所收获。我们已经将本文的全部源数据+源代码+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环境打包好了,做到开箱即用,一键运行,感兴趣的朋友可以下载,自己尝试不同的参数和特征,自己多动手才是学习的最佳途径。

关注同名公众号可获取源数据下载地址,感谢您的支持!

标签

高频交易量化交易人工智能LSTM期货
{link}