主要内容

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

这个例子展示了技术管理,大量的金融数据处理和可视化在MATLAB®。这是一系列相关的一部分对机器学习的统计套利(见例子机器学习的应用)。

处理大数据

金融市场与电子交易所,如纳斯达克执行订单毫秒的时间尺度上,生成大量的数据。可以挖掘数据流统计套利机会,但传统方法进行处理和存储可以被大数据动态分析信息。幸运的是,出现了新的计算方法,用MATLAB工具实现它们的数组。

主要计算机内存提供了高速访问但能力有限,而外部存储器提供了低速访问但潜在无限的能力。计算发生在内存中。计算机数据和结果从外部存储回忆说。

数据文件

这个例子使用一个交易日纳斯达克交换数据[2]在一个安全(intel)样本提供的龙虾[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。选择edVariableNames = TimeVariable; LOB3Variables = [“AskPrice1”,“AskSize1”,“BidPrice1”,“BidSize1”,“AskPrice2”,“AskSize2”,“BidPrice2”,“BidSize2”,“AskPrice3”,“AskSize3”,“BidPrice3”,“BidSize3”];DSLOB。选择edVariableNames = 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.751 2.752 e + 05 166 e + 05年400 34200 2.752 2.751 e + e + 05 166 05年300 34200 2.751 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

预览显示要求和投标在触摸,这意味着1级数据,这是最接近的价位。时间单位秒午夜之后,价格单位金额乘以10000,和大小单位的股份数(见LOBSTER_SampleFiles_ReadMe.txt)。

高大的数组和时间表

高阵列处理内存不足数据支持(见使用MapReduce的数据存储技术高内存不足数据数组)。当你使用MapReduce,高大的数组仍未评价的,直到你执行特定的计算使用数据。

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

mapreduce (0) DT =高(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 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::::::::::

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;% Hyperparameter(重量= exp() -λ* [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培训之前,这是一个参数指定的,而不是估计的机器学习算法。hyperparameter可以影响的性能模型。工程特性是一个过程,选择要使用的特定于域的hyperparameters机器学习算法。您可以调整hyperparameters优化交易策略。

将预处理表达式到内存并评估它们,使用收集函数。这个过程称为延迟评价

(t, S,我)=收集(扫描基线,价位,ImbalanceIndex);
评估高表达式使用当地的MATLAB会话:通过1 1:在3.3秒完成评估在3.5秒完成

一个调用收集评估多个预处理表达式和一个通过数据存储。

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

numTicks =长度(t)
numTicks = 581030

每日LOB数据包含581030个时钟节拍。

检查点数据

您可以将未鉴定的和评估数据保存到外部存储供以后使用。

预谋的时基日期,并把结果作为一个datetime数组。保存生成的datetime数组,中等价位,ImbalanceIndexMAT-file在指定的位置。

dateTimeBase =日期时间(日期)+扫描基线;今天=时间表(dateTimeBase、价位、ImbalanceIndex)
今天= 581030 x2高时间表dateTimeBase价位ImbalanceIndex截止2012年6月21日____________________ __________ * * * 09:30:00 2.7515 e + 05年-0.205 - 6月21日2012 09:30:00 2.7515 e + 05年-0.26006 21 - jun - 2012 09:30:00 2.7515 e + 05年-0.26006 21 - 2012年6月——09:30:00 2.7515 e + 05年-0.086772 21 - 2012年6月——09:30:00 2.7515 e + 05年-0.15581 21 - 2012年6月——09:30:00 2.7515 e + 05年-0.35382 21 - 2012年6月——09:30:00 2.7515 e + 05年-0.19084 - 6月21日2012 09:30:00 2.7515 e + 05 -0.19084::::::
位置= fullfile (pwd,“ExchangeData”、股票、日期);写(位置,今天,“文件类型”,“垫”)
高数据写入文件夹/ tmp / Bdoc21a_1669600_136091 / tpc470327f / finance-ex97702880 / ExchangeData / intel 2012-06-21评估高表达式使用本地MATLAB会话:-通过1对1:在3.4秒完成评估在3.7秒完成

这个文件写一次,每个交易日结束时。保存数据到文件的代码在一个日期戳的文件夹。的一系列ExchangeData子文件夹作为历史数据存储库。

或者,您可以节省工作空间变量评估收集直接MAT-file在当前文件夹。

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

以后准备模型验证、评估并添加市场秩序价格相同的文件。

[MOBid, MOAsk] =收集(DTT.BidPrice1 DTT.AskPrice1);
评估高表达式使用当地的MATLAB会话:通过1 1:在2.3秒完成评估在2.4秒完成
保存(“LOBVars.mat”,“MOBid”,“MOAsk”,“添加”)

这个示例只使用的其余部分未鉴定的高时间表德勤。明确的其他变量的工作区。

clearvars德勤
类属性名称大小字节德勤581030 x12 4746高

数据可视化

将大量的数据可视化,必须总结一下,垃圾桶,或样本数据在某种程度上减少点绘制在屏幕上。

LOB快照

可视化的一个方法是评价只有所选的子样品的数据。创建一个快照的LOB在一天中的特定时间(11点)。

sampleTimeTarget =秒(11 * 60 * 60);%秒午夜之后sampleTimes = withtol (sampleTimeTarget秒(1));% 1秒宽容sampleLOB =德勤(sampleTimes:);numTimes =收集(大小(sampleLOB, 1))
评估高表达式使用当地的MATLAB会话:通过1 1:在2.5秒完成评估在2.7秒完成
numTimes = 23

有23个蜱虫在一秒11点。快照,使用最接近midtime蜱虫。

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:在2.5秒完成,通过2 2:在3.1秒完成评估在6.2秒完成

可视化数据有限样本返回收集通过使用酒吧

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

图包含一个轴。轴与标题3级限制订单:11:00:00包含2对象类型的酒吧。这些对象代表报价,问。”width=

市场深度

一些可视化功能的工作直接与高大的数组和不需要使用收集(看到可视化高大的数组)。函数会自动降低像素密度的示例数据。可视化水平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”,“定位”,“水平”);

图包含一个轴。坐标轴标题深度的市场:盘中进化包含6行类型的对象。这些对象代表Bid1, Bid2、Bid3 Ask1, Ask2 Ask3。”width=

显示细节,限制的时间间隔。

xlim(秒(45060 [45000]))ylim(35000[-35000])标题(“深度的市场:一分钟”)

图包含一个轴。坐标轴标题深度的市场:一分钟包含6行类型的对象。这些对象代表Bid1, Bid2、Bid3 Ask1, Ask2 Ask3。”width=

总结

这个示例介绍了处理大数据的基本知识,同时在内存中。结合,它显示了如何设置和更新外部数据存储,然后创建高预处理数据的数组没有分配变量在MATLAB工作区。的收集函数为计算和传输数据到工作区中进一步分析。的例子显示了如何可视化数据通过数据抽样或MATLAB绘图函数,直接处理数据内存不足。

引用

[1]龙虾限制订单数据。柏林:frischedaten UG (haftungsbeschrankt)。

[2]纳斯达克TotalView-ITCH历史数据。纽约:纳斯达克公司。

[3]Rubisov,安东D。”统计套利使用限制订单不平衡。”多伦多大学硕士论文,2015年。

相关的话题