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

原文链接:http://tecdat.cn/?p=17829

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

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(!Num0;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 ss(cpp11)]]// [[Rcpp::depends(Rto read fromconst RMatrix<double> mat;// internal variablesconst double ratiot;// 从Rcpp输入和输出矩阵初始化run_esd_helper(const Numeall 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('Dais,1],type='l',col='black')

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


(0)

相关推荐

  • 尿毒症脑病的MRI诊断与临床相关

    尿毒症脑病的 MRI诊断与临床相关 点击图片了解培训班详情 ↓↓↓↓↓ ·尿毒症脑病是一种发生在急性或慢性肾功能衰竭患者身上的代谢紊乱.这种毒性代谢性脑病是严重肾功能衰竭患者内源性尿毒症毒素引起的并发 ...

  • 指数基金定投那么好,那买哪些基金比较好?(干货)

    本期定投(2018年2月)支付宝购买 医药100,基金代码:001550 红利机会,基金代码:501029 500低波动,基金代码:003318 50AH优选,基金代码:501050 中证红利,基金代 ...

  • 一直满仓,不断调仓

    A股大盘指数上已经没有什么可说的,大慢牛的趋势和特性(大.慢.牛,三字诀特性)早就确立无疑,而且根基越来越牢固.指数上后面只是个中短线波段节奏问题了. 精选个股,差不多可以说成了A股投资者几乎唯一的工 ...

  • 期权策略:用市场数据带你玩转波动率

    银河期货 吴元华 期权时代 2018-12-15期权作为一种金融衍生品目前已经在国内得到了应用,投资者对期权基础知识的了解和应用也通过各个机构的努力而得到普及.通过基础知识衍生出了各种让人目眩神迷的期 ...

  • R语言中进行期权定价的Heston随机波动率模型

    原文链接:http://tecdat.cn/?p=12111 在本文中,我将向您展示如何模拟股票价格的Heston随机波动率模型. Heston模型是一种期权估值方法,它考虑到同一资产在给定时间交易的 ...

  • R语言中的偏最小二乘回归PLS-DA

    原文链接:http://tecdat.cn/?p=8890 主成分回归(PCR)的方法 本质上是使用第一个方法的普通最小二乘(OLS)拟合来自预测变量的主成分(PC).这带来许多优点: 预测变量的数量 ...

  • ggClusterNet:手写算法在R语言中实现Gephi布局之一

    写在前面 像不像Gephi出图,Gephi布局还是有很多人喜欢,R语言确实不好实现,这个算法需要大量的迭代,让模块化点之间连线最短,不断修正,很耗费时间,我将聚类算法和修改后的距离算法合并起来并结合节 ...

  • R语言中实现广义相加模型GAM和普通最小二乘(OLS)回归

    原文链接:http://tecdat.cn/?p=20882 1导言 这篇文章探讨了为什么使用广义相加模型 是一个不错的选择.为此,我们首先需要看一下线性回归,看看为什么在某些情况下它可能不是最佳选择 ...

  • R语言中的隐马尔可夫HMM模型实例

    原文链接:http://tecdat.cn/?p=17592  最近,我们使用隐马尔可夫模型开发了一种解决方案,并被要求解释这个方案. HMM用于建模数据序列,无论是从连续概率分布还是从离散概率分布得 ...

  • R语言中回归和分类模型选择的性能指标

    原文链接:http://tecdat.cn/?p=11334 有多种性能指标来描述机器学习模型的质量.但是,问题是,对于问题正确的方法是什么?在这里,我讨论了选择回归模型和分类模型时最重要的性能指标. ...

  • R语言中使用非凸惩罚函数回归(SCAD、MCP)分析前列腺数据

    原文链接:http://tecdat.cn/?p=20828 本文使用lasso或非凸惩罚拟合线性回归,GLM和Cox回归模型的正则化,特别是_最小_最_大凹_度_惩罚_函数_(MCP)_和光滑切片绝 ...

  • R语言中贝叶斯网络(BN)、动态贝叶斯网络、线性模型分析错颌畸形数据

    原文链接:http://tecdat.cn/?p=22956 贝叶斯网络(BN)是一种基于有向无环图的概率模型,它描述了一组变量及其相互之间的条件依赖性.它是一个图形模型,我们可以很容易地检查变量的条 ...

  • R语言中生存分析模型的时间依赖性ROC曲线可视化

    原文链接:http://tecdat.cn/?p=20650 人们通常使用接收者操作特征曲线(ROC)进行二元结果逻辑回归.但是,流行病学研究中感兴趣的结果通常是事件发生时间.使用随时间变化的时间相关 ...