自分の勉強用に、沖本竜義「経済・ファイナンスデータの計量経済分析」の章末問題をpythonで解いてみました。
jupyter notebook上で記述したものをほぼそのまま載せてあります。
ソースコードの細かい説明は省いてありますが、今後余裕があれば説明を加えようと思います。
こちらの記事は第5章の章末問題を解いたものになります。
第1章、第2章、第4章、第6章、第7章も公開しています。
各種設定・モジュールのインポート
%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from arch.unitroot import ADF
from arch.unitroot import PhillipsPerron
import matplotlib as mpl
font = {"family":"IPAexGothic"}
mpl.rc('font', **font)
plt.rcParams["font.size"] = 12
5.5
(1)
ファイルをインポートする
eco = pd.read_csv('./input/economicdata.csv')
print(eco.shape)
eco.head()
(364, 7)
date | topix | exrate | indprod | cpi | saunemp | intrate | |
---|---|---|---|---|---|---|---|
0 | Jan-75 | 276.09 | 29.13 | 47.33 | 52.625 | 1.7 | 12.67 |
1 | Feb-75 | 299.81 | 29.70 | 46.86 | 52.723 | 1.8 | 13.00 |
2 | Mar-75 | 313.50 | 29.98 | 46.24 | 53.114 | 1.8 | 12.92 |
3 | Apr-75 | 320.57 | 29.80 | 47.33 | 54.092 | 1.8 | 12.02 |
4 | May-75 | 329.65 | 29.79 | 47.33 | 54.385 | 1.8 | 11.06 |
Date列をdatetime型に変換してecoのDatetimeIndexとする
eco.index=pd.to_datetime(eco.date.values,format='%b-%y')
eco.drop('date',axis=1,inplace=True)
eco.head()
topix | exrate | indprod | cpi | saunemp | intrate | |
---|---|---|---|---|---|---|
1975-01-01 | 276.09 | 29.13 | 47.33 | 52.625 | 1.7 | 12.67 |
1975-02-01 | 299.81 | 29.70 | 46.86 | 52.723 | 1.8 | 13.00 |
1975-03-01 | 313.50 | 29.98 | 46.24 | 53.114 | 1.8 | 12.92 |
1975-04-01 | 320.57 | 29.80 | 47.33 | 54.092 | 1.8 | 12.02 |
1975-05-01 | 329.65 | 29.79 | 47.33 | 54.385 | 1.8 | 11.06 |
topix,exrate,indprod,cpiの対数系列を追加する
logs=['topix','exrate','indprod','cpi']
for i in range(len(logs)):
eco['%s_log'%logs[i]]=np.log(eco[logs[i]])
eco.head()
topix | exrate | indprod | cpi | saunemp | intrate | topix_log | exrate_log | indprod_log | cpi_log | |
---|---|---|---|---|---|---|---|---|---|---|
1975-01-01 | 276.09 | 29.13 | 47.33 | 52.625 | 1.7 | 12.67 | 5.620727 | 3.371769 | 3.857144 | 3.963191 |
1975-02-01 | 299.81 | 29.70 | 46.86 | 52.723 | 1.8 | 13.00 | 5.703149 | 3.391147 | 3.847164 | 3.965052 |
1975-03-01 | 313.50 | 29.98 | 46.24 | 53.114 | 1.8 | 12.92 | 5.747799 | 3.400530 | 3.833845 | 3.972441 |
1975-04-01 | 320.57 | 29.80 | 47.33 | 54.092 | 1.8 | 12.02 | 5.770101 | 3.394508 | 3.857144 | 3.990686 |
1975-05-01 | 329.65 | 29.79 | 47.33 | 54.385 | 1.8 | 11.06 | 5.798031 | 3.394173 | 3.857144 | 3.996088 |
プロットする
title=['topix_log','exrate_log','indprod_log','cpi_log','saunemp','intrate']
fig,ax = plt.subplots(nrows=3,ncols=2,figsize=[10,15])
for i in range(3):
for j in range(2):
ax[i,j].plot(eco[title].iloc[:,2*i+j])
ax[i,j].set_title(title[2*i+j])
ax[i,j].set_xlim(eco.index[0],eco.index[-1])
ax[i,j].set_xticks(eco.index[eco.index.is_year_start][::3])
ax[i,j].set_xticklabels(eco.index[eco.index.is_year_start][::3].strftime('%y'))
ax[i,j].set_xlabel('year')
plt.subplots_adjust(wspace=0.2,hspace=0.3)
plt.show()
5.2の解答に従い、exrate_log,saunemp,intrateは場合2、topix_log,indeprod_log,cpi_logは場合3を仮定する
- 場合1...トレンドがなく、期待値が0
- 場合2...トレンドがなく、期待値が0ではない
- 場合3...トレンドがある
trend=['ct','c','ct','ct','c','c']
adf=[]
pp=[]
for i in range(len(title)):
adf.append(ADF(eco[title[i]],trend=trend[i],max_lags=10,method='AIC'))
pp.append(PhillipsPerron(eco[title[i]],trend=trend[i]))
ADF検定の結果を表示する
for i in range(len(title)):
print(title[i])
print(adf[i])
print('')
topix_log
Augmented Dickey-Fuller Results
=====================================
Test Statistic -1.149
P-value 0.921
Lags 1
-------------------------------------
Trend: Constant and Linear Time Trend
Critical Values: -3.98 (1%), -3.42 (5%), -3.13 (10%)
Null Hypothesis: The process contains a unit root.
Alternative Hypothesis: The process is weakly stationary.
exrate_log
Augmented Dickey-Fuller Results
=====================================
Test Statistic -1.839
P-value 0.361
Lags 3
-------------------------------------
Trend: Constant
Critical Values: -3.45 (1%), -2.87 (5%), -2.57 (10%)
Null Hypothesis: The process contains a unit root.
Alternative Hypothesis: The process is weakly stationary.
indprod_log
Augmented Dickey-Fuller Results
=====================================
Test Statistic -2.299
P-value 0.435
Lags 4
-------------------------------------
Trend: Constant and Linear Time Trend
Critical Values: -3.98 (1%), -3.42 (5%), -3.13 (10%)
Null Hypothesis: The process contains a unit root.
Alternative Hypothesis: The process is weakly stationary.
cpi_log
Augmented Dickey-Fuller Results
=====================================
Test Statistic -3.824
P-value 0.015
Lags 10
-------------------------------------
Trend: Constant and Linear Time Trend
Critical Values: -3.98 (1%), -3.42 (5%), -3.13 (10%)
Null Hypothesis: The process contains a unit root.
Alternative Hypothesis: The process is weakly stationary.
saunemp
Augmented Dickey-Fuller Results
=====================================
Test Statistic -0.846
P-value 0.805
Lags 10
-------------------------------------
Trend: Constant
Critical Values: -3.45 (1%), -2.87 (5%), -2.57 (10%)
Null Hypothesis: The process contains a unit root.
Alternative Hypothesis: The process is weakly stationary.
intrate
Augmented Dickey-Fuller Results
=====================================
Test Statistic -2.226
P-value 0.197
Lags 3
-------------------------------------
Trend: Constant
Critical Values: -3.45 (1%), -2.87 (5%), -2.57 (10%)
Null Hypothesis: The process contains a unit root.
Alternative Hypothesis: The process is weakly stationary.
ADF検定では、cpi_logのみ単位根の帰無仮説が棄却された
PP検定の結果を表示する
for i in range(len(title)):
print(title[i])
print(pp[i])
print('')
topix_log
Phillips-Perron Test (Z-tau)
=====================================
Test Statistic -1.269
P-value 0.895
Lags 17
-------------------------------------
Trend: Constant and Linear Time Trend
Critical Values: -3.98 (1%), -3.42 (5%), -3.13 (10%)
Null Hypothesis: The process contains a unit root.
Alternative Hypothesis: The process is weakly stationary.
exrate_log
Phillips-Perron Test (Z-tau)
=====================================
Test Statistic -1.856
P-value 0.353
Lags 17
-------------------------------------
Trend: Constant
Critical Values: -3.45 (1%), -2.87 (5%), -2.57 (10%)
Null Hypothesis: The process contains a unit root.
Alternative Hypothesis: The process is weakly stationary.
indprod_log
Phillips-Perron Test (Z-tau)
=====================================
Test Statistic -2.012
P-value 0.595
Lags 17
-------------------------------------
Trend: Constant and Linear Time Trend
Critical Values: -3.98 (1%), -3.42 (5%), -3.13 (10%)
Null Hypothesis: The process contains a unit root.
Alternative Hypothesis: The process is weakly stationary.
cpi_log
Phillips-Perron Test (Z-tau)
=====================================
Test Statistic -3.898
P-value 0.012
Lags 17
-------------------------------------
Trend: Constant and Linear Time Trend
Critical Values: -3.98 (1%), -3.42 (5%), -3.13 (10%)
Null Hypothesis: The process contains a unit root.
Alternative Hypothesis: The process is weakly stationary.
saunemp
Phillips-Perron Test (Z-tau)
=====================================
Test Statistic -0.733
P-value 0.838
Lags 17
-------------------------------------
Trend: Constant
Critical Values: -3.45 (1%), -2.87 (5%), -2.57 (10%)
Null Hypothesis: The process contains a unit root.
Alternative Hypothesis: The process is weakly stationary.
intrate
Phillips-Perron Test (Z-tau)
=====================================
Test Statistic -2.417
P-value 0.137
Lags 17
-------------------------------------
Trend: Constant
Critical Values: -3.45 (1%), -2.87 (5%), -2.57 (10%)
Null Hypothesis: The process contains a unit root.
Alternative Hypothesis: The process is weakly stationary.
ADF検定と同じくPP検定でも、cpi_logのみ単位根の帰無仮説が棄却された
(2)
cpi_log以外の系列の差分系列を作成する
for i in range(len(title)):
if title[i]!='cpi_log':
eco['%s_diff'%title[i]]=eco[title[i]].diff()
else:
pass
プロットする
diff=['topix_log_diff','exrate_log_diff','indprod_log_diff','saunemp_diff','intrate_diff']
fig,ax = plt.subplots(nrows=3,ncols=2,figsize=[10,15])
for i in range(3):
for j in range(2):
if i!=2 or j!=1:
ax[i,j].plot(eco[diff].iloc[:,2*i+j])
ax[i,j].set_title(diff[2*i+j])
ax[i,j].set_xlim(eco.index[0],eco.index[-1])
ax[i,j].set_xticks(eco.index[eco.index.is_year_start][::3])
ax[i,j].set_xticklabels(eco.index[eco.index.is_year_start][::3].strftime('%y'))
ax[i,j].set_xlabel('year')
else:
pass
plt.subplots_adjust(wspace=0.2,hspace=0.3)
plt.show()
全ての系列でトレンドがなく期待値が0であるように見えるので、全ての系列について場合1を仮定してADF検定及びPP検定を行う
- 場合1...トレンドがなく、期待値が0
- 場合2...トレンドがなく、期待値が0ではない
- 場合3...トレンドがある
trend=['nc','nc','nc','nc','nc']
adf=[]
pp=[]
for i in range(len(diff)):
adf.append(ADF(eco[diff[i]][1:],trend=trend[i],max_lags=10,method='AIC'))
pp.append(PhillipsPerron(eco[diff[i]][1:],trend=trend[i]))
ADF検定の結果を表示する
for i in range(len(diff)):
print(diff[i])
print(adf[i])
print('')
topix_log_diff
Augmented Dickey-Fuller Results
=====================================
Test Statistic -13.799
P-value 0.000
Lags 0
-------------------------------------
Trend: No Trend
Critical Values: -2.57 (1%), -1.94 (5%), -1.62 (10%)
Null Hypothesis: The process contains a unit root.
Alternative Hypothesis: The process is weakly stationary.
exrate_log_diff
Augmented Dickey-Fuller Results
=====================================
Test Statistic -8.762
P-value 0.000
Lags 2
-------------------------------------
Trend: No Trend
Critical Values: -2.57 (1%), -1.94 (5%), -1.62 (10%)
Null Hypothesis: The process contains a unit root.
Alternative Hypothesis: The process is weakly stationary.
indprod_log_diff
Augmented Dickey-Fuller Results
=====================================
Test Statistic -6.117
P-value 0.000
Lags 3
-------------------------------------
Trend: No Trend
Critical Values: -2.57 (1%), -1.94 (5%), -1.62 (10%)
Null Hypothesis: The process contains a unit root.
Alternative Hypothesis: The process is weakly stationary.
saunemp_diff
Augmented Dickey-Fuller Results
=====================================
Test Statistic -3.864
P-value 0.000
Lags 9
-------------------------------------
Trend: No Trend
Critical Values: -2.57 (1%), -1.94 (5%), -1.62 (10%)
Null Hypothesis: The process contains a unit root.
Alternative Hypothesis: The process is weakly stationary.
intrate_diff
Augmented Dickey-Fuller Results
=====================================
Test Statistic -7.681
P-value 0.000
Lags 2
-------------------------------------
Trend: No Trend
Critical Values: -2.57 (1%), -1.94 (5%), -1.62 (10%)
Null Hypothesis: The process contains a unit root.
Alternative Hypothesis: The process is weakly stationary.
ADF検定では、全ての系列で単位根の帰無仮説が棄却された
PP検定の結果を表示する
for i in range(len(diff)):
print(diff[i])
print(pp[i])
print('')
topix_log_diff
Phillips-Perron Test (Z-tau)
=====================================
Test Statistic -14.137
P-value 0.000
Lags 17
-------------------------------------
Trend: No Trend
Critical Values: -2.57 (1%), -1.94 (5%), -1.62 (10%)
Null Hypothesis: The process contains a unit root.
Alternative Hypothesis: The process is weakly stationary.
exrate_log_diff
Phillips-Perron Test (Z-tau)
=====================================
Test Statistic -13.692
P-value 0.000
Lags 17
-------------------------------------
Trend: No Trend
Critical Values: -2.57 (1%), -1.94 (5%), -1.62 (10%)
Null Hypothesis: The process contains a unit root.
Alternative Hypothesis: The process is weakly stationary.
indprod_log_diff
Phillips-Perron Test (Z-tau)
=====================================
Test Statistic -24.889
P-value 0.000
Lags 17
-------------------------------------
Trend: No Trend
Critical Values: -2.57 (1%), -1.94 (5%), -1.62 (10%)
Null Hypothesis: The process contains a unit root.
Alternative Hypothesis: The process is weakly stationary.
saunemp_diff
Phillips-Perron Test (Z-tau)
=====================================
Test Statistic -21.391
P-value 0.000
Lags 17
-------------------------------------
Trend: No Trend
Critical Values: -2.57 (1%), -1.94 (5%), -1.62 (10%)
Null Hypothesis: The process contains a unit root.
Alternative Hypothesis: The process is weakly stationary.
intrate_diff
Phillips-Perron Test (Z-tau)
=====================================
Test Statistic -14.303
P-value 0.000
Lags 17
-------------------------------------
Trend: No Trend
Critical Values: -2.57 (1%), -1.94 (5%), -1.62 (10%)
Null Hypothesis: The process contains a unit root.
Alternative Hypothesis: The process is weakly stationary.
ADF検定と同じくPP検定でも、全ての系列で単位根の帰無仮説が棄却された
結論として、cpi_logは定常過程に従い、その他5つの系列は全て単位根過程(1次和分過程)に従うことが示唆された
参考サイト
ARCHのドキュメント: http://arch.readthedocs.io/en/latest/index.html