infoq
纳斯达克市场重播提供经纳斯达克验证的重播和股票市场活动分析。 该应用程序是使用Adobe Flex和AIR平台构建的,并利用Amazon Simple Storage Service(S3)来保存历史市场数据。 S3和AIR的组合提供了功能强大的部署模型,几乎不需要内部基础结构。 因为AIR运行时在客户端计算机上运行,所以可以进行简单但强大的部署。 Amazon S3不再需要传统的中间层服务器,因为可以从Amazon“云”中访问数据。
Market Replay应用程序使用户可以在任何时间查看最佳出价和要约,以模拟实时回放市场,以及缩放以毫秒为单位查看事件。 投资者可以验证最佳执行和Reg NMS合规性。 经纪人和交易者可以在交易发生时查看事件,以确定是否存在问题或机会错失。 经纪人可以在交易发生时向客户发送经过纳斯达克验证的重播,以验证其表现。
![](https://i-blog.csdnimg.cn/blog_migrate/82ddc8756c1abc76cef9ad16abf87272.png)
图1.市场重播案例研究
问题域
专业和非专业投资者和交易者之间的普遍经验是“发生了什么?”这个问题吗? 经纪人是否获得最佳执行并遵守Reg NMS? 交易者错过了机会吗? 为什么散户投资者得到的价格与预期不同? 投资者,交易员和合规官需要回答这些问题,这是一种使市场倒退和重播,放慢速度,放大至秒甚至毫秒级别以查看发生的情况的方法。
纳斯达克市场重播应用程序使用“纳斯达克官方”验证数据来执行此操作。 在许多用例中,市场重播是有用的。 例如:
- 合规官会收到一份报告,指出该交易可能不符合Reg NMS或其他最佳执行规则。 合规官使用纳斯达克市场重播来重建交易时的报价,向前和向后移动以查找时间戳不匹配,并放大到毫秒级别以查看持续时间不到一毫秒的报价。 完成分析后,该官员可以向客户或监管机构显示纳斯达克官方回放或屏幕截图,以验证合规性。
- 散户投资者从其经纪人那里收到交易确认书,并想知道为什么价格与他预期的价格不同。 散户投资者在金融门户网站上使用纳斯达克市场重播在交易时重播市场。 投资者了解其经纪人的业绩以及整个市场。
- 经纪人呼叫中心运营商收到来自客户的电话,询问交易价格。 运营商无需提供一般保证,而是可以从Market Replay向客户提供纳斯达克品牌的屏幕快照,以显示交易发生的瞬间。 运营商可以为客户提供指向“市场重播”的链接,在该链接中,客户可以查看交易前后的事件重播。 经纪商可以在每个交易确认中包含指向纳斯达克市场重播相关重播的链接。 Market Replay将减少通话量,并减少每次客户查询时在电话上花费的时间。
- 交易者,活跃投资者或日间交易者利用市场中的一系列事件进行了一笔大交易。 或者,交易者看到一个有趣的市场事件,并希望更好地了解发生了什么。 交易者使用纳斯达克市场重播来重播和查看事件以查看发生了什么。 交易者与其他活跃投资者分享重放,以展示他的交易技巧或要求其他人提供输入。
纳斯达克市场重播为临时和专业投资者提供他们所需的信息,以了解市场情况。
解决方案概述
Market Replay应用程序于2008年2月启动,与此同时Adobe正式发布了供生产使用的Adobe AIR 1.0平台。 借助AIR和S3平台的强大功能,仅用了大约6个月的时间便使该应用程序从概念到可行的生产实施。 一个由10个人组成的团队在整个实施过程中的不同时间处理应用程序,同时处理后端数据卸载和用户界面。
客户端桌面应用程序是使用Adobe Flex构建的,并在AIR运行时中运行。 Adobe Flex是一个应用程序开发框架,开发人员可以使用它来构建在Flash Player中运行的应用程序。 Adobe AIR允许开发人员使用HTML / CSS,Ajax,Flash和Flex等Web技术为桌面创建应用程序。 此外,AIR提供了脱机支持和用于交付客户端应用程序的简单部署范例。
S3提供了一个强大的解决方案,用于存储提供重播所需的大量数据。 由于AIR应用程序在用户的计算机上运行,并且数据存储在S3中,因此可以进行唯一的部署。 因此,不需要繁重的服务器基础结构即可将应用程序部署到生产环境中。
Market Replay实施通过多种方式改进了类似的解决方案。 例如:
- 与用于在特定时间点显示订单状态的现有工具相比,借助Adobe Flex和AIR技术,Market Replay提供了更高级别的易用性,可视化和重放功能。
- 与单个公司或供应商内部存储的市场数据相比,纳斯达克市场重播可直接从源头提供经过纳斯达克验证的数据。
- 与使用历史报价数据库和昂贵的分析软件手动构建订单相比,NASDAQ Market Replay更快,更便宜且更不容易出错。
- 与通常在10到30天后卸载数据的内部数据库(由于数据库的大小使其运行缓慢且昂贵)相比,Market Replay无需卸载数据,因为它使用了S3,这是一种廉价且可伸缩的文件系统。
AIR和S3的配对使用户可以快速检索和可视化数据。 该应用程序的主要功能之一是允许用户在任何时间点查看合并订单的状态。 该应用程序能够从S3快速加载新的订单簿文件,并且AIR应用程序使用用户的台式计算机的处理能力来更新用户界面。 这使用户可以轻松地从一个实例移动到另一个实例,而服务器没有任何延迟来重新计算和传播订单簿的下一个状态的显示。
向下钻取:Adobe Flex&AIR
该应用程序的一个基本功能是,它向用户提供了真实的市场活动重播,就像交易员在其工作站上实时看到的一样。 此功能需要对订单更新消息进行排序和汇总,以便在任何时间点创建合并的订单簿。 Flex界面提供了两个主要显示来实现此目的:
- 时间表:时间表显示根据报价数据计算出的每个时间点的最佳出价和报价。
- 订单簿:订单簿在每个瞬间显示完整订单簿的状态,并在重播期间动态更新。
应用程序能够显示数据中的每个细节是关键。 这需要缩小以引用可能短至毫秒的更新。 该应用程序必须允许用户放大越来越小的时间范围,以查看数据中的每个元素。 另外,必须放慢回放速度,以便人眼可以理解这些事件。 这些类型的动画/数据可视化使Adobe Flex成为自然选择。
部署到Flash Runtime的主要优点之一是本机动画支持,它为Replay应用程序中强大的可视化提供了基础。 建立在Flash API之上的Adobe Flex框架提供了一整套图表组件,用于显示数据的常见可视化。 Flex图表组件以及其他现成的Flex组件均已很好地实现以提供丰富的功能,但仍可扩展。 因此,标准的Flex制图组件已针对Market Replay应用程序进行了扩展和定制。 通过使用现成的Flex数据可视化组件开始,NASDAQ能够比从头开始更快地开发其自定义组件。
使用现成的Flex图表组件非常简单。 在下面的示例中,虚拟数据被硬编码到MXML源文件中。 MXML是作为XML框架的一部分提供的声明性XML标记,用于对Flex应用程序的各个部分进行编码。 它是Flash Player核心编程语言ActionScript之上的抽象。
<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
[Bindable]
private var stockDataAC:ArrayCollection = new ArrayCollection( [
{ Date: "25-Jul", Open: 40.55, High: 40.75, Low: 40.24, Close:40.31},
{ Date: "26-Jul", Open: 40.15, High: 40.78, Low: 39.97, Close:40.34},
{ Date: "27-Jul", Open: 40.38, High: 40.66, Low: 40, Close:40.63},
{ Date: "28-Jul", Open: 40.49, High: 40.99, Low: 40.3, Close:40.98},
{ Date: "29-Jul", Open: 40.13, High: 40.4, Low: 39.65, Close:39.95},
{ Date: "1-Aug", Open: 39.00, High: 39.50, Low: 38.7, Close:38.6},
{ Date: "2-Aug", Open: 38.68, High: 39.34, Low: 37.75, Close:38.84},
{ Date: "3-Aug", Open: 38.76, High: 38.76, Low: 38.03, Close:38.12},
{ Date: "4-Aug", Open: 37.98, High: 37.98, Low: 36.56,Close:36.69},
{ Date: "5-Aug", Open: 36.61, High: 37, Low: 36.48, Close:36.86} ]);
]]>
</mx:Script>
<mx:Panel title="Sample Visualization" height="100%" width="100%">
<mx:HLOCChart id="hlocchart" height="100%" width="100%"
paddingRight="5" paddingLeft="5"
showDataTips="true" dataProvider="{stockDataAC}">
<mx:verticalAxis>
<mx:LinearAxis baseAtZero="false" />
</mx:verticalAxis>
<mx:horizontalAxis>
<mx:CategoryAxis categoryField="Date" title="Date"/>
</mx:horizontalAxis>
<mx:horizontalAxisRenderer>
<mx:AxisRenderer canDropLabels="true"/>
</mx:horizontalAxisRenderer>
<mx:series>
<mx:HLOCSeries openField="Open" highField="High"
lowField="Low" closeField="Close"/>
</mx:series>
</mx:HLOCChart>
</mx:Panel>
</mx:Application>
在此示例中,数据在源中进行了硬编码,以实现独立的示例。 在实际的Market Replay实施中,实际数据是从Amazon S3数据存储中加载的。 然后,数据使用HLOCChart(高/低开/关)Flex组件来呈现数据的可视化。 请参见以下屏幕截图。
![](https://i-blog.csdnimg.cn/blog_migrate/7246548d4d383f0bcb27775314a07497.png)
图2.示例可视化
Adobe AIR为客户端应用程序提供了理想的运行时,因为本地资源允许快速对大量数据进行计算。 该应用程序允许用户选择一个时间范围,以计算每个交易所的最小和最大最佳出价和报价,以及全国最佳出价和报价。 这些计算通常需要大数据量和大量处理才能计算结果。 在服务器上处理用户请求将需要功能强大的Web服务器,并且由于客户等待每个计算请求的往返请求而导致延迟。 通过将大部分工作推到用户的桌面,Adobe AIR允许最小的服务器基础结构。
AIR改善用户体验的另一种方式是通过启用不依赖于不间断网络访问的重放和分析功能。 从S3检索数据文件后,可以在有或没有Internet连接的情况下使用重放和计算。 这不仅对纳斯达克的客户有用,而且对纳斯达克的销售人员在拜访客户时很有用,并且当他们演示该应用程序时不能指望可以访问Internet。
Adobe AIR和Flex的功能是启动该应用程序开发工作的关键因素。 随着工作开始使用现成的Flex组件,他们提供了必要的工具来快速显示质量结果。 然后,随着应用程序的发展,对组件进行自定义,最终形成完整的应用程序。
向下钻取:Amazon Simple Storage Service(S3)
之所以选择Amazon S3,是因为Market Replay要求以便宜且可扩展的方式存储历史市场数据。 股市每天产生大量的交易数据。 Market Replay应用程序要求存储每个细节,并Swift提供所有细节,以使系统能够快速响应用户的请求。
S3也很理想,因为纳斯达克希望提供一种数据服务,该服务能够使多年的数据保持在线状态,并以合理的成本立即为所有相关人员提供。 借助S3,Market Replay可以为不计其数的用户支持数十亿个文件,而不会影响性能。
Market Replay支持具有法规,法律和客户查询的用户,这些查询可能发生在几个月或几年之前。 关键要求是所有历史重播数据都必须立即可用。 事实证明,S3能够保持一致的快速访问速度。
在将数据加载到S3中之前,NASDAQ使用登台服务器将数据从通过实时Feed分发的格式转换为针对重放而优化的格式。 这种专有的转换过程可生成非常简单且高效的文本文件,这些文本文件已针对快速上载和下载进行了优化。 这些文件包含AIR桌面客户端应用程序以极详细地构建重放和市场分析所需的所有报价信息。 在全面生产中,这意味着Market Replay每天将数十万个文件加载到S3。
Market Replay使用简单和小逗号分隔的平面文件格式存储数据。 S3旨在快速可靠地存储和检索如此大量的文件。 这些文件具有易于阅读的格式,如以下示例所示。 文件名提供了股票报价器符号,日期和文件中数据所覆盖期间的开始时间。 前几个记录提供了每个交易所的出价和报价的初始状态。 后续记录显示所有更改。 包括以下字段: 交易所,序列号,要约份额,要约份额,要约价格,要约价格,开始时间(自午夜以来的毫秒数),结束时间(自午夜以来的毫秒数)
M,7838954,300,100,39.81,200,40136513,42919007
I,8557803,0,0,0,0,40838710,44256757
W,10814573,200,200,40.63,40.99,42896510,42901353
D,10816233,800,100,40.57,40.86,42897527,42900730
C,10816354,100,100,40.79,40.83,42897590,42900667
P,10817504,200,300,40.79,40.83,42898433,42900667
Q,10817505,200,200,40.79,40.83,42898437,42900657
Q,10819570,200,200,40.79,40.84,42900657,42900657
Q,10819576,200,100,40.79,40.87,42900657,42900657
Q,10819577,200,100,40.79,40.88,42900657,42900657
组织和管理数百万个文件似乎是有问题的,但是Replay应用程序非常适合平面文件模型,因为任何特定的replay或分析所需的数据量都非常有限。 这使得大量数据可以存储在服务器上的可管理文本文件中。 该应用程序知道如何将用户的重播请求转换为文件名,从Amazon S3请求该文件名,然后在到达后对其进行解析。 该应用程序当前不适用于跨多个股票或跨长时间的开放式查询。 它旨在提供极为详细的单个股票的视图和分析。
Amazon提供了REST和SOAP接口来访问S3中存储的数据。 Flex框架为使用REST和SOAP接口提供了支持。 此外,在Google Code上托管了一个名为as3awss3lib的开源API,该API为使用动作脚本在AIR运行时中与S3交互提供了全面的支持。
使用as3awss3lib访问文件的示例如下:
//sample method for init the downloading of a file
private function getFile():void {
//creates as3awss3lib wrapper with auth parameters
var s3Service:AWSS3 = new AWSS3(this.accessKey, this.secretAccessKey);
//add event handlers for async calls
s3Service.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
s3Service.addEventListener(AWSS3Event.ERROR, onError);
s3Service.addEventListener(AWSS3Event.OBJECT_RETRIEVED, onFileDownloaded);
//calls AWSS3 method to get file
s3Service.getObject(fileName, key);
}
//Event handler used file is returned
private function onFileDownloaded(e:AWSS3Event):void {
//get file details
var currentObject:Object = downloadQueue.shift();
var ext:String = mimeMap.getExtension(e.data.type);
var fileName:String = (ext != null && currentObject.key.indexOf(".") == -1) ?
currentObject.key + "." + ext : currentObject.key;
//save file to specified downloadLocation
var fs:FileStream = new FileStream();
fs.open(downloadLocation.resolvePath(fileName), FileMode.WRITE);
fs.writeBytes(e.data.bytes);
fs.close();
Alert.show("Your file(s) have been successfully downloaded.", "Success!", Alert.OK, null, null, null);
}
在此示例中,“ getFile”方法创建由as3awss3lib提供的AWSS3类,并调用“ getObject”方法以检索所需文件。 Flex异步访问所有远程服务。 因此,getObject调用异步发生,并使用为AWSS3Event.OBJECT_RETRIEVED事件声明的处理程序在返回调用时处理结果。 在此示例代码中,将保存文件并向用户显示警报。
数据准备过程将数据分为单个文件。 一个文件在一天中的单个10分钟时间段内涵盖单个股票代号(所有时间段均标准化为9:25-9:35、9:35-9:45等)。 文件名标识文件中数据的存量,日期和时间段。 它完全按照日期,股票代码和时间顺序排列。 用户通过输入股票代码,日期和时间开始重播。 客户端应用程序将该符号,日期,时间信息转换为文件名。 然后,客户端联系到S3,并索要所需的文件。 S3在快速检索文件和返回内容方面非常有效。
除了Amazon S3的技术优势外,还因为其定价模型而选择了它。 其定价是透明且可预测的。 它可以准确地预测运营成本,并实时监控支出。
精心准备上传到S3的文件和S3成本配置文件对于使NASDAQ承诺永不卸载数据至关重要。 S3价格便宜,大部分费用发生在上载或下载数据时。 维护通常一个月中未触及的大量文件的成本非常低。
S3仅针对Market Replay使用的容量收费。 这大大降低了开发和启动Market Replay的成本,因为它不需要纳斯达克购买可能需要数月或数年才能完全使用的硬件。 S3的可伸缩性和定价模型可根据需要进行扩展,而无需购买额外的“净空”,以防止用户群的增长可能会加速。
结论
纳斯达克市场重播即将发布包含交易和报价的新版本。 它需要对应用程序进行重大更改,包括:同步报价数据和交易数据,完全重写图表界面,包含交易列表及其特征的新面板以及对交易数据进行的新计算。 Market Replay应用程序体系结构以及AIR和S3平台的质量和功能已通过增强过程得到了证明,因为这些主要更新仅在大约一个月的开发时间内就已实现。 此外,AIR使发布应用程序的新版本变得容易,因为该应用程序每次启动时都会检查并安装更新。
纳斯达克市场重播的实施表明,功能强大的数据驱动应用程序可以快速投放市场,并在有限的预算内进行部署,这对软件行业来说是一个激动人心的时刻。 这主要归功于平台的改进,包括云计算的出现和强大的客户端运行时。
读者可以在NASDAQ的DataStore( https://data.nasdaq.com/MR.aspx )上免费试用NASDAQ的Market Replay应用程序。 那些想要完全访问权限的用户应该从其常规股票市场数据提供者处请求该应用程序,例如,经纪人,金融网站或金融信息供应商。
infoq