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

求助:如何用Pandas实现多列滚动窗口分析?以滚动回归为例

解决方案:基于时间窗口分组的面板回归实现

核心思路

要对全股票的滚动20天面板执行回归,替代循环或单列rolling.apply的关键是:先将数据按「滚动时间窗口」分组,再用groupby.apply对每个窗口的完整DataFrame执行回归逻辑——完全匹配你想要的类groupby操作方式。

步骤1:生成滚动时间窗口标签

先为每条数据标记所属滚动20天窗口的结束日期,以此作为分组依据(假设数据已按date排序):

import pandas as pd
import numpy as np
import statsmodels.api as sm

# 模拟你的面板数据结构
np.random.seed(42)
dates = pd.date_range(start='2023-01-01', periods=100)
windcodes = [f'STOCK_{i}' for i in range(50)]
data = pd.DataFrame({
    'windcode': np.repeat(windcodes, len(dates)),
    'date': np.tile(dates, len(windcodes)),
    'volume': np.random.randn(len(windcodes)*len(dates))*1000 + 10000,
    'adjlow': np.random.randn(len(windcodes)*len(dates)) + 20,
    'adjclose': np.random.randn(len(windcodes)*len(dates)) + 22,
    'open': np.random.randn(len(windcodes)*len(dates)) + 21
})
data = data.sort_values('date').reset_index(drop=True)

# 生成滚动20天窗口的结束日期作为分组ID
data['window_end'] = data['date'].rolling(window=20, min_periods=20).apply(lambda x: x.max())
# 过滤掉不足20天的初始窗口
data = data.dropna(subset=['window_end'])

步骤2:定义窗口回归函数

编写函数处理单个窗口的DataFrame,执行回归并返回结果:

def panel_regression(window_df):
    # 准备回归变量:y为volume,X包含截距项+指定特征
    y = window_df['volume']
    X = sm.add_constant(window_df[['adjlow', 'adjclose', 'open']])
    
    # 执行OLS回归
    model = sm.OLS(y, X).fit()
    
    # 返回系数结果(转为Series方便后续拼接)
    return model.params.rename(lambda x: f'coef_{x}')

步骤3:分组执行回归

直接按window_end分组,调用apply完成全窗口回归:

window_reg_results = data.groupby('window_end').apply(panel_regression)

针对数千特征的优化方案

如果特征数量极多,用numpy直接求解线性回归会更高效,且无需手动枚举特征列:

def fast_panel_regression(window_df):
    y = window_df['volume'].values.reshape(-1, 1)
    # 自动筛选所有特征列(排除非特征字段)
    feature_cols = [col for col in window_df.columns if col not in ['windcode', 'date', 'window_end', 'volume']]
    X = np.hstack([np.ones((len(window_df), 1)), window_df[feature_cols].values])
    
    # 最小二乘法直接求解系数
    coefs = np.linalg.lstsq(X, y, rcond=None)[0].flatten()
    # 生成系数名称
    coef_names = ['const'] + feature_cols
    return pd.Series(coefs, index=[f'coef_{name}' for name in coef_names])

# 调用优化后的函数
fast_window_results = data.groupby('window_end').apply(fast_panel_regression)

关键说明

  • 该方案完全规避循环,用groupby.apply直接操作每个窗口的完整DataFrame,逻辑与你熟悉的分组操作一致。
  • 窗口标签生成逻辑确保每个组包含所有股票过去20天的完整面板数据,匹配你的需求。
  • 针对数千特征场景,numpy直接求解比statsmodels更高效,且自动识别特征列,无需手动输入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:30:47