日経平均株価の超長期のデータを用いて確定的トレンドと確率的トレンドを理解しました。
確定的トレンドは、時間の経過と共に上昇、または下落するトレンドを形成し、価格はその期待値の周辺を行ったり来たりする。
一方、確率的トレンドは上昇、または下落のトレンドを形成するが、価格がその後どのような動きをするかは定かではない。
どちらも非定常確率過程の例であるが、その背後に想定される市場の構造は全く違う。
経済に外生的なショックなどが与えられると確定的トレンドでは、日経平均株価は一時的にそのトレンドから大きく乖離するかもしれないが、
経済が確定的なトレンドを維持できる力を保持できていれば、元の軌道に戻る可能性がある。
一方、確率的トレンドではトレンドからの乖離はトレンドとの決別を意味する。
これがランダムウォークの特徴です。
前回までの分析でこのように本質的に異なる2つのトレンドが過去の日経平均株価には見らました。
しかし、株式指数、個別株、為替レートなどの価格は、上昇の後にさらに上昇し、 下落の後にさらに下落するという過去の株価と現在の株価が不完全相関をもつという事例も多数観察されています。
標本線形回帰式の
$$Z_{t} = a + \beta Z_{t-1} + z_{t} $$
を思い出してほしい。
$Z_{t}$は t 時点の被説明変数です。t 時点の説明変数$X_{t}$を1単位時間(1時点)前の被説明変数$Z_{t-1}$に置き換えると
$$Z_{t} = a + \beta Z_{t-1} + z{t}$$
の1次の自己回帰モデル(AR(1)が得られる。
ここで z はかく乱項です。
係数は、自己回帰係数で$Z_{t}$と$Z_{t-1}$の間の関係を表しています。
これは最も簡単な自己回帰過程で1階の自己回帰過程とよばれる。
|β|< 1の場合、これは定常確率過程となります。
β=1の時はすでに見たランダムウォークモデルです。
さらにこのモデルには、ドリフト項と確定的ドレン度を加えることもできます。
単位根検定に用いたモデルを思い出して下さい。
このモデルをさらに一般化したモデルはARMA モデル(自己回帰移動平均モデル:Autoregressive Moving Average Model)とよばれ
$$ Z_{t} = \sum_{i=1}^{p} \beta_{i}\sum_{t-i} + z_{t} - \sum_{i=1}^{q} \gamma_{j} z_{t-j} $$
として定義されます。ここでi は自己回帰の次数とよばれ、$Z_{t-i}$は$Z_{t}$よりi単位時間(i時点)前の変数を表し、jは移動平均の次数であり残差$Z_{t-i}$は t 時点より j 単位時間前の変数を表している。
$\beta_{i}$、$\gamma_{j}$はそれぞれ自己回帰係数、移動平均係数である。$Z_{t}$は平均ゼロ、分散 $\sigma ^{2}_{z}$、かつ共分散ゼロ(異なる次数間)のかく乱項である。
エンジニアリングの世界ではこれをホワイトノイズとよぶ。このモデルをARMA(p, q)といい、q=0 の時は自己回帰モデルAR(p)となり、p = 0 では移動平均モデルMA(q)となります。
q = 0 の時ARMA(p,q)モデルは
$$ Z_{t} = \sum_{i=1}^{p} \beta_{i}Z_{t-j} $$
となります。
自己相関が生じる原因として慣性や市場の停滞が挙げられる。経済は停滞期を得て徐々に拡張期に移行していくように、ゆっくりとした循環のもとで成り立っている。
従って金融市場の価格であってもこのような経済活動を反映してモメンタムが生じ、何か外生的なショックが起こるまで、その傾向は継続します。
金融市場の価格においても正のフィードバック効果が観測されることがあります。
ではなぜ経済はゆっくりと動きたがるのだろうか?
主な理由は3つです。
1.技術的理由:新しい技術をすぐに導入できるわけではないです。
2.組織的理由:すでに導入されているシステム、契約をある一定期間変更するわけにはいかない。
3.心理的理由:心理的に新しい概念に人々はすぐに順応できるわけではないです。
AR(p)モデル、MA(q)、またはARMA(p,q)モデルのどのタイプを使ったらよいのだろうか?
またp,qといった次数はどのように決めたらよいのだろうか?
まず、AR(2)モデルを
$$ Z_{t} = \beta_{1} + \beta_{2}Z_{t-1} + \beta_{3}Z_{t-2} + z_{t} $$
と定義します。
一般に自己相関関数(autocorrelatio function:acf)は
$$acf = \frac{cov(Z_{t},Z_{t-k})}{var(Z_{t})var(Z_{t-k})} $$
で与えられます。
このk = 0の時、共分散(cov)は分散(var)になる。
k = 1であれば$Z_{t}$と$Z_{t-1}$の線形の関係をとらえていてそれを$r_{12}$としよう。
この場合、本当に線形関係がとらえらえているのだろうか?
$Z_{t-2}$は$Z_{t}$に影響を与えないだろうか?
また、$Z_{t}$に影響を与えないだろうか?
または、この両方に影響を与えているのではないだろうか?
従って、実際にはこれらの関係も明らかにしなければならない。
そこで
1.$r_{12,3}$を$Z_{t-2}$を固定した場合の$Z_{t}$と$Z_{t-1}$の間の相関;
2.$r_{13,2}$を$Z_{t-1}$を固定した場合の$Z_{t}$と$Z_{t-2}$の間の相関;
3.$r_{23,1}$を$Z_{t}$を固定した場合の$Z_{t-1}$と$Z_{t-2}$の間の相関;
と定義しそれを偏自己相関とよぶ。自己相関(acf)と偏自己相関(Pacf: partical autocorrelation function)は、ARMAモデルの次数の決定をグラフを用いて判断する方法を与えてくれます。
次の表がその目安です
モデル | 自己相関 | 編自己相関 |
---|---|---|
AR(p) | 指数関数的な減燧、または上下の動き | 大きな突出的な動きがp次まで続く |
MA(q) | 大きな突出的な動きがqが次まで続く | 指数関数的な減衰 |
ARMA(p,q) | 指数関数的な減衰 | 指数関数的な減衰 |
statsmodelsのplot_acfとplot_pacfは標本自己相関と標本偏自己相関をプロットしてくれるだけではなく、その信頼区間をプロットしてくれます。
x軸に次数、y軸に自己相関、偏自己相関として描いたグラフをコレログラムといいます。
影が掛かった部分が95%の信頼区間である。標本自己相関と標本偏自己相関の棒グラフの外側に信頼区間(陰の部分)がプロットされると帰無仮説を棄却するのは難しい。
従って、回帰係数がゼロである可能性が高いです。
信頼区間の影の部分から標本自己相関と標本偏自己相関の棒グラフが大きくはみ出していれば、標本自己相関と標本偏自己相関はゼロではない可能性が高いと判断される
1949年以降から直近までの日経平均株価(対数)を用いて次数 5000までの標本自己相関と次数 40までの標本偏自己相関をプロットしてみました。
標本自己相関は指数関数的に非常になだらかな減衰を示している。
薄い陰のついた部分が信頼区間を示していて、上を向いた棒グラフの先がこの範囲の中になければ、正の自己相関が有意である可能性が高い。
次数1500程度までは、上向きの棒グラフは信頼区間の外側の棄却域にある。従って有意な正の自己相関が存在する可能性が高いです。
また、標本偏自己相関ではなだらかな指数関数的な減衰は見られずに、2つの大きな突起を見ることができますね。
最初の0次は自分自身なので、2本目の大きな突起は1次の偏自己相関です。
従って、日経平均株価の対数の時系列はAR(1)である可能性が高いです。
%matplotlib inline
import pandas as pd
import pandas_datareader.data as web
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
n225 = pdr.DataReader("NIKKEI225", 'fred',"1949/5/16").dropna()
lnn225=np.log(n225)
fig = plt.figure(figsize=(10,4))
ax1 = fig.add_subplot(1,2,1)
fig = sm.graphics.tsa.plot_acf(lnn225.squeeze(), lags=5000, color='lightgray',ax=ax1)
ax2 = fig.add_subplot(1,2,2)
fig = sm.graphics.tsa.plot_pacf(lnn225.squeeze(), lags=40,color='lightgray', ax=ax2)
k次の自己相関関数を計算し、グラフに表示する機能がstatsmodleから得られる。
logは次数に相当します。
import statsmodels.api as sm 接頭語をsmとしてstatsmmodels.apiをインポート
n225 = pdr.DataReader("NIKKEI225", 'fred',"1949/5/16").dropna() 新しいウインドウを描画
lnn225=np.log(n225) figureで指定された場所の中にサブプロットを追加描画
ax1 = fig.add_subplot(1,2,1)
plot_acfは自己相関をプロットする。
fig = sm.graphics.tsa.plot_acf(lnn225.squeeze(), lags=5000, lagsで次数を指定、axでサブプロットを指定
ax2 = fig.add_subplot(1,2,2) plot_acfは自己相関をプロットする。
fig = sm.graphics.tsa.plot_pacf(lnn225.squeeze(), lags=40,color='lightgray', ax=ax2)
前回の1949年以降2016年4月末までの日経平均株価を用いたADF検定では、日経平均株価はドリフト付きモデルでランダムウォークであると見なすことが難しいと判断された。そこでドリフト付きAR(1)であるかどうかを調べてみます。
arma_mod = sm.tsa.ARMA(lnn225,order=(1,0))
arma_res = arma_mod.fit(trend='c', disp=-1)
print(arma_res.summary())
ARMA Model Results ============================================================================== Dep. Variable: NIKKEI225 No. Observations: 16975 Model: ARMA(1, 0) Log Likelihood 50497.635 Method: css-mle S.D. of innovations 0.012 Date: Thu, 03 Aug 2017 AIC -100989.270 Time: 06:12:04 BIC -100966.051 Sample: 05-16-1949 HQIC -100981.613 - 08-02-2017 =================================================================================== coef std err z P>|z| [0.025 0.975] ----------------------------------------------------------------------------------- const 7.6422 2.122 3.602 0.000 3.484 11.801 ar.L1.NIKKEI225 1.0000 2.02e-05 4.94e+04 0.000 1.000 1.000 Roots ============================================================================= Real Imaginary Modulus Frequency ----------------------------------------------------------------------------- AR.1 1.0000 +0.0000j 1.0000 0.0000 -----------------------------------------------------------------------------
対数価格を用いた線形回帰の結果では切片が7.6309、回帰係数が1であり、そのp-値は共にゼロであるので、ドリフト付きモデルでランダムウォークである可能性が高い。
この結果は明らかにMaterial 7のADF 検定の結果と矛盾する。
そこで線形回帰に必要な条件を1つ1つチェックしてみます。 最小二乗法により統計量が母数を正しく推定し、また、被説明変数の正しい期待値を得るためには
1.回帰関数は線形でなければならない。
2.$Z_{i-1}$は確率変数であってはならない。
3.$z_{i}$の平均はゼロである。
4.$z_{i}$の分散は一定である。
5.$z_{i}$と$z_{i+j}$の相関はゼロである。j≠1
6.$z_{i}$と$Z_{i}$の共分散はゼロである。
でなければならない。
ドリフト付きAR(1)は線形である。
ziとZiの共分散がゼロであれば、説明変数が確率変数であっても可能
グラフによる確認が可能である。
グラフによる確認が可能である。
残差項の自己相関、偏自己相関のグラフから判断できる。
このような仮定が成り立てば最小二乗法より最良線形不偏推定量が得られる。
また、次の条件も検討する必要がありますね。
残差項が正規分布に従う確率変数であると、統計量は不偏推定量、最小分散、一致性(標本数が増えると統計量は母数に近づく)、正規性をもつなどの特性を得ることができる
まず、残差をプロットしてみよう。直感的にはバブル崩壊以降残差は大きくなっていて、分散が一定という仮定に反しているように思えます。
arma_res.resid.iloc[1:].plot(figsize=(10,6),color='seagreen')
plt.ylabel('$\hat{z_t}$')
<matplotlib.text.Text at 0x7f28a9e53208>
次に標本自己相関、標本偏自己相関を用いて残差の分析を行ってみよう。acfはp-値を返してくれるので、標本自己相関係数がゼロであるとする帰無仮説の検定ができる。また、標本偏自己相関では95%の信頼区間を返してくれるので、こちらも同じように帰無仮説の検定ができます。
from statsmodels.tsa import stattools
acf,q,pvalue = stattools.acf(arma_res.resid,nlags=5,qstat=True)
pacf,confint = stattools.pacf(arma_res.resid,nlags=5,alpha=0.05)
print("自己相関係数:",acf)
print("p値:",pvalue)
print("偏自己相関:",pacf)
print("95%信頼区間:",confint)
自己相関係数: [ 1. 0.00859385 -0.00140944 0.00502835 0.00557556 -0.00566778] p値: [ 0.26280962 0.52528589 0.63317124 0.69082898 0.73226646] 偏自己相関: [ 1. 0.00859435 -0.00148357 0.00505451 0.00548851 -0.00575057] 95%信頼区間: [[ 1. 1. ] [-0.00644895 0.02363765] [-0.01652688 0.01355973] [-0.00998879 0.02009781] [-0.00955479 0.02053182] [-0.02079388 0.00929273]]
標本自己相関はすべての次数に対して10%より大きいので帰無仮説を棄却することは難しい。従って、標本自己相関はゼロである可能性が高い。 また偏自己相関に関してもすべての次数で信頼区間の中にあるので、帰無仮説を棄却するのは難しく、標本偏自己相関もゼロである可能性が高い。
結果:残差項の自己相関=ゼロ
acf,q,pvalue = stattools.acf(arma_res.resid,nlags=5,qstat=True) p値を取得
pacf,confint = stattools.pacf(arma_res.resid,nlags=5,alpha=0.05) 信頼区間を取得
残差項が定常過程かどうかを調べてみます。
p=sm.tsa.adfuller(arma_res.resid,regression='nc')[1] #[1]はp値の検定結果
p1=sm.tsa.adfuller(arma_res.resid,regression='c')[1] #[1]はp値の検定結果
print("ドリフト無しランダムウォーク p値:",p)
print("ドリフト付きランダムウォーク p値:",p1)
ドリフト無しランダムウォーク p値: 0.0 ドリフト付きランダムウォーク p値: 0.0
結果はp-値がドリフト付き、ドリフト無しモデルに対してゼロであるので、帰無仮説を棄却するに足る。
from scipy.stats import t
resid=arma_res.resid.iloc[1:]
m=resid.mean()
v=resid.std()
resid_max=pd.Series.rolling(arma_res.resid,window=250).mean().max()
resid_min=pd.Series.rolling(arma_res.resid,window=250).mean().min()
print("平均: %2.5f"%m,"標準偏差: %2.4f"%v)
print("250日平均の最大値: %2.5f"%resid_max,"250日平均の最小値: %2.5f"%resid_min)
print("250日平均の95%の信頼区間: ",(t.interval(alpha=0.95, df=250, loc=0, scale=v)))
平均: 0.00029 標準偏差: 0.0123 250日平均の最大値: 0.00363 250日平均の最小値: -0.01230 250日平均の95%の信頼区間: (-0.024317847084989939, 0.024317847084989939)
250日平均の95%信頼区間は、-0.02437 から0.02437である。250日間の平均値の最大値は0.0036 であり、最小値は-0.0012である。従って、どの期間においても250日間の平均値は95%の信頼区間の中にある。グラフで確かめてみます。
pd.Series.rolling(arma_res.resid.iloc[1:],250).mean().plot(figsize=(10,6),color='hotpink')
plt.ylabel('$\hat{z_t}$')
<matplotlib.text.Text at 0x7f28a9856ba8>
Scipy 統計関数のリファレンス: http://docs.scipy.org/doc/scipy-0.17.0/reference/stats.html
標準偏差に関してもグラフを用いてそれが一定であるかどうかの判断をしてみよう。
平均の時と同様に信頼区間があると便利である。
変数$u_{1}$,,...,$u_{i}$が独立同一の平均がμ、分散が$\sigma ^{2}$の正規分布に従うとき、
$$ \widehat{\sigma } ^{2}(n-1) \approx \sigma ^{2} \chi ^{2}_{n-1}$$が成り立つことが知られています。
ここで、
$$ {\sigma }^{2}(\sum_{i=1}^{n} u_{i}) / (n-1)$$ある。 従って、標本分散の の信頼区間は
$$ \frac{ \widehat{\sigma }^{2} }{ \chi^{2}_{a/2n-1} }(n-1)<\sigma^{2} < \frac{ \widehat{\sigma }^{2} }{ \chi^{2}_{1-a/2n-1} }(n-1) $$で与えられます。
from scipy.stats import chi2
resid=arma_res.resid.iloc[1:]
m=resid.mean()
v=resid.std()
resid_max=pd.Series.rolling(arma_res.resid,window=250).std().max()
resid_min=pd.Series.rolling(arma_res.resid,window=250).std().min()
print("平均: %2.5f"%m," 標準偏差: %2.5f"%v)
print("250日標準偏差の最大値:%2.5f"%resid_max,"250日標準偏差の最小値:%2.5f"%resid_min)
cint1,cint2=chi2.interval(alpha=(0.95), df=249)
print("250日標準偏差の95pctの信頼区間:%2.4f"%(np.sqrt(cint1/249)*v),)
print("<= \sigma <=%2.4f"%(np.sqrt(cint2/249)*v))
平均: 0.00029 標準偏差: 0.01235 250日標準偏差の最大値:0.15731 250日標準偏差の最小値:0.00417 250日標準偏差の95pctの信頼区間:0.0113 <= \sigma <=0.0134
残差の標本標準偏差は0.01237であり、その95%信頼区間は0.0113から0.0135である。250日移動標本標準偏差の最大値は0.15であり、最小値は0.0042である。信頼区間から大きく外れている期間が多い。グラフで確認してみよう
pd.Series.rolling(arma_res.resid.iloc[1:],250).std().plot(figsize=(10,6),color='darkgray')
plt.ylabel('$std$')
<matplotlib.text.Text at 0x7f28a9ce4400>
標本標準偏差に関してはグラフから信頼区間から大きく外れている期間が多いことが見て取れます。
一般に回帰分析において分散が一定でない状態を分散不均一性といい、回帰係数の推定に問題を生じさせることで知られています。
しかし、金融市場における分散の変動は分散不均一性以上の意味をもちます。
金融市場では価格の変動性が大きくジャンプしてその状態が一定期間継続することが知られています。
この問題をボラティリティーのクラスタリングとよぶ。金融市場の背後にある経済の状態そのものが変化した結果として、そのような分散の大きな変動が生じている可能性があるのです。
このような時には分散不均一性というよりは構造変化(structural break)として認識されます
ではなぜ分散不均一性、構造変化が注目に値するのだろうか?
その理由は簡単です!
自己相関、偏自己相関、定常過程、平均ゼロとチェックしてきましたが、どの判定も分散が一定であることが前提となっているからです!
ではなぜ最初に分散のチェックをしなかったかって!
確かにそうだ!
順番は分散不均一性のテストが実は最優先だ。
どのような統計の教科書でもこの分散不均一性だけでMaterial 8を費やしている。
有名な検定方法としてPark、Breush-Pagan、White、goldfeld-quandtテストがある。
Parkを除くとStatsmodelで提供されている。
しかし、最も頻繁に用いられるのはインフォーマルな目視のテストである。
その意味では残差の分析の最初に分散不均一性の目視のテストを行っている。
長期の回帰分析には要注意です!
from scipy.stats import chi2
x2乗分布
cint2=chi2.interval(alpha=(0.95),df=249)
cint1=信頼区間の上限
cint2=信頼区間の下限
alpha=信頼区間
再度、景気循環期に着目し、標本自己相関と標本偏自己相関について調べてみよう。景気循環期は分析の出発点である
bcs=["1949/5/16","1954/12/1","1972/1/1","1986/12/1","1986/12/1",
"1993/11/1","1999/2/1","2002/2/1","2009/4/1"]
bce=["1954/11/30","1971/12/31","1986/11/30","1989/12/31","1993/10/30",
"1999/1/31","2002/1/31","2009/3/31","2012/11/30"]
for i in range(len(bcs)):
y=lnn225.loc[bcs[i]:bce[i]].dropna()
fig = plt.figure(figsize=(8,2))
ax1 = fig.add_subplot(1,2,1)
fig = sm.graphics.tsa.plot_acf(y.squeeze(), lags=120, ax=ax1,color='darkgray')
plt.title(bcs[i]+' - acf')
ax2 = fig.add_subplot(1,2,2)
fig = sm.graphics.tsa.plot_pacf(y.squeeze(), lags=20, ax=ax2,color='seagreen')
plt.title(bcs[i]+' - pacf')
大きな傾向は全期間を通して行った時の分析結果と同じである。 標本自己相関は指数関数的な減衰をし、標本偏自己相関は1次で大きな突起が生じるという傾向に変化はないですね。
それぞれの景気循環期に対して切片付きAR(1)モデルを用いて回帰係数を推定してみました。
for i in range(len(bcs)):
y=lnn225.loc[bcs[i]:bce[i]].dropna()
arma_mod = sm.tsa.ARMA(y,order=(1,0))
arma_res = arma_mod.fit(trend='c', disp=-1)
print(bcs[i],arma_res.arparams,arma_res.resid.std())
1949/5/16 [ 0.99941744] 0.016123076050621566 1954/12/1 [ 0.99995715] 0.018857893502517514 1972/1/1 [ 0.99995969] 0.017363617762059698 1986/12/1 [ 0.99941777] 0.017807226539736577 1986/12/1 [ 0.99803644] 0.015223311696095044 1993/11/1 [ 0.99425358] 0.01465834051442162 1999/2/1 [ 0.99766292] 0.01575747888887696 2002/2/1 [ 0.99795655] 0.016698569967002697 2009/4/1 [ 0.98415867] 0.01394878057537178
ADF検定では、第2次世界大戦以降のほぼすべての日経平均株価のデータを対象として分析を行いました。
そして、その結果として、ドリフト付きモデルでランダムウォーク仮説が棄却された。
それに伴い、戦後から現在までの日経平均株価がAR(1)であるかどうかの分析を行いました。
しかし、ADF検定の結果との整合性は取れなかったですね。そこで行った残差項の分析からうまく行かない理由は、分散不均一性と構造変化があったからです。
そして、ADF検定で、すべての経済循環期でドリフト付きモデルでランダムウォークであるという帰無仮説を否定することが難しいという結果を得ました。
今のところ、経済循環期に対して分散不均一性も構造変化についても分析していない。
もちろん本当はするべきです。(経済循環期には拡張期と後退期があることを決して忘れないでほしいです。)
そして今、すべての景気循環期に対して、日経平均株価がAR(1)で説明できるのではないかという分析を行っています。
このようなくどくどとした分析を何度となく繰り返す理由は何なのだろうか?
ここで第一種過誤、またはタイプエラーについて説明します。
第一種過誤とは帰無仮説が正しいのに棄却してしまう過ちのことです。
仮説検定は帰無仮説が正しいのに棄却してまうリスクを少なくする方向で行われます。
つまり、なるべく帰無仮説が受け入れられやすくしているので、帰無仮説が実は間違っているのに正しいとしてしまうリスク、または対立仮説が正しいのに間違っているとするリスクは高まっているのです。
これを第2種の過誤という。ということはMaterial 7の分析ではドリフト付きモデルでランダムウォークであるという可能性が高いだけであって、必ずしもそうであるとは限らないのです。
分析結果ではすべての景気循環期で日経平均株価の確率過程がAR(1)による定常性をもちうるという可能性があります。
つまりこの結論を捨てきるわけにはいかないのです。
または、金融市場の時系列分析では幾つものモデルの可能性を視野に入れて分析する必要があるのではではないでしょうか。
今回は3種の神器である、時間トレンド、ランダムウォーク、AR(1)を手に入れました。
しかし、金融市場の時系列分析ではどれか1つを特定して分析する考え方は得策ではないですね。