BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ アーティクル InfoQ ケーススタディ:NASDAQ Market Replay

InfoQ ケーススタディ:NASDAQ Market Replay

NASDAQ Market ReplayはNASDAQ公認の株式市場の過去の動向のリプレイと分析を提供するアプリケーションです。これはAdobe FlexおよびAIRプラットフォームで作られ、市場データの履歴保存にAmazon Simple Storage Service(S3)を使っています。S3とAIRの組み合わせによって、自前でインフラをほとんど持たないでも強力な展開モデルを実現しています。このシンプルでロバスト(耐障害性のある)な展開モデルはAIRランタイムがクライアントマシンで動くためにできることです。そしてAmazonの「クラウド」からデータを引き出せることによってAmazon S3は従来の中間層サーバを不要としています。

このMarket Replayアプリケーションによってユーザは任意の時点の最良気配を見ることができ、リアルタイムにシミュレートされた市場の動きをリプレイでき、ミリ秒レベルまで経過を詳しく見ることができます。投資家であれば最良執行が行われているか、レギュレーションNMS(全米市場システム規制)を遵守されているかを確認できます。ブローカ(株式仲買人)やトレーダ(投機家)は自分が取引を行った時に問題や機会損失がなかったかをレビューできます。ブローカは取引時点のNASDAQ公認の情報を顧客に送ることで、自らの実績を示すこともできます。

図1.Market Replay Case Study

問題領域

投資家やトレーダにとって「何があったのか?」と問いたくなることは、プロであってもなくても普遍的に経験することです。ブローカは最良執行とレギュレーションNMSに合う企業を得たのか?トレーダは機会を逃したのか?どうしてあの小口投資家は予想とは違う値段をつけたのか?投資家、トレーダ、法令準拠管理者がこのような問いに答えるために必要とするのは、実際に何があったのかを秒単位あるいはミリ秒単位で詳細に遡り見ていける手段です。

NASDAQ Market Replayアプリケーションは「NASDAQ公認」のデータを使ってこれを実現します。Market Replayを有効活用する使用例は多くあります。

  • ある法令準拠管理者がReg NMSや他の最良執行ルールに準じてないとみられるトレーダを知らせるレポートを受け取る。この管理者はNASDAQ Market Replayを使って該当する取引の時点の相場を再現し、タイムスタンプを合わせるのに時間を進めたり戻したりし、ミリ秒単位のレベルまで拡大して1ミリ秒以上続いた相場を見ていく。分析が終わると、この管理者はNASDAQ公認の履歴やスクリーンショットを顧客あるいは監督機関に見せることでルールに準拠していることを証明できる。
  • ある小口投資家がブローカから取引確認を受け取り、なぜ価格が自分の予想と違ったものになったのかを知りたいと考える。この小口投資家はある金融ポータルサイトでNASDAQ Market Replayを使って自分が取引した時の市場をリプレイする。この投資家はブローカの実力と市場とをまとめて知ることができる。
  • ある証券会社のコールセンタのオペレータが顧客からある取引の価格についての問い合わせ電話を受ける。このオペレータはその取引があった時点についての状況を示したNASDAQの印が入ったスクリーンショットをMarket Replayから取得してこの顧客に提供する。このオペレータはMarket Replayへのリンクを提供することもでき、そこで顧客はその取引につながる出来事やその後の出来事をリプレイして見ることができる。証券会社は NASDAQ Market Replay上の関連するリプレイへのリンクを各取引確認書に記載することもできる。Market Replayは各顧客からの問い合わせ電話の数とそれにかける時間を減らすことができることになる。
  • 積極的な投資家であるトレーダ、あるいはデイトレーダは市場の一連の出来事に合わせた良好な取引を行いたいと考える。あるいは、トレーダは興味のある市場の出来事を見て、何が起きたかをより深く理解したいと思う。トレーダはNASDAQ Market Replayを使うことで出来事をリプレイしたりレビューしたりして実際に何が起きたのかを見ることができる。トレーダは他のトレーダとリプレイを共有して、自分のスキルを実際に示したり相手にアドバイスを求めたりもできる。

NASDAQ Market Replayはあまり熱心でない投資家にもプロの投資家にも市場で何が起きたかを把握するのに必要な情報を提供するのです。

 

システム概要

Market Replayアプリケーションは2008年2月にリリースされましたが、同じくしてAdobeがAdobe AIRプラットフォームの正式版である1.0をリリースしました。AIRとS3プラットフォームの力によって、アプリケーションのコンセプト立案から実際に動作するまでにたった6ヶ月ほどしか掛かりませんでした。10人からなるチームがバックエンドのデータ処理とユーザインターフェースの両面からアプリケーションを実装していきました。

クライアントデスクトップアプリケーションはAdabe Flexを利用して構築され、AIRランタイム上で動作していました。Adobe Flexは開発者がFlash Player上で動作するアプリケーションを構築するために利用するアプリケーション開発フレームワークです。Adobe AIRはHTML/CSSやjax、Flash、Flexといったウェブテクノロジーを利用したデスクトップ用のアプリケーションを開発者が作成するのを可能にします。さらに、AIRはクライアントアプリケーションを配信できるようオフラインサポート及び簡単なデプロイメントパラダイムを提供します。

S3 はリプレイに必要な大容量のデータでも格納できるロバストなシステムを提供します。このことでAIRアプリケーションがユーザのコンピュータで動き、データはS3にあるというユニークな配置が可能になっています。これらのおかげでアプリケーションを商用版として配布するのにも重厚なサーバインフラを用意する必要はありませんでした。

Market Replayの実装では同じようなシステムに比べいくつもの方法でその価値を高めています。

  • ある時点の注文板の状態を表示する既存のツールに比べ、Market ReplayはAdobe Flex/AIRテクノロジを使うことで高いレベルの利便性、視覚化、リプレイ機能を実現する。
  • 独自に市場データを持つ一企業や一ベンダに比べ、NASDAQ Market ReplayはNASDAQ公認のデータをNASDAQから直接取得して提供する。
  • 相場データベースや高価な分析ソフトウェアを使って手作業で注文板を作るのに比べ、NASDAQ Market Replayは速く安く作れミスも少なくなる。
  • データベースのサイズのせいで処理が遅くなったり費用がかさまないよう、データを10日後や30日後には消してしまう自前のデータベースに比べ、Market Replayは費用がかさまずスケール性能も高いS3を使うので、データを消去する必要がない。

AIR とS3の組み合わせはデータの抽出と視覚化を素早く行うことを可能にします。このアプリケーションの主な機能の一つはユーザが任意の時点についての統合された注文板を見れるようにすることです。アプリケーションは新しい注文板をS3から素早く読み取ることができ、AIRはユーザのデスクトップマシンの処理能力をユーザインターフェースを更新するために使うことができます。これによりユーザはある注文板から別の注文板へと簡単に移ることができ、その時はサーバが注文板の次の状態を表示するために再計算し送信するせいでもたつくようなこともありません。

詳説:Adobe Flex & AIR

このアプリケーションの機能の最も重要な点は、トレーダがワークステーションで見るのと同じように、ユーザへリアルタイムに市場活動の正確なリプレイを提供することにあります。このためには注文が更新されたメッセージをソートし集約して、任意の時点に関する統合された注文を作る必要があります。Flexで作ったインターフェースでは、メインの2つの画面によってこれを実現しています。

  1. タイムチャート:タイムチャートは読み込んだデータから計算した各時点の最良気配を表示します。
  2. 注文板:注文板の画面は各時点における注文板の全情報を表示し、リプレイ中には動的に更新をします。

キーとなるのはアプリケーションがデータのどんな詳細も表示することです。そのためにはミリ秒レベルで売買の変化がわかるまでズームできる必要があります。ユーザがどんどん時間枠をズームしていってデータの各要素を見ることができないといけません。その上、出来事が人間の目で分かるようにリプレイの進む速度を遅くできないといけません。このようなデータのアニメーション・視覚化をおこなうため、Adobe Flexを選んだのは自然なことでした。

Flash Runtimeの主な利点はアニメーションをネイティブでサポートしていることで、それによりこのリプレイアプリケーションに強力な視覚化基盤が提供されます。Flash APIの上に構築されているAdobe Flexフレームワークはデータの一般的な視覚化方法としてのチャートコンポーネントを何種類も持っています。Flexのチャートコンポーネントは他の標準コンポーネントと同様、リッチな機能を備えると同時に拡張性も備えています。Market Replayアプリケーションでは標準Flexチャートコンポーネントを拡張したりカスタマイズしたりしています。標準であるFlexのデータ視覚化コンポーネントを使って始めることで、NASDAQは一から始めるより速くカスタムコンポーネントを開発することができました。

Flex 標準のチャートコンポーネントを使うことはまったく簡単なことです。以下の例では、仮データがMXMLソースファイルにハードコーディングされています。 MXMLはFlexフレームワークに含まれる宣言的な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データストアから読み込まれます。そしてデータはFlexのHLOCChart(High Low Open Close Chart)コンポーネントを使ってデータを視覚化します。その結果が次のスクリーンショットです。

図2.サンプルデータの視覚化

Adobe AIRはクライアントアプリケーションにとって理想的な実行環境を用意してくれます。なぜならローカルのリソースを大量のデータを速く処理するのに使えるからです。ユーザは各取引所での最良気配や市場の最良気配の最安値/最高値を計算する時間の幅を選択できます。このような計算には通常大量のデータが必要で結果をはじき出すには重い処理が必要になります。ユーザのリクエストをサーバで処理するには強力なウェブサーバが必要でしたし、各処理リクエストについてラウンドトリップリクエストを待たないといけないため時間がかかるということが起きていました。Adobe AIRを使えば最低限のサーバインフラだけ用意して、ほとんどの処理をユーザのデスクトップマシンにまかせることができます。

AIR がユーザエクスペリエンスを向上させる別の理由は、リプレイと分析機能のために常にネットワークへアクセスしなくてもいいことにあります。いったんS3からデータファイルを読み込めんでしまえばインターネットに接続できてもできなくてもリプレイや計算ができます。これはNASDAQのクライアントにとって便利なだけではなく、NSDAQの販売員にとっても便利なもので、彼らがクライアントを訪れる時にインターネット接続がなくてもアプリケーションのデモンストレーションがおこなえます。

パワーあるAdobe AIRとFlexはアプリケーションの開発を始めるキーとなる要因でした。標準コンポーネントによって開発を始められたことは、高品質の成果をすぐに見せるのに必要なことでした。これらのコンポーネントはアプリケーションを強化するのにあわせてカスタマイズされ、最終的に今の完成版アプリケーションを作り出しました。

詳説:Amazon Simple Storage Service(S3)

Amazon S3が選ばれた理由は、あまり費用がかからずスケール性能もいい方法で市場データの履歴を保存する必要があったからです。株式市場は日々ギガバイトクラスの取引データを生成します。Market Replayアプリケーションのためには、全ての詳細が保存され、かつシステムがユーザのリクエストに素早く応えれるようにデータを用意する必要があったのです。

NASDAQが長年に渡って蓄えてきたデータをオンライン化してリーズナブルなコストで関係者全員がすぐに利用できるようなデータサービスを求めていたことからもS3は魅力でした。S3を使うことでMarket Replayは数十億のファイルをパフォーマンスを犠牲にせず無数のユーザに提供することができるのです。

Market Replayは数ヶ月あるいは数年前の取引に関して監督機関からの問い合わせや法的な調査や顧客の問合せを受けるようなユーザをサポートします。そのため全てのリプレイ用履歴データをすぐに利用できるというのは重要な要件でした。その点S3はずっと高速なアクセススピードを実際に維持してきました。

S3 にデータを保管する前に、NASDAQはテストサーバを使って、データをリアルタイムに配信するためのフォーマットからリプレイ用に最適化したフォーマットへ変換します。この独自の変換処理を行うことでアップロードやダウンロードに最適なシンプルで効率のいいテキストファイルを作ります。これらのファイルはAIRで作ったデスクトップアプリケーションがどれだけでも詳しくリプレイしたり分析したりするのに必要な価格情報を全て含んでいます。フル稼働時だと、Market Replayは1日に数十万のファイルをS3に送ります。

Market ReplayはCSV形式のデータファイルを使います。S3は大量のファイルを速く確実に保存したり取り出したりできるよう設計されています。そのファイルにふくまれるデータは以下の例にあるようにシンプルで人間にも可読な形式になっています。そのファイル名からは証券コード、日付、そしてデータがカバーする期間の始めの時刻が分かります。最初の数レコードは各取引所の売り気配と買い気配の初期状態です。それに続くレコードは全ての変化を表します。そしてその各フィールドが表すのは、取引所、連番、売り気配株数、買い気配株数、売り気配値、買い気配値、開始時刻(0時から経過したミリ秒)終了時刻(0時から経過したミリ秒)です。

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

数百万ものファイルをまとめ管理するというのは問題のある方法だと思われるかもしれませんが、ファイルに階層のないモデルはMarket Replayによく合うものなのです。というのも一つのリプレイや分析には限られた量のデータしか必要ないからです。そのため必要なデータだけ格納した手頃なサイズのファイルがサーバにあれいいのです。アプリケーションはユーザのリプレイリクエストからファイル名を決定できます。そしてそのファイルを Amazon S3にリクエストして、それが届いたら一回だけパースするだけでいいのです。アプリケーションは今のところ対象株の数や期間が設定されないクエリには対応していません。一番詳しいレベルまで見たり分析したりするのは単一の株についてだけとなっています。

Amazon はS3に格納されたデータへアクセスするためにRESTとSOAPの両方のインターフェースを提供しています。FlexフレームワークもRESTと SOAPの両方のインターフェースが扱えるようになっています。さらにGoogle Codeにはas3awss3libというオープンソースのAPIがあり、AIRランタイムでActionScriptを使った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イベンに応答するハンドラを使ってgetObjectの結果を処理します。このサンプルではファイルを保存してAlertをユーザに見せるようになっています。

この処理ではデータを用意するのに必要なファイルを決めます。一つのファイルは単一銘柄のある日の特定の10分間(9:25-9:35や9:35-9:45などのように統一されます)をカバーします。ファイル名はデータの銘柄、日付、期間が分かるように日付、銘柄、期間をつなげたものになってます。ユーザは銘柄、日付、期間を指定してリプレイを始めることができます。このクライアントアプリケーションは銘柄、日付、期間の情報をファイル名に変換し、S3へ必要なファイルをリクエストします。S3は直ちにファイルを見つけてその内容を返してきます。

Amazon S3を選んだ理由は、技術的な利点以外に価格モデルもあります。S3の価格は透明性があり予測可能なものです。そのおかげで運用にかかるコストを正確に予測したりリアルタイムにかかった費用を見ることができます。

S3 にアップロードされたファイルをきちんと用意できることと、それにかかるS3のコストはNASDAQがデータを消去しないですむようにする上で重要なことでした。S3は費用が抑えられますし、その大半はデータをアップロードしたりダウンロードする時に発生されるものです。一ヶ月の間アクセスされないことが多い大量のファイルを維持するのにかかる費用は非常に少なくすみます。

S3は Market Replayが使う容量分だけ課金します。このことはMarket Replayを開発しリリースするのにかかるコストを劇的に減らしました。もしNASDAQがハードウェアを購入しても、それをフルに使うには数ヶ月も数年もかかるはずです。S3のスケール性と価格モデルのおかげで必要に応じてスケールアップできるので、ユーザの裾野が拡大した時に備えて余分なスペースを買っておく必要もありません。

終わりに

NASDAQ Market Replayは新しいバージョンがリリースされようとしています。このバージョンでは売買だけでなく株価が含まれるようになります。このためにはアプリケーションに、株価データと売買データの同期、チャート画面の作り直し、売買リストとその指標も示す新しいパネル、売買データの新しい計算などの変更が必要でした。このような変更のための拡張工程にはおよそ1ヶ月の開発期間しかかからなかったことは、Market ReplayアプリケーションとAIRとS3プラットフォームが持つアーキテクチャの品質とパワーを証明するものです。さらにAIRは起動ごとに更新がないかチェックしインストールするので、この新しいバージョンを配布するのも容易です。

今はソフトウェア業界にとってエキサイティングな時代です。NASDAQ Market Replayの実装は、強力なデータドリブンアプリケーションが限られた予算内で市場に素早く出ることが可能だという実例です。その多くを担うのがプラットフォームの改善であり、クラウドコンピューティングや強力なクライアントサイド環境の出現の両方に負うところが大きいのです。

読者はNASDAQのMarket Replayアプリケーションのフリートライアル版をNASDAQのDataStore(https://data.nasdaq.com/MR.aspx)で手に入れることができます。フル機能版を使いたい方は、いつも使われている株式市場データのプロバイダ(ブローカやファイナンスに関するウェブポータルや金融情報ベンダなど)にたずねてください。

原文はこちらです:http://www.infoq.com/articles/nasdaq-case-study-air-and-s3
(このArticleは2008年6月9日に原文が掲載されました)

この記事に星をつける

おすすめ度
スタイル

BT