【NumPy】回帰分析で日経平均株価の予測

この記事では、Python言語とNumPyを用いて、回帰分析による曲線近似(非線形フィッティング)で日経平均株価の予測を行ってみた結果とソースコード付きで解説します。

曲線近似で株価予測

PythonモジュールNumPyを用いた、回帰分析による曲線近似(非線形フィッティング)は下記事で紹介しています。
【NumPy】回帰分析で曲線近似(非線形フィッティング)

今回は、これを応用して簡単な株価予測をしてみました。
内容は、日経平均株価(終値)の前日から上昇するか、それとも下降するかの予想です。

処理手順

プログラムの処理手順は以下の通りです。

①日経平均株価の1年分のデータ(CSVファイル)を読み込む。
②回帰分析で曲線近似(非線形フィッティング)を行う。
③曲線のデータの勾配を1日ずつ求める。(終値の前日比)
④勾配の値を3値化する。(前日差がプラスなら1, マイナスなら-1, 不変なら0)
⑤ ①~④の処理を2つの年に対して行い、3値化データを2つ作成する。
⑥ 3値化したデータ2つを比較して、一致している要素数(当たりの個数)を計算します。
⑦ 当たりの確率を求めてパーセント表示します。

ソースコード

サンプルプログラムのソースコードです。(2次の場合)

# -*- coding: utf-8
import numpy as np

# 回帰分析(x, y)
def fitting(x, f):
    # xの値を生成
    x = np.linspace(1, len(f), len(f))
    
    # フィッティング
    a1, a2, a3, b = np.polyfit(x, f, 3)
    
    # フィッティング関数
    fh = a1 * x**3 + a2 * x**2 + a3 * x + b

    # 勾配を計算
    dfh = np.gradient(fh)

    # 3値化(前日の終値よりプラス:1, 変化なし:0, マイナス:-1)
    dfh[dfh > 0] = 1
    dfh[dfh == 0] = 0
    dfh[dfh < 0] = -1

    return fh, dfh
    
def main():
     # CSVのロード(2015年と2016年のデータ)
    data15 = np.genfromtxt("nikkei15.csv", delimiter=",", skip_header=1, dtype='float')
    data16 = np.genfromtxt("nikkei16.csv", delimiter=",", skip_header=1, dtype='float')
    
    # 5行目を抽出(日経平均株価の終値を古い順に並び替え)
    f15, f16 = data15[:,4]/1000.0, data16[:,4]/1000.0
    f15, f16 = f15[::-1], f16[::-1]
    # xの値を生成
    x15 = np.linspace(1, len(f15), len(f15))
    x16 = np.linspace(1, len(f16), len(f16))   
    # 平滑化
    f15, df15 = fitting(x15, f15)
    f16, df16 = fitting(x16, f16)
    
    # 差分を計算
    result = df15 - df16
    
    # 差分が0(当たり)の個数を計算
    hit = len(result) - np.count_nonzero(result)
    
    # 当たりの確率をパーセント表示
    score = 100*hit/len(result)
    print(round(score, 3), "[%]")

if __name__ == "__main__":
    main()

■使用したデータ(日経平均株価のデータ)
2013年分:nikkei13.csv
2014年分:nikkei14.csv
2015年分:nikkei15.csv
2016年分:nikkei16.csv

※株価データの入手は下記サイトを参考に行いました。
【日経平均株価】過去データ(CSV)をダウンロード

実行結果

サンプルプログラム実行結果です。
今回は、2013年~2016年のデータを用いて、6パターンの比較を行いました。

比較対象 当たり率[%]
2013年と2014年 69.262
2014年と2015年 22.951
2015年と2016年 27.459
2014年と2016年 80.738
2013年と2015年 53.689
2013年と2016年 50.0

平均:50.683166666666665[%]

近似曲線がシンプルすぎるので、うまく行く場合と、そうでない場合の差が激しいです。
〇〇年と△△年の株価の動きがどれだけ似ているかの指標くらいには使える?
この方法でやるなら、10年分くらいの近似曲線を求めて平均したりすれば少しはマシになるかもしれません。

まだフーリエ変換を用いた予測の方が使えるかもしれません。

おすすめ記事

Python入門 サンプル集
NumPy入門 サンプル集

シェア&フォローお願いします!