You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言面板数据中rollapply计算滚动特质偏度结果异常求助

问题原因及解决方案

问题根源

你的代码存在两个核心问题,导致滚动计算结果为常数:

  • rollapply参数传递错误:调用rollapply时,你直接传入了x=returns, y=market_returns,这会把整个分组后的基金收益、市场收益列传递给getIskewness,而非当前滚动窗口内的子集数据。相当于每个窗口都用全量数据计算偏度,结果自然是固定值。
  • 自定义函数参数设计不合理:getIskewness的参数没有对应rollapply传递的窗口数据,无法正确提取每个窗口内的样本。

另外注意:skewness()函数属于moments包,你的代码里没有加载这个包,需要补充导入。

修正后的代码

library(dplyr)
library(zoo)
library(moments)  # 补充加载skewness所在包

set.seed(123)

# 生成模拟数据
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)
)

# 修正自定义函数:接收窗口数据框作为参数
getIskewness <- function(window_data) {
  # 从窗口数据中提取所需列
  x <- window_data$returns
  y <- window_data$market_returns
  # 回归并计算残差偏度
  model <- lm(x ~ y + I(y^2))  # 用I()包裹y^2,避免公式解析错误
  res <- residuals(model)
  return(skewness(res, na.rm = TRUE))
}

# 滚动计算分组后的特质偏度
kk <- panel_data %>%
  group_by(fund) %>%
  arrange(date) %>%
  mutate(Iskewness = rollapply(
    .SD,  # 传递当前分组的所有列(或指定c(returns, market_returns))
    width = 20,
    FUN = getIskewness,
    by.column = FALSE,  # 按窗口整体传递数据框,而非按列拆分
    align = "right",
    fill = NA
  )) %>%
  arrange(fund, date)

# 查看结果(以Fund_A为例)
head(kk %>% filter(fund == "Fund_A") %>% select(date, Iskewness), 25)

关键改动说明

  • 函数参数调整:让getIskewness直接接收rollapply传递的窗口数据框,从数据框内提取当前窗口的returns和market_returns。
  • 公式修正:回归公式中用I(y^2)明确表示对y的平方项建模,避免lm()将y^2解析为交互项。
  • rollapply调用优化:用.SD传递当前分组的数据集,确保每个窗口只传入对应时间段的样本。

运行修正后的代码,每个基金的Iskewness会随日期滚动变动,符合预期。

内容的提问来源于stack exchange,提问作者Billsyd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 19:39:57