top of page
  • 執筆者の写真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年)など。  
無料で、お試しもできますので安心です。
お時間ある方は下記リンクを覗いてみてはいかがでしょうか(*'ω'*)