スイスショックにおけるCHFJPYの流動性の分析
以下の条件で、CPのレートフィードがどのように配信されていたかをミクロ的に分析する。
eventName : Swiss Shock on 2015-01-15
observationPeriod : 2015/1/15 18:30-18:57 JST
curPair : CHF/JPY
liquidityProviders : 8 banks (匿名)
選択したCPは任意であり、各CPの名称は匿名とさせていただく。
■観察対象のレート全体から見えること
●配信頻度
マルチバンドの扱い等、公平な評価はしづらいが、単純に見ても、高頻度とそうでないCPとでかなりの開きがあることがわかる。
bankAは一秒間に3.4回配信するが、bankCは約3秒間に1回の配信ということになる。以下に説明するが、頻度が高いからよいというものでもない。
●タイムゾーン別配信頻度(配信回数)
bankA,B,G,Hは全時間帯で配信をしている。特にbankA, bankBはその頻度は高い。一方、それら以外のbankは35分以降配信をやめてしまい、そこから復活したのは、G,Hだけである。
●タイムゾーン別bestBid, bestAsk
タイムゾーンを6つに分けた。それぞれにおいて、CPごとのbestBid(maxBid), bestAsk(minAsk)を見つけ出す。
R1:ショックが市場に伝わる前
R2:一行だけ反応し始めるが他のCPは無反応
R3:全面的に反応が始まる。半分の4CPは配信を停止する。継続するCPは130円台に乗せる。
R4:さらにレンジが上がり、140円台になる。
R5:150円台になる。さらに1CP配信を停止する。
R6:1CPが更なる異常値とも思えるレートを出し始める。R5で停止したCPが再開する。
R1は18:30:00.000から18:30:56.120までの時間帯の値という意味。ミリ秒までは管理している。
それぞれのゾーンのbestBid, bestAskは右端のカラムにある。
これによれば、R4(18:43:59.710-18:47:01.046)の時間帯で、ベストビッド:155.075、R5において179.08が配信されていたことがわかる。
Ask側も同様に、R4で139.697、 R5で153.577が配信されている。
気を付けるべきは、このbestBid, bestAskはここでサンプリングした8CPsの中での結果である。実際に個々のCPのレートを見ると、最大askで4140.93というレートが、最小bidで9.909というレートが配信されている。むろん正しい(約定すべきレートとして適切な)はずがない。
以下の表は、全期間中の最大と最小の値である。バグレートを排除するロジックをしっかり持っていないと、とんでもないレートが配信されかねないことがわかるだろう。
CPによって突然のニュースによる反応の仕方はまちまちである。パターンとしては、
1)配信停止する
2)続ける
2−1)ビッドアスク両サイドをシンメトリカルに思いっきりワイドにする
2−2)ビッドアスク両サイドをアシンメトリカルに思いっきりワイドにする
3)続けるが頻度を落とす
4)続けるが、ほしくないサイドは配信しない(ビッドアスク別々に更新するメッセージタイプに限る)
どのパターンも今回は現れた。
●CPレートの制御
それぞれのCPの特性に合わせた制御が望ましいことは言うまでもないが、そうした分析が心地よくできるツールは、知る限りない。あっても売ってないという意味で、“ない”。ここで言う制御とは、「異常値」を定義してその異常値と判断されたレートを顧客への配信レートや証拠金再計算レートの基準に使わない。また、バグレートとして排除する「異常値」を定義するパラメータの“最適化”を過去のレートの履歴を分析しながら常に最適化プロセスを回してゆく、ということを指す。
このあたりのソフトを作ることを考えた場合、インプット側は業者が違ってもCP側のレートフィードは、すべてFIX Protocolなので、合わせることができる。また、分析の視点についても大体の考え方は同じなのでパッケージ化はしやすい。
あとはそれを実装するハード面である。今回のデータ分析はたかだが27分間のデータだが、私のPC(スペックとしてはいい方である)ではこれが限界であった。ましてや一日分×全CP×全通貨ペアで実行しようとすると、まずもってサーバークラスでないとできない。
CPごとのFIX電文の特性はもとより、継続的なレート配信の“クセ”を理解したうえで、バグレート排除の仕様を検討し、かつ、それを日々モニタリングしながら、バグレート排除の設定値の最適化プロセスを継続的に運用する、というのが理想であるが、それを実現するには、そこそこのコストがかかる。本来、そういう部分にはお金をかけてもいいはずだが、あまりそういう価値観は業界で共有されない。中長期的には、機会収益を増やす(機会損失を減らす)ことに貢献する機能、お仕事であると思う。
すべからく業者は考えたことだろう。今回のスイススショックのようなレート変動がドル円で起きていたら、自分のシステムは上手にバグレートを排除してくれていただろうかと。
この外為証拠金取引業界で、私自身が聞き取り調査をしたかぎりではスイス円の最高値は180円台があったようである。それが妥当であるかどうかという議論は成立するが、“正しいか”という概念はあたらいということをきっちり観察の前提として持っていないと、議論が無益な迷宮へと迷い込んでいくので注意が必要だと思う。
仮にストップロスで185円で買わされた客が、そんなレートで約定するなんておかしいよ、と苦情を訴えたとしよう。そんなレートで実際にインターバンクで約定していたのか!と言いたいところである。しかし、それを調べることは不可能である。実際そういう約定があったかと言えば、あったと断言できる。なぜなら、苦情を申し立てている“あなた”がその証拠になっているから。いやそうではなくて、インターバンクで、だよ、と言われると、ならばそもそもそういう定義はインターバンクですると契約でうたっているか、という疑問が生まれる。ということで、結局、業者は約定のルールをシステムの仕様としてどうデザインし、取引ルールとしてどこまで開示し、顧客と同意しているかという点でしか争えない。それがされていない状態でこうした苦情に対応することは、一面任意で個々に対応すればいいから楽である反面、数が多くなるととんでもなくコストがかかることになる。また、訴訟に持ち込まれると印象が悪くなる。
つまるところ、いつも私が主張する「店頭外為証拠金取引のための最良執行方針」の開示が望まれるところである。
■グラフで見てみる
●Graph1:とりあえず全cpレートをプロットしてみる
縦軸(Y)はスイス円のレート、横軸(X)は時間。
あり得ないレート(4100円台)が邪魔してグラフがよく見えない。bankBがとんでもないレートを出している。ちなみに見えないが下は9円台がある。これを見るとよく180円台で止めたねと業界のシステムを褒めたくなる。
●Graph2:レンジをフォーカスする(1)
Yレンジを100円から200円にフォー化するとコアなレンジの動きがよく見える。
BankAとBankBが活発に配信している。その他はあまり活発ではない。特にBankBのレートが広すぎるので邪魔である。
●Graph3:おちゃめなレートを出し続けたbankBをグラフから追い出す
BankBを削除してみるとそうとうグラフはすっきりするが、さらにbankAが、44分あたりでレートスパイクしていることがわかる。
仮に170円とか200円のレートで約定している人がいたとしたらこの辺の時間帯だったのではないだろうか。
●Graph4:レンジをフォーカスする(2)
そこでbankBを外した状態で、レンジを再び100円から200円にフォーカスする。すると、47分以降まともに配信するCPがいないのがわかる。想像するにこの辺でレートを出す銀行はポジションの整理や、リスクパラメータの再調整等をしていたのかもしれない。
●Graph5:さらにBankAもグラフから追い出してみる
bankA,Bを除いた状態だと、あまりおかしなレートは配信しないCPが残るが、その代り頻度は極めて低い。ここから言えることはCHFJPYのこの時の約定価格として、160円台があってもおかしくはない(少なくとも否定はできない)ということである。ただし18:51-18:52あたりの窓が空いている時間帯(グラフ上グレイの楕円部分)において他の2CPが出していたレートがヒットされてそれがCP側で受け入れられていればこれ以上の約定価格が発生してもおかしくはない。コアなレートの動きとしては、160円というのはおよその上限値として認識されうるとおもうが、ヒアリングすれば180円台がついているそうで、それも致し方ない。だれも正解など持ってはいない。えいや!で出したレートを“買った!”という人がでれば、それはれっきとした“約定”である。
今回は分析だけなのでこれ以上取り立てて言うことはない。次は、裁定理論上EURCHFとUSDCHF, EURUSDも見てみようかなと思うが、時間があれば。
▼尾関高のFXダイアリーをご覧のみなさまへ
このFXダイアリーで取り上げて欲しい話題、また尾関さんに書いてもらいたいテーマなどあれば業界内外問いませんので、「件名:FXダイアリーへの要望」として info@forexpress.com までご連絡ください(コラムへの感想でも勿論結構です)。