株価予測の入り口に立ってみた

金融データ解析

ども、Makです。さて、最近はなかなか更新できない日が続いており、更新を楽しみにしてくださっている方々には申し訳ない気持ちでいっぱいでした!これからは心を入れ替えて(何度目のセリフでしょうか・・・)更新をしていきたいと思いますので、引き続き皆様方の暖かいご支援を何卒宜しくお願い申し上げます。。

で、気がつけば本ブログも公開記事が100本に達しておりました。年初から目標としておりました120記事まで気がつけば秒読み、マラソンで言えば残り1kmを切っていよいよラストスパートか、といった所ですがどうしたのでしょうか。更新が全くできておりません。ゴールを確信した安心感と驕りから来る気の緩みなのか。それともお酒の飲みすぎで頭のネジまで緩み始めたのでありましょうか。とにかく早急に立て直しが必要と判断しましたので、近日中に対策案をブログに反映させていきたいです。

で、今日は少し変わったトピックに取り組んでみましたので、現段階でのご報告です。

株価予測の難しさ

自分がベッドに横たわりながらポテトチップスをつまんでいる間に、自分の分身がバリバリと働き、株やFXでしっかりと稼いでくれる明るい未来・・・。不労所得万歳。ニート万歳。

誰もが(?)一度は憧れる夢だとは思いますが、実際のところ今まで数多くの猛者たちがこの株価予測の研究に挑戦し、その壁の高さの前に弾き返されて来ました。実際様々な要因により、株価予測は非常に難しいことが分かっています。一例を挙げると、

  • 金融市場に参加しているプレーヤーに大きな多様性があり、それぞれがそれぞれの思惑により株取引を行っている。
    (海外の投資家v.s.国内の投資家、個人投資家v.s.機関投資家、などなど)
  • 株価がどのタイミングでどの程度の情報を織り込んでいるのかが不明。
    (最近は自動化が進んでいるため、情報公開から株価反映までの時間が非常に短くなっていると考えられる)
  • 世界経済や為替などのマクロ要因の影響も受ける他、競合他社など外部要因も複雑に絡み合い、株価が形成されると考えられる。
  • 上述のように諸々のファクターが複雑に組み合わさるため、モデルの評価が難しい(シミュレーションを行う仮想株式市場を作る研究もあるが制約が多い。また、機械学習モデルとしての精度が良くても、バックテストにおけるPLとは一致しない)。どの指標で評価を行うべきか。

などなど、株価予測の難しさの原因は考えだすとキリがないほどです。
とはいえ、例え登る山がどんなに険しく見えようとも、登ってみて初めて見えてくる景色もあるはず・・・ということで、とりあえず、登り始めてみよう!というのが今回の記事になります・・・。

TOPIXの予測

データの分割

さて、ゆくゆくは個別株の予測につなげていきたい思惑はあるのですが、データを用意するのが面倒なので、まずはサクッと集められるデータで試してみます。ここではTOPIXを扱ってみます。TOPIX(東証株価指数)とは、東証市場第一部に上場する内国普通株式全銘柄を対象とする株価指数です。 データはこちらから頂きました。

TOPIX 過去のレート - Investing.com
TOPIXの過去のデータを無料で入手できます。始値、終値、安値、高値などを始め取引に役立つ情報を日付単位で取得できます。ダウンロード可能。

ここで、今回はお試しですので適当に、過去10年間分のデータを使用することとします。
PythonのDataFrameで読み込み後、DataTypeなどを調整したものが以下のようになります。


(Changeは前日比を示します)

上記、変換後のデータはこちらからご自由にお使いください。
(注:このCSVファイルはExcelで保存してしまったため、日付形式がおかしなことになっておりますので、以下のように取り込んでください)

上記DataFrameをプロットするとこんな感じ。

上昇トレンドが見られますね。

さて、ここでトレーニングデータとテストデータに分けてしまいます。
時系列データは下手をすると「時を駆ける少女」のように未来と過去を飛び越えていたりする危険性があり、何かと気を遣うことが多いので、最初にデータをスパッと分けてしまいます。
2011-08-17〜2017-06-13 : トレーニングデータ
2017-06-14〜2019-06-14:テストデータ

としました。下図で青線部がトレーニングデータ。オレンジ部がテストデータとなります。

さて、ここで見るからにトレンドの違いが問題となりそうです。
青線部分では上昇トレンドですが、オレンジ部分ではやや下降トレンド。
まーモデルの汎用性を見るには良いデータではないでしょうか。。

データの前処理

ここは本来めちゃくちゃ重要と思われますが、今回は色々検証する時間がありません。。
ですので普通に標準化を行います。標準化とは、データを平均0、分散1となるように調整することですね。これにより学習を行いやすくすることができます。ここもsklearnでサクッと。

TOPIXの予測を行う上で、トレーニング時の平均・分散をテスト時にもそのまま適用して良いのか?は考える余地がありますが、今回は全く考慮しません。てへぺろ。

学習用データセットの作成

ここではどのように学習を行うか考えます。と言いつつあまり考えません。
「ある日のX日後のTOPIXの上昇・下降は、過去Y日の変動パターンから予測可能」という大胆な仮定をおきます。マルコフさんもビックリ。開いた口が塞がらないってやつでしょう。

取り敢えずは決め打ちで、X=10, Y=1とします。つまり、過去10日間のTOPIXデータから、1日後のTOPIXの上昇・下降を予測するタスクとしてみました。以下のようにデータセットを作成します。もっと良い書き方がありそう・・・

モデル選択

「とにかく、ワシは今、結果が欲しいのじゃよ。結果が。」
という心の声に素直に耳を傾け、ここも究極に手を抜きます。みんな大好きsklearnをフル活用。

御察しの通り、ハイパーパラメータのチューニングは一切行っておりません。。

で、ここは恐らく環境により差異が出るところとは思いますが、自分が今回実験した環境では以下のようになりました。

サイコロ降って決めた方が良いんじゃないか?という結果です(笑)
まぁ、パラメータチューニングで多少向上する可能性もありますが、まだその段階でも無さそうですね。。

回帰問題ではなく分類問題として解く

で、取り敢えずは結果を出してみたわけですが、今回「過去10日間のTOPIXを元に、翌日のTOPIX増減を求める」という問題設定に対して、「分類問題」ではなく「回帰問題」として解いていました。理由は、分類問題とすると、せっかくの正解値を離散値に丸めてしまうために、情報量が落ちると考えたためです。直感的には回帰問題の方が離散値への丸め込みがない分、学習時に無駄がないように思えた訳です。

では同じ問題設定に対して、回帰問題ではなく分類問題で解くとどうなるか?を試してみました。変更箇所は2箇所で、データセットのラベル作成部分と、モデル選択部分ですね。

これで試してみると、以下のような結果となりました。

あれ・・・下がると予想した結果が、むしろ精度が向上している。。
もちろん最もよかったモデルはBoostingベースなので、「たまたま」の可能性も捨て切れませんが。。直感と異なる結果が出るのはいつでも面白いものですが、少し気になった結果でした。

今日はここまでとします。

コメント

タイトルとURLをコピーしました