ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

gs-quant 滚动窗口回归实战:用 RollingLinearRegression 监控参数漂移

gs-quant 滚动窗口回归实战:用 RollingLinearRegression 监控参数漂移 gs-quant 滚动窗口回归实战用 RollingLinearRegression 监控参数漂移【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quantgs-quant 是 Goldman Sachs 开源的量化金融工具包。其 timeseries 模块中的RollingLinearRegression定义于gs_quant/timeseries/statistics.py在固定观测数的滚动窗口上拟合 OLS 回归输出每个窗口末一个点的参数序列是监控参数漂移最直接的构件。本文按源码走读这个类再用仓库自带测试数据复现一次完整的漂移告警。参数突然失效长什么样策略参数通常在全样本上标定系数拟合漂亮R² 达标。但市场结构切换后解释变量与被解释变量的关系可能已经改变。典型症状滚动 R² 连续多期低于长期基线关键系数相对历史区间发生符号或量级翻转模型残差标准差显著放大漂移不一定出现在你关注的那个系数上可能转移到其他系数或截距全样本回归只能告诉你整体拟合变差滚动回归能告诉你从哪一期开始变差、哪个参数在动。RollingLinearRegression 源码走读构造函数校验、清洗与对齐一次做完构造签名是RollingLinearRegression(X, y, w, fit_interceptTrue)X可以是单条序列或序列列表。关键逻辑节选简化# 意图清洗对齐后交给 statsmodels RollingOLS参数存于每个窗口末端 def __init__(self, X, y, w, fit_interceptTrue): df sm.add_constant(df) if fit_intercept else df if w len(df.columns): raise MqValueError(Window length must be larger than the number of explanatory variables) df df[~df.isin([np.nan, np.inf, -np.inf]).any(axis1)] y y[~y.isin([np.nan, np.inf, -np.inf])] df_aligned, y_aligned df.align(y, inner, axis0) self._res RollingOLS(y_aligned, df_aligned, w).fit()有四个点值得注意fit_intercept必须是 bool传数字会抛MqTypeErrorw的校验把常数项也算一列2 个解释变量加截距时w必须大于 3含 nan/inf 的行在对齐之前就被剔除窗口内有效点数可能小于w底层引擎是 statsmodels 的RollingOLSw只接受 int不支持1m这类字符串窗口四个输出序列各返回什么每个方法都是对self._res对应字段的包装序列 index 与对齐后一致前w-1个点为 NaN方法返回含义coefficient(i)pd.Seriesparams[i]fit_interceptTrue时i0是截距r_squared()pd.Series各窗口决定系数fitted_values()pd.Series窗口末端拟合值standard_deviation_of_errors()pd.Seriessqrt(mse_resid)误差项标准差参数按窗口末端存储$R_t \mathrm{OLS}(X_{t-w1:t},\ y_{t-w1:t})$第t个点记录的是[t-w1, t]这一窗口的估计值。日常调用只需几行# 意图一次构造取出滚动 R² 与斜率两条核心监控序列 from gs_quant.timeseries.statistics import RollingLinearRegression reg RollingLinearRegression([x1, x2], y, 22) reg.r_squared() # 滚动 R² reg.coefficient(1) # 第 1 个解释变量的斜率0 是截距 reg.standard_deviation_of_errors() # 滚动误差标准差方法上的plot_method装饰器把输出标记为可绘图对象gs_quant/timeseries/statistics.py头部注释写明 Marquee Plot Service 会直接暴露这些公开方法。同文件的LinearRegression是全样本静态版输出标量、额外支持predict()RollingLinearRegression没有predict。用仓库自带测试数据复现一次漂移告警gs_quant/test/timeseries/test_statistics.py的test_rolling_linear_regression构造了一组真实关系稳定、中间注入异常观测的数据简化后可直接运行# 意图y 10 x1 3*x2末两点被压低模拟参数漂移发生 x1 pd.Series([0, 1, 4, 9, 16, 25], indexpd.date_range(2019-1-1, periods6)) x2 pd.Series([0, 1, 2, 3, 4, 5], indexpd.date_range(2019-1-1, periods6)) y pd.Series([10, 14, 20, 28, 28, 40], indexpd.date_range(2019-1-1, periods6)) reg RollingLinearRegression([x1, x2], y, 4) print(reg.coefficient(1)) # nan, nan, nan, 1.0, -1.5, 1.0 print(reg.r_squared()) # nan, nan, nan, 1.0, 0.964, 0.902测试断言的期望值与上面一致。把完整参数向量放在一起看输出末三个窗口取值漂移信号coefficient(0)截距10.0 → 2.5 → 19.0截距抬升coefficient(1)x1 斜率1.0 → -1.5 → 1.0符号翻转coefficient(2)x2 斜率3.0 → 12.5 → -1.0漂移转移到其他系数r_squared()1.0 → 0.964 → 0.902解释力衰减standard_deviation_of_errors()0.0 → 2.24 → 4.47残差标准差翻倍注意最后一个窗口 x1 斜率恢复到 1.0但 x2 系数变成 -1.0、截距抬到 19.0漂移只是转移了位置。这是参数漂移监控要看完整参数向量、而不是单条系数序列的原因。拿到参数序列后告警规则可以自己叠加常见形态是基线加偏差阈值# 意图斜率偏离长期基线 2 个标准差、或 R² 低于基线 0.2 时触发漂移告警 slope reg.coefficient(1) base, scale slope.rolling(126).mean(), slope.rolling(126).std() drift (slope - base).abs() 2 * scale weak reg.r_squared() reg.r_squared().rolling(126).mean() - 0.2同族滚动窗口函数怎么选RollingLinearRegression不是孤例gs_quant/timeseries/__init__.py对多个子模块做了星号导入按需求取用即可需求函数窗口形式滚动斜率/系数向量RollingLinearRegression(X, y, w)仅 int滚动 betabeta(x, b, w, pricesTrue)见gs_quant/timeseries/econometrics.pyint / str /Window滚动 std、var、cov、zscorestd、var、cov、zscores等见gs_quant/timeseries/statistics.pyint / str /Window绩效报告类滚动度量standard_deviation(report_id, rolling_window)等见gs_quant/timeseries/measures_reports.pyint / strgs_quant/documentation/05_factor_models/01_Factor_Models.ipynb里用一行代码生成约三个月的因子 beta 序列是多因子参数稳定性检验的标准写法# 意图滚动窗口 63 个观测约 3 个月估计因子间 beta from gs_quant.timeseries.econometrics import beta factor_beta beta(growth_ret, momentum_ret, 63, pricesFalse)其余滚动函数的窗口语义统一收口在gs_quant/timeseries/helper.py的Window与normalize_window形式含义w22int22 个观测ramp 期默认取 22前 22 点被丢弃Window(22, 10)窗口 22、ramp 10保留第 10 点之后的值1mstr日历窗口index 必须是 DatetimeIndex窗口设置的常见坑现象原因构造即抛MqValueErrorw不大于变量数fit_interceptTrue时常数项占一列构造即抛MqTypeErrorfit_intercept不是 boolcoefficient(i)取错列fit_interceptTrue时索引 0 是截距而非第一个解释变量序列前w-1点为 NaN窗口未满属正常现象与手工 pandasrolling结果对不上本类先剔 nan 行再对齐RollingOLS在清洗后的 index 上定窗1m字符串窗口不可用RollingLinearRegression的w只接受 int字符串窗口由其他滚动统计量支持另外两件事X 与 y 日期轴不一致时构造器取交集inner join输出 index 是交集后的 index若目标只是每天重估一次参数、不做跨期比较用LinearRegression静态版更合适RollingLinearRegression专职产出参数时间序列复现本文测试运行pytest gs_quant/test/timeseries/test_statistics.py::test_rolling_linear_regression窗口 ramp 语义与normalize_window的实现直接读gs_quant/timeseries/helper.py完整的因子 beta 滚动示例在gs_quant/documentation/05_factor_models/01_Factor_Models.ipynb【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表