请求提供面板数据12个月滚动窗口回归Python代码:提取基金月度截距
基金月度12个月滚动窗口回归获取截距值代码
前提假设
假设你的面板数据包含以下核心字段:
fund_id: 唯一基金标识date: 月度日期(格式如'2020-01-31')fund_return: 基金月度收益率market_return: 市场基准月度收益率(若需多因子模型可自行扩展)
完整代码
import pandas as pd import numpy as np import statsmodels.api as sm # 1. 数据预处理 # 替换为你的数据读取方式(如数据库读取、本地文件) df = pd.read_csv('fund_panel_data.csv') # 转换日期格式并按基金+日期排序 df['date'] = pd.to_datetime(df['date']) df = df.sort_values(['fund_id', 'date']).reset_index(drop=True) # 2. 定义滚动回归函数 def rolling_alpha(group, window_size=12): # 初始化截距存储列 group['alpha'] = np.nan # 遍历每个窗口的结束位置 for i in range(window_size, len(group)+1): # 截取当前滚动窗口内的数据 window = group.iloc[i-window_size:i] # 构建回归变量:添加常数项用于计算截距 X = sm.add_constant(window['market_return']) y = window['fund_return'] # 拟合OLS回归模型 model = sm.OLS(y, X).fit() # 将截距值赋值给窗口最后一个日期的记录 group.loc[group.index[i-1], 'alpha'] = model.params['const'] return group # 3. 按基金分组执行滚动回归 result_df = df.groupby('fund_id').apply(rolling_alpha) # 4. 整理输出结果 # 提取核心字段并去除无截距值的行(前11个月无足够窗口数据) output_df = result_df[['fund_id', 'date', 'alpha']].dropna() print(output_df.head()) # 可选:保存结果到本地文件 # output_df.to_csv('fund_monthly_alpha.csv', index=False)
关键说明
- 窗口逻辑:每个滚动窗口包含连续12个月数据,回归得到的截距对应窗口最后一个月的数值(即第12个月生成第一个有效截距,后续每月更新)
- 模型扩展:若需多因子模型(如Fama-French三因子),只需修改
X的构建逻辑,例如:sm.add_constant(window[['market_return', 'smb', 'hml']]) - 性能优化:针对超大规模数据,可引入
numba加速循环,或改用向量化滚动操作替代逐行遍历
内容的提问来源于stack exchange,提问作者sam12345
相关产品推荐
相关产品推荐

