米国株式市場 将来株価予測 2位解法

先日終了した[米国株式市場 将来株価予測](https://comp.probspace.com/competitions/us_stock_price)で2位になった解法を紹介します。機械学習初心者＆ほぼ初コンペで試行錯誤の結果なため、内容に誤りがあるかもしれません。誤りに気付いた方はコメントで指摘頂けると嬉しいです。

# コンペティション概要
* 米国証券取引所の株価推移データを用いて、1週間後の株価を予測するアルゴリズムを開発する
* 2011/11/13～2019/11/17週の計419週間にわたる米国株データ（終値）をもとに、2019/11/24週の終値を予測する
* 外部データは使用不可
* モデルの予測性能は評価関数RMSLE(Root Mean Squared Logarithmic Error)で評価

# 解法
## 予測対象
株価（終値）そのものを予測するのは難しいため、対数化した株価の前週との差を予測することにしました。最終的にはトピックの[LightGBM Base line(LB=0.03781)](https://comp.probspace.com/competitions/us_stock_price/discussions/DT-SN-Posta3d47ae1bcea01c64bd5)と同じように差を標準化しました。

## モデル構成
次の9つのモデルを作り、結果をアンサンブルしました。ダウとNASDAQで値動きが違うことはわかっていたので、市場毎にモデルを分けています。例えばLightGBM_NYSEは全市場のデータを元に学習しますが、予測結果のうち利用するのはNYSEのもののみです。最後の層では4つのモデルの結果の市場毎の加重平均を取っています。

![StockPricePrediction.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337041/efa1eea2-6d88-f293-243b-9b96a5c5d2dc.png)

|No.|モデル|学習データセット|予測対象|
|:----|:----|:----|:----|
|1|LightGBM_ALL_1|NYSE, NASDAQ, AMEX|NYSE, NASDAQ, AMEX|
|2|LightGBM_ALL_2[^1]|NYSE, NASDAQ, AMEX|NYSE, NASDAQ, AMEX|
|3|LightGBM_NYSE|NYSE, NASDAQ, AMEX|NYSE|
|4|LightGBM_NASDAQ|NASDAQ|NASDAQ|
|5|LightGBM_AMEX|NASDAQ|AMEX|
|6|MLP_NYSE|NYSE, NASDAQ, AMEX|NYSE, NASDAQ, AMEX|
|7|MLP_NASDAQ&AMEX|NASDAQ, AMEX|-[^2]|
|8|ExtraTrees_NYSE&AMEX|NYSE|NYSE, AMEX|
|9|ExtraTrees_NASDAQ|NASDAQ|NASDAQ|![StockPricePrediction.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337041/b4350b8d-1508-8bac-703a-0b37cf7ad8ec.png)

## 特徴量
ベースとなる特徴量は[LightGBM Base line(LB=0.03781)](https://comp.probspace.com/competitions/us_stock_price/discussions/DT-SN-Posta3d47ae1bcea01c64bd5)と同じ以下のものです。このうち、セクター、業界、市場はターゲットエンコーディングしました。LightGBMではあえて欠損値はそのままとしました（MLPとExtraTreesでは欠損値補完しています）。

* ラグ特徴量（4週分）
* 52週単純移動平均とその標準偏差
* 上場年
* セクター
* 業界
* 市場
* 年
* 月
* 日
* 年初から何週目か

一部モデルにはこれ以外の特徴量も追加していますが、多くのモデルでは特徴量を追加した方がPublic LBのスコアが下がったため取りやめました。

|No.|モデル|特徴量|
|:----|:----|:----|
|1|LightGBM_ALL_1|ベース特徴量|
|2|LightGBM_ALL_2|ベース特徴量|
|3|LightGBM_NYSE|ベース特徴量|
|4|LightGBM_NASDAQ|ベース特徴量|
|5|LightGBM_AMEX|ベース特徴量|
|6|MLP_NYSE|ベース特徴量, Skew|
|7|MLP_NASDAQ&AMEX|ベース特徴量, 指数移動平均乖離率, ボラティリティ, Kurt, KST Oscillator, PCA, K-Means|
|8|ExtraTrees_NYSE&AMEX|ベース特徴量|
|9|ExtraTrees_NASDAQ|ベース特徴量|

## ハイパーパラメーター
Optuneを使い調整しました。コンペ終了1-2週間前はほぼパラメーター調整に時間を費やしていましたが、これによりかなりスコア向上した気がします（Public LBで0.00043ほどスコア向上）。

# ソースコード
コンペ終了後にリファクタリングしたものを[GitHub](https://github.com/shoji9x9/StockPricePrediction)で公開しています。

# 次回
~~今回のコンペでの気付き、学びを書く予定です。~~
[初めてデータ分析コンペに参加し得たこと](https://qiita.com/shoji9x9/items/3f28d5b63e7d37c92a36)を投稿しました。

# 参考にした記事
* [株式分析チュートリアル | 日本取引所グループ](https://japanexchangegroup.github.io/J-Quants-Tutorial/)
* [GBDTの仕組みと手順を図と具体例で直感的に理解する](https://www.acceluniverse.com/blog/developers/2019/12/gbdt.html)
* [GBDTのハイパーパラメータの意味を図で理解しつつチューニングを学ぶ](https://knknkn.hatenablog.com/entry/2021/06/29/125226)
* [RMSLE を最適化する小技](https://www.guruguru.science/competitions/13/discussions/cbb736e9-f0f7-4847-811e-fe038e8ed0e8/)
* [【随時更新】Kaggleテーブルデータコンペできっと役立つTipsまとめ](https://naotaka1128.hatenadiary.jp/entry/kaggle-compe-tips)
* [【時系列】時系列データ予測　予測手法マップ](https://qiita.com/sato235/items/48022d2bf023ecd5ceef)
* [決定木の予測値が天井や底に張り付いてしまう](https://itips.krsw.biz/decision-tree-predict-stable/)

[^1]: LightGBM_ALL_1との違いはrandom seedとハイパーパラメーターのみ
[^2]: スコアがよくなかったため、最終的にこのモデルは利用しないこととした