難易度:★★★★☆
本クエストでは株価の最高値、および最安値の変化率の予測にチャレンジしていただきます。 クエストの内容の大部分は、日本取引所グループ ファンダメンタルズ分析チャレンジに合わせて用意された株式分析チュートリアル(https://japanexchangegroup.github.io/J-Quants-Tutorial/)の2章をベースに作成しています。
ただし、本クエストで扱うデータの詳細や、金融に関連する知識や用語の詳しい説明は、本コンテンツ内では省略しています。これを確認したい場合は上記のチュートリアルをご参照ください。
監修
・株式会社日本取引所グループ:https://www.jpx.co.jp/
・AlpacaJapan株式会社:https://www.alpaca.ai/ja/index.html
データ提供
・株式会社QUICK:https://corporate.quick.co.jp/
Mission 1
ここでは与えられたデータを読み込み、確認する方法を学びます。データの規模感や欠損値の存在の有無を確認することが目的です。扱うデータは各銘柄の情報に関するデータ、各銘柄の株価情報(始値、高値、安値、終値)に関するデータ、各銘柄のファンダメンタル情報(決算数値データや配当データ等)に関するデータです。
なお、本クエストでは以下4種のデータを扱います。
stock_list:銘柄の情報に関するデータ
stock_price:株価情報に関するデータ
stock_fin:ファンダメンタル情報に関するデータ
stock_labels:目的変数情報に関するデータ
これらのデータは、株式分析チュートリアル(https://japanexchangegroup.github.io/J-Quants-Tutorial/)の「2.2. データセットの説明」に記載された同名のファイルと期間※を除いて同じ内容となっております。
このため、各ファイルの内容の詳細は上記チュートリアルを参照してください。
※本クエストではデータの期間を2019年1月初から2020年12月末に限定しております
ここではpandasというPythonのライブラリを用いて、csvファイルとして与えられたユーザーの行動履歴データを読み込む方法を学びます。
ここではpandasというPythonのライブラリを用いて、読み込んだデータの規模感やデータ型、そして欠損値の有無を確認します。
Mission 2
予測対象は、株価の最高値、最安値の変化率です。どのような要素が株価に影響を及ぼすのか、与えられたデータから特に影響を与える要素を明らかにすべく、ここでは探索的分析のやり方を学びます。
ここではpandasというPythonのライブラリを用いて、ファンダメンタル情報のデータをより詳細に分析します。
ここでは引き続きpandasというPythonのライブラリを用いて、株価情報のデータをより詳細に分析します。
Mission 3
ここでは、株価の最高値、最安値の変化率を予測するモデルを構築するための準備段階として、データの前処理を行います。データにはいくつか欠損値が確認されていましたが、欠損値はそのままにしておくと、モデル構築ができないため、適切に処理する必要があり、その方法を学びます。また、前の探索的分析の結果を受けて、モデルの予測精度に効くと思われる特徴量の生成方法についても学びます。
特徴量生成は、仮説を考え、その仮説をモデルが学ぶにはどのような特徴量が必要か、ということを想像することが重要です。
本クエストでは、「直近株価が上がったら、高値もより大きく変動しやすい」という仮説を立て、この仮説を基に特徴量を生成してみます。この仮説をモデルが学ぶためには直近株価が上がったことを示す特徴量が必要です。直近を仮に1ヶ月と仮定すると、20日リターンや20日移動平均乖離率などが候補になります。
また、この仮説が市場においても必ずしも正しいという必要はなく、仮説を思いついたら、その仮説を学ぶことができる特徴量を想像し、実際に実験してみることが重要です。
Mission 4
ここでは前のMissionで作成した特徴量を用いて株価の最高値と最安値の変化率を予測するモデルを構築します。特に時系列情報を含んだデータに対する学習、検証、評価用への分割の仕方やモデルの選択方法、精度評価の仕方を学びます。
モデル構築のステップは、以下の通りに行います。
1. 銘柄を一つ選ぶ
2. その銘柄に対して、ファンダメンタルズ情報及び株価情報から特徴量を作る
3. 全銘柄に対して同じことを繰り返す
4. 作成したデータを結合する
5. 全データを訓練データ、評価データ、テストデータに分ける
6. 訓練データで予測モデルを学習させる
なお、本クエストにおける訓練データ、評価データ、テストデータは次の期間で分割します。
訓練期間:2019-01-01 - 2019-12-31
評価期間:2020-02-01 - 2020-06-01
テスト期間:2020-07-01 - 2020-12-31
バックテストとは、モデルの有効性を検証する際に、過去のデータを用いて、一定期間にどの程度のパフォーマンスが得られたかをシミュレーションすることです。モデルの有効性を検証する上で、どのようにバックテストを実施するかは重要なポイントになります。
ここでは、まずはじめに特徴量をまとめて生成する関数を作ります、その後にバックテストを行うためのデータ分割に取り組みます。
データの準備が完了したので、いよいよモデルの学習を実行します。ここでは、sklearnライブラリのRandomForestRegressorモデルを使用します。モデルに設定する各種パラメータは、ここではとくに指定せずにライブラリのデフォルトパラメータを使用します。
RandomForestの回帰モデルであるRandomForestRegressorモデルを利用する理由は、予測する目的変数が連続値であるからです。RandomForestモデルは決定木をベースとするモデルであるため、以下の理由から最初に選択するモデルとして扱いやすいです。
- RandomForest内部で利用する決定木は、特徴量の大小関係のみに着目しており、値自体には意味がないので正規化処理の必要がありません
- 特徴量の重要度を取得することができ、次に実施することの道筋を立てやすい
最後に、複数種類の機械学習モデルの構築の取り組みます。
これまでに作成した RandomForestRegressor に加え、ExtraTreesRegressor、GradientBoostingRegressor によるモデルの学習と予測も合わせて行います。