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

请求提供面板数据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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 14:45:56