KATOエンジニヤリング開発日誌

「アウトプット無きエンジニアにインプットもチャンスも無い」の精神で書いています

KABU+で取得したデータから日経平均株価の回帰分析を行う

前回まででKABU+から取得したCSVファイルをもとにデータベースへのインポートまでを行いました。

今回からはインターネットから取得したデータを利用して実際に株価の分析を行ってみました。

www.kato-eng.info

www.kato-eng.info

www.kato-eng.info

分析方法

株価のような時系列データの予想は回帰分析が有効らしいので、単純な回帰分析を試してみることにしました。

実装の参考に下記サイトを利用しました。

kinaonao.blogspot.com

スクリプト

機械学習なので今回もPythonで実装しています。

データ取得対象のテーブル

事前情報として株価データを取得するテーブルの情報を記載します。

DDL
CREATE TABLE rwsoa_japan_stock.nikkei225_topix_stock_prices(
    security_code INTEGER,
    dt DATE,
    name VARCHAR(50),
    opening_price DOUBLE,
    closing_price DOUBLE,
    high_price DOUBLE,
    low_price DOUBLE,
    day_before_ratio DOUBLE,
    day_before_ratio_percentage DOUBLE,
    last_day_closing_price DOUBLE,
    PRIMARY KEY (security_code, dt)
);

実際に使用するデータは「dt(日付)」と「closing_price(終値)」になります。つまり、単回帰分析で使用する説明変数として「終値」を使用していることになります。

実行するスクリプト

#coding:utf-8

# ライブラリのimport
import pandas as pd
import matplotlib.pyplot as plt
import seaborn
import mysql.connector
from sklearn import linear_model


# MySQLを利用するためのクラス
class MySQL():
    def __init__(self, config):
        self.config = config
        self.conn = None
        if config is not None:
            self.connect()

    def connect(self, config=None):
        if config is None:
            config = self.config
        conn = mysql.connector.connect(**config)
        self.conn = conn
        return conn

# DataBase設定
database_config = {
    'host' : '※ConoHaのプライベートネットワークのホストを指定',
    'user' : '※ここに作成したDB操作用のユーザ名を指定',
    'password' : '※DB操作ユーザのパスワードを指定',
    'database' : '※DBサーバに作成したデータベーススキーマ名を指定'
}
mysql = MySQL(database_config)

sql = "SELECT * FROM nikkei225_topix_stock_prices WHERE security_code = 1 ORDER BY dt"
data = pd.read_sql(sql, mysql.conn)

# 日付の取得
data_date = data['dt']
# 終値の取得
data_close = data['closing_price']

data_num = pd.DataFrame(list(range(0, len(data_close))))

# モデルを作成して学習させる
model = linear_model.LinearRegression()
model.fit(data_num, data_close)
py = model.predict(data_num)

# プロット設定
plt.plot(data_date, data_close, label="NIKKEI225")
plt.plot(data_date, py, label="LinearRegression", lw=5)
plt.legend()
plt.xlabel("Day")
plt.ylabel("Yen")
plt.show()

print("傾き:" + str(model.coef_))
print("切片:" + str(model.intercept_))
print("決定係数:" + str(model.score(data_num, data_close)))

このスクリプトを実行すると次のような図が表示されます。

f:id:masayuki_kato:20181229172727p:plain
日経平均株価を最小二乗法で単回帰分析

青線が日経平均株価でオレンジの線が「y=ax+b」の一次関数の結果です。

参考にしたサイトは1950年からのデータで回帰分析を行っており、株価が上昇傾向にあるということでしたが、今回用意したデータは2017年1月からの2年分のデータなので、短い期間でも株価が上昇傾向にあるということがわかりました。

図の表示後、Pythonスクリプトの標準出力に次のような値が表示されます。

傾き:[8.01602167]
切片:19287.671070350763
決定係数:0.5680802627223172

決定係数は0から1の間で計算される値で、1に近いほど回帰分析で計算した直線と実際のデータが一致していることを表しています。今回は大体「0.57」くらいなのであまり良い値ではなさそうです。

まとめ

今回はじめて取得したデータを利用して株価の分析を行ってみました。得られた結果はあまりいいものではなかったですが、機械学習を利用した株価分析の第一歩を踏み出せたと思います。今回は終値を説明変数としましたが、説明変数を複数利用した重回帰分析で研究すれば何らかの良い結果が得られそうな気がします。