尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

滚动单因子回归的计算和代码示例

滚动单因子回归的计算和代码示例 滚动单因子回归通常指在时间序列上用一个固定长度的窗口不断向后滑动每个窗口内做一次一元线性回归得到随时间变化的 alpha、beta 等系数。滚动单因子回归常见于 CAPM 滚动 beta、动态因子暴露、业绩归因等。1 计算方式1模型模型为其中每个滚动窗口内估计一组。例如是资产超额收益是市场超额收益则是滚动 CAPM beta是滚动 Jensen alpha。2计算对每个窗口一元回归下所以如果只需要 alpha、beta、R²可以用 pandas 的滚动协方差/方差快速算。2 向量化实现1Python基础实现参考以上计算公式Python向量化实现如下所示。这样得到的每个值对应窗口的最后一天的对应参数值。import pandas as pd import numpy as np # 假设 df 有两列asset 是资产收益factor 是因子收益 # index 是日期 window 60 # 例如 60 个月、252 个交易日等 df df.dropna() df[beta] df[asset].rolling(window).cov(df[factor]) / df[factor].rolling(window).var() df[alpha] df[asset].rolling(window).mean() - df[beta] * df[factor].rolling(window).mean() df[r2] df[asset].rolling(window).corr(df[factor]) ** 2 print(df[[alpha, beta, r2]].dropna().tail())如果要用作信号通常还要向后平移一天避免前视偏差df[beta_signal] df[beta].shift(1)2statsmodels实现用statsmodels获取 t 值等完整结果实现示例如下。import pandas as pd import statsmodels.api as sm def rolling_ols(y, x, window): out [] for end in range(window, len(y) 1): yw y.iloc[end - window:end] xw x.iloc[end - window:end] X sm.add_constant(xw) fit sm.OLS(yw, X).fit() out.append({ date: y.index[end - 1], alpha: fit.params.iloc[0], beta: fit.params.iloc[1], alpha_t: fit.tvalues.iloc[0], beta_t: fit.tvalues.iloc[1], r2: fit.rsquared, nobs: window }) return pd.DataFrame(out).set_index(date) result rolling_ols(df[asset], df[factor], window60) print(result.tail())如果担心残差自相关可以把fit sm.OLS(...).fit()改成 HAC/Newey-Westfit sm.OLS(yw, X).fit( cov_typeHAC, cov_kwds{maxlags: int(window ** 0.25)} )3 注意事项1窗口长度权衡窗口太短beta 噪声大不稳定。窗口太长反应慢无法捕捉结构变化。常见60 个月、36 个月、252 个交易日、120 个交易日。2数据频率要一致月频因子就用月频收益日频就用日频收益不要混用。3前视偏差滚动回归结果基于窗口末端数据实盘使用时通常要shift(1)。4重叠窗口导致自相关滚动 beta 序列通常高度平滑、自相关做统计推断时最好用 Newey-West 或 bootstrap。5超额收益问题如果 \(y\) 和 \(x\) 都是超额收益alpha 是 Jensen alpha。如果没有减去无风险利率截距含义会不同。6多因子扩展把一元回归换成多元回归即可reference---Rolling Beta Exposurehttps://github.com/quantskills/skill-rolling-beta-exposure/blob/main/README.en.mdquantskills /skill-rolling-beta-exposurehttps://github.com/quantskills/skill-rolling-beta-exposure/blob/main/examples/run_demo.pyskill-rolling-beta-exposureGitHub - quantskills/skill-rolling-beta-exposure · GitHub
返回列表