ms-sv 。
#################################################################################################
#
#  LOG STOCHASTIC VOLATILITY AR(1) MODEL
#
#  AUXILIARY PARTICLE FILTER + PARAMETER LEARNING 
#
#################################################################################################
#
# Author : Hedibert Freitas Lopes
#          The University of Chicago Booth School of Business
#          5807 South Woodlawn Avenue
#          Chicago, Illinois, 60637
#          Email : 
hlopes@Chicagobooth.edu
#
#################################################################################################
pri        = function(x,m0,sC0){dnorm(x,m0,sC0)}
likelihood = function(y,x){dnorm(y,0,exp(x/2))}
rlike      = function(x){rnorm(1,0,exp(x/2))}
post       = function(y,x,m0,C0){pri(x,m0,sC0)*likelihood(y,x)}
quant025   = function(x){quantile(x,0.025)}
quant975   = function(x){quantile(x,0.975)}
# Simulating the data
# -------------------
set.seed(12345)
n     =  500
alpha = -0.0031
beta  =  0.9951
tau2  =  0.0074
tau   = sqrt(tau2)
y     = rep(0,n)
x     = rep(0,n)
x[1]  = alpha/(1-beta)
y[1]  = rlike(x[1])
for (t in 2:n){
  x[t] = rnorm(1,alpha+beta*x[t-1],tau)
  y[t] = rlike(x[t])
}
alpha.true = alpha
beta.true  = beta
tau2.true  = tau2
# Data and prior hyperparameters 
# ------------------------------
m0      = 0.0
C0      = 0.1
sC0     = sqrt(C0)
ealpha  = alpha
valpha  = 0.01
ephi    = beta
vphi    = 0.01
nu      = 3
lambda  = tau2
# Liu and West filter
# -------------------
set.seed(8642)
N      = 5000
xs     = rnorm(N,m0,sC0)
pars   = cbind(rnorm(N,ealpha,sqrt(valpha)),rnorm(N,ephi,sqrt(vphi)),log(1/rgamma(N,nu/2,nu*lambda/2)))
delta  = 0.75
h2     = 1-((3*delta-1)/(2*delta))^2
a      = sqrt(1-h2)
parss  = array(0,c(N,3,n))
xss    = NULL
ws     = NULL
ESS    = NULL
par(mfrow=c(1,1))
for (t in 1:n){
  mpar        = apply(pars,2,mean)
  vpar        = var(pars)
  ms          = a*pars+(1-a)*matrix(mpar,N,3,byrow=T)
  mus         = pars[,1]+pars[,2]*xs 
  weight      = likelihood(y[t],mus)
  k           = sample(1:N,size=N,replace=T,prob=weight)
  ms1         = ms[k,] + matrix(rnorm(3*N),N,3)%*%chol(h2*vpar)
  xt          = rnorm(N,ms1[,1]+ms1[,2]*xs[k],exp(ms1[,3]/2))
  w           = likelihood(y[t],xt)/likelihood(y[t],mus[k])
  w           = w/sum(w)
  ind         = sample(1:N,size=N,replace=T,prob=w)
  xs          = xt[ind]
  pars        = ms1[ind,]
  xss         = rbind(xss,xs)
  parss[,,t]  = pars 
  ws          = rbind(ws,w)
  cv2         = var(w)/(mean(w)^2)
  ESS         = c(ESS,N/(1+cv2))
  ts.plot(ESS,xlim=c(1,n))
}
# Posterior summary
# -----------------
mvol   = apply(exp(xss),1,mean)
lvol   = apply(exp(xss),1,quant025)
uvol   = apply(exp(xss),1,quant975)
malpha = apply(parss[,1,],2,mean)
lalpha = apply(parss[,1,],2,quant025)
ualpha = apply(parss[,1,],2,quant975)
mbeta  = apply(parss[,2,],2,mean)
lbeta  = apply(parss[,2,],2,quant025)
ubeta  = apply(parss[,2,],2,quant975)
mtau2  = apply(exp(parss[,3,]),2,mean)
ltau2  = apply(exp(parss[,3,]),2,quant025)
utau2  = apply(exp(parss[,3,]),2,quant975)
# Graphical analysis
# ------------------
pdf(file="vol.pdf",width=10,height=10)
par(mfrow=c(2,1))
ts.plot(y,xlab="time",ylab="",main=expression(y[t]))
ts.plot(mvol,ylim=range(lvar.smc,uvar.smc),xlab="time",ylab="",main="")
lines(mvol,lwd=1.25)
lines(lvol,lwd=1.25)
lines(uvol,lwd=1.25)
dev.off()
pdf(file="par.pdf",width=10,height=4)
par(mfrow=c(1,3))
ts.plot(malpha,ylim=range(lalpha,ualpha),ylab="",main=expression(alpha))
lines(lalpha,lwd=1.25)
lines(malpha,lwd=1.25)
lines(ualpha,lwd=1.25)
abline(h=alpha.true,col=2,lwd=2)
ts.plot(mbeta,ylim=range(lbeta,ubeta),ylab="",main=expression(beta))
lines(lbeta,lwd=1.25)
lines(mbeta,lwd=1.25)
lines(ubeta,lwd=1.25)
abline(h=beta.true,col=2,lwd=2)
ts.plot(mtau2,ylim=range(ltau2,utau2),ylab="",main=expression(tau^2))
lines(ltau2,lwd=1.25)
lines(mtau2,lwd=1.25)
lines(utau2,lwd=1.25)
abline(h=tau2.true,col=2,lwd=2)
dev.off()