前回の記事では、ニュース記事の定量データ(写真の有無や文字数)に関するEDAとニュース公表後の個別銘柄の株価への影響について分析しました。
結果として、写真の有無やニュースの公表は株価へ影響がある可能性を示唆しました。
今回は個別銘柄のニュース(文章情報)から株価を予測する簡単なモデルを構築したので記事にまとめます。
結論としては、有用なモデルは構築できませんでした。その点をあらかじめご了承ください。
モデル概要
今回はコンペのチュートリアルで公開してある各ニュースのBERT特徴量をインプットとし、1営業日後、5営業日後、20営業日後の株価やその騰落を予測するモデルを構築します。
前回の記事でも記載しましたが、各ニュースに対するリターンの算出には注意が必要です。
一般的な取引時間は9:00~15:00である為、15:00以降に公表されたニュースと当日中の終値を関連付けてはいけないです。
今回は15:00以降に公表されたニュースは翌日の終値と関連付けることにします。
学習データは2020年1月1日~2020年12月31日、検証(テスト)データは2021年1月1日~3月31日としました。
本コンペで提供しているデータは2020年分までしか無かった為、検証用で利用したデータはJ-Quants APIから取得しました。
今回は簡単のため、ランダムフォレストの回帰・分類モデルを利用しました。
ラベルについては、回帰モデルの場合はリターンの値、分類モデルの場合はリターンの正負からバイナリに変換したものを利用します。
また、パラメータはデフォルト設定としております。
結果と評価
学習データに対する評価
まずは、学習データに対するデータの予測値と実測値をプロットしてみました。
結果は以下の通りです。
上段が回帰モデルの結果、下段が分類モデルの結果です。
回帰モデルについては、推定値と実測値の相関がかなり高く、正しくスコアリングできている様子が見られました。
一方で、分類モデルについても誤った数はごく僅かで、正しく分類できていそうです。
どちらも過学習の可能性は残されておりますが、学習データに関しては適度に学習できているように思えます。
検証(テスト)データに対する評価
次に検証データについて同様に行った結果が以下です。
学習データに対する結果とはかなり異なっております。
回帰モデルに関しては、相関関係がほとんど見られません。
ただ、予測値が高い場合、実際のリターンは0近辺に密集している特徴が見られました。
つまり、モデルの予測値が高い銘柄は投資対象から除外することで、リターンを生まないような銘柄を事前に除外できる可能性はあります。(本来のモデルの在り方と逆な気がしますが・・・)
これは、予測値が高くなるようなインパクトの大きいニュースは、既に株価に織り込まれているためかもしれないです。
分類モデルについては、的中した数は外した数より少ない(的中率は50%を下回っている)ことがわかります。
最後に分類モデルにおいてラベル付けされた各グループ(“0” or “1”)のリターンの平均について確認してみます。
結果は、以下の通りです。
5日後リターンはラベル”1”の方が高くなりましたが、他の期間については反対の結果となっております。また、各期間でリターンの差もあまりないです。
したがって、個別銘柄のニュースから将来のリターンの方向性(騰落)を予測するのは困難かもしれません。(他のモデルを利用すれば改善するのかもしれがないですが…。)
まとめ
今回はランダムフォレストを利用して、個別銘柄のニュースのBERT特徴量からダイレクトで将来の株価を予測するようなモデルを構築してみました。
結果としては、冒頭にも述べたように有用なモデルとはなりませんでした。
今回は簡単のためランダムフォレストを利用しましたが、他のモデルを利用すれば改善の余地があるのかもしれません。
しかし、ニュース情報をそのまま銘柄のリターンに紐づけるのはあまり向いていない気がしました。
チュートリアルでも紹介されておりましたが、学習データの量の観点なども踏まえると、個別銘柄単体を予測するのではなく、市場全体や業種別のインデックスを予測するのに利用すると良いのかもしれません。
各個別銘柄に関する十分なニュース情報があり、各銘柄ごとに予測モデルを構築でれば、個別銘柄のリターンを予測することができるのかもしれません。
ここまでの結果を踏まえて、次回はニュース情報と各業種の関係について分析してみたいと思います。(⇒次の記事)
(補足)APIでのデータ取得について
J-Quants APIでニュースデータを取得に若干苦労したので、フォーラムに質問しました。
いただいた回答のやり方で無事取得できたので、同じように困っている人は以下を参考にしてください。
実際に取得に利用したサンプルコードは、最下段の項目”ご参考”のget_recent_new_data_pblic.ipynbをご参照ください。
⇒ https://signate.jp/competitions/443/discussions/jpx-api-1
ご参考
今回の記事に関するプログラムはGithub(こちら)に公開ております。
【ipynb】
- NEWS_Classiffer_public.ipynb: 今回の記事に関するノートブック
- get_recent_news_data_public.ipynb:APIを利用したニュース取得
【src】
- SentimentGenerator_public.py:取得したニュースのBETR特徴量に変換する際に利用
【private】
- credentials_public.py:API利用時の設定ファイル(リフレッシュトークンを格納)
コメント