東証株式高頻度データ（FLEX historical）の加工/分析ツール「jpxlab」の使い方ガイド

AlpacaJapan（以後、Alpaca）は東京証券取引所の提供するデータサービスである東証株式高頻度データ（FLEX historical）の加工/分析ツール「[jpxlab](https://github.com/AlpacaDB/jpxlab)」を提供開始致しました。FLEX historicalは東証がリアルタイムで配信する相場情報を1つのファイルにまとめてヒストリカル情報として提供しているものであり、本プロジェクトはAlpacaと東京証券取引所とのコラボレーションにより実現したものです。

---

### 前提条件

FLEX Historicalにアクセスするには東京証券取引所との契約が必要です。契約をご希望の方は[こちら](https://www.jpx.co.jp/markets/paid-info-equities/historical/01.html)までお問い合わせください。 
東証株式高頻度データ（FLEX historical）の加工/分析ツール「[jpxlab](https://github.com/AlpacaDB/jpxlab)」はオープンソースプロジェクトとして提供されます。今後のテクニカルサポートや機能追加は、本ツールを利用する皆様と一緒に実施していきたいと考えております。機能追加や不具合のご報告はGithubのIssueを通して実施致します。なお、本ツールはLinux / MacOSX上での利用を前提としています。

### クイックスタート

Githubからrepositoryを複製

```
$ git clone git@github.com:AlpacaDB/jpxlab.git
```

### アカウント情報を設定

契約が完了するとアーカイブファイルを取得するのに必要なFTPサーバーのログイン情報をもらえます。[jpxlab](https://github.com/AlpacaDB/jpxlab)にはファイルを簡単にダウンロードすることができるシンプルなシェルスクリプトがついてきます。必要に応じて `tools/fetcher/fetch.sh` を編集してください。

```
$ cat fetch.sh
#!/bin/bash
# A simple ftp downloader for FLEX Historical
#
# Usage: ./fetch.sh <YYYYMMDD>
#
# - Wildcard is allowed to fetch multiple files
# - Downloaded files go `/jpxlab/downloads`
#
# edit these
FTP_USER=$FTP_USER <- Edit this
FTP_PASS=$FTP_PASS <- Edit this
```

ログイン情報は誤ってリポジトリにpushしたりすると大変なことになりますので、スクリプトを実行するときに、2つの環境変数を指定することでも動作させることが出来ます。

```
FTP_USER=**** FTP_PASS=**** ./fetch.sh '20190902'
```

### データのダウンロード

以下のコマンドを実行してみましょう。

```
$ cd tools/fetcher
$ ./fetch.sh '20190902'
```

FLEX Historicalはftpサーバー上でzip形式でアーカイブされ、日毎のファイルに分割されます。ファイルサイズはかなり大きく、圧縮後で4GB近くあることに留意してください。

またwiled-cardを使用して、複数のファイルをバッチで取得することもできます。たとえば以下のように、コマンドで2019年9月のすべてのファイルをダウンロードすることが可能です。

```
$ cd tools/fetcher
$ ./fetch.sh '201909??'
$ ls ../../downloads/
StandardEquities_20190902.zip
StandardEquities_20190903.zip
StandardEquities_20190904.zip
StandardEquities_20190905.zip
StandardEquities_20190906.zip
StandardEquities_20190909.zip
StandardEquities_20190910.zip
StandardEquities_20190911.zip
StandardEquities_20190912.zip
StandardEquities_20190913.zip
StandardEquities_20190917.zip
StandardEquities_20190918.zip
StandardEquities_20190919.zip
StandardEquities_20190920.zip
StandardEquities_20190924.zip
StandardEquities_20190925.zip
StandardEquities_20190926.zip
StandardEquities_20190927.zip
StandardEquities_20190930.zip
```

### データをパースする
これらのzipファイルには、分析用の時系列データとして使用するのにはパースが必要な生のFLEXメッセージが含まれています。たとえば、データ構造は次のようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48701/9c0bc679-0b45-5459-3aa9-4c910e71bb53.png)

_02_Market Information System FLEX Connection Specification Realtime Message (Standard) DS.15.10.pdfより引用_

FLEXフォーマットの詳細については、`ftp.tmi.tse.or.jp：/specifications/English/Standard_E_20181225.zip` から公式のドキュメントを確認してください。

フォーマットはバイト単位のASCIIデータと制御コードによって区切られたチャンクの連続で、なかなか高級言語でパースしていてはパフォーマンスが出にくいものではあるものの、基本的にはチャンクのヘッダに含まれるチャンクの種類に関する情報をチャンクのサイズさえ正確にシークしていけば目当ての情報だけ抜き出していくことは可能です。

ただし、心配しなくても、[jpxlab](https://github.com/AlpacaDB/jpxlab)にはこれらのファイルをh5ファイルに変換するパーサーを用意しています。h5ファイルは主にpythonの分析ライブラリpandasで扱うための圧縮型の表形式データのファイルフォーマットです。

```
$ python cli.py resample -f 1H /opt/jpxlab/downloads/*.h5
```

本パーサーはFLEXデータで提供される「4P:四本値」タグをパースしており、四本値(始値、高値、安値、現在値)の情報がすべて含まれています。データの配信時期は以下のようになっており、日中の現在値がすべてこのタグにより取得可能となります。

(1)約定値段情報(同値約定含む)が新規に発生したとき
(2)ザラバ引けになったとき(売買停止、売買中断のまま引けたときを含む)
(3)バックアップ配信時
(4)日通し情報配信時

気配値の情報は含まれていないことに注意してください。ただし、新たなタグのパースも本ツールを拡張することで可能な設計になっています。

また、「4P:四本値」に加えて対応する「VL:ボリューム」のタグもパースすることで実際の取引ボリュームも同時にダンプしております。FLEX Historicalの電文に含まれるボリュームの値はマーケットがオープンしてからの累積値となっているため、各データポイントに対応するボリューム値を記録するようにパーサー内で一つ前のレコードとの差分を計算するようにしております。

### データをリサンプリングする

これらのh5ファイルには、すべての株式の詳細な価格情報が含まれています。ファイルサイズは依然1日あたり約500MBあるので、大抵の場合は大きすぎるでしょう。 そこで、[jpxlab](https://github.com/AlpacaDB/jpxlab)には、指定サイズのローソク足にリサンプリングするユーティリティコマンドも用意しています。同コマンドは変換された生のh5ファイルを入力として受け取り、h5ファイルにOHLCリサンプリングシーケンスを生成します。たとえば、次のようなコマンドでデータを時間足のろうそくにリサンプリングすることができます。

```
$ python cli.py resample -f 1H /opt/jpxlab/downloads/*.h5
```

### Jupyter Notebookをローンチする

ではいよいよデータで遊んでみましょう。Jupyter notebookをローンチしてください。

```
$ make notebook_docker
To access the notebook, open this file in a browser:
 file:///root/.local/share/jupyter/runtime/nbserver-1-open.html
 Or copy and paste one of these URLs:
 http://85e47314c90a:8888/?token=*****
 or http://127.0.0.1:8888/?token=*****
```

### 例:データローディング 

jpxlabにはいくつかのサンプルがプリロードされていますが、[jpxlab demo — loader.ipynb](https://github.com/AlpacaDB/jpxlab/blob/master/notebooks/jpxlab%20demo%20-%20loader.ipynb)は、データのロード方法を示す最も基本的なデモです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48701/d522dcef-8da1-396a-598a-5b59214c017c.png)

生成されたh5ファイルはopen、high、low、closeに加えて、取引ボリュームと取引サイズを含む6列で構成されています。 h5ファイルには、銘柄ごとにこのようなテーブルがあり、上記の例はToyota Motor Corp (TYO: 7203) を示しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48701/3f79a954-d843-8fd4-c8fc-50999919fb88.png)

### 最後に

このブログでは以下の方法を紹介しました:

* FTPサーバーからアーカイブをダウンロード
* 生のファイルからh5ファイルへのコンバート
* h5ファイルのデータをOHLCデータにリサンプル
* H5ファイルをロードしてビジュアライズ

[jpxlab](https://github.com/AlpacaDB/jpxlab)が、より多くの人が日本株のデータの世界に飛び込む手助けとなることを願っています。

さらに応用した利用方法は[こちらの記事](https://qiita.com/kitayama_tomoya/items/225d82eb012d1a58dce9)を参考にしてください！