bookloveru2
pythonで株価分析⑨【単回帰分析を使って、明日の日経平均株価を予測する】
更新日:2021年11月1日
皆様、こんにちは。
今回は、大人気シリーズ「pythonで株価分析してみた」の第9弾です❕
本記事では、統計学に置いて解析の基礎となる単回帰分析を使用し、日経平均株価を予測していきます。('ω')ノ
今回も、コピペで行ける様、しっかりとpythonコードの解説をしていきますので、グーグルコラボのご準備をお願い致します。
では、早速行ってみましょう!(^^)!
目次
❶単回帰分析とは❓
❷日経平均株価をダウ平均株価で算出(説明する)
❸単回帰分析の信頼性は決定係数で見る
❹機械学習で今後の株価を予測して見た
➎python一括コード
❶単回帰分析とは❓
単回帰分析とは、端的に申し上げると『現在手元にあるデータを活用し、将来起こりうる結果を予測する』ということです。
考え方はとても単純で、中学1年生で学ぶ数学でOKです。
単回帰式: y = ax + b
これだけです。(*^-^*)
yが将来起こりうる結果(予測値)。統計学上、目的となる数値(算出したい数値)ですので、目的変数と言います。
xが現在手元にあるデータ。統計学上、予測値(y)を算出するための、元となる数値ですので、説明変数(目的変数を説明するための数値)と言います。
今回は、【x=ダウ平均株価】を使って、【y=日経平均株価】を算出していきます(^_-)-☆
単回帰分析(単回帰式)グラフのイメージは下記の通りです。👇
https://qiita.com/y_itoh/items/1584ebae325927b3684b
画像は、データサイエンティスト/データアナリストである、yumi ito@y_itoh様のQiitaより。
yumi ito@y_itoh様はこの他にも、丁寧な数式やグラフを駆使して、統計学の分析手法を分かり易くご説明なさっていますので、興味をお持ちの方はリンクからどうぞ。(^_-)-☆
大変参考になりますよ🙉
❷日経平均株価をダウ平均株価で算出(説明する)
相場の格言では、『アメリカがくしゃみをすると、日本は風邪を引く。』と言われたりします。これは、日本が先進国として常にアメリカに追いつけ。追い越せ。としてきた戦後以降変わりません。
その為、今回はダウ平均株価を説明変数として、目的変数である日経平均株価を算出していきます。(・ω・)ノ
では、コードです👇
はい!ドン❕
まずは必要なモジュールをインストール。
#@title 単回帰分析❶【a:X軸の株価 b:Y軸の株価 c:回帰係数 d:切片】
from sklearn import linear_model
import statsmodels.api as smf
import numpy as np
import pandas as pd
import datetime
import pandas_datareader.data as web
import fix_yahoo_finance as yf
import matplotlib.pyplot as plt
%matplotlib inline
import warnings
import seaborn as sns
warnings.filterwarnings('ignore')
次に、x:現在手元にあるデータ。を指定します。👇
#スタート日を決める
start = "2019-1-1" #@param {type:"string"}
end = datetime.date.today()
#銘柄コード
code1 = "DJIA" #@param ["AAPL"] {allow-input: true}
code2 = "NIKKEI225" #@param ["AMD"] {allow-input: true}
codelist = [code1,code2]
#終値取得(data2に終値を取り込み)※欠損値除外
data2 = web.DataReader(codelist, "fred", start, end).dropna()
print(data2.head().append(data2.tail()))
data2.describe()
ここまでの結果です。👇
※下図では、期間設定約3年間と書いてますが、2年間の誤りでした。
訂正してお詫び申し上げます。

次に、statsmodelsというライブラリを使用した単回帰分析👇
#単回帰分析モデルを作成
#statsmodelsを使用
#目的変数yが先なのに注意❕ .OLS(Y, X)
X1 = data2[code1]
X0 = smf.add_constant(X1)
Y1 = data2[code2]
res = smf.OLS(Y1, X0).fit()
print(res.summary())
print('Parameters: ', res.params)
print('R2: ', res.rsquared)
ここまでの結果です。👇

説明です👇

これめっちゃ!良いです👇
ラストです。👇
ラストはscikit-learnというライブラリを使用した単回帰分析で、statsmodelsと一致するか確かめます👇
print("#########ここから下はstatsmodelsでは無く、scikit-learnである。#########")
#scikit-learn linear_modelを使用
#変量xは、pandasのloc関数で [全行, x列] の要素を切り出してvaluesでNumpy配列に変換し、2次元データとして格納。
#変量yは、列名yを指定して1次元データとして取り出し、同様にNumpy配列に変換。
x = data2.loc[:, [code1]].values
y = data2[code2].values
# 線形回帰モデルを読み込み、関数clとする
cl = linear_model.LinearRegression()
# 関数clに対して変量x, yをあてはめる
Z = cl.fit(x,y)
#回帰係数を算出 coef_ は係数(coefficient)の意味
print("回帰係数:",cl.coef_, sep="\n")
#切片を算出
print("切片:",cl.intercept_, sep="\n")
#決定係数を算出
print("決定係数:",cl.score(x, y), sep="\n")
# 回帰係数
a = cl.coef_
# 切片
b = cl.intercept_
# 決定係数
r = cl.score(x, y)
#aは回帰係数であり、1行1列の為、reshape(1)で1行n列の行ベクトルに変換。nはXの行数を自動で認知。
#reshapeは多次元配列への変換。
Y = a.reshape(1)*x + b
fig, ax = plt.subplots(figsize=(8,6))
#xはcode1の数値:説明変数。yはcode2の数値:目的変数
ax.plot(x, y, 'o', label="data")
ax.legend(loc='best')
ax.set_title('Regression Analysis')
ax.set_xlabel(code1)
ax.set_ylabel(code2)
# 回帰直線 ここでのxはcode1の数値:説明変数。ラージYは回帰式:ax+b。
plt.plot(x, Y, "r") # 第3引数で線の色を"r"に指定
print("回帰式(y軸の数値)は、y = ",a,"* X軸の数値 +",b )
結果です。👇

ここまでの結果から、
今回の回帰式は、
日経平均株価 = 0.99×ダウ - 4,202
y = 0.99 × x -4,202
と算出出来ました。
試しに、ダウが30,000ドル付近として計算して見ます。
25,498円 = 0.99×30,000ドル - 4,202

結果は、確かにダウが30,000ドル付近の時に、日経平均株価は25,500円程度にあります。(`・ω・´)ゞ
つまり、明日の日経平均株価を予測したければ、
y = 0.99 × x -4,202
上式の、Xに今日のダウ平均株価の終値を代入すれば、大まかな日経平均株価を予測することが出来ると言うことです❕(´∀`*)ウフフ
いやぁ~。ナイスです。単回帰分析❕❕\(◎o◎)/!
❸単回帰分析の信頼性は決定係数で見る
確かにこれまでの回帰式で、ある程度の予測は説明できました。
しかし、ウルトラ大事なことを申し上げると、「決定係数が低いと、xは何の説明もできていない為、算出されるyは意味を持たなくなる。」ということに注意して頂きたい!ということです。
※ここでも、yumi ito@y_itoh様の記事を参照させて頂きます👇
いや~。分かり易いですね。凄すぎですね(・ω・)ノ。さぞ美しいお方なんでしょう。
いつかこんな記事が書けるようになりたいです(´;ω;`)ウッ…
❹機械学習で今後の株価を予測して見た
最後に、未来を予測して見ましょう(・ω・)ノ
学習期間:2018年1月1日から2021年2月12日現在まで
予測した株価:2021年2月~2022年2月までの1年間(未来)
以下グラフです👇

黒い点が実際の株価です。
青い線が株価の予測値です。
赤い線がトレンドです。
薄い水色のバンドが株価の信頼区間です。
垂直に引かれた赤い破線はトレンド転換点です。
現在は1株29,520円。1年後は1株37,000円程度。
この予測からは、『オリンピックは無事開催されるし、黒田総裁はETF買い増しを続けるよ(^_-)-☆』
と言っている様に感じます。
まるで、コブラですね('ω')ノ

総裁から、「オレがオリンピックに出れば金メダルでオセロができるぜ」。
「ジゴバよ サイコガン(黒田バズーカ)は心で撃つもんなんだぜ」
と言った名言が聞こえてきそうです。。
如何でしたでしょうか?
今回は単回帰分析を使った予測の紹介でした。
皆様に爆益あれ(^_-)-☆
では、ばいちゃ(・ω・)ノ
❹機械学習で今後の株価を予測して見たのPythonのコードが見たい方はこちらの過去記事をご覧下さい。👇
コード全部載せてるので、コピペでOK(^_-)-☆です。
https://www.bookloveru2.com/post/python-analysis7
➎python一括コード
あっ、一括コード載せときますね(^_-)-☆
以下です。👇今後ともよろしくお願いいたします。
#@title 単回帰分析
from sklearn import linear_model
import statsmodels.api as smf
import numpy as np
import pandas as pd
import datetime
import pandas_datareader.data as web
import fix_yahoo_finance as yf
import matplotlib.pyplot as plt
%matplotlib inline
import warnings
import seaborn as sns
warnings.filterwarnings('ignore')
#スタート日を決める
start = "2019-1-1" #@param {type:"string"}
end = datetime.date.today()
#銘柄コード
code1 = "DJIA" #@param ["AAPL"] {allow-input: true}
code2 = "NIKKEI225" #@param ["AMD"] {allow-input: true}
codelist = [code1,code2]
#終値取得(data2に終値を取り込み)※欠損値除外
data2 = web.DataReader(codelist, "fred", start, end).dropna()
print(data2.head().append(data2.tail()))
data2.describe()
#単回帰分析モデルを作成
#statsmodelsを使用
#目的変数yが先なのに注意❕ .OLS(Y, X)
X1 = data2[code1]
X0 = smf.add_constant(X1)
Y1 = data2[code2]
res = smf.OLS(Y1, X0).fit()
print(res.summary())
print('Parameters: ', res.params)
print('R2: ', res.rsquared)
print("#########ここから下はstatsmodelsでは無く、scikit-learnである。#########")
#scikit-learn linear_modelを使用
#変量xは、pandasのloc関数で [全行, x列] の要素を切り出してvaluesでNumpy配列に変換し、2次元データとして格納。
#変量yは、列名yを指定して1次元データとして取り出し、同様にNumpy配列に変換。
x = data2.loc[:, [code1]].values
y = data2[code2].values
# 線形回帰モデルを読み込み、関数clとする
cl = linear_model.LinearRegression()
# 関数clに対して変量x, yをあてはめる
Z = cl.fit(x,y)
#回帰係数を算出 coef_ は係数(coefficient)の意味
print("回帰係数:",cl.coef_, sep="\n")
#切片を算出
print("切片:",cl.intercept_, sep="\n")
#決定係数を算出
print("決定係数:",cl.score(x, y), sep="\n")
# 回帰係数
a = cl.coef_
# 切片
b = cl.intercept_
# 決定係数
r = cl.score(x, y)
#aは回帰係数であり、1行1列の為、reshape(1)で1行n列の行ベクトルに変換。nはXの行数を自動で認知。
#reshapeは多次元配列への変換。
Y = a.reshape(1)*x + b
fig, ax = plt.subplots(figsize=(8,6))
#xはcode1の数値:説明変数。yはcode2の数値:目的変数
ax.plot(x, y, 'o', label="data")
ax.legend(loc='best')
ax.set_title('Regression Analysis')
ax.set_xlabel(code1)
ax.set_ylabel(code2)
# 回帰直線 ここでのxはcode1の数値:説明変数。ラージYは回帰式:ax+b。
plt.plot(x, Y, "r") # 第3引数で線の色を"r"に指定
print("回帰式(y軸の数値)は、y = ",a,"* X軸の数値 +",b )
pythonでプログラミングがしたい!!
pythonを学びたい!という方には、
オンラインプログラミング教室『Aidemy アイデミー』がお勧めです。
ご自身でプログラム環境を用意する必要は無く、サイトへアクセスするだけです。 創業者は東京大学工学部卒の石川聡彦さん。
著書に『人工知能プログラミングのための数学がわかる本』(KADOKAWA/2018年)など。
無料で、お試しもできますので安心です。
お時間ある方は下記リンクを覗いてみてはいかがでしょうか(*'ω'*)。