我正在尝试计算面板数据中不同基金的特殊偏度。基本上,我希望将基金的每日回报率与市场回报率和市场回报率的平方进行回归以获得残差。然后使用 skewness() 计算残差的偏度。但是,我需要在 20 天的移动窗口内执行此计算,每一步向前移动 1 天。我正在考虑编写一个函数并为我的面板数据中的每个基金滚动应用该函数。然而,我并没有得到我预期的结果。以下代码生成模拟数据表。
library(dplyr)
library(zoo)
set.seed(123)
# Generate mock data
n <- 100
date_sequence <- seq(as.Date("2022-01-01"), by = "1 day", length.out = n)
fund_sequence <- rep(c("Fund_A", "Fund_B", "Fund_C"), each = n/3)
panel_data <- data.frame(
fund = rep(fund_sequence, each = n),
date = rep(date_sequence, times = 3),
returns = rnorm(n * 3),
market_returns = rnorm(n * 3)
)
# My own iKewness function
getIskewness<-function(x,y,z){aa<-residuals(lm(x~y+y^2))
aa<-skewness(aa, na.rm = TRUE)
return(aa)}
## run a rolling regression
kk<-panel_data%>%
group_by(fund)%>%
arrange(date)%>%
mutate(Iskewness=rollapply(across(c(returns,market_returns)), width = 20,
FUN=getIskewness,x=returns,y=market_returns,
by.column = FALSE, align = "right",fill="NA"))%>%
arrange(fund,date)`
我发现每个基金的结果都是恒定的。我期望的是变量每天都在变化,因为该函数应该在 20 天的移动窗口内滚动应用。有人可以帮助我吗?谢谢!
有几个问题:
skewness
,因此将其设置为 mean
以允许其运行rollapply
可以写成 rollapplyr
并在末尾加上 r 以避免 align="right"
getIskewness
)z
参数未在 getIskewness
cbind
中使用
rollapplyr
代码:
set.seed(123)
# Generate mock data
n <- 4
date_sequence <- seq(as.Date("2022-01-01"), by = "1 day", length.out = n)
fund_sequence <- rep(c("Fund_A", "Fund_B", "Fund_C"), each = n/3)
panel_data <- data.frame(fund = rep(fund_sequence, each = n),
date = rep(date_sequence, times = 3),
returns = rnorm(n * 3),
market_returns = rnorm(n * 3)
)
# My own iKewness function
skewness <- mean
getIskewness<-function(x, y) {
aa <- residuals(lm(x~y+y^2))
aa <- skewness(aa, na.rm = TRUE)
return(aa)
}
## run a rolling regression
kk <- panel_data %>%
group_by(fund) %>%
arrange(date) %>%
mutate(Iskewness = rollapplyr(
cbind(returns, market_returns),
width = 3,
FUN = \(X) getIskewness(X[, 1], X[, 2]),
by.column = FALSE,
fill = NA)) %>%
ungroup %>%
arrange(fund, date)
kk
给予:
# A tibble: 12 × 5
fund date returns market_returns Iskewness
<chr> <date> <dbl> <dbl> <dbl>
1 Fund_A 2022-01-01 -0.560 0.401 NA
2 Fund_A 2022-01-02 -0.230 0.111 NA
3 Fund_A 2022-01-03 1.56 -0.556 1.62e-17
4 Fund_A 2022-01-04 0.0705 1.79 -1.11e-16
5 Fund_B 2022-01-01 0.129 0.498 NA
6 Fund_B 2022-01-02 1.72 -1.97 NA
7 Fund_B 2022-01-03 0.461 0.701 -2.31e-17
8 Fund_B 2022-01-04 -1.27 -0.473 0
9 Fund_C 2022-01-01 -0.687 -1.07 NA
10 Fund_C 2022-01-02 -0.446 -0.218 NA
11 Fund_C 2022-01-03 1.22 -1.03 -2.04e-16
12 Fund_C 2022-01-04 0.360 -0.729 9.25e-18