学习日记:基于滚动窗口的R-vine Copula模型(2)

本人非专业背景,代码来源于GitHub:https://github.com/zhanghuanyuan/r-vine-copula-with-sliding-window.git,非本人原创,仅用于学习记录。不当之处欢迎指正。

使用软件:R V4.3.3版本

功能概述

R-vine Copula 本质上是一种多元 Copula 模型,它是将多个二元 Copula 组合起来构建高维的依赖结构,以此来描述多个变量之间的相关关系。

  • 核心目标:结合滚动窗口技术构建高维动态 R-Vine Copula 模型来分析各变量间的动态相依结构。
  • 方法:边缘分布使用 AR (1)-GARCH (1,1) (学生 t 分布作为标准化残差的分布假设‌) 或 AR (1)-GJR (1,1) -Guass 构造,用 R-vine Copula 建模变量间的非线性依赖结构,滚动窗口分析动态变化。

自定义函数 2 :summarise 函数

此函数用于生成数据集的描述性统计表,包含描述性统计量(均值、最大值、最小值、标准差、偏度、峰度)及三类统计检验结果( KS 正态性检验、ADF 单位根检验、ARCH-LM 自回归条件异方差检验)。如下表所示(未考虑 Q (1)):

注: ****** 分别表示在 1%、5%、10%的置信水平上显著; Q(1) 是序列自相关滞后 1 阶的统计量; ARCH-LM 是 ARCH 效应的检验统计量; ADF 检验是单位根检验的统计量。

详细信息如下:

1、辅助函数 panduan

根据 p 值为统计检验结果添加显著性标记

  • p ≤ 0.01***(在 1% 的置信水平上显著)
  • 0.01 < p ≤ 0.05**(在 5% 的置信水平上显著)
  • 0.05 < p ≤ 0.1*(在 10% 的置信水平上显著)
  • p > 0.1 → 无标记
# "***","**","*"分别表示在 1%、5%、10%的置信水平上显著
panduan<-function(x){
  if(x<=0.01){
    a="***"
  }else if(x<=0.05){
    a="**"
  }else if(x<=0.1){
    a="*"
  }else{
    a=""
  }
  return(a)
}

# 使用方法
panduan(ks_result_test[["p.value"]])
panduan(adf_result_test[["p.value"]])
panduan(archlm[["p.value"]])
# ...

2、辅助函数 market_simp_name

通过数字索引映射变量名(如 1→"SH", 2→"US")。

market_simp_name<-function(x){
    name<-switch(x,
        "SH",
        "US",
        "FR",
        "UK",
        "HK",
        "JP",
        "CH",
        "SG",
        "TW")
}

3、Summarise 函数

(1)利用 summary 函数计算均值、最大值、最小值。函数输出:

#mean,max,min
a<-as.numeric(summary(data_1))
summ[i,2]<-a[4] #mean
summ[i,3]<-a[6] #max
summ[i,4]<-a[1] #min

(2)计算标准差、偏度、峰度:

summ[i,5]<-sd(data_1)        #sd
summ[i,6]<-skewness(data_1)  #skewness
summ[i,7]<-kurtosis(data_1)  #kurtosis

(3)KS 检验:用于判断样本数据是否与某个理论分布一致。

在原代码 ks.test(data, "pnorm") 中:

  • ‌原假设(H₀):data 服从标准正态分布。
  • ‌备择假设(H₁):data 不服从标准正态分布。

p 值 < 显著性水平(如 5%),则拒绝原假设,认为 data 不服从标准正态分布。

修正‌:检验一般正态分布:

ks.test(data, "pnorm", mean = mean(data), sd = sd(data))

(4)Augmented Dickey-Fuller(ADF)检验:检验时间序列是否存在单位根,即判断序列是否平稳。

在原代码 adf.Test (data) 中:‌

  • ‌原假设(H₀)‌:序列存在单位根(非平稳)。
  • ‌备择假设(H₁):序列不存在单位根(平稳)。

p 值 < 显著性水平(如 5%),则拒绝原假设,认为 data 不存在单位根,平稳。
代码未显式指定滞后阶数,依赖 adf.test 函数的默认选择:trunc((length(x)-1)^(1/3))

(5)ARCH-LM 检验

检验‌时间序列残差是否存在自回归条件异方差(ARCH 效应)‌,即波动聚集性(Volatility Clustering)。

在原代码 ArchTest(data,1) 中,滞后阶数为 1 :

  • ‌原假设(H₀)‌:残差序列无 ARCH 效应(无异方差性)。
  • ‌备择假设(H₁)‌:残差存在 ARCH 效应(存在异方差性)。

p 值 < 显著性水平(如 5%),则拒绝原假设,认为存在 ARCH 效应。

使用方法:

# 生成描述性统计表
descr_stats <- summarise(returns, RC)
print("描述性统计结果:")
print(descr_stats)

write.csv(descr_stats, "descriptive_statistics.csv", row.names = FALSE)


代码:

summarise<-function(data,RC){
  data_set=as.numeric(RC$data_set)
  summ<-matrix(data=NA,nrow=data_set,ncol=10)
  colnames(summ)<-c("name","mean","max","min","sd","skewness","kurtosis","ks","adf","Arch-LM")
  
  for(i in 1:data_set){
    #name
    summ[i,1]<-market_simp_name(i)
    #data
    data_1<-as.numeric(c(unlist(data[,(i)])))
    #mean,max,min,sd
    a<-as.numeric(summary(data_1))
    summ[i,2]<-a[4]
    summ[i,3]<-a[6]
    summ[i,4]<-a[1]
    summ[i,5]<-sd(data_1)
    #skewness&kurtosis
    summ[i,6]<-skewness(data_1)
    summ[i,7]<-kurtosis(data_1)
    #ks_test&adf_test
    ks_result_test<-ks.test(data_1, "pnorm", mean = mean(data_1), sd = sd(data_1))
    adf_result_test<-adf.test(data_1)
    summ[i,8]<-paste(round(ks_result_test[["statistic"]],3),panduan(ks_result_test[["p.value"]]))
    summ[i,9]<-paste(round(adf_result_test[["statistic"]],3),panduan(adf_result_test[["p.value"]]))
    #ARCH-LM
    archlm<-ArchTest(data_1,1)
    summ[i,10]<-paste(round(archlm[["statistic"]],3),panduan(archlm[["p.value"]]))
    }

  summ
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值