求助:如何用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
相关产品推荐
相关产品推荐

