2
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

株価予測について

Last updated at Posted at 2023-03-20
1 / 2

今回は日本版Kaggleと呼ばれているコンペティションサイト「SIGNATE」の株価データを使って株価予測と株価データからチャートをプロットする方法を学んだのでこちらにアウトプットしていこうと思います。

Pandasにはデータをプロットする機能も備わっていたことを初めて知り、今回の可視化作業はPandasの機能を使って行いました。

#ライブラリのインポート
import pandas as pd
import numpy as np
#データの読み込み
train_df = pd.read_csv("/Users/miyatakazuhiko/Desktop/機械学習用データフォルダ/train (1).csv")
test = pd.read_csv("/Users/miyatakazuhiko/Desktop/機械学習用データフォルダ/test.csv")
#データの先頭5行とデータ数を出力
train_df.head()
print(len(train_df))

3226件のデータが確認できました

#データの先頭5行とデータ数を出力
test.head()
print(len(test))

1200件のデータが確認できました

#データ要約を表示
train_df.info()

スクリーンショット 2023-03-20 20.43.13.png

#データ要約を表示
test.info()

スクリーンショット 2023-03-20 20.43.45.png

#学習データの統計情報を取得
train_df.describe()

スクリーンショット 2023-03-20 20.44.19.png

#学習データの欠損値を確認
train_df.isnull().sum()

欠損値は無し
テストデータについても同様の処理をしていますが長くなるので記載は省きます

#学習データとテストデータを縦方向に結合
train_df = pd.concat([train_df, test], ignore_index=True)

trainのデータとtestのデータの中身を確認したら日付が続いていたので縦方向にデータを結合して分析することにしました

#株価の「オープン値」と「クローズ値」を可視化
train_df[["Open", "Close"]].plot()

スクリーンショット 2023-03-20 20.46.55.png

#plotly(株価をチャート化できるライブラリ)をインポート
import plotly.graph_objects as go

#株価の可視化作業
fig = go.Figure(data=go.Ohlc(x=train_df["Date"], open=train_df["Open"], high=train_df["High"], low=train_df["Low"], close=train_df["Close"]))
fig.show()

スクリーンショット 2023-03-20 20.47.41.png
データが何年にも渡っているため月単位で出せませんでした
ズームすると月単位での株価情報が確認できます

#株価を半年平均と一年平均で算出した値を追加(可視化のため)
train_df['SMA60'] = train_df.Close.rolling(60).mean()
train_df['SMA365'] = train_df.Close.rolling(365).mean()

#半年平均と一年平均のチャート線を追加し、株価を可視化
fig = go.Figure(data=[go.Ohlc(x=train_df['Date'],
        open=train_df['Open'],
        high=train_df['High'],
        low=train_df['Low'],
        close=train_df['Close'], name = "OHLC"),
        go.Scatter(x=train_df.Date, y=train_df.SMA60, line=dict(color='orange', width=1), name="半年平均"),
        go.Scatter(x=train_df.Date, y=train_df.SMA365, line=dict(color='green', width=1), name="一年平均")])
fig.show()

スクリーンショット 2023-03-20 20.50.26.png
移動平均で「半年間の株価平均」と「一年間の株価平均」のチャートを追加しています

#データ分析に不要なデータの削除
train_df = train_df.drop(["Date", "Up", "SMA60", "SMA365"], axis=1)
#ライブラリのインポート
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score

#データを目的変数と特徴量に分割し、学習用データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(train_df.drop(["Open"], axis=1), train_df["Open"], test_size=0.2, shuffle=False)

#モデルのインスタンス化
model = LinearRegression()

 #モデルの学習
model.fit(X_train, y_train)

#モデルの予測
pred = model.predict(X_test)

#モデルの評価(R2決定係数)
y_pred = r2_score(y_test, pred)

print("R2評価", y_pred)

結果は0.99と予測精度は高いスコアがでました
今回もLinearRegressionを使っていますが、ランダムフォレストで評価してみたら2RMSE評価が2103とかおおよそ予測とはいえない誤差が出てしまったため機械学習モデル選択と特徴量と目的変数の選び方の大切さを再認識しました。

今日も見てくださってありがとうございます。
今回は株価のチャートをプロットすることと最適なモデルを選択することに重点を置きモデル作成いたしました。

頑張ってスキルを磨いていこうと思います。

2
8
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
2
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?