拓端tecdat|R語言隨機波動率(SV)模型、MCMC的Metropolis-Hastings算法金融應用:預測標准普爾SP500指數


原文鏈接:http://tecdat.cn/?p=23991

原文出處:拓端數據部落公眾號

在這個例子中,我們考慮隨機波動率模型 SV0 的應用,例如在金融領域。

統計模型

隨機波動率模型定義如下

並為

其中 yt 是因變量,xt 是 yt 的未觀察到的對數波動率。N(m,σ2) 表示均值 m 和方差 σ2 的正態分布。

α、β 和 σ 是需要估計的未知參數。

BUGS語言統計模型

文件內容 'sv.bug'

  1.  
    moelfle = 'sv.bug' # BUGS模型文件名
  2.  
    cat(readLies(moelfle ), sep = "\n")
  1.  
    # 隨機波動率模型SV_0
  2.  
    # 用於隨機波動率模型
  3.  
    var y[t_max], x[t_max], prec_y[t_max]
  4.  
     
  5.  
     
  6.  
    model
  7.  
    {
  8.  
    alha ~ dnorm(0,10000)
  9.  
    logteta ~ dnorm(0,.1)
  10.  
    bea <- ilogit(loit_ta)
  11.  
    lg_sima ~ dnorm(0, 1)
  12.  
    sia <- exp(log_sigma)
  13.  
     
  14.  
    x[1] ~ dnorm(0, 1/sma^2)
  15.  
    pr_y[1] <- exp(-x[1])
  16.  
    y[1] ~ dnorm(0, prec_y[1])
  17.  
    for (t in 2:t_max)
  18.  
    {
  19.  
    x[t] ~ dnorm(aa + eta*(t-1]-alha, 1/ia^2)
  20.  
    pr_y[t] <- exp(-x[t])
  21.  
    y[t] ~ dnorm(0, prec_y[t])
  22.  
    }

設置

設置隨機數生成器種子以實現可重復性

set.seed(0)

加載模型並加載或模擬數據

  1.  
    sample_data = TRUE # 模擬數據或SP500數據
  2.  
    t_max = 100
  3.  
     
  4.  
    if (!sampe_ata) {
  5.  
    # 加載數據 tab = read.csv('SP500.csv')
  6.  
    y = diff(log(rev(tab$ose)))
  7.  
    SP5ate_str = revtab$te[-1])
  8.  
     
  9.  
    ind = 1:t_max
  10.  
    y = y[ind]
  11.  
    SP500_dae_r = SP0dae_tr[ind]
  12.  
    SP500_e_num = as.Date(SP500_dtetr)

模型參數

  1.  
    if (!smle_dta) {
  2.  
    dat = list(t_ma=ax, y=y)
  3.  
    } else {
  4.  
    sigrue = .4; alpa_rue = 0; bettrue=.99;
  5.  
    dat = list(t_mx=_mx, sigm_tue=simarue,
  6.  
    alpatrue=alhatrue, bet_tue=e_true)
  7.  
    }

如果模擬數據,編譯BUGS模型和樣本數據

data = mdl$da()

繪制數據

對數收益率

Biips粒子邊際Metropolis-Hastings

我們現在運行Biips粒子邊際Metropolis-Hastings (Particle Marginal Metropolis-Hastings),以獲得參數 α、β 和 σ 以及變量 x 的后驗 MCMC 樣本。

PMMH的參數

  1.  
    n_brn = 5000 # 預燒/適應迭代的數量
  2.  
    n_ir = 10000 #預燒后的迭代次數
  3.  
    thn = 5 #對MCMC輸出進行稀釋
  4.  
    n_art = 50 # 用於SMC的nb個粒子
  5.  
    para_nmes = c('apha', 'loit_bta', 'logsgma') # 用MCMC更新的變量名稱(其他變量用SMC更新)。
  6.  
    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)

參數的后驗均值和置信區間

  1.  
    for (k in 1:length(pram_names)) {
  2.  
    suparam = su_pmm[[pam_as[k]]]
  3.  
    cat(param$q)
  4.  
    }

參數的MCMC樣本的蹤跡

  1.  
    if (amldata)
  2.  
    para_tue = c(lp_tue, log(dt$bea_rue/(-dta$eatru)), log(smtue))
  3.  
    )
  4.  
     
  5.  
    for (k in 1:length(param_aes)) {
  6.  
    smps_pm = tmmh[[paranesk]]
  7.  
    plot(samlespram[1,]

PMMH:跟蹤樣本參數

參數后驗的直方圖和 KDE 估計

  1.  
    for (k in 1:length(paramns)) {
  2.  
    samps_aram = out_mmh[[pramnaes[k]]]
  3.  
    hist(sple_param)
  4.  
    if (sample_data)
  5.  
    points(parm_true)
  6.  
    }

PMMH:直方圖后驗參數

  1.  
    for (k in 1:length(parm) {
  2.  
    kd_pram =kde_mm[[paramames[k]]]
  3.  
    plot(kd_arm, col'blue
  4.  
    if (smpldata)
  5.  
    points(ar_true[k])
  6.  
    }

PMMH:KDE 估計后驗參數

x 的后均值和分位數

  1.  
    x_m_mean = x$mean
  2.  
    x_p_quant =x$quant
  3.  
    plot(xx, yy)
  4.  
    polygon(xx, yy)
  5.  
    lines(1:t_max, x_p_man)
  6.  
    if (ame_at) {
  7.  
    lines(1:t_ax, x_true)
  8.  
     
  9.  
    } else
  10.  
    legend(
  11.  
    bt='n)

PMMH:后驗均值和分位數

x 的 MCMC 樣本的蹤跡

  1.  
    par(mfrow=c(2,2))
  2.  
    for (k in 1:length) {
  3.  
    tk = ie_inex[k]
  4.  
     
  5.  
    if (sample_data)
  6.  
    points(0, dtax_t
  7.  
    }
  8.  
    if (sml_aa) {
  9.  
    plot(0
  10.  
    legend('center')
  11.  
    }
  12.  
     

PMMH:跟蹤樣本 x

x 后驗的直方圖和核密度估計

  1.  
    par(mfow=c(2,2))
  2.  
    for (k in 1:length(tie_dex)) {
  3.  
    tk = tmnex[k]
  4.  
    hist(ot_m$x[tk,]
  5.  
    main=aste(t=', t, se='')
  6.  
    if (sample_data)
  7.  
    points(ata$x_re[t],
  8.  
    }
  9.  
    if (saml_dta) {
  10.  
    plot(0, type='n', bty='n', x
  11.  
    legend('center
  12.  
    bty='n')
  13.  
     
  14.  
    }

PMMH:后邊際直方圖

  1.  
    par(mfrow=c(2,2))
  2.  
    for (k in 1:length(idx)) {
  3.  
    tk =m_dx[k]
  4.  
    plot(kmmk]] if (alata)
  5.  
    point(dat_r[k], 0)
  6.  
    }
  7.  
    if (aldt) {
  8.  
    plot(0, type='n', bty='n', x, pt.bg=c(4,NA)')
  9.  
    }
  10.  
     


最受歡迎的見解

1.R語言對S&P500股票指數進行ARIMA + GARCH交易策略

2.R語言改進的股票配對交易策略分析SPY—TLT組合和中國股市投資組合

3.R語言時間序列:ARIMA GARCH模型的交易策略在外匯市場預測應用

4.TMA三均線期指高頻交易策略的R語言實現

5.r語言多均線量化策略回測比較

6.用R語言實現神經網絡預測股票實例

7.r語言預測波動率的實現:ARCH模型與HAR-RV模型

8.R語言如何做馬爾科夫轉換模型markov switching model

9.matlab使用Copula仿真優化市場風險


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM