株価予測について

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


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


```python
#ライブラリのインポート
import pandas as pd
import numpy as np
```

```python
#データの読み込み
train_df = pd.read_csv("/Users/miyatakazuhiko/Desktop/機械学習用データフォルダ/train (1).csv")
test = pd.read_csv("/Users/miyatakazuhiko/Desktop/機械学習用データフォルダ/test.csv")
```

```python
#データの先頭５行とデータ数を出力
train_df.head()
print(len(train_df))
```
3226件のデータが確認できました

```python
#データの先頭５行とデータ数を出力
test.head()
print(len(test))
```
1200件のデータが確認できました

```python
#データ要約を表示
train_df.info()
```
![スクリーンショット 2023-03-20 20.43.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124100/85c23516-27f3-65ec-488b-e8052051aa28.png)

```python
#データ要約を表示
test.info()
```
![スクリーンショット 2023-03-20 20.43.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124100/03244a3c-aeea-016a-b824-2e75323e3c50.png)

```python
#学習データの統計情報を取得
train_df.describe()
```
![スクリーンショット 2023-03-20 20.44.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124100/0dc3c451-de79-c01d-04b5-8cbf72e0eb91.png)

```python
#学習データの欠損値を確認
train_df.isnull().sum()
```
欠損値は無し
テストデータについても同様の処理をしていますが長くなるので記載は省きます

```python
#学習データとテストデータを縦方向に結合
train_df = pd.concat([train_df, test], ignore_index=True)
```
trainのデータとtestのデータの中身を確認したら日付が続いていたので縦方向にデータを結合して分析することにしました

```python
#株価の「オープン値」と「クローズ値」を可視化
train_df[["Open", "Close"]].plot()
```
![スクリーンショット 2023-03-20 20.46.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124100/96d1fbdb-89f0-8673-b8cb-ae2c333c2a49.png)

```python
#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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124100/b58cd0ff-1dc5-0368-e893-05d4ee9d7a42.png)
データが何年にも渡っているため月単位で出せませんでした
ズームすると月単位での株価情報が確認できます

```python
#株価を半年平均と一年平均で算出した値を追加（可視化のため）
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124100/da156394-3c2c-25d1-3605-8461a298ebbf.png)
移動平均で「半年間の株価平均」と「一年間の株価平均」のチャートを追加しています

```python
#データ分析に不要なデータの削除
train_df = train_df.drop(["Date", "Up", "SMA60", "SMA365"], axis=1)
```

```python
#ライブラリのインポート
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評価が２103とかおおよそ予測とはいえない誤差が出てしまったため機械学習モデル選択と特徴量と目的変数の選び方の大切さを再認識しました。

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

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