ストックドッグ

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

交差検証法の罠

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

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

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


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

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

な〜ぜ〜?

まずは交差検証法とは

交差検証 - 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

デュアルブートでいれたUbuntuが起動しない問題

目次

昨日断捨離しました

Ubuntu内の容量がかなり切羽詰まってきたので、昨日断捨離しました。

使っていないカーネルなんかを一斉に削除したり、いらないピクチャをポイしたり...

まとめてライブラリのアップグレードを行ったり...

きっとまずいものを途中で捨ててしまったんでしょうね...

Ubuntuを起動できなくなってしまいました。

f:id:doz13189:20161115183112j:plain

この黒い画面から進まない絶望感は半端ないです。

原因

たぶん、Ubuntuの場所がわからなくなっている。

まぁ、そんなことより復旧が大事。

中には卒論のデータや今まで書いてきたコードが入っているんです。

バックアップは容量が足りなくて、とっていなかったんです。(絶望)

修復の流れ

そんなこんなで修復を諦めるという選択肢はなかったので、必死にググりました

なんとかなったので、修復の流れをまとめました。

  1. Liveメディアからubuntuを起動
  2. Boot Repairで修復

LiveメディアからUbuntuを起動する

デュアルブートUbuntuを入れている人なら、誰しもはじめUbuntuをPCに入れるとき、USBあるいはCDに保存して、それを読み込んでインストールしたと思います。

そのUSBあるいはCDを使って、Ubuntuを立ち上げます。

HDDからUbuntuを読み込むことができないなら、他の方法でとりあえずUbuntuを立ち上げようと言う作戦です。

Liveメディアへのアクセス方法はその人の環境に依存するので、詳しくはググってください。

私の場合(Let's Note CF-SX1)は、はじめの「Panasonic」の画面でF2です。

そのまま、USBにアクセスできます。

Boot Repairで修復

無事、Ubuntuに入れたでしょうか?

Liveメディアから立ち上げているので、まっさらなUbuntuです。

ここでTeminalをひらきます。

このTeminalから、Boot Repairというソフトウェアを使って、HDDに入っている方のUbuntu2を修復します。

そのため、まずはBoot Repairをインストールする必要があります。(デフォルトでははいっていないんですね)

インストールの方法はUbuntu12.04 〜Ubuntu13.10の人と、Ubuntu 14.04以降の人ではコードが変わってくるので注意。

~$ sudo add-apt-repository ppa:yannubuntu/boot-repair

これはUbuntu12.04 〜Ubuntu13.10までの人用のコードです。

~$ sudo add-apt-repository ppa:kranich/cubuntu

こっちがUbuntu14.04以降の人用です。

これがわからなくて、私はずっとネットをさまよっていました。

とにかく、これでPPAのリポジトリが追加されたはずです。

これが終わったら以下のコードをTerminalに打ち込みます。

~$ sudo apt-get update
~$ sudo apt-get install -y boot-repair

これでリポジトリの取得、最新化が終了し、インストールを行います。

~$ boot-repair

ではboot-repairを立ち上げます。

f:id:doz13189:20161115185655j:plain

recommended repair(おすすめの修復)をクリックします。

あとは出てくるポップアップを読みながら、適宜コードを入力していれば、修復が完了するはずです。

まとめ

何とかなってホッとしています。

ググれば何とかなるんですね。

黒い画面を見ながら、復旧できなかったときのために、教授への言い訳を必死に考えてました。

きっとこの記事を読んでいる人も何かしらのエラーが起こっていることでしょう笑

きっと大丈夫です。

ググればなんとかなります。

グッドラック!


【参考サイト】

tylerhandstone.hateblo.jp

kledgeb.blogspot.jp

単回帰分析で株価を予測してみる

目次

今回すること

単回帰分析(最小2乗法)で株価を分析し、上昇しそうな株を見つけよう、ってことを今回やってみたいと思います。

実際に上昇しそうな株を見つけて、運用シミュレーションも行いました。

よくわかる解説

ざっくり言うと、株価の中に一次式(y = ax + b)を見つけようという話です。

f:id:doz13189:20161112234848p:plain

こうじっくりと株価を見ていると、一次式が見えてきませんか?

f:id:doz13189:20161112234948p:plain

ズドーン!!

これは完全に手動で線を引いたのですが、これをPCでやってみようということです。

そして、今引いた一次式の傾きはマイナスですよね。

そのため、もし、この銘柄がこの一次式に従って明日以降株価をつけることになれば、続落することになります。


今回は、傾きがプラスの一次式を見つけていきたいと思います。

傾きがプラス = 将来も上昇が見込まれる

これを買えば、利益が出るんじゃ...

っとこんな感じで進めていきます。

手順

  1. 2016/9/1〜2016/9/30の株価データを取得してくる
  2. 各銘柄のデータを元に最小2乗法でパラメータを学習
  3. 完成したモデルの変数a(傾き)が0以上の銘柄を抽出
  4. R2乗決定係数を計算して、決定係数0.6以上の銘柄を抽出
  5. めでたく上昇株の抽出が完了
  6. シミュレーションで運用してみた

日本語で説明しますと、

一ヶ月分の株価データを取得してきます。

このデータを使って、一次式を見つけます。

複数銘柄でこれを行っていき、見つけた一次式の傾きがプラスのものだけを抽出します。

ここで一つ問題があります。

一次式を見つけたは良いけど、まったくあてにならない一次式もあります。

例えば...

f:id:doz13189:20161113000735p:plain

確かに一次式は見つけました。

でも、株価が暴れすぎてて一次式に全く従っていません。

こういう場合は全く参考にならないので、省きたいです。

省くための作業が手順4です。

この決定係数0.6以上というのは、この銘柄の60%の株価は、一次式に従っているという意味になります。

なので、ある程度一次式に収まっている銘柄のみをこの作業で抽出することができます。

これでめでたく上昇株の抽出が完了です。

せっかく見つけた株は、本当に上昇株かどうかを確かめてみます。

自分のお金を削るのはいやなので、PC上でシミュレーションをします。

見つけてきた株を次の日の始値で買い、19日後の終値で売ります。

「19日」である理由はこの本の中に!

ロボット運用のプロが分析してわかった 最強の株式投資法

ロボット運用のプロが分析してわかった 最強の株式投資法

まぁ、別に日数には特にこだわっていません。

別に7日でもいいんです。

売る日数が多少ブレるくらいで利益が損失に変わるようであれば、そこまで良いストラテジーではないですからねー。

実際にやってみる

対象銘柄(コード表記)

2685, 3092, 3436, 1605, 3402, 1928, 2503, 1801, 2579, 1925, 3064, 3099, 3407, 3659, 3778, 1812, 1802, 2802, 3401, 3405, 1963, 2871, 1803, 3086, 2371, 3103, 2212, 1808, 3668, 2282, 3116, 3289, 1332, 2580, 3626, 3632, 2002, 2264, 2181, 3861, 2193, 2811, 3193, 1893

対象銘柄は売買高10億円以上で、1株あたり3000円以下のものを対象にしています。

企業コードは、1000〜4000までにしています。(あまり多すぎるとPCが火を吹くから)


抽出された銘柄

企業コード 変数a(傾き) 決定係数
code_2579 21.83007519 0.786459606337
code_3659 8.62857143 0.820553859034
code_1963 10.93684211 0.768322427837
code_2371 8.34586466 0.636582826282
code_2212 9.93609023 0.610254322522
code_2282 6.94887218 0.693626352138
code_2580 20.30827068 0.876403201773
code_2264 8.31203008 0.894825026426
code_2811 13.90902256 0.773928591471
code_3193 37.75714286 0.949618158408

これらが今回抽出された上昇するであろう株です。

運用シミュレーション

これらの上昇株を100株、株価取得期間の次の日の始値で買い、18日間保有して、19日後の終値で売ります。

つまり、今回は2016/10/3の始値で買い、2016/10/21の終値で売ることになります。

結果...

企業コード 変数a(傾き)
code_2579 +6300
code_3659 +3900
code_1963 +12200
code_2371 -1500
code_2212 -5500
code_2282 3000
code_2580 -1600
code_2264 1900
code_2811 400
code_3193 19500

トータルの損益は+38600円でした。

なんと利益がでちゃいましたね。笑

軽い考察

まず、考えなければいけないのが、株価は一次式で表せるのか、について。

複雑にうねりながら上昇下落を繰り返す、株価は今回の結果を見る限りでは、まだなんとも。

このあと8月分のデータで試行してみたところ-21560円という結果に。

まだまだ改良の余地がありそうです。


ただ、実際はこれでシストレを行う気はありません

もし、上昇トレンドの株をプログラミングで見つけることができれば、日々の銘柄探しがうんと楽になるのでそういった使い方をしていこうなぁと思います。