Optiver Realized Volatility Prediction 簡単なコンペ詳細とEDA

# はじめに

Kaggleで9月末まで行われているコンペ***Optiver Realized Volatility Prediction***について簡単にどんな内容なのか***日本語***でまとめます。英語の説明読むのが大変というのと、どんなデータで何を予測するのか簡単に書いてあるサイトがなかったのでこれから参加される方や参加中に方の参考になれば幸いです。

[Kaggleリンク](https://www.kaggle.com/c/optiver-realized-volatility-prediction)


# 何を求めるのか

今回のコンペの依頼主はアメリカの電子マーケットメーカーであるOptiverという会社です。
Optiverは、世界中の多数の取引所でオプション、ETF、現金株式、債券、外貨へのアクセスと価格を改善といった業務を行なってます。
なので今回のコンペでは株価市場についてのコンペになります。
私も取り組むまで全く株価市場について知らなかったので、取組前はかなり身構えました。

長くなってしまうので結論からいうと今回のコンペの目的変数は***ボラティリティ***と呼ばれる指標です。

## ボラティリティについて

見慣れない単語ですが、日本語でようやくすると株価の変動量(業界では流動性)のことです。上がったり下がったりする株価がどれくらい激しく動いているのかといった指標になります。
未来10分間のボラティリティを予測します。
ではなぜ企業がこれを予測するかというと、流動性が高いと取引回数が多くなり手数料等で利益が上がるからだと考えられます。

# 評価方法

作成したモデルは、トレーニング後の3ヶ月間の評価期間に収集した実際の市場データと比較して評価されます。
実際の市場とどれだけ近いかで順位が決まるというなかなかトリッキーなコンペになります。  



# コンペで出てくる専門用語

## オーダーブック

買いと売りの価格による日本でいうところの板。
密度が高いものは頻繁にトレードされているか、動きが激しいとみなせます。

## トーレド

実際に売買が行われたあとのオーダーブックとの差です。
というより、トレードによって上記オーダーブックの値が変化することになります。
日本と同じで、最低売値から買われることは同じです。

下のオーダーブックの場合、
価格 : 148、　数量 : 20
のトーレドが行われたと推測できます。

![Imgur](https://i.imgur.com/16Qt255l.png)![Imgur](https://i.imgur.com/jTuN081l.png)

## Market making and market efficiency

![Imgur](https://i.imgur.com/f5TOZJCl.png)

上の表の市場の場合流動性(効率とも呼ばれてる)は低いといえます。
というのも
価格 : 148
では買えず、待ちの状態になります。
価格 : 問わない, 数量 : 20 の注文を出した場合
149 : 1
150 : 12
151 : 7
とばらばらに購入することになり、希望通りの取引はできません。これを非効率的な市場と呼びます。
これを解決させるのが、***マーケットメーカー***と呼ばれる存在になります。(今回のホスト)
金融機関が流動性確保のために、こういった株に対して売買気配置を示すことが制限されています。（国からの命令）
これによって一定の流動性が保たれるとされています。

## オーダーブック統計

Optiverのデータサイエンティスト推奨のオーダブックから抽出できる統計値です。  

### bid/ask spread

最高売値と最低買値の比率をとって計算される値。  
小さいと流動性が高いと見なせます。  

$$BidAskSpread = BestOffer/BestBid -1$$  

### Weighted averaged price(wap)
日本語の加重平均価格の事です
例)100円のケーキと200円のケーキを1個ずつ買えば、平均は150円。では100円のケーキを7個と200円のケーキを3個買えば、（100円×7個）＋（200円×3個）＝1,300円。これを10個で割ったら130円になります。  
これを先程のオーダーブックに適用したものが株価の加重平均価格です。  

$$WAP = \frac{BidPrice_{1}*AskSize_{1} + AskPrice_{1}*BidSize_{1}}{BidSize_{1} + AskSize_{1}}$$

上の例で計算を行うと

```python
bidsize = 251
asksize = 221
bidprice = 147
askprice = 148

(bidprice * asksize + askprice * bidsize) / (bidsize + asksize)

# 出力 147.53177966101694
```
となります。


## 株式評価額

加重平均が同じな場合でも、株式評価額は異なります。  
というのも、オファーサイズが大きい場合その市場には売り手が多く存在することになります。そうなると一般的に株の価値は上がりづらく結果として株式評価額は小さくなると推測されます。

## Log return

株価の割合の比率を対数で取ったものになります。  
$$r_{t_1, t_2} = \log \left( \frac{S_{t_2}}{S_{t_1}} \right)$$
$S_t $ : ある時間$t$での株価格$S$

基本的には10分が目安となります。また
- 時間をまたいで加法的である $r_{t1},r_{t2}+r_{t2},r_{t3}=r_{t1},r_{t3} $
- 通常のリターンは-100%以下にはならないが、Log returnは境界がない
といった特徴があります。

また、対数関数の特徴として

- 価格が落ちた場合、rは少数になるのでyは-の値を取る。
- 価格が上がった場合、rは自然数になるのでyは+の値を取る。
- もし最終的に変化がなければ、0を取る。

![Imgur](https://i.imgur.com/PieGDUqh.png)


## Realized volatility

Log returnの標準偏差を１年間とみなして計算する年間標準偏差をボラティリティとよびます。
今回の目的変数です。
$$\sigma = \sqrt{\sum_{t}r_{t-1, t}^2}$$
10分刻みでLog returnを求めて、それを一年単位で行い標準偏差を求めるとされています。

シンプルなLog returnとは違い、標準偏差になるので最終変動が0であっても10分刻みで動きが激しければボラティリティは高い値をとります。
つまり流動性が高く、いい市場になっているといえます。


# データセットについて
(値はダミーになります)

## 教師データ

- time_id  
    時間id,名前は時間には関係ないので注意  
- stock_id  
    銘柄のid
- target  
    ボラティリティの値


|   |stock_id|time_id|  target   |
|--:|-------:|------:|----------:|
|  0|       0|      5|1|
|  1|       2|     11|2|
|  2|       19|     16|3|
|  3|       23|     31|4|
|  4|       10|     62|5|

## オーダーブックデータ

- time_id  
    時間id,名前は時間には関係ないので注意  
- seconds_in_bucket  
    秒数, 0から絶対始まる。動きがあると行が追加される。  
- bid_size1, bid_size2  
    競争力の高い買いの株式数  
    和訳が難しいが、現在価格に近い買い株式数の事  
- ask_size1, ask_size2  
    同様に売りの株式数  
- bid_price1, ask_price1, bid_price2, ask_price2   
    最小の買値/ 現在の価格と最小から２番目の買値/ 現在の価格  
    最大の売値 / 現在の価格と最大から2番目の売値 / 現在の価格  
- stock_id  
    銘柄のid
- wap(Weighted averaged price)  
    １秒単位の移動平均
- log_return  
    上で述べたLog return値

|   |time_id|seconds_in_bucket|    bid_price1    |    ask_price1    |    bid_price2    |    ask_price2    |bid_size1|ask_size1|bid_size2|ask_size2|stock_id|       wap        |      log_return       |
|--:|------:|----------------:|-----------------:|-----------------:|-----------------:|-----------------:|--------:|--------:|--------:|--------:|-------:|-----------------:|----------------------:|
|  1|      1|                6|18|18|18|129|        3|      10|        1|      100|       0|1| 0|
|  2|      2|                7|38|1|1|1|        3|      20|        2|      100|       0|14| 0|
|  3|      3|                8|4|18|18|1|        3|      30|        3|      100|       0|13|0|
|  4|      4|                7|508|18|18|0|        3|      40|        4|      100|       0|13| 0|
|  5|      5|               9|68|18|158|10|        3|      50|        5|      100|       0|14| 0|


## トレードデータ

- price  
    1秒間に取引が成立した平均価格。  
    価格は取引が成立した株式数と金額の平均値で加重平均を取ったもので正規化されている
- size  
    priceの価格でいくつの株式数が取引されたか  
- order_count  
    取引注文の数

|   |time_id|seconds_in_bucket|      price       |size|order_count|stock_id|
|--:|------:|----------------:|-----------------:|---:|----------:|-------:|
|  0|      1|               11|1| 100|         0|       0|
|  1|      2|               12|4| 200|          0|       10|
|  2|      3|               13|1| 300|          0|       20|
|  3|      4|               14|1| 400|          0|       30
|  4|      5|               15|1| 500|          10|       40|

# EDA

実際にコードがあった方がわかりやすいと思いますのでkaggleのカーネルのリンクを参照してください。
よければVoteしてくださるととてもやる気が出ます。
[https://www.kaggle.com/satoshimts/optiver-volatility-introduction](https://www.kaggle.com/satoshimts/optiver-volatility-introduction)

# 最後に

特徴量作成やモデル作成については現在取り組み中...
記事にする元気が出たら記事にするかもしれないです。