基於GARCH模型的平安銀行股票研究和危機預警——R語言描述
來自專欄 統計小白的成長之路
目 錄
基於GARCH模型的平安銀行股票研究和危機預警 1
1 研究背景 1
2 研究內容 2
3 研究方法及結構框架 2
3.1 研究方法 2
3.2 結構框架 2
4 相關理論介紹 3
4.1 平安銀行股票介紹 3
4.2 GARCH模型及其推廣 3
5 平安銀行股票收益率的基本統計分析和檢驗 5
5.1 平安銀行股票的描述性統計分析 5
5.2 純隨機性檢驗 8
5.3平穩性檢驗 8
5.4 ARIMA模型確定和ARCH效應檢驗 9
5.5 建立ARIMA-GARCH模型 12
5.6 基於VAR曲線的收益風險預警 16
6 小結 18
參考文獻 20
R源代碼 21
基於GARCH模型的平安銀行股票研究和危機預警
——R語言描述
1 研究背景
我國股市經過多年的發展,取得了巨大的成就特別是近年來,市場規模大幅增加,滬深證券市場與整個國民經濟的相關程度顯著增強,兩市總市值佔GDP的比重越來越大,滬深股票市場與宏觀經濟的聯動效應正日益加強。
然而,我國證券市場尚處於發展的初級階段,其波動幅度和風險大大高於國外成熟市場,尤其是異常波動更是頻繁出現對金融市場波動性的研究主要是源於對資產選擇和資產定價的需要,所以長期以來,股價波動的特徵及其影響因素研究是學者們和投資者所關注的焦點問題投資者總是希望能憑藉自己對股市波動性的充分認識來獲得超額報酬。因此,如何去尋找較能真實刻畫和衡量股價波動性特徵的研究已經成為如今數理金融學不可分割的一部分。
在對現代金融市場研究的過程中,人們發現大多數時間序列諸如股票價格、利率、外匯匯率等的誤差序列無自相關,但誤差的平方序列存在自相關,即誤差的方差或波動隨時間變化這就對經典的最小二乘法回歸所假定的誤差序列無自相關、誤差的方差為一常數提出了質疑。最小二乘法不再適用於對此類經濟數據的建模和估計。
2003年,著名的計量經濟學家—美國紐約大學的羅伯特·恩格爾教授和加州大學聖迭哥分校的克萊夫·格蘭傑教授成為諾貝爾經濟學獎的兩位新得主。兩位學者抓住了經濟時間序列的兩個核心性質:時變性(time-varyingvolatility)和非平穩性(nonstationary),並由此開創了一套新的統計分析方法。兩位學者在上世紀八十年代初針對描述金融市場波動性的方差的時變性特徵提出了自回歸條件異方差,即ARCH模型,此後,隨著實踐的深入,ARCH模型的一些擴展模型也被相繼提出,如GARCH模型、EGARCH模型、TARCH模型等,並且這些模型在解釋金
融時間序列的特性中得到廣泛應用。
多年來,恩格爾和格蘭傑的研究工作不僅活躍了計量經濟學、統計學和數理金融的理論模型及其實證研究,而且還廣泛應用於現實經濟金融問題的定量分析,為經濟預測和風險評估提供了一套新的方法。
2 研究內容
本次數據集採用平安銀行股票自1991年4月至2018年4月每日歷史收盤價,擬通過分析平安銀行每日收益率的波動變化情況,構建合適的ARIMA-GARCH模型,然後對某一期數據進行驗證性預測,最終判斷該模型的可適用性。本文同時試圖使用風險價值模型(VAR)來對改股票進行風險預警,最終發現平安銀行在2007年至2012年日收益率存在GARCH效應,預警效果在股價波動較大時有一定的參考意義。
3 研究方法及結構框架
3.1 研究方法
以平安銀行股票為研究對象,用GARCH族模型對日收益率進行建模分析.對股票收益率的基本統計量以及模型參數估計結果進行對比分析.
本文股價指數的數據來源於萬德數據平台,在統計分析和參數估計時以R語言為主要分析工具。
3.2 結構框架
第一章和第二章分別對本次研究的背景和內容進行介紹,第三章提出本次的研究方法和框架結構。
第四章主要是對平安銀行和GARCH模型的相關理論及其拓展進行介紹。
第五章我們對平安銀行股票日收益率進行了基本的統計分析之後,再對此金融數列進行純隨機性檢驗、平穩性檢驗和ARCH效應檢驗等,最終建立相應的GARCH模型。並基於建立的GARCH模型,我們對平安銀行2007年至2010年的日收益率進行風險度量,度量結果發現,本次建立的ARMA-GARCH模型對於股價波動較大時具有一定的參考價值。
第六章是本文的小結,主要回顧了本次研究的內容,研究的方法以及研究成果等。
4 相關理論介紹
4.1 平安銀行股票介紹
平安銀行(股票代碼:000001)是深圳發展銀行 2012 年 6 月收購原深圳平安銀行並更名後的銀行,是一家全國性股份制商業銀行。平安銀行已經形成了七大行業產業鏈(地產、交通、能源礦產、現代物流、現代農業、文化旅遊以及醫療健康)「全覆蓋」模式,截至 2016 年 6 月末,在全國設有 58 家分行、1037 家營業機構,包括 1 個平台事業部、6 個行業事業部和 11 個產品事業部。
平安銀行依託平安集團強大的綜合金融服務優勢,已形成獨具特色與競爭力的市場品牌。近年來,我國商業銀行受利率市場化、互聯網金融、資本市場動蕩、資產荒及監管趨嚴等因素影響,整體盈利水平大幅下降,但平安銀行仍然保持高速發展。
在此背景下,本文擬計劃分析平安銀行股價波動規律,旨在為投資者衡量和規避市場風險提供一些參考。
4.2 GARCH模型及其推廣
4.2.1 ARCH模型及其特點
ARCH模型最初是由美國聖迭哥大學經濟學家恩格爾教授提出,主要用於具有「簇集性」及方差波動性特點的經濟類時間序列數據的回歸分析及預測。
ARCH模型認為過去的波動擾動對未來波動有著正向而緩慢的影響,依次波動會持續一段時間,從而模擬了市場波動的集群性現象,即較大幅度的波動後面一般緊接著較大幅度的波動,較小幅度的波動後面緊接著較小幅度的波動,提高預測精度。
當存在ARCH效應時,若仍使用方差為常數的普通最小二乘估計參數,就會產生偏差,掩蓋預測的不確定性然而,若使用ARCH模型,則不僅可以提高預測值的精度,還可以知道預測的可靠性當方差較大時,預測值的置信區間就較小,從而可靠性較好。
ARCH模型均假設所研究的時間序列的條件分布為正態分布,但是在實際應用中,對使用條件正態分布所建立的模型進行殘差診斷、標準化殘差的擬合檢驗卻經常拒絕條件正態分布的假設。基於ARCH模型自身的模型使用缺陷,我們接下來介紹GARCH等模型。
4.2.2 GARCH模型及其特點
雖然ARCH模型擺脫了傳統計量經濟學的「同方差」約束,使得「異方差」成為可能,但在實際應用中為得到較好的擬合效果需要很大的階數。巴拉斯拉夫,提出了更一般性的ARCH模型,即GARCH模型。GARCH模型是廣義自回歸條件異方差模型的簡稱,其中異方差指方差隨時間變化而變化,即具有易變性;條件性表示了對過去臨近觀測信息的依賴;自回歸則描述了預測值與過去觀測之間的聯繫。GARCH模型的條件方差不僅與前期的誤差項有關,而且也與前期的條件方差有關。它在對時間序列波動性的解釋和建模上具有較強的優勢,因而有著極其廣泛的理論和實用價值。
相對於ARCH模型,GARCH模型的優點在於可以用較為簡單的低階的模型來代表高階模型,從而使得模型的識別和估計都變得比較容易。但GARCH模型在應用於資產定價方面也存在以下三個方面的不足:
- GARCH模型不能解釋股票收益和收益變化波動之間出現的負相關現象。GARCH模型假定條件方差是滯後殘差平方的函數,因此,殘差的符號不影響波動,即條件方差對正的價格變化和負的價格變化的反應是對稱的然而在研究中發現,當利空消息出現時,即預期股票收益會下降時,波動趨向於增大當利好消息出現時,即預期股票收益會上升時,波動趨向於減小。而GARCH模型不能解釋這種非對稱現象。
(2)GARCH模型為了保證方差權非負,假定方差方程中所有係數均大於零。
(3)GARCH模型在確定條件方差時只考慮了收益的大小,而沒有考慮收益的符號,也就是說沒有區分正向衝擊和負向沖對正負干擾反應的不對稱性,可以用TARCH或者EGARCH模型來描述,即通過在條件方差方程中引入另外一個參數,使得在隨機干擾取正和負值時有不同程度的變化,一從而能更準確地描述股價的變動。
4.2.3 EGARCH模型
在實踐中,大多數金融時間序列的分布較正態分布而言有高峰厚尾特徵。而GARCH模型有助於刻劃這種現象。由於GARCH模型假定條件方差是過去殘差平方的函數,因此殘差的符號不影響波動,即條件方差對正的價格變化和負的變化的反應是對稱的。
然而在實踐中,研究人員發現,當壞消息出現時,波動趨於增大,當好消息出現時,波動趨於減小。 為了刻劃對消息反應的不對稱性,Nelson提出了指數GARCH(EGARCH)模型。EGARCH模型與GARCH模型相比,關於條件方差的假設有兩個優點。
第一個優點是條件方差由指數形式表示,所以無論方程中的參數取什麼實數,條件方差總是正的。因此在對模型作參數估計時不需要人為地對模型參數施加非負約束,從而可以減少數值計算的計算工作量。
第二個優點是在條件方差中引入γ參數,使得隨機干擾項取正、負值時有不同程度的變化,從而能更好的體現金融產品價格波動的情況。例如在股票市場中,若將利好消息看作對股價的正干擾,將利空消息看作對股價的負干擾,若γ<0時,那麼一個負的隨機干擾項所引起的ht的變化比相同程度的正干擾所引起的ht的變化將更加劇烈,所以模型能解釋這種正負干擾反應的不對稱性。
5 平安銀行股票收益率的基本統計分析和檢驗
5.1 平安銀行股票的描述性統計分析
為了防止過度波動,中國股市在1996年12月16日開始實行10%的漲跌停板限制,採用此後的數據可以減少異常值的干擾,提高模型的精度,我們選取1997年之後的歷史收盤價數據作為初始描述統計分析的數據,從1997年12月1日到2017年12月31日的收盤價格,共計2454個,數據來源於萬德數據平台。在後續建模分析中,由於本次數據集多數數據為白躁,最終我們選擇2002年至2008年的數據作為建模數據。
首先先導入本次所需的數據集,並觀察其歷史收盤價的走向,R程序如下:
#Import Data
library(fGarch)
library(rugarch)
library(TSA)
library(tseries)
library(zoo)
library(forecast)#auto.arima()
library(psych)
library(ggplot2
library(lattice)
library(ccgarch)
library(quantmod)
dat=read.csv(C:\Users\hector zhu\Desktop\GARCH\平安.csv,header=T)
dat_close=dat$收盤價.元.
dat_time=dat$日期
time=as.Date(dat_time)
#anyDuplicated(dat_close)
#anyDuplicated(time)
data=zoo(dat_close,time)
selectdata=window(data,start = as.Date("2007-12-01"),end = as.Date("2017-12-31"))
plot(selectdata,xlab="time",ylab="close price",main="pinan")
其歷史收盤價走勢圖如下:
可以看到,平安銀行股票自2007年以來歷史收盤價呈現出較大幅度的波動,以2008年和2013年尤甚。而研究股票市場的波動,通常以股票市場的日收益率作為考察變數,股票市場日收益率以相鄰兩日收盤指數的對數一階差分來表示,本次採用R軟體來實現對數收益率的計算,程序如下:
#Logarithmic return rate calculation
rlog=log(selectdata)
rlogdiff=diff(log(selectdata))*100
rlogdiff=na.omit(rlogdiff)
rlogdifftime=index(rlogdiff)
rlogdiffdata=coredata(rlogdiff)
data_choose=zoo(rlogdiffdata,rlogdifftime)
data_choose=na.omit(data_choose)
par(mfrow=c(1,3),oma=c(0.2,0.2,0.2,0.2))
hist(rlogdiff,main="PinAn Log Return Distribution",col="yellow",xlab="",xlim=c(-15,15),ylim=c(0,0.3),probability=T)
lines(density(rlogdiff),lwd=1);rug(rlogdiff)#first graph
qqnorm(rlogdiff);qqline(rlogdiff)#second graph
plot(rlogdiff,ylab="value");abline(h=0,lty=2)#third graph
對數收益率曲線的分布性質如下:
上述三圖分別為數據分布函數,QQ圖,對數收益率序列折現圖。收益率分布圖、QQ圖可以看出金融時間序列確實表現出尖峰厚尾性,相對於標準正態分布,峰度更高,兩端的尾部更厚,也就是極值更多。由收益率波動序列可以看出收益率序列在樣本區間內均表現出一定的波動性和聚集性,其中2008-2009年和2012-2015波動幅度尤為明顯。
5.2 純隨機性檢驗
首選對本次對數收益率進行純隨機性檢驗,若檢驗結果為純隨機數列,本次模型建立將不再有意義。由於本次數據集(平安銀行對數收益率)大多區間內均為白躁數據,在多次試驗後我們選取2002年至2008年的數據作為本次模型的基礎數據,首選對該數據進行隨機性檢驗,其R程序如下:
#Pure randomness test
Box.test(rlogdiffdata,type=Ljung-Box)
Box.test(rlogdiffdata)
檢驗結果如下:
#the result of Pure randomness test
> Box.test(rlogdiffdata,type=Ljung-Box)
Box-Ljung test
data: rlogdiffdata
X-squared = 7.1976, df = 1, p-value = 0.0073
> Box.test(rlogdiffdata)
Box-Pierce test
data: rlogdiffdata
X-squared = 7.1827, df = 1, p-value = 0.007361
檢驗結果表明,本次數列不是純隨機數列,可以進行進一步檢驗和建立模型。
5.3平穩性檢驗
為了進一步研究收益率的平穩性,對其進行ADF單位根檢驗,R程序如下:
#Stability test
adf.test(rlogdiffdata,alt="stationary")
檢驗結果如下:
#the result of Stability test
Augmented Dickey-Fuller Test
data: rlogdiffdata
Dickey-Fuller = -11.327, Lag order = 11, p-value = 0.01
alternative hypothesis: stationary
Warning message:
In adf.test(rlogdiffdata, alt = "stationary") :
p-value smaller than printed p-value
檢驗結果與以往研究一致,一般認為,金融資產的價格是非平穩的,而收益率序列則是平穩的。
5.4 ARIMA模型確定和ARCH效應檢驗
平安銀行的日收益時序圖如下:
從收益率的時序圖可以看到收益率波動的聚集性效應。這說明波動率隨時間變化,不能用常數擬合,為此,考慮運用GARCH類模型對收益率序列波動性進行建模。因而需要對序列進行ARCH效應檢驗,來判斷是否存在異方差效應。而在進行ARCH效應檢驗之前我們首先需要對該數據進行ARIMA階數的確定,定階方式本次採用自動定階和根據EACF來確定,其R程序如下:
#ARCH test
eacf(rlogdiffdata)
armamodel1=auto.arima(data_choose,trace=T,stepwise=T,approx=T)
armamodel1
armamodel2=arima(data_choose,order=c(5,0,5))
armamodel2
armamodel=armamodel2
lmresult=McLeod.Li.test(y=residuals(armamodel))
檢驗結果如下:
#the result of armamodel1 armamodel2
>eacf(rlogdiffdata)
AR/MA
0 1 2 3 4 5 6 7 8 9 10 11 12 13
0 x o o o o x o o o o o o o o
1 x o o o o x o o o o o o o o
2 x o o o o x o o o o o o o o
3 x x o o o x o o o o o o o o
4 x x x x o x o o o o o o o o
5 x x x x x o o o o o o o o o
6 x x x x x x o o o o o o o o
7 x o x o x x x o o o o o o o
> armamodel1
Series: data_choose
ARIMA(3,1,0)
Coefficients:
ar1 ar2 ar3
-0.8090 -0.5488 -0.2481
s.e. 0.0323 0.0345 0.0296
sigma^2 estimated as 0.0004544: log likelihood=3134.75
AIC=-6261.51 AICc=-6261.49 BIC=-6238.76
> armamodel2
Call:
arima(x = data_choose, order = c(5, 0, 5))
Coefficients:
ar1 ar2 ar3 ar4 ar5 ma1 ma2 ma3
-0.0778 0.3400 0.4711 -0.0760 -0.8509 0.1207 -0.2869 -0.4395
s.e. 0.1674 0.1252 0.0701 0.1521 0.1374 0.1733 0.1210 0.0779
ma4 ma5 intercept
0.0317 0.8207 8e-04
s.e. 0.1503 0.1319 7e-04
sigma^2 estimated as 0.0005878: log likelihood = 3319.06, aic = -6616.11
上述ARIMA定階採用的是auto.arima()函數和根據EACF圖來確定,根據EACF圖我們可以看到,當p=5,q=5時,模型或許有著不錯的擬合效果,因而本次ARIMA模型階數可以選擇(5,0,5)。同時,我們也要根據auto.arima()函數確定的階數來選擇最終的模型階數,該自動定階函數確定的階數為(3,1,0)。最後我們根據AIC準則最小化來確定最後的階數,即最後ARIMA模型的階數選擇為(5,0,5)。
同時我們繪製出檢驗殘差自相關性的圖像。
根據上圖可以看到,2002年至2008年這幾年的日收益率整體上ARCH效應存在明顯效應,且各項檢驗均過檢。
5.5 建立ARIMA-GARCH模型
在驗證數列存在ARCH效應後,我們建立相應的GARCH模型,國內外多篇文獻表明在建立GARCH模型時,GARCH(1,1)、GARCH(2,1)、GARCH(2,2)等較低階數的模型就已經能較好的刻畫金融市場的尖峰厚尾現象,所以嘗試利用GARCH(1,1)、GARCH(2,1)和GARCH(2,2)模型來對收益率序列進行建模,R程序如下:
#ARMIA-GARCH
myspec=ugarchspec(
variance.model = list(model = "sGARCH", garchOrder = c(1,1),variance.targeting=0),
mean.model = list(armaOrder = c(1,1), include.mean = F),
distribution.model = "std"
)
myfit1=ugarchfit(myspec,data=rlogdiff,solver="gosolnp")
myfit1
myspec=ugarchspec(
variance.model = list(model = "sGARCH", garchOrder = c(2,1),variance.targeting=0),
mean.model = list(armaOrder = c(1,1), include.mean = F),
distribution.model = "std"
)
myfit2=ugarchfit(myspec,data=rlogdiff,solver="gosolnp")
myfit2
myspec=ugarchspec(
variance.model = list(model = "sGARCH", garchOrder = c(2,2),variance.targeting=0),
mean.model = list(armaOrder = c(1,1), include.mean = F),
distribution.model = "std"
)
myfit3=ugarchfit(myspec,data=rlogdiff,solver="gosolnp")
myfit3
相應的結果如下:
#the result of ARMIA-GARCH
> myfit1
*---------------------------------*
* GARCH Model Fit *
*---------------------------------*
Conditional Variance Dynamics
-----------------------------------
GARCH Model : sGARCH(1,1)
Mean Model : ARFIMA(5,0,5)
Distribution : std
Optimal Parameters
------------------------------------
Estimate Std. Error t value Pr(>|t|)
ar1 1.059110 0.002133 496.5669 0
ar2 -0.562151 0.002933 -191.6955 0
ar3 1.151386 0.002200 523.3036 0
ar4 -0.419118 0.003411 -122.8857 0
ar5 -0.230929 0.002602 -88.7348 0
ma1 -1.073605 0.000136 -7889.3037 0
ma2 0.575327 0.000026 22423.9242 0
ma3 -1.177340 0.000148 -7978.8801 0
ma4 0.454127 0.000053 8564.7911 0
ma5 0.226017 0.000014 15860.4701 0
alpha1 0.060118 0.006185 9.7197 0
beta1 0.938882 0.005691 164.9850 0
shape 4.672275 0.435680 10.7241 0
omega 0.000000 NA NA NA
可以看到,模型係數的檢驗均通過,我們對該模型的殘差進行自相關檢驗,相應的程序如下:
#Residual autocorrelation test
par(mfcol=c(2,2))
resi=residuals(myfit,standardize=T)
plot(resi,xlab=Date,ylab=st.resi,type=l)
Box.test(resi)
acf(resi)
pacf(resi)
檢驗結果如下:
#Residual autocorrelation test
> Box.test(resi)
Box-Pierce test
data: resi
X-squared = 5.043, df = 1, p-value = 0.02472
其殘差沒有過檢,同時ACF,PACF圖像如下:
上圖和box檢驗均表明殘差未過檢驗,因而GARCH(1,1)模型捨去,我們同理進行GARCH(2,1)、GARCH(2,2)的檢驗,最終僅有GARCH(2,1)模型通過殘差白躁檢驗,其檢驗結果和ACF圖如下:
#the result of Residual autocorrelation test
> Box.test(resi)
Box-Pierce test
data: resi
X-squared = 3.6766, df = 1, p-value = 0.05518
同時我們還可以繪製出平安銀行的收益率衝擊曲線,其圖像如下:
從上圖可以看出,平安銀行在利空利好消息時曲線均走勢陡峭,這說明平安銀行股票對消息敏感,抗風險能力較弱。
進一步地,在建立完模型之後,我們利用urgarchforecast函數來進一步預測未來20期的收益率,我們將預測值和真實值進行比較,比較圖像如下:
根據上圖我們比較發現,該模型的預測值在未來20期存在部分與真實值相同的趨勢特徵,但存在時間提前性,如從第11期開始,真實值與預測值整體走向一致,但真實值與預測值相比,真實值的變化速度更緩慢,這可能與現實中存在的諸多影響因素有關。
5.6 基於VAR曲線的收益風險預警
股票的對數收益率的公式為,其中rt為股票指數收益率,et,et-1為第t和t-1期的股票指數收盤價,當股票對數收益率存在波動聚集性時,這表明大的波動不是突然發生的,而是逐步變化產生。大的波動發生之前應該出現一定的信號,如出現某些異常的低收益率值。
基於以上公式,假設,其中σ為GARCH模型的預測方差,q為正態分布5%水平下分位點值,FitValue為GARCH模型的擬合值。VAR曲線以下的點即為實際波動率在預測波動率95%置信區間外的點。
實現其原理的R程序如下:
#VAR CURVE
spec = ugarchspec(variance.model = list(model = "sGARCH"), distribution.model = "std")
cl = makePSOCKcluster(10)
roll = ugarchroll(spec,data_choose, n.start =300,refit.every = 300,
refit.window = "moving", solver = "hybrid", calculate.VaR = TRUE,
VaR.alpha = c(0.01, 0.025, 0.05), cluster = cl,keep.coef = TRUE)
report(roll, type = "fpm")
plot(roll,which=4,VaR.alpha=0。05)
預測值的MAE、MSE值如下:
#MAE OF VAR CURVE
GARCH Roll Mean Forecast Performance Measures
---------------------------------------------
Model : sGARCH
No.Refits : 4
No.Forecasts: 1145
Stats
MSE 0.0006571
MAE 0.0179400
DAC 0.4760000
相應的VAR圖像如下:
由上圖可知在較大波動率之前確實有一些點落在Var曲線以下(標註為紅點)。例如,在2008年收益率產生大幅波動前,有不少收益率值落在了var曲線以下。可見,股票大跌在之前是有留下一定信號的,所以該模型在波動率非平穩期有一定參考價值。
6 小結
本文利用GARCH族模型及其擴展形式對平安銀行日對數收益率序列進行實證研究,運用R軟體對收益率序列進行分析,得出了其有偏、分布的尖峰厚尾性以及序列的「波動的集聚性」等特徵,考慮到上述特徵,我們採用GARCH族模型建模。
通過ARCH效應檢驗等證明了利用GARCH類模型對收益率序列的波動性進行建模的可行性後,我們利用GARCH(2, 1)模型基於R軟體計算出參數估計的結果,並對參數的顯著性做了檢驗,同時對模型進行了診斷檢驗。診斷檢驗原則是通過檢驗模型擬合後的標準化殘差序列進行相關性和異方差性檢驗,如果標準化殘差平方序列不具有相關性,標準化殘差序列不具有異方差性則說明模型的擬合效果較好。最終分析結果顯示,GARCH(2,1)對於金融數據的擬合結果較好,具有一定的可參考性。
同時,在建模中發現,平安銀行股票對利好利空等消息極為敏感,市場抗風險能力較弱。在GARCH模型的建立的基礎之上,我們還基於VAR曲線對平安銀行股票進行的風險預警分析,研究結果發現,本模型在波動率非平穩期能夠在一定程度上起到風險預警的作用。
參考文獻
[1] CSDN:基於GARCH模型的股市研究與危機預警——R語言實現
https://blog.csdn.net/huozi07/article/details/48176587
[2] CSDN:R語言分析股票指數的GARCH效應
https://blog.csdn.net/oxuzhenyi/article/details/77850561
[3] 唐小峰.基於GARCH模型族的滬市波動性實證分析[D].華東師範大學.2008
[4] 宋博.基於GARCH模型的VAR計算[D].南京理工大學.2004
[5] 陳廷.基於風險價值導向的平安銀行價值評估研究[D].蘭州財經大學.2017
R源代碼
library(fGarch)
library(rugarch)#garch擬合與預測
library(TSA)#BIC準則確定arma階數 eacf確定garch階數
library(tseries)
library(zoo)#轉換成時間序列類型
library(forecast)#auto.arima() arma階數確定方法
library(psych)#數據描述統計分析
library(ggplot2)#繪圖
library(lattice)
library(ccgarch)#JB統計量
library(quantmod)
dat=read.csv(C:\Users\hector zhu\Desktop\GARCH\平安.csv,header=T)
dat_close=dat$收盤價.元.
dat_time=dat$日期
time=as.Date(dat_time)
#anyDuplicated(dat_close)
#anyDuplicated(time)
data=zoo(dat_close,time)
selectdata=window(data,start = as.Date("2007-12-01"),end = as.Date("2012-12-31"))
plot(selectdata,xlab="time",ylab="close price",main="pinan")
#計算收益率
#selectdata=na.omit(selectdata)
rlog=log(selectdata)
rlogdiff=diff(log(selectdata))*100
rlogdiff=na.omit(rlogdiff)
rlogdifftime=index(rlogdiff)
rlogdiffdata=coredata(rlogdiff)
data_choose=zoo(rlogdiffdata,rlogdifftime)
data_choose=na.omit(data_choose)
plot(rlogdifftime,rlogdiffdata,type=l)
#描述數據
par(mfrow=c(1,3),oma=c(0.2,0.2,0.2,0.2))
hist(rlogdiff,main="PinAn Log Return Distribution",col="yellow",xlab="",xlim=c(-15,15),ylim=c(0,0.3),probability=T)
lines(density(rlogdiff),lwd=1);rug(rlogdiff)#first graph
qqnorm(rlogdiff);qqline(rlogdiff)#second graph
plot(rlogdiff,ylab="value");abline(h=0,lty=2)#third graph
#正態性檢驗
shapiro.test(rlogdiffdata)#P越小越非正態
#JB正態性檢驗
describe(rlogdiffdata)
jb.test(rlogdiffdata)
#隨機性檢驗 檢驗說明數據不是純隨機數列
#LB統計
Box.test(rlogdiffdata,type=Ljung-Box)
#Q統計量
Box.test(rlogdiffdata)
#平穩性檢驗 檢驗說明數據平穩
#若 ADF p<0.0 認為序列是均值回歸的
#adf.test(rlog,alt="stationary")#注意 這是未差分的數據
adf.test(rlogdiffdata,alt="stationary")#這是差分後的數據
#自相關檢驗
acf(rlogdiffdata)
acf(rlogdiffdata*rlogdiffdata)
#arch效應檢驗 檢驗結果為ARIMA(2,0,1)
#eacf 0 0
eacf(rlogdiffdata)
#ARIMA模型擬合 s.e.表示係數的標準差
fit1=arima(data_choose,order=c(2,0,1))
armamodel=auto.arima(data_choose,trace=T,stepwise=T,approx=T)
#armamodel=arima(data_choose,order=c(1,0,1))
armamodel
plot(residuals(armamodel))
#na.omit(residuals(armamodel))
par(mfrow=c(1,1))
lmresult=McLeod.Li.test(y=residuals(armamodel))#殘差arch效應看是否顯著
myspec=ugarchspec(
variance.model = list(model = "sGARCH", garchOrder = c(1,1),variance.targeting=0),
mean.model = list(armaOrder = c(1,1), include.mean = F),
distribution.model = "std"
)
myfit=ugarchfit(myspec,data=rlogdiff,solver="gosolnp")
myfit
#殘差檢驗
resi=residuals(myfit,standardize=F)
plot(res,xlab=Date,ylab=st.resi,type=l)
par(mfcol=c(2,2))
acf(resi)
pacf(resi)
#收益率衝擊曲線
plot(myfit,which=12)
spec = ugarchspec(variance.model = list(model = "sGARCH"), distribution.model = "std")
cl = makePSOCKcluster(10)
#滾動預測
roll = ugarchroll(spec,data_choose, n.start =300,refit.every = 300,
refit.window = "moving", solver = "hybrid", calculate.VaR = TRUE,
VaR.alpha = c(0.01, 0.025, 0.05), cluster = cl,keep.coef = TRUE)
report(roll, type = "fpm")
plot(roll,which=4,VaR.alpha=0.05)
推薦閱讀: