Matlab用BUGS马尔可夫区制转换Markov switching随机波动率SV模型、序列蒙特卡罗SMC、Metropolis Hastings采样分析时间序列数据

在这个例子中,我们考虑马尔可夫转换随机波动率模型。

由Kaizong Ye,Coin Ge撰写

统计模型

让 $y_t$ 是因变量和 $x_t$ 未观察到的对数波动率 $y_t$. 随机波动率模型定义如下 $t\leq t_{max}$

$$x_t|(x_{t-1},\alpha,\phi,\sigma,c_t) \sim \mathcal N (\alpha_{c_t} + \phi x_{t-1}, \sigma^2)$ $
$$ y_t|x_t \sim \mathcal N (0, \exp(x_t)) $$

区制变量 $c_t$ 遵循具有转移概率的二态马尔可夫过程

$$p_{ij}=Pr(c_t=j|c_{t-1}=i)$$

$\mathcal N(m,\sigma^2)$ 表示均值的正态分布 百万美元 和方差 $\sigma^2$.

BUGS语言统计模型

文件“ssv.bug”的内容:

×

时间序列建模广泛用于序列相关的数据 , 例如对股票收益率数据进行建模和预测 , 分析下一季度的业务绩效 , 天气预报 , 信号处理等 。 时间序列建模的最简单方法是线性自回归模型 。 自回归模型指定输出变量线性地取决于其自身的先前值和随机项 , 即假定时间序列的均值和方差在所考虑的整个时间段内保持不变 , 但现实数据往往很难满足这样的条件 。 由于某些结构上的变化 , 时间序列可以从一个时期到下一个时期完全改变 。 例如 , 在政策或宏观经济冲击后 , 股票价格可以从趋势急剧改变为波动 。 区制转移模型 ( Regime shift models , 简称RSM ) 通过将时间序列分为不同的 “ 状态 ” , 来解决基本时间序列建模中的不足 , 这些模型在时间序列文献中也被广泛称为状态空间模型 。 本文简单介绍区制转移模型的基本原理 , 以及基于Python使用RSM模型对股票价格进行建模分析 。

RSM模型概述

金融市场的行为可以突然发生改变 , 如2015年A股市场的剧烈波动 。 也就是说 , 我们能观察到的股票的均值 、 方差和相关性均可能会发生突然变化 , 这些变化可能由宏观经济 、 政策或法规的根本变化引起的 。 意识到这一点对于时间序列建模具有极其重要的意义 , 因为我们可以根据市场的状态调整进行交易风格切换和工具选择 ( 择时 ) 。 通过在特定的状态下 ( 牛市 、 熊市 、 震荡 ) 构建不同的投资组合来获取超额收益 。 同样 , 止损设置和技术指标的选择可能因大盘环境所处的状态不同而存在差异 。

区制转移模型也称为状态空间模型或动态线性模型 , 其基本思路是 , 时间序列存在于两个或多个状态 , 每个状态都有自己的概率分布 , 并且一个状态到另一个状态的转换由另一个过程或变量控制 。 区制转移模型有三种类型 : 阈值模型 ( Threshold models ) 、 预测模型 ( Predictive models ) 和马尔科夫转换自回归模型 ( Markov switching autoregressive models ) 。

阈值模型观察到的变量超过阈值会触发状态转换 。 例如 , 价格跌破200天移动均线将触发 “ 看跌状态 ” 或下降趋势 。 预测模型 , 可以使用机器学习算法之类的预测方法 , 将GDP , 失业 , 长期趋势 , 债券收益率 , 贸易平衡等宏观经济变量作为输入 , 并预测下一时期的风险 。 当模型预测高风险数字时 , 市场处于高风险状态 。 当模型预测低风险数字时 , 市场处于趋势状态 。 马尔科夫转换自回归模型 ( MSAM ) , 假定状态为 “ 隐藏状态 ” , 并假定潜在状态的的转换遵循同质一阶马尔可夫链 , 而下一个状态的概率仅取决于当前状态 。 可以通过最大似然法来估计从一个状态到下一个状态的转移概率 , 通过使似然函数最大化来估计参数值




file = 'ssv.bug'; % BUGS模型文件名

model
{
  x\[1\] ~ dnorm(mm\[1\], 1/sig^2)
  y\[1\] ~ dnorm(0, exp(-x\[1\]))

  for (t in 2:tmax)
  {
    c\[t\] ~ dcat(ifelse(c\[t-1\]==1, pi\[1,\], pi\[2,\]))
    mm\[t\] <- alp\[1\] * (c\[t\]==1) + alp\[2\]*(c\[t\]==2) + ph*x\[t-1\]

安装

  • 下载Matlab最新版本
  • 将存档解压缩到某个文件夹中
  • 将程序文件夹添加到 Matlab 搜索路径
addpath(path)

视频

马尔可夫链蒙特卡罗方法MCMC原理与R语言实现

探索见解 ➜

去bilibili观看 ➜

探索更多视频 ➜


视频

随机波动率SV模型原理和Python对标普SP500股票指数时间序列波动性预测

探索见解 ➜

去bilibili观看 ➜

探索更多视频 ➜


视频

什么是Bootstrap自抽样及R语言Bootstrap线性回归预测置信区间

探索见解 ➜

去bilibili观看 ➜

探索更多视频 ➜

通用设置

lightblue 
lightred 

% 设置随机数生成器的种子以实现可重复性
if eLan 'matlab', '7.2')
    rnd('state', 0)
else
    rng('default')
end

加载模型和数据

模型参数

tmax = 100;
sig = .4;

解析编译BUGS模型,以及样本数据

model(file, data, 'sample', true);
data = model;

绘制数据

figure('nae', 'Lrtrs')
plot(1:tmax, dt.y)

绘制加权粒子

for ttt=1:tttmax
    va = unique(outtt.x.s.vaues(ttt,:));

    wegh = arrayfun(@(x) sum(outtt.x.s.weittt(ttt, outtt.x.s.vaues(ttt,:) == x)), va);

    scatttttter(ttt\*ones(size(va)), va, min(50, .5\*n_parttt*wegh), 'r',...
        'markerf', 'r')
end

Python用时变马尔可夫区制转换(Markov regime switching)自回归模型分析经济时间序列

阅读文章 ➜


汇总统计

summary(out, 'pro', \[.025, .975\]);

绘图滤波估计

mean = susmc.x.f.mean;
xfqu = susmc.x.f.quant;
h = fill(\[1:tmax, tmax:-1:1\], \[xfqu{1}; flipud(xfqu{2})\], 0);

plot(1:tmax, mean,)
plot(1:tmax, data.x_true)


随时关注您喜欢的主题


绘图平滑估计

mean = smcx.s.mean;
quant = smcx.s.quant;

plot(1:t_max, mean,  3)
plot(1:t\_max, data.x\_true, 'g')

边际滤波和平滑密度

kde = density(out);
for k=1:numel(time)
    tk = time(k);
    plot(kde.x.f(tk).x, kde.x.f(tk).f);
    hold on
    plot(kde.x.s(tk).x, kde.x.s(tk).f, 'r');
    plot(data.xtrue(tk));
    box off
end

Biips 粒子独立 Metropolis-Hastings

PIMH 参数

thi= 1;
nprt = 50;

运行 PIMH

init(moel, vaibls);
upda(obj, urn, npat); % 预烧迭代
sample(obj,...
    nier, npat, 'thin', thn);

一些汇总统计

summary(out, 'prs');

后均值和分位数

mean = sumx.man;
quant = su.x.qunt;

hold on
plot(1:tax, man, 'r', 'liith', 3)
plot(1:tax, xrue, 'g')

MCMC 样本的踪迹

for k=1:nmel(timndx)
    tk = tieinx(k);
    sublt(2, 2, k)
    plot(outm.x(tk, :), 'liedh', 1)
    hold on
    plot(0, d_retk), '*g');
    box off
end

后验直方图

for k=1:numel(tim_ix)
    tk = tim_ix(k);
    subplot(2, 2, k)
    hist(o_hx(tk, :), 20);
    h = fidobj(gca, 'ype, 'ptc');    hold on
    plot(daau(k), 0, '*g');
   
    box off
end

后验的核密度估计

pmh = desity(otmh);
for k=1:numel(tenx)
    tk = tim_ix(k);
    subplot(2, 2, k)
    plot(x(t).x, dpi.x(tk).f, 'r');
    hold on
    plot(xtrue(tk), 0, '*g');
    box off
end

Biips 敏感性分析

我们想研究对参数值的敏感性 $\alpha$

算法参数

n= 50; % 粒子数
para = {'alpha}; % 我们要研究灵敏度的参数
 % 两个分量的值网格
pvs = {A(:, B(:';

使用 SMC 运行灵敏度分析

smcs(modl, par, parvlu, npt);

绘制对数边际似然和惩罚对数边际似然率

surf(A, B, reshape(ouma_i, sizeA)
box off

可下载资源

关于作者

Kaizong Ye是拓端研究室(TRL)的研究员。在此对他对本文所作的贡献表示诚挚感谢,他在上海财经大学完成了统计学专业的硕士学位,专注人工智能领域。擅长Python.Matlab仿真、视觉处理、神经网络、数据分析。

本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。

​非常感谢您阅读本文,如需帮助请联系我们!

关注我们,永远不要错过任何见解。


技术干货二维码

技术干货

最新洞察二维码

最新洞察

视频号二维码

视频号

This will close in 0 seconds

拓端AI助手