0
点赞
收藏
分享

微信扫一扫

拓端tecdat|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如何帮助我们减少计算时间。

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

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

1.  #*****************************************************************
2. # 计算对数收益率
3. #*****************************************************************
4. ret = diff(log(data$prices))
5.
6. tic(5)
7. hist.vol = sqrt(252) * bt.apply.matrix(ret, runSD, n = 200)
8. toc(5)

经过时间为0.17秒

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

1.  # 建立 RCPP 函数计算指数加权波动率
2. load.packages('Rcpp')
3. sourceCpp(code='
4. #include <Rcpp.h>
5. using namespace Rcpp;
6. using namespace std;
7.
8. // [[Rcpp::plugins(cpp11)]]
9.
10. //ema[1] = 0
11. //ema[t] = (1-a)*r[t-1] + (1-a)*a*ema[t-1]
12. // [[Rcpp::exp
13.
14. {
15. if(!NumericVector::is_na(x[t])) break;
16. res[t] = NA_REAL;
17. }
18. int start_t = t;
19.
20. -a) * a^i * (r[t-1-i] - rhat[t])^2, i=0 ... inf
21. // [[Rcpp::export]]
22. NumericVector run_esd_cpp(NumericVector x, double ratio) {
23. auto sz = x.siz
24.
25. // find start index; first non NA item
26. for(t = 0; t < sz; t++) {
27. if(!Num
28. 0;
29. for(t = start_t + 1; t < sz; t++) {
30. ema = (1-ratio) * ( x[t-1] + ratio * ema);
31. double sigma = 0;
32. for(int i = 0; i < (t - start_t); i++) {
33. sigma += pow(ratio,i) * pow(x[t-1-i] - ema, 2);
34. }
35. res[t] = (1-ratio) * sigma;
36. }
37. , n, ratio = n/(n+1)) run_ema_cpp(x, ratio)
38. run.esd = funct

 经过时间为106.16秒。

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

  1.  # 建立 RCPP 并行函数计算指数加权波动率


1.  load.packages('RcppParallel')
2. sourceCpp(code='
3.
4. using namespace Rcpp;
5. using namespace s
6. s(cpp11)]]
7. // [[Rcpp::depends(R
8. to read from
9. const RMatrix<double> mat;
10. // internal variables
11. const double ratio
12. t;
13. // initialize from Rcpp input and output matrixes
14. run_esd_helper(const Nume
15. all operator that work for th
16.
17. in, size_t end) {
18. for (size_t c1 = begin; c1 < end; c1++) {
19. int t;
20. // find start index; fir

经过时间为14.65秒

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

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

拓端tecdat|R语言中使用RCPP并行计算指数加权波动率_加权波动率

 

 

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

拓端tecdat|R语言中使用RCPP并行计算指数加权波动率_随机波动率_02

举报

相关推荐

0 条评论