プログラミング初学者が機械学習を使って株価予測してみた!!
1.はじめに
自分の職業、経理事務員がAI化の流れで無くなってしまう職業の第一位にランキングされてしまいました。予測はしていましたが一位はショック・・・以前より、Pythonに興味が有り独学で、トライしていましたが、自分のバックグランドや効率性なども考慮し、Aidemyのデータ分析講座受講を決めました。学習成果として機械学習を使って株価予測にチャレンジします。
2.概要
企業の稼ぐ力、収益力と成長性が分かる、指標 EPS(一株当たり純利益)が高い企業の過去3年間の3種類の移動平均を使い、教師あり学習(回帰)にて終値の株価予測を行います。
3.実行環境
Google Colaboratory
Python ver 3.10.11
4.分析の手順
2022/03年度 EPSの高い企業を選定して、株価予測する銘柄を決定
過去3年間の株価データ取得
前々日と前日の終値比較値と3種類の移動平均を算出
算出した4つの計算値を学習データとして4種類の回帰分析を行う
予測結果の可視化
5.実践
①2022/03年度 EPSの高い企業を選定して、株価予測する銘柄を決定
import pandas as pd
# 銘柄コード読込
xlsx = pd.ExcelFile('code_data_j.xls')
df1 = pd.read_excel(xlsx, 'Sheet1')
# 2022年3月度のPL読込
df2 = pd.read_csv('2022_pl.csv',skiprows=1)
# 2つのデータフレームを結合
df =pd.merge(df1,df2,on="コード")
#EPSの上位10社を視覚化
df.sort_values(by=["EPS"]).tail(10)
上記のコードを実行し、EPSが高い企業トップ10を表示します。
一番EPSが高かった銘柄はコード 4628のエスケー化研であることが分かりました。
②過去3年間の株価データ取得
次に、エスケー化研の過去3年間2019.4.1~2022.3.31の株価情報を取得します。
import pandas_datareader.data as pdr
import datetime as dt
data = pdr.DataReader("4628.JP","stooq")
data = data[(data.index >=dt.datetime(2019,4,1)) & (data.index <=dt.datetime(2022,3,31))]
data = data.iloc[::-1]
上記のコードを実行し、dataという変数に株価データを格納しました。
③前々日と前日の終値比較値と3種類の移動平均を算出
株価データの終値のデータ「Close」を使って
前日と当日の終値比較値 → 「Price Change」
5日移動平均 → 「span01」
25日移動平均 → 「span02」
75日移動平均 → 「span03」
上記4つの計算値をdataへ追加します。
# 前々日の終値と前日の終値の差分を計算
data['Price Change'] = data['Close'].shift(1) - data['Close'].shift(2)
# upしたかdownしたかを表示
data['Up or Down'] = data['Price Change'].apply(lambda x: 'up' if x > 0 else 'down' if x < 0 else 'even')
# 差分の値を表示
data['Change Amount'] = data['Price Change'].apply(lambda x: abs(x))
# # 移動平均5・25・75日算出
data["Close"] = data["Close"].astype(float)
span01 = 5
span02 = 25
span03 = 75
data["span01"] = data["Close"].rolling(window=span01).mean()
data["span02"] = data["Close"].rolling(window=span02).mean()
data["span03"] = data["Close"].rolling(window=span03).mean()
先頭10行を表示しています。
④算出した4つの計算値を学習データとして4種類の回帰分析を行う
4つの値を学習データとして、連続値の予測手法に適している、機械学習 教師あり回帰にて株価予測を行います。手法は「線形回帰」「ラッソ回帰」「リッジ回帰」「ElasticNet回帰」を実施し、スコアが良いモデルを採用します。
# 4つの計算値を使用して回帰分析を行ってみる
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Lasso
from sklearn.linear_model import Ridge
from sklearn.linear_model import ElasticNet
data = data
train_X, test_X, train_y, test_y = train_test_split(
data[["span01","span02","span03","Price Change"]], data["Close"], random_state=42,shuffle=False)
train_X.dropna(axis=0, inplace=True)
train_y = train_y[train_X.index]
test_X.dropna(axis=0, inplace=True)
test_y = test_y[test_X.index]
#最大スコアと最も良いモデル名を代入する入れ物を作成
max_score = 0
best_model = ""
# 線形回帰
model = LinearRegression()
model.fit(train_X, train_y)
score = model.score(test_X, test_y)
if max_score < score:
max_score = score
best_model = "線形回帰"
# ラッソ回帰
model = Lasso()
model.fit(train_X, train_y)
score = model.score(test_X, test_y)
if max_score < score:
max_score = score
best_model = "ラッソ回帰"
# リッジ回帰
model = Ridge()
model.fit(train_X, train_y)
score = model.score(test_X, test_y)
if max_score < score:
max_score = score
best_model = "リッジ回帰"
# ElasticNet回帰
model = ElasticNet(l1_ratio=0.9)
model.fit(train_X, train_y)
score = model.score(test_X, test_y)
if max_score < score:
max_score = score
best_model = "ElasticNet回帰"
print("モデル:{}".format(best_model)) #上記のif文の繰り返しで見つけた最大精
print("決定係数:{}".format(max_score))
上記のコードを実行することにより得られた実行結果は
となり、「線形回帰」モデルで高いスコアを得ることが出来ました。
それぞれのモデルのスコア結果については、次の様になりました。
どのモデルに於いても、高い評価値が得られました。
⑤予測結果の可視化
# 実績と予測の比較
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(16, 10))
plt.plot(data["Close"],color="b")
plt.plot(test_y,color="r")
plt.show()
可視化からも、高いスコアを確認出来ました。
今回の選定銘柄では高いスコアとなりましたが、株価は多数の要因やその関係性で変化することを肝に銘じ、ファンダメンタルやテクニカルなどの分析の手法をPythonで自動化し、自身の会計知識のブラッシュアップも兼ねて、投資に活かせたら良いなぁ~と考えております。
6.さいごに
受講期間中にChatGPTがリリースされるなど、世の中が以前を上回るスピードで変化する中、講座を通して変化を加速させるAI技術がどういうものなのか少し体験できた様な気がします。プログラミング初学者なので学習速度は亀の歩みではありますが、今回得た知識を自身の業務や投資へ活かしていきたいと考えています。初学者の私を修了に導いてくれたAidemyの講座や講師の皆さまに感謝しております。
7.補足 教育訓練給付について
今回の講座受講にあたって、経済産業省と厚生労働省が認定する講座「第四次産業革命スキル習得講座認定制度」を利用しました。要件を満たし、ハローワークにて手順を踏んで申請を行い修了した場合、受講経費の最大70%を給付金として支給されます。国も人材確保の為に制度を拡充しているようです。話題の『リスキリング』に活用されてはいかがでしょうか。