アベノミクスと線形回帰モデル

Python+金融 プロジェクト

確定的トレンドまたは時間的トレンドとよばれるものは、経過時間に比例して価格が変化するモデルです。これは最も基本的な回帰モデルです。

数式にすると、次の一次式で表されます。

\(Y_t=α+βt+u_t\)

\(Y_t\)は価格、t が経過、βがトレンドの傾き、\(u_t\)が残差項です。αはトレンド開始時の価格です。

例えば、上昇トレンドが始まった時の株価が10000円 (=α) だとします。これは、1日で100円(=β)上昇するトレンドだとします。この時、5日(=t)後どうなっているのかというと、10500円くらいになっているはず。。。みたいなことです。

こんな単純なモデルでトレンドを説明することなんてできるのでしょうか?

スポンサーリンク

景気循環

景気循環、という考え方があります。これは、経済の拡大期と後退期が周期的に循環するという考え方です。

詳しくは専門のサイトを見てください。証券会社さんやトレーダさん達がわかりやすい記事をいくつも書いています。

日本の景気循環は内閣府によって定義されたものがあるらしく、基準日付が定められいます。

内閣府 景気基準日付

これによると、2012年10-12月期が谷で、2013年1月から第16循環期の山を形成する上昇基調に入っているということで良いのでしょうか?

いわゆるアベノミクス相場〜現在までの流れですね。

第16循環期は確定的トレンドで説明できるのか?

2013年1月からのトレンドを分析してみます。statsmodelsという便利なモジュールがあるので、これを使ってみます。

import statsmodels.api as sm
import pandas as pd
import pandas_datareader as web
import matplotlib.pyplot as plt
import numpy as np
 
# N225を取得
N225 = web.DataReader('NIKKEI225', 'fred', '1945.5.16')
 
# 対数価格にする
LN_N225 = np.log(N225.dropna())
 
# アベノミクスの開始時期からデータを切り出し
LN_N225_ABE = LN_N225.loc['2013/1/1':]
 
y = LN_N225_ABE
x = sm.add_constant(range(len(y)))
model = sm.OLS(y,x)
results = model.fit()

results.summary() でサマリーが取得できます。

results.summary()
Dep. Variable: NIKKEI225 R-squared: 0.681
Model: OLS Adj. R-squared: 0.681
Method: Least Squares F-statistic: 2634.
Date: Sun, 21 Jan 2018 Prob (F-statistic): 1.88e-308
Time: 22:47:21 Log-Likelihood: 1180.4
No. Observations: 1236 AIC: -2357.
Df Residuals: 1234 BIC: -2346.
Df Model: 1
Covariance Type: nonrobust
coef std err t P>|t| [0.025 0.975]
const 9.5004 0.005 1793.132 0.000 9.490 9.511
x1 0.0004 7.43e-06 51.326 0.000 0.000 0.000
Omnibus: 7.612 Durbin-Watson: 0.022
Prob(Omnibus): 0.022 Jarque-Bera (JB): 7.675
Skew: 0.180 Prob(JB): 0.0215
Kurtosis: 2.860 Cond. No. 1.43e+03

R-squared は決定係数と呼ばれ、1に近いほど良いようです。あまり良い数字ではないですね。期待値と実測値をひっぱってみましょう。

plt.plot(y)
plt.plot(results.fittedvalues)
plt.ylabel('LN_N225')
plt.legend()
plt.show()

うまく回帰しているかというと、微妙なところですね。

残差項をプロットしてみます。

results.resid.hist(bins=100, color='lightgray')
plt.xlabel('residual')
plt.ylabel('frequency')
plt.show()

正規分布になっていることが望ましいですが、当然ながらなっていないです。季節トレンドや確率的トレンドを無視して単純なモデルで説明するのはやはり無理筋ですね。

残差プロットを見ると、分析した区間の中にいくつかトレンドがあるようにも見えます。もうすこし短かい区間で区切ることで、確定的トレンドモデルはうまく回帰するのかもしれません。

いずれにしても、確定的トレンドがあるかどうかの判断は難しそうです。

スポンサーリンク

フォローする