ARCHモデル

# 導入
時間の経過に伴って変化するデータを示す、時系列データについての記事です。
時系列データは、自然科学、社会科学、経済学、金融、医療、エンジニアリングなど、多くの分野で扱われています。
今回はそんな時系列データを分析する際に出てくる**ARCHモデル**ついての説明をします。


この記事では<a href="https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E3%81%99%E3%81%90%E4%BD%BF%E3%81%88%E3%82%8B%E6%99%82%E7%B3%BB%E5%88%97%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90-%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%82%B9%E3%83%88%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E6%A8%AA%E5%86%85-%E5%A4%A7%E4%BB%8B/dp/4774163015/ref=pd_bxgy_14_img_3/357-7213040-9644743?_encoding=UTF8&pd_rd_i=4774163015&pd_rd_r=21f509dd-50b7-494a-bfbf-9cd9d41752a6&pd_rd_w=myCv9&pd_rd_wg=cBb4L&pf_rd_p=e1d64852-a4db-4f50-95af-f6bb1415e9c1&pf_rd_r=GKHKRHV7FC4V1TCD6NA6&psc=1&refRID=GKHKRHV7FC4V1TCD6NA6">現場ですぐ使える時系列データ分析 ~データサイエンティストのための基礎知識~ :横内 大介, 青木 義充 著(2014)</a>のデータを使い、**ARCHモデル**についてRを使いながら説明していきます。


# 前提知識として必要な概念
__・自己回帰モデル(ARモデル)__
__・ホワイトノイズ__

さらっと解説します

## 自己回帰モデル
__現在の自分を過去の自分で表すモデル式__

ARモデルとも呼ばれます。(Auto Regressive model)

一般式はこう


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413787/bff54fbb-8fb2-609d-c95d-5b1450cae3d1.png)

ある時点tでの値を、過去の時点(t-1)の自分で表しています



シンプルな形にするとただの一次式なのでわかりやすいと思います。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413787/c34d0f4f-274b-0725-310c-a9c14ceda6fa.png)

このシンプルな式に

自分以外の過去の情報：C
過去とは無関係な現在の情報ノイズ：ε

を加えると一般式になり__過去の情報__と__現在のノイズ__で__現在の自分を表す__ことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413787/d7ff0620-aa2f-1600-5f54-a4891fdb5d94.png)


## ホワイトノイズ


上で紹介した自己回帰モデルの ε のこと。


特徴はざっくり言うと次の3つです。

1.定常時系列の代表、扱いやすい
2.平均 = 0、分散 = 一定、自己共分散 = 0
3.現在の自分は過去の自分と無関係


自己共分散や定常性については割愛します。


## 本題に向けて
__ホワイトノイズは扱いやすいがこいつだけでなんでもかんでもあてはまりの良い自己回帰モデルを作るには限界がある。__
__そこで分散不均一構造の代表ARCHモデルの出番__、というわけです。


# ARCHモデル

分散不均一構造モデルの代表例です


正式名称は**自己回帰条件付き分散不均一モデル(Auto Regressive Heteroskedasticity model)**
頭文字をとって**ARCHモデル**
ARは自己回帰モデルのARと同じ意味です。

次の3つの式を総称して__ARCHモデル__と呼びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413787/b90c2a83-e97f-3100-8de5-023506b2fed3.png)

このモデルの意味するところは__前回絶対値の大きなノイズが来たのであれば今回の分散は大きくなるだろう__ということです。

株価を例に考えましょう。


__昨日A社の株がすごく下がった__(=大きなノイズが来た)

__このあとよくある株価の動きは2つです__。

1.するとみんなA社の株を**たくさん買った**（買い時だと思った）
→**株価は反発し上がった**

2.するとみんなA社の株を**たくさん売った**（これ以上下がったら嫌だ）
→**株価はさらに下がった**

この2つに共通しているのが**大きなノイズがきたので株価がまた大きく動いた**ということです.

具体例として**リーマンショック**や一時期の**ビットコイン**なんかを考えていただければ**動くときは一定方向に大きく動く**ことをイメージしやすいでしょうか。



こういった株価に代表される動きは**ホワイトノイズで表すことはできませんがARCHモデルによって表すことができます**。

これらを踏まえたうえで式の意味を考えましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413787/01c566ac-1204-1864-77ae-85d3100c5b85.png)

**1つ目は自己回帰モデルの式**です。
期待値 __μt__ の部分は今までの自己回帰モデル式で言えば __c + ΦR(t-1)__ の部分に相当します。

**2つ目は現在のノイズを表す式**です。
ホワイトノイズに対して時点tによってブレる係数をかけています。
このブレる係数を条件付き標準偏差と呼びます。

**3つ目は条件付き分散、2つ目の式の条件付き標準偏差の2乗を表す式**です。
適当なパラメータω + 2つ目の式で表すことのできる前期のノイズの二乗に適当な係数a1をかけた式です。

適当なパラメータωと適当な係数a1と書きましたが注意点があります。
ここで表す条件付き分散とは2乗、つまり0またはほとんどの場合が正の数をとります。
そのためω、a1については「0以上である」という制約を設けます。

# Rで実行
使うライブラリはfGarch
使う関数はgarchFitです。

```
install.packages("fGarch")
library(fGarch)

#使うデータは120日分の収益率データ
str(data.log.return$x9041)

 num [1:120] -0.985 0 -0.331 -0.332 0.662 ..

# 一次の自己回帰モデルとその誤差モデルをつくる
# AR(1)+ARCHモデル

(arch.fit1<-garchFit(~arma(1,0)+garch(1,0),data=data.log.return$x9041,trace=F))
# estimate:係数の推定値
# Std.error:標準誤差
# t.value:t値
# Pr(>t):P値
# P値が小さければ帰無仮説「係数が0」は棄却され係数が意味を持つ

Title:
 GARCH Modelling 

Call:
 garchFit(formula = ~arma(1, 0) + garch(1, 0), data = data.log.return$x9041, 
    trace = F) 

Mean and Variance Equation:
 data ~ arma(1, 0) + garch(1, 0)
<environment: 0x000001cd60b618b0>
 [data = data.log.return$x9041]

Conditional Distribution:
 norm 

Coefficient(s):
        mu         ar1       omega      alpha1  
 0.2365270  -0.0022778   1.1195896   0.3053496  

Std. Errors:
 based on Hessian 

Error Analysis:
        Estimate  Std. Error  t value Pr(>|t|)    
mu      0.236527    0.107295    2.204   0.0275 *  
ar1    -0.002278    0.116571   -0.020   0.9844    
omega   1.119590    0.206116    5.432 5.58e-08 ***
alpha1  0.305350    0.159451    1.915   0.0555 .  
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Log Likelihood:
 -194.0714    normalized:  -1.617261 



```

## garchFit関数について

### 入力部分
```
garchFit(~arma(1,0)+garch(1,0),data=data.log.return$x9041,trace=F)
```
**arma()の部分は前半部分でARモデルの次数、MAモデルの次数を指定**します。

arma(1,0)で一次のARモデル
arma(3,0)で三次のARモデル
arma(0,1)で一次のMAモデル
arma(1,1)で一次のARMAモデルを指定します。


**garch()の部分はARCHモデル、GARCHモデルの次数の指定**をします。

garch(1,0)で一次のARCHモデル
garch(1,1)でその発展形である一次のGARCHモデルでの推定をします。


デフォルトではtrace = T であり詳細を見れますが結果だけを見たい場合が trace = F のほうが見やすいでしょう。

### 出力結果
```
Error Analysis:
        Estimate  Std. Error  t value Pr(>|t|)    
mu      0.236527    0.107295    2.204   0.0275 *  
ar1    -0.002278    0.116571   -0.020   0.9844    
omega   1.119590    0.206116    5.432 5.58e-08 ***
alpha1  0.305350    0.159451    1.915   0.0555 .  
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

```

注目すべきは**1列目のEstimate*4列目のPr(>|t|)です**。

**1列目のEstimateはモデルの係数の推定値**を表します。

**4列目のPr(>|t|)はP値**を表します。
この値が**大きければモデルへの当てはまりが悪い**ということです。
今回はar1についてのP値が0.9844と非常に大きい値をとっておりあてはまりが悪いですね。


### 余談

ちなみにこのデータについては0次のARIMAモデル、ARCHモデルの残差にskew-normal分布を指定するとあてはまりが良くなります。

```
(arch.fit3=garchFit(~arma(0,0)+garch(1,0),data=data.log.return$x9041,cond.dist="snorm",trace=F))

Error Analysis:
        Estimate  Std. Error  t value Pr(>|t|)    
mu        0.2447      0.1047    2.337   0.0194 *  
omega     1.1286      0.2033    5.551 2.84e-08 ***
alpha1    0.2773      0.1454    1.907   0.0566 .  
skew      1.2282      0.1442    8.519  < 2e-16 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


```

やみくもにあてはまりの良いモデルを探すのではなく

・ARモデルの次数のあたりをつけるにはADF検定を使う
・残差を可視化しあてはまりの良い分布を考える

のが良いと考えています。

また、聞いたことがある方も多いと思いますが[プロスペクト理論という心理効果](https://schoo.jp/biz/column/1235#:~:text=%E3%83%97%E3%83%AD%E3%82%B9%E3%83%9A%E3%82%AF%E3%83%88%E7%90%86%E8%AB%96%E3%81%A8%E3%81%AF%E3%80%811979,%E3%82%88%E3%81%86%E3%81%AA%E3%82%82%E3%81%AE%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82)が、このモデルを感覚的に理解できる一助になると思います。


# まとめ

・ARCHモデルは分散不均一構造の代表的なモデル
・株価によくある「前回絶対値の大きなノイズが来たのであれば今回の分散は大きくなるだろう」のモデル
・Rで実行するにはfGarchライブラリのgarcFit関数を使う。




以上です、最後まで読んでいただきありがとうございました。

# 参考文献
<a href="https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E3%81%99%E3%81%90%E4%BD%BF%E3%81%88%E3%82%8B%E6%99%82%E7%B3%BB%E5%88%97%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90-%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%82%B9%E3%83%88%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E6%A8%AA%E5%86%85-%E5%A4%A7%E4%BB%8B/dp/4774163015/ref=pd_bxgy_14_img_3/357-7213040-9644743?_encoding=UTF8&pd_rd_i=4774163015&pd_rd_r=21f509dd-50b7-494a-bfbf-9cd9d41752a6&pd_rd_w=myCv9&pd_rd_wg=cBb4L&pf_rd_p=e1d64852-a4db-4f50-95af-f6bb1415e9c1&pf_rd_r=GKHKRHV7FC4V1TCD6NA6&psc=1&refRID=GKHKRHV7FC4V1TCD6NA6">現場ですぐ使える時系列データ分析 ~データサイエンティストのための基礎知識~ :横内 大介, 青木 義充 著(2014)</a>
一橋大学の横内先生と株式会社QUICKという金融情報サービス会社の青木さんの本です。
私みたいな時系列データ初学者にとって最適な入口となってくれた本です。


<a href="https://www.amazon.co.jp/時系列分析と状態空間モデルの基礎-RとStanで学ぶ理論と実装-馬場-真哉/dp/4903814874">時系列分析と状態空間モデルの基礎: RとStanで学ぶ理論と実装:馬場真哉 著(2018)</a>
<a href="https://www.amazon.co.jp/経済・ファイナンスデータの計量時系列分析-統計ライブラリー-沖本-竜義/dp/4254127928/ref=pd_bxgy_14_img_3/357-7213040-9644743?_encoding=UTF8&pd_rd_i=4254127928&pd_rd_r=05c84f7a-8374-4419-8db1-c4846ae818f9&pd_rd_w=yAJtt&pd_rd_wg=7OlRV&pf_rd_p=e1d64852-a4db-4f50-95af-f6bb1415e9c1&pf_rd_r=6PGEMPWFRTA27NS3ECHR&psc=1&refRID=6PGEMPWFRTA27NS3ECHR">
経済・ファイナンスデータの計量時系列分析:沖本竜義 著(2010)</a>