zoukankan      html  css  js  c++  java
  • 拓端tecdat|R语言随机波动率(SV)模型、MCMC的MetropolisHastings算法金融应用:预测标准普尔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仿真优化市场风险

  • 相关阅读:
    3.2 直线与方程
    3.1.2 两条直线平等与垂直的判定
    GNU Make
    linux 启动后台进程
    go 占位符
    raft 协议
    restTemplate 接收list数据
    JAVA通过实体类生成数据库查询语句(驼峰命名规则)
    flink使用命令开始、停止任务
    SPringBoot 配置类继承WebMvcConfigurationSupport和实现WebMvcConfigurer的使用
  • 原文地址:https://www.cnblogs.com/tecdat/p/15416958.html
Copyright © 2011-2022 走看看