基于面板数据计算各资产RET前15-30个值的偏度
面板数据动态滚动偏度计算方案
针对每个ASSET_CODE,实现从15个前置值逐步过渡到固定30个前置值的偏度计算需求,以下是Python和R的具体实现:
Python 实现(Pandas + Scipy)
import pandas as pd import numpy as np from scipy.stats import skew # 1. 确保数据按资产和日期排序(关键步骤) data = data.sort_values(['ASSET_CODE', 'DATE']) # 2. 定义动态偏度计算函数 def calc_dynamic_skew(series): window_len = len(series) if window_len < 15: return pd.NA # 数据量不足15个,返回缺失值 elif 15 <= window_len < 30: return skew(series, nan_policy='omit') # 用当前所有前置数据计算偏度 else: return skew(series[-30:], nan_policy='omit') # 固定取最近30个数据 # 3. 分组计算并生成结果 data['ROLLING_SKEW'] = data.groupby('ASSET_CODE')['RET'].transform( lambda x: x.expanding().apply(calc_dynamic_skew) )
说明
expanding()窗口会逐行累积前置数据,配合自定义函数实现窗口从15到30的动态扩展,之后固定为30个数据的滚动窗口nan_policy='omit'用于自动忽略RET字段中的缺失值,可根据实际需求调整
R 实现(Dplyr + Slider + Moments)
library(dplyr) library(slider) library(moments) # 1. 确保数据按资产和日期排序(关键步骤) data <- data %>% arrange(ASSET_CODE, DATE) # 2. 分组计算动态偏度 data <- data %>% group_by(ASSET_CODE) %>% mutate( ROLLING_SKEW = slide_dbl( .x = RET, .f = ~{ window_len <- length(.x) if (window_len < 15) { NA_real_ } else if (window_len < 30) { skewness(.x, na.rm = TRUE) } else { skewness(tail(.x, 30), na.rm = TRUE) } }, .before = Inf # 累积所有前置数据,模拟expanding窗口 ) ) %>% ungroup()
说明
slide_dbl(.before = Inf)实现逐行累积前置数据的效果,逻辑与Python的expanding()一致na.rm = TRUE用于忽略RET中的缺失值,可根据实际情况调整
内容的提问来源于stack exchange,提问作者datgoaltho
相关产品推荐
相关产品推荐

