30
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【第1章】pythonで「経済・ファイナンスデータの計量時系列分析」の章末問題を解く

Last updated at Posted at 2018-02-10

自分の勉強用に、沖本竜義「経済・ファイナンスデータの計量経済分析」の章末問題をpythonで解いてみました。
jupyter notebook上で記述したものをほぼそのまま載せてあります。
ソースコードの細かい説明は省いてありますが、今後余裕があれば説明を加えようと思います。

こちらの記事は第1章の章末問題を解いたものになります。
第2章第4章第5章第6章第7章も公開しています。

各種設定・モジュールのインポート

%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import acf
from statsmodels.stats.diagnostic import acorr_ljungbox


import matplotlib as mpl
font = {"family":"IPAexGothic"}
mpl.rc('font', **font)
plt.rcParams["font.size"] = 12

1.3

(1.8)式のモデルからデータを生成する

gwn_0_1 = pd.Series(np.random.randn(100),name=u'\u03bc=0,\u03c3=1')
gwn_2_1 = pd.Series(2+np.random.randn(100),name=u'\u03bc=2,\u03c3=1')
gwn__2_1 = pd.Series(-2+np.random.randn(100),name=u'\u03bc=-2,\u03c3=1')
gwn_0_2 = pd.Series(2*np.random.randn(100),name=u'\u03bc=0,\u03c3=2')
gwn_0_3 = pd.Series(3*np.random.randn(100),name=u'\u03bc=0,\u03c3=3')
gwn_2_2 = pd.Series(2+2*np.random.randn(100),name=u'\u03bc=2,\u03c3=2')

プロットする

fig, ax = plt.subplots(3,2,figsize=(20,20))
ax[0,0].plot(gwn_0_1)
ax[0,0].set_title(u'\u03bc=0,\u03c3=1')
ax[0,1].plot(gwn_2_1)
ax[0,1].set_title(u'\u03bc=2,\u03c3=1')
ax[1,0].plot(gwn__2_1)
ax[1,0].set_title(u'\u03bc=-2,\u03c3=1')
ax[1,1].plot(gwn_0_2)
ax[1,1].set_title(u'\u03bc=0,\u03c3=2')
ax[2,0].plot(gwn_0_3)
ax[2,0].set_title(u'\u03bc=0,\u03c3=3')
ax[2,1].plot(gwn_2_2)
ax[2,1].set_title(u'\u03bc=2,\u03c3=2')

plt.show()

output_3_0.png

1.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

プロットする

title=['TOPIX','実効為替レート','鉱工業生産指数','CPI','失業率','コールレート']
ylim=[3500,120,120,120,6,14]

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.iloc[:,2*i+j])
        ax[i,j].set_title(title[2*i+j])
        ax[i,j].set_ylim(0,ylim[2*i+j])
        ax[i,j].set_xlim(eco.index[0],eco.index[-1])
        ax[i,j].hlines(ax[i,j].get_yticks(),ax[i,j].get_xlim()[0],ax[i,j].get_xlim()[1],linewidth=0.5)
        ax[i,j].spines['right'].set_visible(False)
        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('')
plt.subplots_adjust(wspace=0.2,hspace=0.3)
plt.show()

output_7_0.png

(2)

対数差分系列を計算する

eco['topix_dlog'] = np.log(eco.topix).diff()
eco['exrate_dlog'] = np.log(eco.exrate).diff()
eco['indprod_dlog'] = np.log(eco.indprod).diff()
eco.head()
topix exrate indprod cpi saunemp intrate topix_dlog exrate_dlog indprod_dlog
1975-01-01 276.09 29.13 47.33 52.625 1.7 12.67 NaN NaN NaN
1975-02-01 299.81 29.70 46.86 52.723 1.8 13.00 0.082422 0.019378 -0.009980
1975-03-01 313.50 29.98 46.24 53.114 1.8 12.92 0.044650 0.009383 -0.013319
1975-04-01 320.57 29.80 47.33 54.092 1.8 12.02 0.022301 -0.006022 0.023299
1975-05-01 329.65 29.79 47.33 54.385 1.8 11.06 0.027931 -0.000336 0.000000

(3)

プロットする

title=['TOPIX','実効為替レート','鉱工業生産指数']
ylim_u=[15,12,5]
ylim_l=[-20,-8,-5]
yticks_int=[5,2,1]

fig,ax = plt.subplots(nrows=3,ncols=1,figsize=[10,15])
for i in range(3):
    ax[i].plot(eco.iloc[:,6+i]*100)
    ax[i].set_title(title[i])
    ax[i].set_ylim(ylim_l[i],ylim_u[i])
    ax[i].set_xlim(eco.index[0],eco.index[-1])
    ax[i].spines['right'].set_visible(False)
    ax[i].set_xticks(eco.index[eco.index.is_year_start][::3])
    ax[i].set_xticklabels(eco.index[eco.index.is_year_start][::3].strftime('%y'))
    ax[i].set_yticks(range(ylim_l[i],ylim_u[i]+1)[::yticks_int[i]])
    ax[i].hlines(ax[i].get_yticks(),ax[i].get_xlim()[0],ax[i].get_xlim()[1],linewidth=0.5)
    ax[i].set_xlabel('')
plt.subplots_adjust(wspace=0.2,hspace=0.3)
plt.show()

output_11_0.png

(4)

indprodの変化率の標本自己相関とQ(m)とP値を求める

autocorr_indprod=acf(eco.indprod_dlog[1:])[1:]
q_m_indprod=acorr_ljungbox(eco.indprod_dlog[1:])[0]
p_value_indprod=acorr_ljungbox(eco.indprod_dlog[1:])[1]
lag=range(1,41)
test_indprod=pd.DataFrame({'lag':lag,'autocorr':autocorr_indprod,'Q(m)':q_m_indprod,'P_value':p_value_indprod})
test_indprod[['lag','autocorr','Q(m)','P_value']].iloc[0:10,:].T
0 1 2 3 4 5 6 7 8 9
lag 1.000000e+00 2.000000e+00 3.000000e+00 4.000000e+00 5.000000e+00 6.000000e+00 7.000000e+00 8.000000e+00 9.000000e+00 1.000000e+01
autocorr -3.056815e-01 1.231154e-01 1.699805e-01 6.173203e-02 1.677640e-02 8.291975e-02 -1.082355e-03 8.959420e-02 3.584451e-02 -4.913541e-02
Q(m) 3.420025e+01 3.976335e+01 5.039731e+01 5.180377e+01 5.190793e+01 5.445974e+01 5.446017e+01 5.745610e+01 5.793698e+01 5.884316e+01
P_value 4.972263e-09 2.320056e-09 6.574768e-11 1.516132e-10 5.634492e-10 5.958688e-10 1.907042e-09 1.466964e-09 3.342017e-09 5.995413e-09

標本自己相関をプロットする

fig,ax=plt.subplots(1,1,figsize=[8,5])
ax.bar(test_indprod.lag[:20],test_indprod.autocorr[:20])
ax.set_ylim(-0.5,0.5)
ax.set_xticks([1,5,10,15,20])
ax.set_yticks(np.asarray(range(-5,6))*0.1)
ax.hlines([1.96/np.sqrt(eco.shape[0]-1),-1.96/np.sqrt(eco.shape[0]-1)],0,21,linestyles='dashed',linewidth=1)
ax.set_xlabel('ラグ')
ax.set_ylabel('自己相関')
ax.set_title('鉱工業生産指数の成長率')
plt.show()

output_14_0.png

(5)

TOPIXについて自己相関検定を行う

autocorr_topix=acf(eco.topix_dlog[1:])[1:]
q_m_topix=acorr_ljungbox(eco.topix_dlog[1:])[0]
p_value_topix=acorr_ljungbox(eco.topix_dlog[1:])[1]
lag=range(1,41)
test_topix=pd.DataFrame({'lag':lag,'autocorr':autocorr_topix,'Q(m)':q_m_topix,'P_value':p_value_topix})
test_topix[['lag','autocorr','Q(m)','P_value']].iloc[0:10,:].T
0 1 2 3 4 5 6 7 8 9
lag 1.000000e+00 2.000000e+00 3.000000e+00 4.000000e+00 5.000000e+00 6.000000e+00 7.000000 8.000000 9.000000 10.000000
autocorr 3.077999e-01 6.824984e-02 3.529433e-02 6.801588e-02 3.130508e-02 -5.079917e-02 0.015837 0.025024 0.106257 0.064149
Q(m) 3.467592e+01 3.638552e+01 3.684399e+01 3.855135e+01 3.891405e+01 3.987178e+01 39.965130 40.198841 44.424647 45.969211
P_value 3.894192e-09 1.255984e-08 4.964713e-08 8.622952e-08 2.471338e-07 4.827198e-07 0.000001 0.000003 0.000001 0.000001

標本自己相関をプロットする

fig,ax=plt.subplots(1,1,figsize=[8,5])
ax.bar(test_topix.lag[:20],test_topix.autocorr[:20])
ax.set_ylim(-0.5,0.5)
ax.set_xticks([1,5,10,15,20])
ax.set_yticks(np.asarray(range(-5,6))*0.1)
ax.hlines([1.96/np.sqrt(eco.shape[0]-1),-1.96/np.sqrt(eco.shape[0]-1)],0,21,linestyles='dashed',linewidth=1)
ax.set_xlabel('ラグ')
ax.set_ylabel('自己相関')
ax.set_title('TOPIXの成長率')
plt.show()

output_17_0.png

実効為替レートについて自己相関検定を行う


autocorr_exrate=acf(eco.exrate_dlog[1:])[1:]
q_m_exrate=acorr_ljungbox(eco.exrate_dlog[1:])[0]
p_value_exrate=acorr_ljungbox(eco.exrate_dlog[1:])[1]
lag=range(1,41)
test_exrate=pd.DataFrame({'lag':lag,'autocorr':autocorr_exrate,'Q(m)':q_m_exrate,'P_value':p_value_exrate})
test_exrate[['lag','autocorr','Q(m)','P_value']].iloc[0:10,:].T
0 1 2 3 4 5 6 7 8 9
lag 1.000000e+00 2.000000e+00 3.000000e+00 4.000000e+00 5.000000e+00 6.000000e+00 7.000000e+00 8.000000e+00 9.000000e+00 1.000000e+01
autocorr 3.217763e-01 4.860159e-02 9.068437e-02 3.667455e-02 -3.474773e-02 -8.257040e-02 -3.047480e-02 1.070266e-01 1.015502e-01 -1.826474e-02
Q(m) 3.789649e+01 3.876344e+01 4.179009e+01 4.228649e+01 4.273335e+01 4.526370e+01 4.560934e+01 4.988452e+01 5.374427e+01 5.386948e+01
P_value 7.459915e-10 3.824946e-09 4.445457e-09 1.454942e-08 4.184633e-08 4.148156e-08 1.041334e-07 4.300973e-08 2.111351e-08 5.131560e-08

標本自己相関をプロットする

fig,ax=plt.subplots(1,1,figsize=[8,5])
ax.bar(test_exrate.lag[:20],test_exrate.autocorr[:20])
ax.set_ylim(-0.5,0.5)
ax.set_xticks([1,5,10,15,20])
ax.set_yticks(np.asarray(range(-5,6))*0.1)
ax.hlines([1.96/np.sqrt(eco.shape[0]-1),-1.96/np.sqrt(eco.shape[0]-1)],0,21,linestyles='dashed',linewidth=1)
ax.set_xlabel('ラグ')
ax.set_ylabel('自己相関')
ax.set_title('実効為替レートの成長率')
plt.show()

output_19_0.png

30
33
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?