初めてデータ分析コンペに参加し得たこと

[米国株式市場 将来株価予測 2位解法](https://qiita.com/shoji9x9/items/16d166a9ee9812069ae0)に書きましたが、ほぼ初めてデータ分析コンペに参加し2位となりました。この中で気付いたことや学びを書いていきます。

# コンペ参加前の状態
* コンペ参加経験ほぼなし。正確にはKaggleに2回ほど参加したことはあるものの、公開されたコードをフォーク＆実行する程度
* 2-3年前にディープラーニングは勉強していたが、その後は中断
* ディープラーニング以外の機械学習は本は読んでいたものの、コードを書いたことはほぼなかった
* Pandasもほぼ経験なし
* [Kaggleで勝つデータ分析の技術](https://www.amazon.co.jp/Kaggle%E3%81%A7%E5%8B%9D%E3%81%A4%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%81%AE%E6%8A%80%E8%A1%93-%E9%96%80%E8%84%87-%E5%A4%A7%E8%BC%94-ebook/dp/B07YTDBC3Z/ref=sr_1_1?adgrpid=109872001568&gclid=Cj0KCQiAnuGNBhCPARIsACbnLzr22tSgXRiCESm8ekoBw9FG7NjQgdC5AGvx75i6y0ptypwYpRwYYTgaAkNuEALw_wcB&hvadid=553921514572&hvdev=c&hvlocphy=1009461&hvnetw=g&hvqmt=e&hvrand=8016295391968444526&hvtargid=kwd-818170082585&hydadcr=27492_14478797&jp-ad-ap=0&keywords=kaggle%E3%81%A7%E5%8B%9D%E3%81%A4%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%81%AE%E6%8A%80%E8%A1%93&qid=1639528967&sr=8-1)は発売直後に読んだ
* 1年前くらいから日常的に株式投資をしている

# コンペに取り組んだ環境
* Google Colabでコードを書いて実行
* 各種データはGoogle Driveで管理
* コンペに使える時間は豊富（現在無職なため）

# コンペを経験し得たこと
以下、コンペを経験し学んだことなどを書いていきます。経験のある方にとっては当たり前のことばかりとは思いますが、どなたかの役に立てれば幸いです。

## 株価そのものではなく、前週との株価の差を予測する（定常性を意識する）
[非定常な時系列データを変換して定常性を持たせる解析](https://ai-trend.jp/basic-study/time-series-analysis/transformation/)に書かれていますが、非定常な株価を予測するのは難しく、差分変換や対数差分変換を行い定常性のあるものを予測するのがいいということを初めて知りました。

[株式分析チュートリアル](https://japanexchangegroup.github.io/J-Quants-Tutorial/#anchor-2.7)の`2.7.2. 定常性を意識した特徴量設計`には特徴量にも定常性を意識すべきだと書かれており、[日本取引所グループ ファンダメンタルズ分析チャレンジ 暫定1位解法](https://speakerdeck.com/m_mochizuki/the-provisional-1st-place-solution-of-jpx-fundamentals-analysis-challenge-on-signate)でも定常性が強調されています。今後、時系列データを分析する際には必須のノウハウだと思いました。

## 信頼できる検証データセットの大切さ
[Tips for data science competitions](https://www.slideshare.net/OwenZhang2/tips-for-data-science-competitions)に`Good Validation is MORE IMPORTANT than Good Model.`と書かれているのですが、本当にその通りだと実感しました。

コンペ中盤で特徴量を色々と試しているときには、手元でのスコアは向上したのにPublic LBのスコアは下がることがあり、何を信じればいいのかわからなくなっていました。なので、信頼できる（Public LBのスコアと相関する）検証データセットのスコアを早めに見つけ、以降はそれを信じてモデルや特徴量を改善していくのがいいと思っています。

ちなみに例えば今回のコンペで作成したLightGBM_NYSEは、NYSEのスコアが最もよくなるような特徴量選択、ハイパーパラメーターチューニングをしています。

## LightGBM優秀！
今回のコンペでは、最終的に4つのモデルのアンサンブルを行いましたが、その中でLightGBMのモデルが単体では最もスコアがよかったです。さらに他のExtraTreesやMLPと比較し、メモリ使用量が少ない、学習時間が短い、欠損値をそのまま扱える、スケーリング不要といったメリットがあり「初手LightGBM」は間違いないと感じました。

## ソースコード管理の大切さ
今回のコンペでは、自身にノウハウがない中、時間だけはあったので色々なアイディアを試したのですが、その結果どのコードがどんな特徴を持っているのかや、その結果（スコア）がよかったのかなど管理しきれず混乱することもありました。次回は管理方法を決めた上でコンペに取り組もうと思います。

## 思考は止めてもサーバーは止めるな！
コンペ最終盤は主にハイパーパラメーターチューニングを昼夜問わず行っていました（他にスコア改善する方法も思いつかなかったので）。これによりスコア改善しましたので、格言？は偉大です。OptunaであればチューニングログをSQLiteに吐き出してくれるので、Google Colabのランタイムがリセットされてもチューニング再開できて便利です。

今回はできなかったのですが、特徴量追加→学習→評価のループも自動化できれば、より効率的にトライアルできそうです。

## 再現性の大切さ（乱数固定）
これまでも乱数固定は意識してきたつもりでしたが、今回のコンペではMLPの乱数固定に苦労しました（というか、今でもGoogle Colabのランタイムがリセットされるとスコアが変わってしまう）。当たり前ですが、乱数の影響でスコアが変わってしまうと、特徴量追加やハイパーパラメーター変更がプラスに働いたのかどうか確認することが難しくなります。MLPの乱数固定は今後の自分の課題です。

## Pandasを使えるようになった
今回のコンペを通じて一番成長したのはPandasのスキルかもしれません。試行錯誤したからかコンペ序盤はリファレンスを見ながら書いていたPandasのコードを、コンペ終盤には何も見なくても書けるようになりました。scikit-learnやMatplotlibはもう少し経験が必要そうです。

# 今回のコンペで取り組んだこと諸々（備忘録）
今回のコンペで取り組んだこと諸々を備忘録代わりに書きます（かなり細かいです）。

## PyCaret
初めて[PyCaret](https://pycaret.org/)を知り使ってみたのですが、コンペ序盤にモデル選択するときには有効かもしれません。今回のコンペでアンサンブル対象にExtraTreesを選択したのはPyCaretでExtraTreesのスコアが高かったからです。

## 価格の相対化
例えば、ある銘柄の価格が前週から1%上がっていたとしても、市場平均が2%上がっているのだとすると、その銘柄は相対的には弱いということになります。これを表現するために、`各銘柄の前週との差 - 市場平均の前週との差`を利用してみたのですが、残念ながらスコアは悪くなってしまいました。

## セクターの利用
ある銘柄は市場の値動きに追従する以上に、セクターの値動きに追従すると考え、特徴量にセクター平均価格の差などを追加したのですが、スコアは悪くなってしまいました。ひょっとすると、セクター毎にモデルを作るとスコア改善するかもしれません。

## スタッキング
9つのモデルのoofを利用しスタッキングしたのですが、加重平均よりもスコアが悪かったので採用しませんでした。

## Permutation Importance
permutation_importanceでマイナスのスコアの特徴量を削除していたのですが、一向にスコアが改善しませんでした。よく見たら評価関数がneg_root_mean_squared_errorだったので、プラスのスコアを出している特徴量を削除しないといけなかった・・・。

## t-SNE
bhtsneを使ってみたものの、Google Colabではタイムアウト（メモリ超過だったかも）となってしまい、動かせませんでした。

# 次のステップ
## データ分析し、確度を高めてからコードに落とし込む
今回のコンペでは時間があったこともあり、行き当たりばったりなトライアルを繰り返していましたが、今後限られた時間の中でいい順位を狙おうと思うと、やはり事前のデータ分析や考察が重要だと思いますので、これに取り組みたいです。

# より効率的なトライアル
自動化や資産（ソースコード含む）管理を工夫し、自分の手を動かさない時間にトライアルを進められるようにしたいです。