0
8

More than 3 years have passed since last update.

「株価データセット作成」と「AR(1)の実装」

Last updated at Posted at 2020-04-07

本記事でやること

  • 自分で株価のデータセットを作成し、AR(1)モデルを実装する。

株価データセットの作成

AR(1)の実装

  • 上記で取得した株価のcsvを元に、AR(1)モデルを実装する。

AR(1)を一言で

  • 前日の株価で当日の株価を予測するモデル。

実装

ライブラリ・モジュール

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

前処理

# データをdfとして読み込む。
df = pd.read_csv(file_nm, encoding='cp932') # file_nmに株価のcsvファイルのパスを指定。 
# 上記のcsvには無駄な情報があるため、dfとしての形式を整える。
date = df.index[1:] # 日付の値を格納するdateを生成する。
df = pd.DataFrame(df.values[1:,:], columns=df.loc['日付'].values) # 余分な情報を削除する。
df['日付'] = date
df = df[['日付', '始値', '高値', '安値', '終値', '出来高', '終値調整値']]

# dfのカラムを日付と終値に絞る。
df = df[['日付','終値']]

# 終値に格納される値のデータ型を文字列からfloat32に変更する。
df.loc[:,'終値'] = df['終値'].astype(np.float32)

# 2013年6月28日を0, 2013年7月1日を1, 2013年7月2日を2, ...とする日付番号カラムを生成する。
date_num = list(range(len(df.日付)))
df['日付番号'] = date_num
df = df[['日付', '日付番号', '終値']]

# 1日前の終値のカラムを生成する。
df_2 = df.copy()
df_2['日付番号'] = df_2['日付番号'] + 1
df = pd.merge(df, df_2[['日付番号' ,'終値']], on='日付番号', how='left')
df = df.rename(columns={'終値_x':'当日の株価', '終値_y':'前日の株価'})

# 欠損値を含む行を除外する。
df = df.dropna()

# 特徴量, 目的変数を格納するX, yを生成する。
y = df.当日の株価.values
X = df.前日の株価.values

def reshape_row(arr):
    """X, yの形状を変更する。(行ベクトルに変更する。)
    """
    return arr.reshape(-1, 1)

X, y = reshape_row(X), reshape_row(y)

# X, yをtrainデータとvalidationデータに7:3の割合で分割する。
train_X, val_X, train_y, val_y = train_test_split(X, y, test_size=0.3)

学習 ~ 評価

# 線形回帰モデル(AR(1))の係数推定値を算出する。
model = LinearRegression()
model.fit(train_X, train_y)

# 切片と前日の株価の係数推定値を表示する。
print("切片は", model.intercept_[0])
print("前日の株価の係数推定値は", model.coef_[0][0])

# モデルの評価を行う。
true_y = val_y
pred_y = model.predict(val_X)
mean_squared_error(true_y, pred_y)
0
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
0
8