最近、ファイナンス機械学習という書籍を読み始めました。今回は、その本の中で紹介されていた金融データのサンプリングについてまとめておきたいと思います。
まずはじめに、機械学習アルゴリズムでは抽出データはテーブル形式が前提であることが多いです。このテーブルの行を「バー」と表現するそうです。そして、バーは以下の2つの方式に区別することができます。
- 標準バー方式
- 情報ドリブン方式
一般的に利用されているのは1. の標準バー方式です。標準バー方式とは、一連の観測値を規則的にサンプリングすることです。例えば、最もポピュラーな時間足(分, 時間, 日, 週, 年…)はこれに該当します。他にも取引数(ティック数)や出来高/売買高を基準としたサンプリングもあります。
それらに対し、2. の情報ドリブン方式という方法があります。これは、インフォームドトレーダー(情報をもつトレーダー)の市場参加とサンプリングを同期させる方法になります。情報ドリブン方式にもいくつかのサンプリング手法が紹介されております。今回は、その中でもベースとなる『ティックインバランスバー(ティック不均衡バー)』について紹介します。また、最後には標準バー方式と標準バー方式によるサンプリングの比較も行います。
利用データについて
今回は為替相場を利用してみます。通貨はドル円とします。データは、MT5から取得できるティックデータを利用します。MT5を利用したデータの取り扱いについては過去の記事のこちらを参照ください。ティックデータは膨大な量となってしまうため、とりあえず2020年10月1日~2021年3月31日を対象としました。(それでもかなり多い)
以下、ドル円の一部を表示した結果です。


これを見ると為替のティックデータには、BID / ASKの二つのデータがあることがわかります。調べてみたら、一般的にチャートで利用されているのはBID(売り価格)を利用しているそうです。(情報元)
なので以降は、BIDを利用して検証していきます。
上記のデータは、BID / ASKのTICKデータが結合されたテーブルとなっております。したがって、BIDのみの約定に絞り込む必要があります。
そのためには、まず、”flags”列の値をルールに基づき取引情報に変換してあげます。そして、この取引情報に基づき、BIDのみに絞り込みます。
結果、データ数を10,159,381個から6,894,634個に削減(約32%減)されました。
余談
ティックデータを個人で利用するのはハードルが高い気がしました。JPXから購入することも可能のようですが、そこまでする金銭的に余裕がなく、実際に使い物になるかは別なので個人利用は厳しい気がしております。
無料でティックデータをダウンロードできるツールとしては、MT5やSBI証券の『HYPER SBI』があります。HYPER SBIを利用するには口座開設が必要です。今回は、口座開設のは少々手間だったので一旦保留としましたが、将来的には利用してみるのもありなのかもしれません。
為替データには、出来高/売買高が含まれておりません。ファイナンス機械学習で紹介されている情報ドリブン方式には出来高/売買高を利用したものが多く紹介されていたので、その辺を試してみることができないのは少し残念。この辺をフリーで試してみるとなると、SBIのツールを利用するしかなさそうです。ただ、個人でシストレ売買をするならFXがお手頃なのでしばらくは可能な範囲で検証していけたらいいのかなと思っております。
標準バー方式 vs 情報ドリブン方式
標準バー方式
ティックデータを標準バー方式に変換するには、pandasのremapleを利用すると簡単にできます。以下は、ティックデータを日次の4本値に変換するためのコードです。
price_daily = tick_frame_b['bid'].resample('D').ohlc() price_daily.dropna(inplace=True) price_daily.head()

こんなに簡単に変換できるとは思わなかったので、panadsは使い方次第で便利だなと思いました。
情報ドリブン方式(ティックインバランスバー)
定義
\(\{(p_t, v_t)\}_{t=1, \cdots, T}\)をティック系列とします。ここで、\(p_t\)はティック\(t\)の価格であり、\(v_t\)はティック\(t\)の出来高を表します。(今回は出来高は利用しません)
このとき、\(\{b_t\}_{1, \cdots, T}\)を以下のように定義します。
$$ b_t = \begin{cases} b_{t-1} & if \Delta p_t = 0 \\ \frac{|\Delta p_t|}{\Delta p_t} & if \Delta p_t \neq 0 \end{cases}$$
ティックインバランスバーでは、ティック符号の累積値が所定の閾値を超えたところでティックインデックス\(T\)を決定する。
検証
上記の定義に基づきサンプリングをした結果、39個のバーが得られました。以下のグラフは、ティック符号と閾値の推移を表したものになります。

リターンの分布は以下の通り。


日次リターン(右側)に比べて、ティックインバランスバー(左側)は裾が軽い分布となっております。得られたサンプル数が36と少ないですが、サンプリングの仕方を変えるだけで分布がかなり異なることがわかります。
価格の推移にティックインバランスバーによりサンプリングされた時点をプロット(赤点)したものが以下の通りです。

序盤は、閾値の推定により多くサンプリングされてしまっております。全体を見ると、相場の局面でサンプルされているようにも見えます。
まとめ
今回は、サンプリング手法について書いてみました。本書によると、タイムバーはよい統計的性質を示さないそうです。ティックインバランスバーに基づくサンプリングを実装してみましたが、サンプリングをされたデータは39個で学習データとして利用するには少なそうです。(日次データは128個でした)
サンプル数を増やすとなると、適切な閾値(初期値)を設定する等、検討が必要そうです。初期値によっては、発散?してサンプリングをしすぎてしまうよな問題もあったので難しい印象を受けました。あとは、値動きの激しい資産にしてみると良いのかもしれません。
以上
参考
今回の記事を作成するにあたり使用したプログラム等は以下に掲載しておきます。
- TIckInbalanceBar.ipynb: 今回の記事全般のコードを記載