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

指数加权波动率是一种波动率的度量,它使最近的观察结果有更高权重。

由Kaizong Ye,Sherry Deng撰写

我们将使用以下公式计算指数加权波动率:

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
 
	// 查找开始索引; 第一个非NA项目

	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秒。


课程

R语言数据分析挖掘必知必会

从数据获取和清理开始,有目的的进行探索性分析与可视化。让数据从生涩的资料,摇身成为有温度的故事。

立即参加

执行此代码花了一段时间。但是,代码可以并行运行。以下是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
  
in, size_t end) {
		for (size_t c1 = begin; c1 < end; c1++) {		
			int t;
			// 查找开始索引; 

经过时间为14.65秒

 

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

 
QQ在线咨询
售前咨询热线
15121130882
售后咨询热线
0571-63341498

关注有关新文章的微信公众号


永远不要错过任何见解。当新文章发表时,我们会通过微信公众号向您推送。

技术干货

最新洞察

This will close in 0 seconds