ストックドッグ

KatoTakahiro。金融系の会社で働くSEが株やPython、その他諸々について書いています。サービスも運営してます→http://fmbrain.work

1月の株価予測を1月頭に出すのは無理

月始めに予測を出さればそれがベストだが...

1月の予測を1月1日に出せれば、シンプルでわかりやすいのですが。

さすがにそれは無理っぽいです。

12月のデータ自体揃うのが、1月の早くても初旬あたりだからです。

データによっては、集計に時間かかったりするんでしょうね。

マンション契約率(首都圏)はなかなか説明変数として機能していたんですが、データの発表が次月の中旬頃なんですよね!おそーい!

断腸の思いでマンション契約率は説明変数から外すことにするのですが、中には外せないものもあります。

米国の非農業部門雇用者数は絶対に外せません。

ただ、非農業部門雇用者数の発表は次月の第一金曜日なので、月の頭には間に合いません。

基準日を設けることにしました

月頭に株価予測は出せないので、例えば1月10日に基準日を設けて、基準日から1ヶ月後の株価を予測する形にしたいと思います。

重要なデータは、10日ほど待てばたいていは出揃います。

これが仕様変更ってやつか

SIerで働く人からしたら聞きたくないワードダントツの一位、仕様変更。

これがまさに仕様変更ってやつですね。

2位は404:File Not Foundあたり?

基準日バージョンに変えるために、もう一度コードを見なおさないといけません。

予測精度も変わるはず...

あぁ、本当に面倒くさいです仕様変更。

今春からたくさん聞くことになるであろう仕様変更、早めに慣れておくとします。


1月10日あたりに今月の株価予測を出せればうれしい

あくまでも予定ですが、1月10日頃に今月の株価予測を出したいです。

トラブらなければ...ですが...

Prediction -人工知能による株価の予測- というサービスをリリースしました

Prediction -人工知能による株価の予測-

↓WebサイトURL
https://stockdogi.herokuapp.com/index



どんなサービス?

1ヶ月後の株価を予測し、その結果を掲載しています。

現在、掲載しているのは12月分の予測結果です。

現地点(2016/12/29大引け後)では、全263銘柄中53.44%の予測が的中しています。


予測は、上昇or下落の2択で行っています。

上がり幅、下がり幅は予測していません。

あくまでも1ヶ月後に上昇するのか、あるいは下落するのか、です。

予測方法

Webサイトに訪問していただければ詳しくのっているので、ここでは簡単に。

色々なデータ(株価・経済指標・為替)をだいたい100項目ほど集めてきて、それらのデータの過去4年間を分析しています。

この分析結果から12月の株価を予測しています。

この形で予測し、過去6ヶ月分シミュレーションを行いました。

予測月 予測精度
11月 45.25%
10月 61.30%
9月 54.40%
8月 62.60%
7月 57.47%
6月 54.41%

予測精度は、平均したらだいたい55%くらいあります。

11月の予測精度が悪いのは、おそらく大統領選挙の影響が大きいと思います。

大統領選挙に関するデータは分析していないので完全に「予期せぬ出来事」です。

やはりこういった「予期せぬ出来事」があれば、極端に予測精度が下がるみたいです。

こういった「予期せぬ出来事」が発生しないよう、幅広いデータを使用しているのですが、全てを網羅するのは簡単じゃないですね。

6月にはブレクジットもあったと思いますが、ユーロやポンドなんかが6月末時点で反応していたので、そこらへんをうまく拾えたので予測精度も悪くなっていないのかなぁと思います。

かなりビビってる

HPがBootstrap臭いので、お察しだとは思いますが、本格的なWebサービスを作るのはこれが初めてです。

なので、右も左もわからず至らない点が多いと思います。

もし何かあればご指摘よろしくお願いします。


正直、エラー対処できる自信がなくheroku側でエラーとか落ちたらどうしようとかかなりビビってます。

また、そもそも予測するのに使っているコードのほうにプログラミングミスがあったらどうしよう、とかにもビビりまくってます。

何回も何回も見直しましたが、プログラミングミスって自分じゃあ見つけにくくて、人から指摘されたり、あとから気づいたりすることのほうが多いので。

アクセスそんなになかったら問題ないですが(悲


ただ、アクセスそんなになくても、少なからず見てもらえる人はいるので、URL発行してWebサイトとしてリリースするからにはちゃんとしたいな、という気持ちが大きくて。

多くの困難を乗り越えて...

リリースまでに本当に多くの困難がありました。

11月12月は睡眠時間以外のほとんどがPCとにらめっこっす。

視力たぶん落ちました。

もう本当にやっとの思いって感じです。

今は疲れているので多くは書きませんが...笑


ぜひ、Prediction -人工知能による株価の予測-にアクセスしてみてください。

https://stockdogi.herokuapp.com/index


ご指摘もお待ちしております。

※herokuの無料枠で運用しているので、アクセスに時間がかかるかもしれません。

交差検証法の罠

【結論】交差検証法はモデル性能を完璧に測ることはできない

交差検証法で出るモデル性能と未知データを与えた時のモデル性能差がありすぎて悩んだ話です。

考えると当たり前っちゃ当たり前なのですが...


あるモデルを作ったのですが、交差検証法ではある程度満足の行く結果が出ました。

しかし、未知データを与えると途端にモデル性能が悪くなり、使い物になりませんでした。

な〜ぜ〜?

まずは交差検証法とは

交差検証 - Wikipedia

自分なりに説明しようかと5秒だけ悩みましたがやめました。

なぜ交差検証法では完璧に測ることができないのか

交差検証法の手法からすると、テストデータとトレーニングにわけるので、モデルからするとテストデータは未知データとなります。

そうやって検証を行うので、テストデータにもトレーニングデータにも含まれていない完全な未知データを与えたとしても、交差検証法で出たモデル性能の結果と大きくは乖離しないと私は考えていました。

しかし、ここに盲点。

もし、与えた未知データがテストデータにもトレーニングデータにも含まれない特徴を持っていたらどうなるでしょう。


モデルはトレーニングデータから傾向を学習し、モデルを生成します。

もし、トレーニングデータに含まれない特徴を持った未知データが現れたらもちろん、モデルは対応できるわけがありません。


これが交差検証法で出るモデル性能と未知データを与えた時のモデル性能差が出る理由です。

まとめ

交差検証法が機能するのは、トレーニングデータと未知データ同士が似た特徴を持っている場合のみですね。

ほぼ全ての特徴を網羅したトレーニングデータをモデルに与えるのがやはり重要みたいですね。

終わり!

銘柄によって予測精度が異なるようだ

目次

前回の記事の訂正

doz13189.hatenablog.com

前に60%の正答率の株価予測システムでけた〜っと喜んでいたのですが、どうやら糠喜びっぽかったです。

検証を重ねたり、プログラムのミスを見つけたり、いろいろしていると52〜54%あたりに収束していきました。


さすがに60%は怪しいなっ、って思っていたのですがやっぱりでした。

はしゃいでどうもすみませんでした。



ただ予測精度は下がったものの、50%は超えているので少しホッとしています。

(まぁ、またミスが見つかるかもしれませんがね!涙)


どうも論文なんかを漁っていると、いろいろな予測方法がありますがだいたい52%前後の予測精度が多いような気がします。

なので、結果としてはわりと妥当なラインなのかなぁと感じております。


business.nikkeibp.co.jp

この記事はちょっと飛び抜けてますが...

けっこうこの記事参考にしたんですが、さすがに7割には届きそうもありませんというより5割の壁をやっとの思いで超えた自分には想像もできない領域っす。


では今日の本題へ。

どうやら銘柄によって予測精度が異なりそう

決定木を使った株価予測の話です。

考えてみるとまぁ違うわな、と納得感のある結果ではありますが。

説明します。


決定木なので目的変数と説明変数があります。

株価予測をする際に目的変数は、株価の変動指数にしています。

前日より+5%や-3%とかとかです。

決定木は2値が扱いやすいので、もし変動指数がプラスだったら1に変換して、もしマイナスだったら0に変換しています。


問題は説明変数です。

説明変数は30個くらい用意しているんですね。(今自分で数えてびっくり、多いですね笑)

株価に影響を与えそうな指標なんかをごっそりと自分で集めてきているのですが、例えばTopixドル円レート、他にも新発10年国債利回りやマンション契約率(首都圏)などなどです。

ちょっとピンってきますよね。

Topixドル円レートなんかは、どの銘柄にも適した説明変数になっています。

マンション契約率(首都圏)や新発10年国債利回りなどは、全ての銘柄に適した説明変数かと言われるとそうではなさそうですね。

自分で説明変数は選んできたので、けっこう変化球的な指標も選んでいます。

他にもマネタリーベースとか。

きっとこれらが原因で、予測しやすい銘柄とそうではない銘柄にわかれたのだと思います。


識別コードごとに予測するとはっきりとでています。

識別コード:1000〜1999

対象銘柄:[1605, 1928, 1801, 1925, 1812, 1802, 1963, 1803, 1808, 1332, 1893]

予測月 予測精度
2016/10 0.497
2016/9 0.495
2016/8 0.494
2016/7 0.489
2016/6 0.503
2016/5 0.511
2016/4 0.505
2016/3 0.528
2016/2 0.517

識別コード:3000〜3999

対象銘柄:[3092, 3436, 3402, 3064, 3099, 3407, 3659, 3778, 3401, 3405, 3086, 3103, 3668, 3116, 3289, 3626, 3632, 3861, 3193]

予測月 予測精度
2016/10 0.542
2016/9 0.553
2016/8 0.560
2016/7 0.552
2016/6 0.544
2016/5 0.537
2016/4 0.542
2016/3 0.530
2016/2 0.559

予測月というのは、2016年10月以前のデータを使って、2016年10月の株価を予測しています。

識別コード1000〜1999の2016/10は、49.7%の確率で予測が当たっているという意味になります。

※前回までの記事だと日毎で予測していたのですが、どう考えても実用性が低いので月ごとに予測する仕様に変更しました


1000〜1999の識別コードの予測精度は低すぎです。

平均するとおそらく50ちょい。

たしか1000番台は内需系が多かったと思います。

大林組(業界最大手)や日本水産(冷凍食品大手だった気がする)などです。

説明変数を見直すと、内需系には効きにくいものが多いかなぁという気がしないでもないです。


3000〜3999の識別コードの予測精度は相対的に高かったです。

平均すると、55〜54%はありそうです。

3000番台って何系の会社が多いんだろう...さくらインターネットなんかは3000番台だった気がするから情報系?わからない。

3000番台って見知らぬ会社が多いイメージしかない。

なんで3000番台の予測精度が高いのかはちょっとわからねぇ。


テーブルを作るのがめんどうなので、もう載せませんが4000番台もけっこう精度が良かったです。

自分の中で、銀行系に関する説明変数を選んできたつもりだったので、8000番台は良い数字がでるかなぁと思ったのですが、残念、1000番台と同じような結果でした。(これがすごく意外)


思っていたよりも、はっきりと銘柄によって予測の精度が異なりました。

集めてきた説明変数を見ると、納得感ある結果ではあるんですがびっくりです。

やっぱり説明変数の選択が大事

予測するにあたって、やっぱり説明変数が予測精度に直結します。

当たり前っちゃ当たり前なのですが。

決定木の深さや葉の数などなどチューニングなんかをやるよりも、俄然、良い説明変数を見つけてくるほうが予測精度が上がります。

例えば、topixを説明変数に入れるのと入れないのとでは、体感ですが0.5%くらい予測精度が上がったように思います。


予測手法もSVMやら回帰やらいろいろありますが、どの手法を使おうかで悩むよりかは、いろんな説明変数をぶちこんで試してみたほうがいい結果がでるような気がします。

もちろん、手法も大事ですがね。

最近はもっぱらネットサーフィン(死語)しながら良いデータないかなぁって探したり、CiNii行って株価系の論文漁ったりして、良い説明変数になりそうなデータを探しています。

良い説明変数が見つかれば、予測精度7割に届いちゃったりするのだろうか。

正答率53%の株価予測システムできた

f:id:doz13189:20161207215442p:plain

目次

釣りタイトルじゃあありません

ただ先に謝っておきますが、60%はちょっとだけ盛ったかもしれない。ちょっとだけ...

【訂正】

だいぶ盛ってました。

51%〜54%あたりに収束していきました。

タイトルは訂正後です。

前回までのあらすじ

doz13189.hatenablog.com

doz13189.hatenablog.com

上2つの記事をざっくりまとめると、機械学習(決定木)で明日上がる株価と下がる株価の分類をしようとして失敗したという苦悩の日々がつづってあります。

失敗してるんで別に読まなくてもいいっす(はなほじ)

ただ、決定木のロジックなんかはちょっとだけ詳しく書いているので、気になる方はどうぞ。


そして、前回までやってきたことを見直して試行錯誤したのが今回です。

結果を先に発表!

検証したのは、2016年11月22日、2016年11月21日、2016年11月18日、2015年12月30日の4日間です。(一日一日の検証に時間がかかりすぎるため、スパコンくれたら100日分くらい検証します)

対象銘柄

8306, 8411, 8591, 7012, 8058, 7201, 8604, 6301, 6501, 7267, 4528, 4755, 9437, 8750, 6502, 7011, 4043, 4503, 5411, 7751, 2685, 6752, 4689, 7261, 6770, 8801, 8031, 8802, 5401, 3092, 4568, 3436, 9501, 7013, 1605, 7897, 6503, 3402, 8113, 6702, 6326, 9201, 8001, 8304, 1928, 5713, 2503, 9531, 8308, 7752, 1801, 2579, 8601, 7272, 4005, 5938, 8830, 1925, 3064, 5802, 4041, 8795, 4188, 5020, 6857, 8725, 4346, 4912, 5233, 8729, 8267, 4911, 6619, 4183, 8053, 9532, 7731, 6952, 6361, 6479, 7202, 8355, 9202, 8358, 5406, 3099, 9962, 3407, 9502, 4506, 8697, 8630, 3659, 3778, 1812, 4042, 1802, 8002, 2802, 3401, 6644, 3405, 6305, 5201, 1963, 9101, 9503, 6724, 2871, 7167, 7182, 1803, 3086, 6701, 4185, 9062, 4536, 4508, 6178, 2371, 3103, 6432, 6471, 5105, 9507, 6481, 6460, 8354, 9104, 2212, 5714, 6448, 5801, 7211, 9508, 9697, 5334, 8303, 6506, 1808, 8331, 5706, 8252, 8015, 6302, 6756, 9513, 3668, 2282, 6268, 8586, 4004, 5110, 4217, 8570, 3116, 5711, 9064, 5333, 4088, 9008, 8233, 8410, 6473, 6976, 5803, 5486, 4202, 3289, 1332, 5101, 6472, 8515, 9005, 7186, 6841, 9404, 6113, 2580, 7205, 4204, 3626, 6366, 7282, 8334, 9024, 9006, 7912, 5214, 3632, 9506, 4208, 7240, 8086, 2002, 2264, 2181, 8473, 8848, 4845, 8572, 4902, 5012, 7606, 6740, 7003, 6504, 3861, 6995, 7550, 2193, 9831, 6103, 4182, 6755, 5707, 7732, 9107, 2811, 6141, 3193, 1893, 8369, 4321, 9045, 7911, 4151, 6383, 4613, 9041, 4974

この200近い銘柄を対象にしており、ほぼすべて銘柄を予測しています。

結構な銘柄数になるので母数が大きい分、4回しか検証はやっていませんが、ある程度の信頼性はあると思います。

作ったシステムはこんな形で予測を出力します。

code predict real
8306 Down Down
8411 - Down
8591 Up Up
8058 Down Up

※predictがシステムが出した予測
※realが実際に株価がUpしたかDownしたか

このUpとUp、あるいはDownとDownが一致すれば予測が当たったということになります。

予測は2値で行われるので、適当にやっても50%は当たるはずです。

なので、50%を超えた分がシステムの実力ということになりますね。

では、結果。

期間 正答率
2016年11月22日 56.43%
2016年11月21日 58.04%
2016年11月18日 62.43%
2015年12月30日 57.69%

おぉぉぉ、前回とはまるで違う!

40%台がない!良いじゃないか。

検証した4日間中、3回が50後半、1回だけ60超えと安定して60前後だったので、検証を重ねてこれより大きく正答率が下がるとは思いたくないです。思いにくいです。

これは正答率60%の株価予測システムできてしまったのではないだろうか。

どうやって予測したのか

使用しているのは、あいも変わらず決定木です。

勉強しているうちにどうやら決定木のこと好きになってもうたみたいやわ。

なんてことはないのですが、単純に決定木のロジックで株価が予測できる見立てがあったので決定木を使用しました。


ざっくりとシステムの中身のプロセスを説明すると...

  1. 現在の相場と似た相場を過去の株価データから探してくる
  2. 発見した似た相場をよーく見て観察する
  3. 観察してわかったことを教師データとして、決定木に学習させる
  4. もうひとつ、似た相場がその後どうなったか(上昇or下落)も合わせて教師データとして、決定期に学習させる
  5. 学習したことを踏まえて、現在の相場を見た時明日上昇するのか、下落するのかを予測する


そもそも株価って、長い目で見ると繰り返しだと私は思っています。

上がって下がって、上がって下がって、そうやって何回もうねりながら株価を形成しています。

途中、何かの出来事でイレギュラーは起こるかもしれません。(例えば、米国大統領選挙など)

起こったとしても、長い目で見るとそれは小さな出来事であって、大きな流れを変えるものにはたいてい成り得ません。


ということは、繰り返してきている株価の歴史を見たら、必ず現在と似た相場があるということです。

ここで仮説が立てられます。


仮説:現在の相場と似た相場は高確率で同じ結果になる

yahoo!ファイナンスの株価予想のページに何度か、過去の相場を参考に株価を予想しているアナリストを見たことがありました。

その人はたしか「過去、似たような相場では69%の確率で下落しています」

こんな形での予想だったと思います。

このアナリストは、下落する確率を出して終わっていますが、今回のシステムでは、似たような相場を見て、現在の相場は上がるのか、下がるのか、までを予測しています。

すごくざっくりですが、実際にこのような流れで予測をしています。

この仮説が正しいのかどうかは検証結果を見る限りでは、正しいと見ていいと思います。

この結果どう向き合う

システムがはじき出すには上等な数値。(だと私は思っています。)

かと言って、全面的に信頼できるかというと私はNoです。

全面的に信頼というのは、このシステムがはじき出した結果に従順に取引をするということです。


システムのロジックを見る限り、私の中ではおおかた予測できること自体が予測通りですし、決定木はホワイトボックスなので中身の処理を見ても、思い描いたとおりでした。

ただ、ロジックを見ているからこそ、こういう時は予測しづらいだろうな、というのもわかります。


まだまだ、すべてを相場を網羅したシステムは作れません。

足りていないところはやはり人間の手で補う必要があると私は考えています。

なので、現状ではこのシステムがはじき出した解の中から自分も同意できる銘柄に買いを入れる、準裁量スタイルが適切かと思います。

つまり、システムと一緒に銘柄を選ぼうということです。


前回の記事でも言いましたが、将棋で一番強いのは人間でも機械でもありません。

人間と機械が力を合わせたフリースタイルです。

人間と機械が足りていないところをうまく補い合い、向き合っていくことが今の時代は適切なんだと思います。


もう少したてば、機械に全部任しちゃっていい時代が来ると思いますけどねっ。

終わり

【訂正】

検証を重ねると、だいたい51%〜54%あたりに収束していきました。

ちなみに似た相場は同じ結果になるという仮説も、検証を行ったところ同じ結果にはなっていなさそうでした。

詳しく検証していないのでなんとも言えませんが。


【続き】

doz13189.hatenablog.com

〜更新〜

株価予測のサービスをリリースしました。

doz13189.hatenablog.com

君、過学習してるね...

目次

前回までのあらすじ

doz13189.hatenablog.com

決定木を使って、明日上がる株価と下がる株価の分類を試みました。

その時、作ったシステムで株価の予測をしたら一回目が53%で、ええやん!ってなったのですが、2回目、3回目と検証を続けると48%、49%と50%を下回る結果に...

っとここまでが前回のあらすじ。

その後、ちゃんと検証をやろうってなったのが今回です。

なんかおかしくない?

検証結果を見て思ったんです。

ちなみにこれが検証結果です。

モデル 正答率
20日モデル 50.69%
40日モデル 49.98%
60日モデル 49.13%
80日モデル 50.26%
100日モデル 50.32%
120日モデル 48.13%
140日モデル 46.76%
160日モデル 52.20%
180日モデル 49.23%

過去何日間を学習させたかによってモデルを分けて、予測をさしています。

例えば、20日モデルは過去20日を学習して、次の日の株価を予測しています。

これで100日分検証を行い、出た正答率の平均値を正答率として出しています。


モデルが出す予測は、上昇だったら1、下落だったら0なんです。

つまり、基本的に適当にやっても50%は当たるはずなんですね。


この正答率を見たらピンっときますね。

「君、適当にやってるな?」

このモデル何も学習できずに適当に上昇!下落!と叫んでいるだけなのではないだろうか。

いや、適当ではない!

バックテストでは結果が出るんです。

正答率70%、80%とポンポンいい数値が出るんです!


これってもしかして。

もしかして。

君、過学習してるね...

決定木のいいところはホワイトボックスです。

中身でどういった処理をしているのか、人間に理解できる形で可視化できるのでやってみました。

f:id:doz13189:20161207215442p:plain

うん、過学習してるね!

木が深すぎて、一体何を学習しているのか!?

この木は、前回の私の記事、あるいは前回の記事に貼ってあるURL先の記事を読めば、どれだけ過学習して頭が固くなっているのか解ると思います。

過学習の見極め方

私は単純にバックテストとフォワードテストの結果に差があり過ぎたら、過学習を疑います。

過学習すると未知データに対して、全く対応ができなくなるので、おのずとフォワードテストでの結果がでなくなるんですね。


今回のようにバックテストでは良い結果がでているのに、フォワードテストではからっきし、というのはまさに過学習を疑うべきシグナルです。

もちろん、ただ単純に説明変数がよくなくてダメモデルを作っていることもありますが。

過学習を解消すれば精度が上がったのか

過学習をしない程度の深さや葉の数を調整して、再検証を行ってみました。

しかし、結果は同じくランダムチックな正答率ばかり。

説明変数がよくない。

これが私が出した結論です。

そもそもインデックスリターンを使って、株価の値動きを予測しようという試み自体が間違っていたのではないだろうか。

もう少し決定木を使って頑張ってみますよ!

続く...

機械学習で株価は予測できるのか!?

目次

流行ってるなぁ、機械学習で株価予測

みんな予測し過ぎじゃないですか?笑

おかげで参考文献には困りませんでしたよ!

qiita.com

masamunet.com

ちょっと前までこういう↑記事を見ると、「へぇすごい、ホンマにすごいなぁ」と指を加えて羨むしかなかったんですけど...

最近は、「何!?予測!?できるんか!?っしゃ、たしかめるかぁ!」

くらいの勢いでできるので、成長を感じます。笑


上の記事たちではあたかも正答率100%を誇るスーパーシステムが出来上がったような雰囲気を出していますが、残念というか安心してくださいというかそんなわけはありません。

どちらも決定木というアルゴリズムで予測しているので、そもそもそこまで精度が上がるわけないと私は考えています。(理由は後述)

ということで今回は出来上がったシステムの内容、精度、検証含めた記事を書きます。(ちなみにただ今検証中...記事の終盤にかかる頃には検証が終わって欲しいことを祈りつつ書き書き...)

〜更新【最新版】〜

機械学習での株価予測についての記事をまとめました【おすすめ記事】

doz13189.hatenablog.com



予測の精度は53%でした

ということでした。

また後で詳しくっ☆

どんな予測の仕方?

決定木で株価を予測する大まかな流れは、

  1. 教師データで学習させる(過去の株価データ)
  2. 未知データ(過去データ以降の株価データ)をあげて、予測結果を見る

これだけです。


さっきから予測、予測と繰り返していますが、やっていることは予測というより、分類と言ったほうが正確です。

機械学習の決定木は分類手法です。

決定木の分類をイメージで説明すると...

f:id:doz13189:20161130185741p:plain

こーんな感じで株価は無数に転がっています。

一つ一つが各銘柄の株価です。

これを。

f:id:doz13189:20161130185823p:plain

バスッと線を引いて、右と左に分類します。

これが決定木の分類イメージです。


決定木の難しいのは、何を判断材料とするかです。

例えば、RSIを判断材料とした場合だと...

RSIだと70以上は反落の可能性が高かったり、逆に30以下だと反発の可能性が高かったりと逆張りでよく使われる指標で有名なのでとりあえずチョイスしました。

f:id:doz13189:20161130192441p:plain

こんな感じのRSIでソートした株価の集団があるとします。(乱数でふってるので値は適当です)

この株価たちが次の日上昇したか、下落したかを見てみましょう。

f:id:doz13189:20161130193658p:plain

こうなったとします。赤が上昇、青が下落。

これらを教師データとして決定木に学習させます。

データを渡すときは、次の日上昇したかどうかと、RSIをセットで渡します。

すると、機械はデータを見ながらこんなことを考えるでしょう。

「おぉ、上昇する株価と下落する株価は傾向がありそうだなぁ、そういえばRSIが低いと上昇して、高いと下落して...ふむふむ。」

「どうやらRSI50付近にバスっと線を引いて、分類したらうまくいきそうだな。」

うまく学習してくれたみたいですね。

ここから未知データをあげます。

先ほど学習したことを未知データに活かすのです!

例えば、RSI80の株価データを上げたとすると、機械は「下落!」と答えるはずです。

RSI30の株価データを上げたとすると、機械は「上昇!」と答えるはずです。

こーんな感じで株価を分類し、予測していきます。

ちなみに今回判断基準として使ったのはインデックスリターンです。

インデックスリターンを使って、株価たちをバスっと上昇する株と下落する株に分類しています。

参考にした記事と同じものを使用しているので、もし興味があればそちらもお読みになってください!

決定木の弱点

すべてのものを完璧に分類できる手法なんて世界にはまだ存在していません。

すべての手法は何らかの弱点があり、同じくして決定木にも弱点があります。

決定木の弱点は...


女性に弱いところです。



んなわけ。



弱点は分類の精度です。

弱点とも言いがたいのですが、決定木はそこまで高い精度を誇る分類手法ではないです。

もちろん、分類する対象にもよりますが、うまく分類できないこともままあります。

一般的な分析精度だけ見れば、SVMなど決定木より優れたものはたくさんあります。

弱点として把握しておかなければならないのは、うまく分類できない可能性があるということです。

f:id:doz13189:20161130192925p:plain

例えば、このパターンはうまく分類できていません。

こんなバラバラデータに線を引いたところでですね。

実際にRSIを判断基準にしても、きっとこうなります。

RSI30以下で絞っても、ダマしが多くて、うまく分類はできないと思います。


また、これも気をつけないといけません。

f:id:doz13189:20161130185823p:plain

境界線付近のデータです。

決定木は分類なので、YES or NOにわけなければいけません。

「わからない!」っていう答え方はなし、なんですね。

境界線付近は曖昧だけど、分類しないといけないからしてやった系データが集まってるんですね。

こういうデータも含まれているので、上昇する株側に分類されたからと言って、すべてのデータに対して、「これ明日上がるで〜ドヤァ。」なんてことはできないんですね。

今回は、株価というただでさえ分類が難しいものを対象にしているので、気をつけなければいけません。


でもさっきから、気をつけろ、気をつけろって言ったって、いったいどう気をつければいいんだい!?

私なりの弱点の気をつけ方

今から説明することはマサムネットさんの記事を参考にしながら、自分なりに工夫し、分類の弱点を補いました。

株価は基本的には分類しにくいものですが、中には比較的分類しやすいものもあります。

例えば、25日移動平均線、60日移動平均線、100日移動平均線が上で待ち構えている株価があるとします。

明らかに一度、そこで上昇がストップしますよね?

他にも下落トレンドが始まり、しばらく続きそうなタイミングなどなど。

こんな風に比較的予測しやすいもののみに絞って、分類の結果を見ます。

f:id:doz13189:20161130185823p:plain

この図で言うと、境界線付近の結果は全く見ないということです。

機械が自信を持って、「この銘柄は明日上昇する」と言える結果のみを受け取ります。

具体的に言うと、教師データは様々なパターンで渡します。

過去20日の株価データで学習にしたモデル、過去60日で学習したモデルなどなど。

過去20日から200日、それぞれで学習したモデルを作り、モデルごとに株価を予測させます。

そこで正答率の良かったモデルのみを選んで、そのモデルで未知データを読み込み、予測します。

この正答率の良かったモデル、というのが味噌で、こうすることで境界線付近の曖昧なデータたちは省くことができます。

これがひとつ目。


ふたつ目は民主主義制をとっているところです。

システムに民主主義!?ナンセンスだ!っと思われる人もいるかもしれませんが...

先ほど正答率の良かったモデル、つまりエリートモデルで未知データを読み込み、予測させることを説明しました。

じゃあ、そのエリートモデルは完璧なのか?と聞かれるとそうではありません。

たまたま精度が高かったという偶然の可能性も十分にあります。

なので、精度の良かった複数のエリートモデルを選び、その複数のエリートモデルたちでひとつの銘柄を予測させ、多数決をとります。

  1. 過去20日を参考にしたエリートモデル UP
  2. 過去40日を参考にしたエリートモデル DOWN
  3. 過去60日を参考にしたエリートモデル UP
  4. 過去100日を参考にしたエリートモデル UP

この場合は明日の株価は上昇ということになります。

極めて民主主義的に決めているのです。

まとめると、エリート選抜かつ民主主義制なシステムと言えるでしょう。

まるで日銀政策決定会合のような感じですね笑

あとで話すと言った予測結果

11月22日までの過去株価データで23日の株価を予測しました。


対象銘柄

8306, 8411, 8591, 7012, 8058, 7201, 8604, 6301, 6501, 7267, 4528, 4755, 9437, 8750, 6502, 7011, 4043, 4503, 5411, 7751, 2685, 6752, 4689, 7261, 6770, 8801, 8031, 8802, 5401, 3092, 9501, 7013, 1605, 7897, 6503, 3402, 8113, 6702, 6326, 8001, 8304, 1928, 2503, 9531, 8308, 7752, 1801, 2579, 8601, 7272, 4005, 5938, 8830, 1925, 3064, 5802, 4041, 8795, 4188, 5020, 6857, 8725, 4346, 4912, 5233, 8729, 8267, 4911, 6619, 4183, 8053, 7731, 6952, 6361, 6479, 7202, 9202, 8358, 5406, 3099, 9962, 3407, 9502, 4506, 8697, 8630, 3659, 3778, 1812, 4042, 1802, 8002, 2802, 3401, 6644, 3405, 6305, 5201, 1963, 9101, 6724, 2871, 7167, 7182, 1803, 3086, 6701, 4185, 9062, 4536, 4508, 6178, 2371, 3103, 6432, 6471, 5105, 9507, 6481, 6460, 8354, 9104, 2212, 5714, 6448, 5801, 7211, 9508, 9697, 5334, 8303, 6506, 1808, 8331, 5706, 8252, 8015, 6302, 6756, 9513, 3668, 2282, 6268, 8586, 5110, 4217, 8570, 3116, 5711, 9064, 5333, 4088, 9008, 8233, 6473, 6976, 5803, 5486, 4202, 3289, 1332, 5101, 6472, 8515, 9005, 7186, 6841, 9404, 6113, 2580, 7205, 4204, 3626, 6366, 7282, 8334, 9024, 9006, 7912, 5214, 3632, 9506, 4208, 7240, 2002, 2264, 2181, 8473, 8848, 4845, 4902, 5012, 7606, 6740, 7003, 6504, 3861, 6995, 7550, 2193, 9831, 6103, 4182, 6755, 5707, 7732, 9107, 2811, 6141, 3193, 1893, 4321, 7911, 4151, 6383, 4613, 4974, 4568, 3436, 9532, 8410, 8086, 8369, 9045, 5713, 9041, 9201, 9503, 8572, 8355


予測はこんな形で出力されます。

code predict real
8306 Down Down
8411 - Down
8591 Up Up
8058 Down Up

predict = 機械が出した予測です。
real = 23日に実際に上昇したかどうかです。realってもう少し関数名考えろよってあとから見てちょっと思います。
リアルって聞くと出川の顔がチラチラ脳裏を横切ったりしますが、そもそも関数名をつけるセンスのなさには定評があるので勘弁してください。

「-」この小さいマイナスになっているところは、エリートモデルたちの意見が同数で決めきれなかった場合です。

このUpとUp、あるいはDownとDownが一致すれば予測が当たったということになります。

これらをすべて集計した結果、正答率は53.99%でした。

しかし、50%を超えたのはここだけ...

22日、21日、17日と検証を重ねていくと、47.86%、44.9%、49.75%と50を割ってしまう結果に...

今のところ、検証は4日間だけしか行っていません。(マシンパワーが足りまてん)

予測結果がブレることは当たり前なので、もっと検証を重ねて分散、平均などをだしていきたいのはやまやまなんですが...

なんせ一つの検証に結構時間がかかるので、スパコン欲しいです。

もし、平均50%を割ることになれば、この機械に従順に従い売買を重ねると順調に損していくことになります。

じゃあ、これは失敗なのか?機械との付き合い方を考える

私はそうは思っていません。

もし、仮にこの機械の平均正答率が50%だとしましょう。

結果の出力はかなりの銘柄数出してくれるので、人間がその出力された銘柄に絞って実際に売買する銘柄を選ぶとします。

そうすれば、自動的に正答率50%は確保されることになります。


人間は良くも悪くもパフォーマンスの分散は大きいです。

調子のいい日、悪い日があります。

そんな調子の悪い日でも50%が確保されることになります。


これは機械と力を合わせて、銘柄を選択しよう、ということです。

機械はまだまだ頼りきれるほどの信頼性はありません。

とくに今回は...(50%きっちゃってそうですしね)

だから協力するのです。


将棋で一番強いのは、機械でも人間でもありません。

人間と機械が一緒に戦うフリースタイルです。


機械の考え方、人間の考え方、両方取り込むということで相乗効果を生むと私は考えます。

といいつつも今後工夫する点

今回はリターンインデックスのみで判断しました。


シンプルすぎて、そこまで正答率も上がらなかったのだと思います。

他にもいろいろと指標はあるので、追加することで精度が上がるかトライアンドエラーをしていきます。

〜更新1〜

ちゃんと検証をしてみました。

doz13189.hatenablog.com

〜更新2〜

っぽいのができた

doz13189.hatenablog.com

〜更新3〜

株価予測のサービスをリリースしました。

doz13189.hatenablog.com

〜更新4〜

機械学習での株価予測についての記事をまとめました【おすすめ記事】

doz13189.hatenablog.com