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

基于面板数据计算各资产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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:02:33