主要内容

统计套利的机器学习I:数据管理和可视化

这个例子展示了在MATLAB®中管理、处理和可视化大量财务数据的技术。它是用于统计套利的机器学习系列相关示例的一部分机器学习的应用).

与大数据合作

金融市场,像纳斯达克这样的电子交易所在毫秒级的时间尺度上执行指令,产生大量的数据。数据流可以挖掘统计套利机会,但处理和存储动态分析信息的传统方法可能会被大数据所淹没。幸运的是,新的计算方法已经出现,MATLAB有一系列的工具来实现它们。

主计算机存储器提供高速访问,但容量有限,而外部存储器提供低速访问,但可能无限容量。计算在内存中进行。计算机从外部存储器中回收数据和结果。

数据文件

本例使用一个交易日的纳斯达克交易所数据[2]在一个证券(INTC)的样本由龙虾提供[1]并包含在金融工具箱™的zip文件中LOBSTER_SampleFile_INTC_2012-06-21_5.zip.将zip文件的内容解压缩到当前文件夹中。展开的文件,包括两个CSV文件的数据和文本文件LOBSTER_SampleFiles_ReadMe.txt,消耗93.7 MB内存。

解压缩(“LOBSTER_SampleFile_INTC_2012-06-21_5.zip”);

数据描述了日内的演变限制订单(LOB)的记录市场订单(最好的价格),限价订单(指定价格),以及由此产生的买卖。数据包括这些事件的精确时间,跟踪订单从到达到取消或执行。在交易日的每个时刻,LOB的买卖双方都存在不同的订单水平远离最低要价(卖出指令)和最高出价(买入指令)之间的中间价格。

第5级数据(距离中间价格各5级)包含在两个CSV文件中。从消息文件名中提取交易日期。

MSGFileName =“INTC_2012-06-21_34200000_57600000_message_5.csv”%消息文件(数据的描述)LOBFileName =“INTC_2012-06-21_34200000_57600000_orderbook_5.csv”%数据文件(股票、rem) = strtok (MSGFileName,“_”);日期= strtok (rem,“_”);

数据存储

每天的数据流不断积累,需要存储。一个数据存储是存储过大而无法装入内存的数据集合的存储库。

使用tabularTextDatastore为消息和数据文件创建数据存储。因为文件包含不同格式的数据,所以要单独创建数据存储。忽略通用列标题(例如,VarName1),设置“ReadVariableNames”的名称-值对参数.用获得的描述性变量名替换标头LOBSTER_SampleFiles_ReadMe.txt.设置“ReadSize”的名称-值对参数“文件”允许在每个交易日结束时将类似格式的文件追加到现有的数据存储区。

DSMSG = tabularTextDatastore (MSGFileName,“ReadVariableNames”假的,“ReadSize”“文件”);DSMSG。VariableNames = [“时间”“类型”“OrderID”“大小”“价格”“方向”];DSLOB = tabularTextDatastore (LOBFileName,“ReadVariableNames”假的,“ReadSize”“文件”);DSLOB。VariableNames = [“AskPrice1”“AskSize1”“BidPrice1”“BidSize1”...“AskPrice2”“AskSize2”“BidPrice2”“BidSize2”...“AskPrice3”“AskSize3”“BidPrice3”“BidSize3”...“AskPrice4”“AskSize4”“BidPrice4”“BidSize4”...“AskPrice5”“AskSize5”“BidPrice5”“BidSize5”];

通过选择创建组合数据存储时间第三级数据。

TimeVariable =“时间”;DSMSG。年代electedVariableNames = TimeVariable; LOB3Variables = [“AskPrice1”“AskSize1”“BidPrice1”“BidSize1”...“AskPrice2”“AskSize2”“BidPrice2”“BidSize2”...“AskPrice3”“AskSize3”“BidPrice3”“BidSize3”];DSLOB。年代electedVariableNames = LOB3Variables; DS = combine(DSMSG,DSLOB);

您可以预览组合数据存储中的前几行,而不必将数据加载到内存中。

DSPreview =预览(DS);LOBPreview = DSPreview (: 1:5)
LOBPreview =8×5表时间AskPrice1 AskSize1 BidPrice1 BidSize1  _____ _________ ________ _________ ________ 34200 2.752 e + 05 66 e + 05年400 34200 2.751 2.752 2.751 e + e + 05 166 05 400 2.751 34200 2.752 e + 05 166 e + 05年400 34200 2.752 2.751 e + e + 05 166 05年400 34200 2.752 2.751 e + e + 05 166 05 300 2.751 34200 2.752 e + 05 166 e + 05年300 34200 2.752 2.751 e + e + 05 166 05年300 34200 2.752 2.751 e + e + 05 166 05年300

预览显示了出价和询价在触摸,即一级数据,这是最接近中价的数据。时间单位是午夜后的秒数,价格单位是美元金额乘以10,000,大小单位是股票数量(参见LOBSTER_SampleFiles_ReadMe.txt).

高数组和时间表

高数组使用MapReduce技术处理由数据存储支持的内存不足的数据用于内存不足数据的高数组.在使用MapReduce时,在执行使用该数据的特定计算之前,不计算高数组。

将MapReduce的执行环境设置为本地MATLAB会话,而不是使用并行计算工具箱™,通过调用mapreduce (0).然后,从数据存储中创建一个高数组DS通过使用.预览tall数组中的数据。

mapreducer(0) DT = tall(DS);DTPreview = DT (: 1:5)
DTPreview = Mx5高表时间AskPrice1 AskSize1 BidPrice1 BidSize1  _____ _________ ________ _________ ________ 34200 2.752 e + 05 66 e + 05年400 34200 2.751 2.752 2.751 e + e + 05 166 05 400 2.751 34200 2.752 e + 05 166 e + 05年400 34200 2.752 2.751 e + e + 05 166 05年400 34200 2.752 2.751 e + e + 05 166 05 300 2.751 34200 2.752 e + 05 166 e + 05年300 34200 2.752 2.751 e + e + 05 166 05年300 34200 2.752 2.751 e + e + 05 166 05年300  : : : : : : : : : :

时间表允许您执行特定于时间序列的操作(参见创建时间表.因为LOB数据由并发时间序列组成,所以要转换DT到一个高时间表。

DT。时间=秒(DT.Time);将时间转换为从午夜开始的持续时间。。德勤= table2timetable (DT);DTTPreview =德勤(:1:4)
DTTPreview = Mx4高时间表时间AskPrice1 AskSize1 BidPrice1 BidSize1  _________ _________ ________ _________ ________ 34200秒2.752 2.751 e + e + 05 66 05年400 34200秒2.752 e + 05 166 2.751 e + 05年400 34200秒2.752 2.751 e + e + 05 166 05年400 34200秒2.752 e + 05 166 2.751 e + 05年400 34200秒2.752 2.751 e + e + 05 166 05年300 34200秒2.752 e + 05 166 2.751 e + 05年300 34200秒2.752 2.751 e + e + 05 166 05年300 34200秒2.752 2.751 e + e + 05 166 05年300  : : : : : : : : : :

在MATLAB工作空间中显示所有变量。

类属性名称大小字节DS 1 x1 8 matlab.io.datastore.CombinedDatastore DSLOB 1 x1 8 matlab.io.datastore.TabularTextDatastore DSMSG 1 x1 8 matlab.io.datastore.TabularTextDatastore DSPreview 8 * 13 4515表DT Mx13 4950高DTPreview Mx5高2840高4746年德勤Mx12 DTTPreview Mx4 2650高LOB3Variables 1 x12 780弦LOBFileName 1 x1 234弦LOBPreview 2203 x5表MSGFileName 1 x1 230弦TimeVariable 1 x1 150弦日期1 x1 156弦rem 1 x1 222弦股票1 x1 150字符串

因为所有数据都在数据存储中,所以工作区使用的内存很少。

预处理和评估数据

高数组允许预处理,或者排队,这改进了工作空间中的内存管理。

中等价位年代和不平衡指数用于LOB动力学模型。要将它们的计算排队,定义它们和时间基数,根据德勤

时基= DTT.Time;价位=(德勤。BidPrice1 + DTT.AskPrice1) / 2;% LOB三级失衡指数:λ= 0.5;% HyperparameterWeights = exp(-(lambda)*[0 1 2]);瓦斯克=重量(1)*德勤。一个skSize1 + weights(2)*DTT.AskSize2 + weights(3)*DTT.AskSize3; VBid = weights(1)*DTT.BidSize1 + weights(2)*DTT.BidSize2 + weights(3)*DTT.BidSize3; ImbalanceIndex = (VBid-VAsk)./(VBid+VAsk);

失衡指数是中间价两侧买入量和购买量的加权平均值[3].失衡指数是未来价格走势的潜在指标。的变量λ是一个hyperparameter,这是训练前指定的参数,而不是由机器学习算法估计。超参数会影响模型的性能。工程特性是在机器学习算法中选择特定于领域的超参数的过程。你可以调优超参数来优化交易策略。

方法将预处理表达式放入内存并对其求值收集函数。这个过程叫做延迟评价

(t, S,我)=收集(扫描基线,价位,ImbalanceIndex);
使用本地MATLAB会话计算高表达式:通过1 / 1:在1.9秒内完成计算在2.1秒内完成

一个电话收集只通过一次数据存储就计算多个预处理表达式。

确定样本量,这是数量蜱虫,或更新数据。

numTicks =长度(t)
numTicks = 581030

每日LOB数据包含581030个tick。

检查点数据

您可以将未计算的和已计算的数据都保存到外部存储以供以后使用。

在时间基数前加上日期,并将结果转换为datetime数组。保存生成的datetime数组,中等价位,ImbalanceIndex到指定位置的mat文件中。

dateTimeBase = datetime(date) + timeBase;今天=时间表(dateTimeBase、价位、ImbalanceIndex)
今天= 581030 x2高时间dateTimeBase中期价格不平衡指数____________________ __________ ______________ 21- june -2012 09:30:00 2.7515e+05 -0.26006 21- june -2012 09:30:00 2.7515e+05 -0.26006 21- june -2012 09:30:00 2.7515e+05 -0.26006 21- june -2012 09:30:00 2.7515e+05 -0.086772 21- june -2012 09:30:00 2.7515e+05 -0.15581 21- june -2012 09:30:00 2.7515e+05 -0.35382 21- june -2012 09:30:00 2.7515e+05 -0.19084 21- june -2012 09:30:00 2.7515e+05 -0.19084::::::
位置= fullfile (pwd,“ExchangeData”、股票、日期);写(位置,今天,“文件类型”“垫”
使用本地MATLAB会话计算高表达式:通过1/ 1:在3秒内完成计算在3.3秒内完成

该文件在每个交易日结束时写入一次。该代码将数据保存到一个带有日期戳的文件夹中的文件中。的一系列ExchangeData子文件夹用作历史数据存储库。

或者,您可以保存用它计算的工作空间变量收集直接到当前文件夹中的一个mat文件。

保存(“LOBVars.mat”“t”“S”“我”

在为后面的模型验证做准备时,评估并将市场订单价格添加到同一个文件中。

[MOBid, MOAsk] =收集(DTT.BidPrice1 DTT.AskPrice1);
使用本地MATLAB会话计算高表达式:通过1 / 1:在2秒内完成计算在2.1秒内完成
保存(“LOBVars.mat”“MOBid”“MOAsk”“添加”

本示例的其余部分仅使用未计算的高时间表DTT。从工作区中清除其他变量。

clearvars德勤
名称大小字节类属性DTT 581,030x12 4746高

数据可视化

要可视化大量数据,必须以某种方式对数据进行汇总、归档或取样,以减少在屏幕上绘制的点的数量。

LOB快照

可视化的一种方法是只评估数据的一个选定的子样本。在一天中的特定时间(11 AM)创建LOB的快照。

sampleTimeTarget =秒(11 * 60 * 60);午夜后%秒数sampleTimes = withtol (sampleTimeTarget秒(1));% 1秒公差sampleLOB =德勤(sampleTimes:);numTimes =收集(大小(sampleLOB, 1))
使用本地MATLAB会话计算高表达式:通过1 / 1:在2秒内完成计算在2.2秒内完成
numTimes = 23

上午11点后的一秒内有23次滴答声。对于快照,使用最接近中间时间的标记。

sampleLOB = sampleLOB(圆(numTimes / 2):);sampleTime = sampleLOB.Time;sampleBidPrices = [sampleLOB.BidPrice1、sampleLOB.BidPrice2 sampleLOB.BidPrice3];sampleBidSizes = [sampleLOB.BidSize1、sampleLOB.BidSize2 sampleLOB.BidSize3];sampleAskPrices = [sampleLOB.AskPrice1、sampleLOB.AskPrice2 sampleLOB.AskPrice3];sampleAskSizes = [sampleLOB.AskSize1、sampleLOB.AskSize2 sampleLOB.AskSize3];[sampleTime, sampleBidPrices sampleBidSizes、sampleAskPrices sampleAskSizes] =...收集(sampleTime、sampleBidPrices sampleBidSizes、sampleAskPrices sampleAskSizes);
使用本地MATLAB会话计算高表达式:-通过1 / 2:在1.7秒内完成-通过2:在1.9秒内完成计算在4.2秒内完成

的返回的有限数据示例可视化收集通过使用酒吧

图保存栏((sampleBidSizes sampleBidPrices / 10000)“r”) ((sampleAskSizes sampleAskPrices / 10000)‘g’)举行包含(“价格(美元)”) ylabel (“数量的股票”)传说([“收购”“问”),“位置”“北”)标题(strcat (“三级限价订单簿:”datestr (sampleTime“HH: MM: SS”)))

图中包含一个axes对象。标题为Level 3 Limit Order Book: 11:00:00的axes对象包含两个类型为bar的对象。这些对象代表买入价、卖入价。

市场深度

一些可视化函数直接使用高数组,不需要使用收集看到高数组的可视化).该函数自动采样数据以降低像素密度。想象一下盘中的第3点市场深度,表示流动性的时间演化,用情节有长长的时间表德勤

图保存情节(DTT.Time -DTT.BidSize1,“颜色”(1.0 0 0),“线宽”2)图(DTT.Time -DTT.BidSize2,“颜色”(0.8 0 0),“线宽”2)图(DTT.Time -DTT.BidSize3,“颜色”(0.6 0 0),“线宽”2)图(DTT.Time DTT.AskSize1,“颜色”(1.0 0 0),“线宽”2)图(DTT.Time DTT.AskSize2,“颜色”(0.8 0 0),“线宽”2)图(DTT.Time DTT.AskSize3,“颜色”(0.6 0 0),“线宽”, 2)包含(“时间”) ylabel (“数量的股票”)标题(“市场深度:盘中演变”)传说([“Bid1”“Bid2”“Bid3”“Ask1”“Ask2”“Ask3”),“位置”“NorthOutside”“定位”“水平”);

图中包含一个axes对象。标题为“市场深度:盘中演变”的轴对象包含6个类型为线的对象。这些对象分别表示Bid1、Bid2、Bid3、Ask1、Ask2、Ask3。

若要显示详细信息,请限制时间间隔。

Xlim (seconds([45000 45060])) ylim([-35000 35000]) title(“市场深度:一分钟”

图中包含一个axes对象。标题为Depth of Market: One Minute的axes对象包含6个类型为line的对象。这些对象分别表示Bid1、Bid2、Bid3、Ask1、Ask2、Ask3。

总结

这个例子介绍了在内存内和内存外处理大数据的基础知识。它展示了如何设置、组合和更新外部数据存储,然后创建用于预处理数据的高数组,而无需在MATLAB工作区中分配变量。的收集函数将数据传输到工作空间中进行计算和进一步分析。该示例展示了如何通过数据采样或直接处理内存不足数据的MATLAB绘图函数来可视化数据。

参考文献

[1]龙虾限价订单帐面数据.柏林:frischedaten UG (haftungsbeschränkt)。

[2]纳斯达克历史TotalView-ITCH数据.纽约:纳斯达克证券交易所。

[3]安东·鲁比索夫。”利用限价订单账面失衡进行统计套利硕士论文,多伦多大学,2015年。

相关的话题