ユニクロの株価予測
公開データから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
ダウンロードしたデータセットの中身は以下のような状態で、データの欠損等は見られない綺麗なデータセットでした。
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()
- 予測データのグラフ
- 実データのグラフ
最後に
今回の株価予測の精度は良くありませんでしたが、今後も機械学習の勉強を続けて、kaggleやSIGNATEなどのコンペで精度の高いモデルをコーディングしたいと思います。