機械学習を用いた株価予測 [システム入手編]

#はじめに

[前回記事：機械学習を用いた株価予測[データ入手編]](https://qiita.com/askl4267/items/de3f9717aebed3df7fdb)にて、「Yahoo finance」よりデータを入手することができました。
本記事では、実現したいシステムと分析の概要について記載していこうと思います。

今回考えているのは、特定の銘柄の中から、一定期間（1ヶ月以内）で、一定値（8%）の上昇（下落）を検知し、通知するシステムです。

トレード回数は少なくてもいいんで、大きく儲けられると思った時に勝負できれば、うまく資産を運用できるのかなと考えています。

※現在、絶賛開発中です。

#アルゴリズム
####売買アルゴリズム
1. 前日までの取引情報から、トレンド発生シグナルを検知
2. システム利用者に通知をする
3. 通知がきたらその日中に購入
4. 前日の終値から利益確定基準(8%)、損切り基準(3%)で逆指値を設定
5. 以下の条件を満たすと売却通知をする
    1. 利益確定基準(8%)に到達
    2. 損切り基準(3%)に到達
    3. レンジ相場のまま１ヶ月が経過
6. 必要に応じて売却を行う

####予測アルゴリズム
予測するアルゴリズムとしては、LightGBM等の決定木系、ロジスティック回帰等の回帰系、DBN等のニューラルネット（Deep Learning）系を組み合わせて予測していきたいと思っています。


#システムの目的
・知識や時間がなくても安定的に資産を運用することができる。

ここでいう安定的な資産の運用は、年間を通して損をすることがなく、期待値の範囲内で収支コントロールできるようになることを目指しています。

#システムの目標精度と期待値
####システムの目標精度
１ヶ月以内に8%上昇（下落）するかを予測した適合率<font color="red">60%</font>を目標とします。
その理由としては、トレードをした時(上昇・下降トレンドが起きると予測した時)の結果だけに関心があるからです。
「トレンドなし」と予測した時にはトレードをしないので、予測結果を評価する意味はないですよね。

下記の300日間予測した例で考えると、適合率は、正答率に比べてだいぶ下がりますが「トレンドなし」の的中率を考えても仕方がないですよね。
また、そもそも「トレンドなし」のラベルが圧倒的に多いので正答率が高くなるのは当たり前かなと思います。

今回の目標は、この例よりもいい精度を求めていきたいと思います。

<img width="300" alt="図1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614282/6f1ef010-e369-44bf-9524-04713bfafa34.png">

```math
\begin{align}
正答率 &= \frac{262 + 7 + 5}{300} = 0.9133 \Longrightarrow 91.3\%
\\
適合率 &= \frac{7 + 5}{12 + 9} = 0.5714 \Longrightarrow 57.1\%
\end{align}
```



####期待値
年12回の取引を想定し、予測が当たれば8%の利益、外れれば3%の損をすると仮定した場合、年間の運用利益率は以下のようになります。

```math

\begin{align}
年間運用額 &= 元金 (1 + 利益率)^{年間運用回数 \times 適合率}(1 - 損益率)^{年間運用回数(1-適合率)}\\
\\
\\
年間利益率 &= \frac{年間運用額 - 元金}{元金} = (1 + 利益率)^{年間運用回数 \times 適合率}(1 - 損益率)^{年間運用回数(1-適合率)} - 1\\
\\
年間利益率 &= (1 + 0.08)^7(1 - 0.03)^5 - 1\\
\\
&\fallingdotseq 0.4717 \Longrightarrow 47.2\%
\end{align}

```

なんと、計算上では、年間を通して<font color="red">+50%</font>近い利益を出すことができます。
但し、予測が当たれば8%の利益を得ることができますが、株価が8%上昇（下落）しなければ必ず3%の損をするという仮定で計算をしていますので、売買アルゴリズムをうまく設定することにより、期待値以上の成果を期待できます。


こんなんできたらボロ儲けじゃんと思ったので、たぶん予測精度で苦戦するんだろうと思います。

#使用データ
選定する銘柄は、東証一部上場企業のDX銘柄に絞ろうと思います。
実験段階では、一つ二つぐらいの銘柄で試して、最終的には、10個ぐらいの銘柄を予測できればいいなと思います。

####銘柄
とりあえず今回は、<font color="MediumVioletRed">NTT DATA（9613）</font>を使用していきたいと思います。

選定理由は、特にありません。DX銘柄の中から適当に一社を選びました。
進捗状況によって、どんどん増やして分析できればいいなと思っています。

特徴量に関しては、株価（日足）データからテクニカル指標を作成していきたいと思っています。

よくあるテクニカル指標からの予測となっておりますが、今日の株価から明日の株価を予測するというような超短期的な予測ではないので、比較的実用性があるものになるのかなと思っています。
（想定している取引頻度は月1回の年12回です。）
また、将来的には、Twitterやニュース記事などの定性データを加えて予測精度を上げられるか検証していきたいと考えています。

####使用期間
2011年1月〜2019年12月の日足データを使用

学習データ：2011年1月〜2018年12月
テストデータ：2019年1月〜2019年12月

使用期間に関しては、特徴量を作成する過程で使用可能期間が変動することから2011年から使用しています。
2019年までのデータを使用していることに関しては、コロナの影響を除くために本分析からは除外しています。

#目的変数の定義
目的変数の定義については、だいぶ迷いましたが、下記の内容で進めていきたいと思います。

* OLSによるトレンドフラグの作成

約１ヶ月間（土日を除く20日間）のデータで直線を引き、フラグを作成します。

```math
トレンドフラグ = \left\{
\begin{array}{ll}
1 & (直線の傾きが有意 \cap 直線の傾き \geqq 8\%上昇の傾き \cap 切片が0以上で有意) \\
2 & (直線の傾きが有意 \cap 直線の傾き \leqq 8\%下落の傾き \cap 切片が0以下で有意) \\
0 & (1,2のどちらにも該当しない)
\end{array}
\right.
```

```math
8\%上昇（下落）の傾き = \pm \frac{　0.08 \times 初日の終値　}{20}
```

今回の定義のした理由としては、突発的に上昇（下落）したものの影響を除去するためと、連日フラグが立たないようにするためです。
※単純に20日間の間で8%上昇（下落）したら、フラグを立てるようにすると、上げ下げが激しい時にフラグを立てたり、連日フラグがたったりなど、トレンド発生時をうまく定義できていないように感じたので、今回のようになりました。

#おわりに
以上が今回やってみたいシステムの概要になります。
実際に予測ができたら、予測精度だけでなく、売買アルゴリズムの評価として、バックテストとかもやっていきたいと思います。
なんで、次回はLightGBMを用いた予測をやっていきたいと思います。