原文鏈接:http://tecdat.cn/?p=23991
原文出處:拓端數據部落公眾號
在這個例子中,我們考慮隨機波動率模型 SV0 的應用,例如在金融領域。
統計模型
隨機波動率模型定義如下

並為![]()

其中 yt 是因變量,xt 是 yt 的未觀察到的對數波動率。N(m,σ2) 表示均值 m 和方差 σ2 的正態分布。
α、β 和 σ 是需要估計的未知參數。
BUGS語言統計模型
文件內容 'sv.bug':
-
moelfle = 'sv.bug' # BUGS模型文件名
-
cat(readLies(moelfle ), sep = "\n")
-
# 隨機波動率模型SV_0
-
# 用於隨機波動率模型
-
var y[t_max], x[t_max], prec_y[t_max]
-
-
-
model
-
{
-
alha ~ dnorm(0,10000)
-
logteta ~ dnorm(0,.1)
-
bea <- ilogit(loit_ta)
-
lg_sima ~ dnorm(0, 1)
-
sia <- exp(log_sigma)
-
-
x[1] ~ dnorm(0, 1/sma^2)
-
pr_y[1] <- exp(-x[1])
-
y[1] ~ dnorm(0, prec_y[1])
-
for (t in 2:t_max)
-
{
-
x[t] ~ dnorm(aa + eta*(t-1]-alha, 1/ia^2)
-
pr_y[t] <- exp(-x[t])
-
y[t] ~ dnorm(0, prec_y[t])
-
}
設置
設置隨機數生成器種子以實現可重復性
set.seed(0)
加載模型並加載或模擬數據
-
sample_data = TRUE # 模擬數據或SP500數據
-
t_max = 100
-
-
if (!sampe_ata) {
-
# 加載數據 tab = read.csv('SP500.csv')
-
y = diff(log(rev(tab$ose)))
-
SP5ate_str = revtab$te[-1])
-
-
ind = 1:t_max
-
y = y[ind]
-
SP500_dae_r = SP0dae_tr[ind]
-
SP500_e_num = as.Date(SP500_dtetr)
模型參數
-
if (!smle_dta) {
-
dat = list(t_ma=ax, y=y)
-
} else {
-
sigrue = .4; alpa_rue = 0; bettrue=.99;
-
dat = list(t_mx=_mx, sigm_tue=simarue,
-
alpatrue=alhatrue, bet_tue=e_true)
-
}
如果模擬數據,編譯BUGS模型和樣本數據

data = mdl$da()
繪制數據


對數收益率
Biips粒子邊際Metropolis-Hastings
我們現在運行Biips粒子邊際Metropolis-Hastings (Particle Marginal Metropolis-Hastings),以獲得參數 α、β 和 σ 以及變量 x 的后驗 MCMC 樣本。
PMMH的參數
-
n_brn = 5000 # 預燒/適應迭代的數量
-
n_ir = 10000 #預燒后的迭代次數
-
thn = 5 #對MCMC輸出進行稀釋
-
n_art = 50 # 用於SMC的nb個粒子
-
para_nmes = c('apha', 'loit_bta', 'logsgma') # 用MCMC更新的變量名稱(其他變量用SMC更新)。
-
latetnams = c('x') # 用SMC更新的、需要監測的變量名稱
初始化PMMH
![]()
運行 PMMH
update(b_pmh, n_bun, _rt) #預燒和擬合迭代

samples(oj_mh, ter, n_art, thin=hn) # 采樣

匯總統計
summary(otmmh, prob=c(.025, .975))
計算核密度估計
density(out_mh)
參數的后驗均值和置信區間
-
for (k in 1:length(pram_names)) {
-
suparam = su_pmm[[pam_as[k]]]
-
cat(param$q)
-
}

參數的MCMC樣本的蹤跡
-
if (amldata)
-
para_tue = c(lp_tue, log(dt$bea_rue/(-dta$eatru)), log(smtue))
-
)
-
-
for (k in 1:length(param_aes)) {
-
smps_pm = tmmh[[paranesk]]
-
plot(samlespram[1,]

PMMH:跟蹤樣本參數
參數后驗的直方圖和 KDE 估計
-
for (k in 1:length(paramns)) {
-
samps_aram = out_mmh[[pramnaes[k]]]
-
hist(sple_param)
-
if (sample_data)
-
points(parm_true)
-
}

PMMH:直方圖后驗參數
-
for (k in 1:length(parm) {
-
kd_pram =kde_mm[[paramames[k]]]
-
plot(kd_arm, col'blue
-
if (smpldata)
-
points(ar_true[k])
-
}

PMMH:KDE 估計后驗參數
x 的后均值和分位數
-
x_m_mean = x$mean
-
x_p_quant =x$quant
-
plot(xx, yy)
-
polygon(xx, yy)
-
lines(1:t_max, x_p_man)
-
if (ame_at) {
-
lines(1:t_ax, x_true)
-
-
} else
-
legend(
-
bt='n)

PMMH:后驗均值和分位數
x 的 MCMC 樣本的蹤跡
-
par(mfrow=c(2,2))
-
for (k in 1:length) {
-
tk = ie_inex[k]
-
-
if (sample_data)
-
points(0, dtax_t
-
}
-
if (sml_aa) {
-
plot(0
-
legend('center')
-
}
-

PMMH:跟蹤樣本 x
x 后驗的直方圖和核密度估計
-
par(mfow=c(2,2))
-
for (k in 1:length(tie_dex)) {
-
tk = tmnex[k]
-
hist(ot_m$x[tk,]
-
main=aste(t=', t, se='')
-
if (sample_data)
-
points(ata$x_re[t],
-
}
-
if (saml_dta) {
-
plot(0, type='n', bty='n', x
-
legend('center
-
bty='n')
-
-
}

PMMH:后邊際直方圖
-
par(mfrow=c(2,2))
-
for (k in 1:length(idx)) {
-
tk =m_dx[k]
-
plot(kmmk]] if (alata)
-
point(dat_r[k], 0)
-
}
-
if (aldt) {
-
plot(0, type='n', bty='n', x, pt.bg=c(4,NA)')
-
}
-


最受歡迎的見解
1.R語言對S&P500股票指數進行ARIMA + GARCH交易策略
2.R語言改進的股票配對交易策略分析SPY—TLT組合和中國股市投資組合
3.R語言時間序列:ARIMA GARCH模型的交易策略在外匯市場預測應用
