LoginSignup
3
10

More than 3 years have passed since last update.

機械学習を用いた株価予測

Last updated at Posted at 2021-03-25

ユニクロの株価予測

公開データから2012年から2016年までのユニクロの株式情報に関するデータセットを用いて簡単な株価予測をします。

株価予測をするにあたって、「現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル」を参考にさせていただきました。

1. データセットの取り込み

必要なライブラリをインポートします。

%matplotlib inline
import datetime
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import sklearn
import sklearn.linear_model
import sklearn.model_selection

ダウンロードしたデータセットの中身は以下のような状態で、データの欠損等は見られない綺麗なデータセットでした。

ブログ用 - Jupyter Notebook および他 3 ページ - 個人 - Microsoft​ Edge 2021_03_25 21_23_59 (2).png

ブログ用 - Jupyter Notebook および他 3 ページ - 個人 - Microsoft​ Edge 2021_03_25 21_33_25 (2).png

2. データ前処理

'Close'列、つまり、終値の値を基に株価予測をしたいと思います。
各日にちから30日前の値を入れた'Data 30 days ago'列を作成。'Data 30 days ago', 'Date'列を除いたデータセットの全ての値を標準正規化します。

df['Data 30 days ago'] = df['Close'].shift(-30)

X = np.array(df.drop(['Data 30 days ago', 'Date'], axis=1))
X = sklearn.preprocessing.scale(X)

3. モデルの学習

訓練データとテストデータに分割して、線形回帰を用いて訓練データを学習させます。

y_pred = X[-30:]
X = X[:-30]
y = np.array(df['Data 30 days ago'])
y = y[:-30]
X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(
    X, y, test_size=0.2)

# modelの学習する
model = sklearn.linear_model.LinearRegression()
model.fit(X_train,y_train)

4. グラフの描画

予測したデータと実際のデータのグラフを描画します。

df['Predict'] = np.nan

last_date = datetime.datetime(int(df["Date"].iloc[-1].split("-")[0]),
                              int(df["Date"].iloc[-1].split("-")[1]),
                              int(df["Date"].iloc[-1].split("-")[2]))

df["Date"] = df["Date"].apply(lambda x: datetime.datetime(int(x.split("-")[0]),
                                                 int(x.split("-")[1]),
                                                 int(x.split("-")[2])))
df.index = df["Date"]

one_day = 86400
next_unix = last_date.timestamp() + one_day

for data in pred:
    next_date = datetime.datetime.fromtimestamp(next_unix)
    next_unix += one_day
    df.loc[next_date] = np.append([np.nan]* (len(df.columns)-1), data)

df = df.drop("Date", axis=1)
fig, ax = plt.subplots(figsize=(15, 6))
ax.plot(df['Close'], color="green")
ax.plot(df['Predict'], color="orange")
plt.show()
  • 予測データのグラフ

predict_graph.png

  • 実データのグラフ

real_graph.png

最後に

今回の株価予測の精度は良くありませんでしたが、今後も機械学習の勉強を続けて、kaggleやSIGNATEなどのコンペで精度の高いモデルをコーディングしたいと思います。

3
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
10