読者です 読者をやめる 読者になる 読者になる

株も歩けば犬に当たる

ブラックSlerで働くSEが株やPythonや思ったことについて書いています。

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

目次

今回すること

単回帰分析(最小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円という結果に。

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


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

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