R语言中使用RCPP并行计算指数加权波动率

简介: R语言中使用RCPP并行计算指数加权波动率

指数加权波动率是一种波动率的度量,它使最近的观察结果有更高权重。我们将使用以下公式计算指数加权波动率:

S [t] ^ 2 = SUM(1-a)* a ^ i *(r [t-1-i]-rhat [t])^ 2,i = 0…inf

其中rhat [t]是对应的指数加权平均值

rhat [t] = SUM(1-a)* a ^ i * r [t-1-i],i = 0…inf

上面的公式取决于每个时间点的完整价格历史记录,并花了一些时间进行计算。因此,我想分享Rcpp和RcppParallel如何帮助我们减少计算时间。

我将使用汇率的历史数据集  作为测试数据。

首先,我们计算平均滚动波动率



#*****************************************************************
# 计算对数收益率
#*****************************************************************
ret = diff(log(data$prices))


tic(5)
hist.vol = sqrt(252) * bt.apply.matrix(ret, runSD, n = 200)
toc(5)

经过时间为0.17秒

接下来,让我们编写指数加权代码逻辑



# 建立 RCPP 函数计算指数加权波动率
load.packages('Rcpp')
sourceCpp(code='
#include <Rcpp.h>
using namespace Rcpp;
using namespace std;


// [[Rcpp::plugins(cpp11)]]


//ema[1] = 0
//ema[t] = (1-a)*r[t-1] + (1-a)*a*ema[t-1]
// [[Rcpp::exp


{
if(!NumericVector::is_na(x[t])) break;
res[t] = NA_REAL;
}
int start_t = t;


-a) * a^i * (r[t-1-i] - rhat[t])^2, i=0 ... inf
// [[Rcpp::export]]
NumericVector run_esd_cpp(NumericVector x, double ratio) {
auto sz = x.siz


// 找到开始的索引,第一个非空项;  
for(t = 0; t < sz; t++) {
if(!Num
0;
for(t = start_t + 1; t < sz; t++) {
ema = (1-ratio) * ( x[t-1] + ratio * ema);
double sigma = 0;
for(int i = 0; i < (t - start_t); i++) {
sigma += pow(ratio,i) * pow(x[t-1-i] - ema, 2);
}
res[t] = (1-ratio) * sigma;
}
, n, ratio = n/(n+1)) run_ema_cpp(x, ratio)
run.esd = funct

经过时间为106.16秒。

执行此代码花了一段时间。但是,代码可以并行运行。以下是RcppParallel版本。



# 建立 RCPP 并行函数计算指数加权波动率
load.packages('RcppParallel')
sourceCpp(code='


using namespace Rcpp;
using namespace s
s(cpp11)]]
// [[Rcpp::depends(R
to read from
const RMatrix<double> mat;
// internal variables
const double ratio
t;
// 从Rcpp输入和输出矩阵初始化
run_esd_helper(const Nume
all operator that work for th


in, size_t end) {
for (size_t c1 = begin; c1 < end; c1++) {
int t;
// find start index; fir

经过时间为14.65秒

运行时间更短。接下来,让我们直观地了解使用指数加权波动率的影响



dates = '2007::2010'
layout(1:2)
e='h', col='black', plotX=F)
plota.legend(paste('Dai
s,1],type='l',col='black')

 

不出所料,指数加权波动率在最近的观察结果中占了更大的比重,是一种更具反应性的风险度量。


相关文章
|
6月前
|
算法 Python
R语言随机波动模型SV:马尔可夫蒙特卡罗法MCMC、正则化广义矩估计和准最大似然估计上证指数收益时间序列
R语言随机波动模型SV:马尔可夫蒙特卡罗法MCMC、正则化广义矩估计和准最大似然估计上证指数收益时间序列
|
6月前
|
机器学习/深度学习 安全
R语言逻辑回归Logistic选股因素模型交易策略及沪深300指数实证
R语言逻辑回归Logistic选股因素模型交易策略及沪深300指数实证
|
6月前
|
算法 数据可视化 数据挖掘
R语言指数平滑预测法分析南京出租车打车软件空载率时间序列补贴政策可行性
R语言指数平滑预测法分析南京出租车打车软件空载率时间序列补贴政策可行性
|
6月前
|
数据可视化 数据挖掘
R语言DCC-GARCH模型对上证指数、印花税收入时间序列数据联动性预测可视化
R语言DCC-GARCH模型对上证指数、印花税收入时间序列数据联动性预测可视化
|
6月前
|
数据挖掘 数据建模
R语言指数加权模型EWMA预测股市多变量波动率
R语言指数加权模型EWMA预测股市多变量波动率
R语言指数加权模型EWMA预测股市多变量波动率
|
6月前
|
算法
R语言MCMC-GARCH、风险价值VaR模型股价波动分析上证指数时间序列
R语言MCMC-GARCH、风险价值VaR模型股价波动分析上证指数时间序列
R语言MCMC-GARCH、风险价值VaR模型股价波动分析上证指数时间序列
|
6月前
|
数据可视化
R语言汇率、股价指数与GARCH模型分析:格兰杰因果检验、脉冲响应与预测可视化
R语言汇率、股价指数与GARCH模型分析:格兰杰因果检验、脉冲响应与预测可视化
|
6月前
|
机器学习/深度学习 数据可视化 数据挖掘
R语言神经网络模型金融应用预测上证指数时间序列可视化
R语言神经网络模型金融应用预测上证指数时间序列可视化
|
6月前
|
算法 数据可视化 数据挖掘
R语言平滑算法LOESS局部加权回归、三次样条、变化点检测拟合电视节目《白宫风云》在线收视率
R语言平滑算法LOESS局部加权回归、三次样条、变化点检测拟合电视节目《白宫风云》在线收视率
|
6月前
|
数据可视化 前端开发 SEO
R语言门限误差修正模型(TVECM)参数估计沪深300指数和股指期货指数可视化
R语言门限误差修正模型(TVECM)参数估计沪深300指数和股指期货指数可视化