拓冰建站拓冰建站
首页 / 资讯中心 / 正文

gs-quant 滚动线性回归 RollingLinearRegression 详解:从滚动 OLS 原理到实际应用

gs-quant 滚动线性回归 RollingLinearRegression 详解从滚动 OLS 原理到实际应用【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant导读本文以 gs-quant 时间序列统计模块中的RollingLinearRegression类为讲解对象深入剖析其在金融时序分析中的应用场景在固定观察窗口内对解释变量 X 与因变量 y 进行滚动普通最小二乘Rolling OLS回归动态捕捉回归系数、拟合值、R² 与残差标准差的时序演化。读完本文你将掌握该类的构造参数语义、四个核心方法coefficient、fitted_values、r_squared、standard_deviation_of_errors的用法与返回结构并通过源码与单元测试的对照理解滚动窗口的参数对齐、缺失值处理等底层实现细节可直接在因子分析、风格暴露跟踪、价差动态建模等场景中落地使用。一、类概览与定位RollingLinearRegression定义于 gs_quant/timeseries/statistics.py约第 1173 行起归属于gs_quant.timeseries.statistics子模块与其同模块的静态回归类LinearRegression互为补充后者对整个样本拟合一次回归前者则以固定宽度窗口沿时间轴滚动拟合参数结果存储在每个窗口的末端。按照 docs/classes/gs_quant.timeseries.statistics.RollingLinearRegression.rst 的 API 文档该类对外暴露四个方法本文章节将逐一展开方法返回值语义coefficient(i)pd.Series第 i 个预测变量的滚动估计系数fitted_values()pd.Series每个滚动窗口末端的拟合值r_squared()pd.Series滚动回归的决定系数 R²standard_deviation_of_errors()pd.Series滚动回归残差的标准差需要特别注意的是与静态LinearRegression返回标量不同滚动版本的四个方法全部返回与输入时间序列等长的时间序列未达到完整窗口的前导位置为NaN。二、构造参数与初始化语义类的构造函数签名如下源码见 statistics.pydef __init__(self, X: Union[pd.Series, list[pd.Series]], y: pd.Series, w: int, fit_intercept: bool True):参数类型说明Xpd.Series或list[pd.Series]一个或多个解释变量自变量观测序列ypd.Series因变量被解释变量观测序列wint每个滚动窗口包含的观测数量必须大于解释变量个数fit_interceptbool默认True是否在模型中计算截距项初始化阶段做了四件关键事情源码与注释可以互相印证数据整形若X是多个序列用pd.concat(X, axis1)沿列方向拼接成数据框若X是单个序列则调用to_frame()转为单列数据框。截距项fit_interceptTrue时通过sm.add_constant(df)加入常数项列随后列重命名为0, 1, 2, ...0 号对应截距fit_interceptFalse时列重命名为1, 2, ...此时coefficient(0)不再可用必须从coefficient(1)开始取斜率系数。窗口宽度校验若w len(df.columns)即窗口长度不大于解释变量个数抛出MqValueError提示信息为Window length must be larger than the number of explanatory variables。这与文档字符串中窗口观测数必须大于解释变量数的约束完全一致也是防止 OLS 设计矩阵秩亏的最小可行性检查。脏数据过滤与对齐先剔除X中任何含NaN、inf、-inf的行同样剔除y中的非法值再通过df.align(y, inner, axis0)仅保留两个序列日期/时间索引的交集。这正是类文档中若 X 与 y 未对齐则仅使用日期/时间的交集的实现。此外fit_intercept若传入非布尔值例如整数1构造阶段会抛出MqTypeError提示expected a boolean value for fit_intercept。窗口拟合的核心一行是self._res RollingOLS(y_aligned, df_aligned, w).fit()这里直接使用 statsmodels 的RollingOLS导入语句见 statistics.pyfrom statsmodels.regression.rolling import RollingOLS因此该类的数值计算完全复用 statsmodels 成熟的滚动回归实现gs-quant 在此之上封装了金融时序友好的接口与返回值。三、核心方法逐一拆解3.1 coefficient(i)滚动回归系数plot_method def coefficient(self, i: int) - pd.Series: return self._res.params[i]i0对应截距项前提是fit_interceptTruei1起对应各个解释变量的回归斜率返回pd.Series索引与输入序列对齐窗口未满的前导位置为NaN。参数语义在 LinearRegression.coefficient 与 RollingLinearRegression.coefficient 的 docstring 中保持一致0 for intercept (available if intercept is used), 1 for regression slope。3.2 fitted_values()窗口末端拟合值plot_method def fitted_values(self) - pd.Series: comp self._X.mul(self._res.params.values) return comp.sum(axis1, min_countlen(comp.columns))滚动版本并未直接返回RollingOLS的fittedvalues因为 RollingOLS 的拟合值矩阵结构不同而是手工重算将保存的原始解释变量矩阵self._X逐列乘以对应位置的滚动系数矩阵self._res.params.values再按行求和。min_countlen(comp.columns)保证当某行存在缺失系数时整行结果仍为NaN从而保持时序完整性。返回值语义为每个滚动窗口末端的拟合值。3.3 r_squared()滚动决定系数plot_method def r_squared(self) - pd.Series: return self._res.rsquared直接透传 statsmodels 滚动回归结果的rsquared属性返回每个窗口的拟合优度 R² 时序用于评估各时间切片上模型的解释力度。3.4 standard_deviation_of_errors()滚动残差标准差plot_method def standard_deviation_of_errors(self) - pd.Series: return np.sqrt(self._res.mse_resid)对滚动回归的残差均方误差mse_resid开平方得到每个窗口误差项的标准差时序反映模型在每个窗口上的拟合误差水平。静态版本的同类实现见 LinearRegression.standard_deviation_of_errors逻辑完全一致。四个方法均被plot_method装饰装饰器定义见 gs_quant/timeseries/helper.py其作用是标记该方法可被 Marquee Plot Service 导出为绘图工具方法并允许调用方传入real_time、interval、time_filter等绘图场景参数而不报错装饰器内部会将这些多余关键字参数静默剔除。四、完整可运行示例类文档statistics.py给出如下使用范式基于 100 个观测在 22 个观测的滚动窗口内对 y 与 x1、x2 做回归并计算 R²from gs_quant.timeseries.statistics import generate_series from gs_quant.timeseries.statistics import RollingLinearRegression x1 generate_series(100) x2 generate_series(100) y generate_series(100) r RollingLinearRegression([x1, x2], y, 22) r.r_squared() # 滚动 R² 时序前 21 个位置为 NaN r.coefficient(0) # 滚动截距项 r.coefficient(1) # x1 的滚动斜率 r.coefficient(2) # x2 的滚动斜率 r.fitted_values() # 每个滚动窗口末端的拟合值 r.standard_deviation_of_errors() # 滚动残差标准差要点解读传入两个解释变量时使用列表[x1, x2]单变量时可直接传pd.Series窗口w22可理解为过去约一个月的日频观测这是一种常见的金融回归窗口设定由于每个参数都存储在窗口末端因此输出序列的前w-1个位置为NaN从第w个位置起才有有效值。五、单元测试实证行为细节与边界条件gs_quant/test/timeseries/test_statistics.py 中的test_rolling_linear_regression完整验证了该类的行为是理解其语义的绝佳实证x1 pd.Series([0.0, 1.0, 4.0, 9.0, 16.0, 25.0, np.nan], indexpd.date_range(2019-1-1, periods7), namex1) x2 pd.Series([0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0], indexpd.date_range(2019-1-1, periods8)) y pd.Series([10.0, 14.0, 20.0, 28.0, 28.0, 40.0, 60.0], indexpd.date_range(2019-1-1, periods7))测试覆盖了以下关键行为窗口宽度过小报错RollingLinearRegression([x1, x2], y, 3, True)抛出MqValueError。两个解释变量加上截距共 3 列w3不满足窗口长度必须大于解释变量个数的约束这里要求w 列数即至少为 4。fit_intercept 类型校验RollingLinearRegression([x1, x2], y, 4, 1)抛出MqTypeError因为fit_intercept传入了整数而非布尔值。NaN 过滤与索引对齐x1长度为 7、x2长度为 8、y长度为 7且x1最后一位为NaN。经过过滤与交集对齐后最终只有 6 个有效观测参与滚动回归输出索引为2019-1-1至2019-1-6前 3 个位置未凑满窗口 4为NaN。数值结果逐项断言w4、含截距方法前 3 位第 4~6 位期望值coefficient(0)截距NaN10.0, 2.5, 19.0coefficient(1)x1 斜率NaN1.0, -1.5, 1.0coefficient(2)x2 斜率NaN3.0, 12.5, -1.0r_squared()NaN1.0, 0.964029, 0.901961fitted_values()NaN28.0, 28.5, 39.0standard_deviation_of_errors()NaN0.0, 2.236068, 4.472136从中可以看到第一个完整窗口数据恰好严格线性截距 10、x1 斜率 1、x2 斜率 3因此 R²1、残差标准差为 0后续窗口数据扰动后 R² 与残差标准差相应变化系数也随之滚动更新——这正是滚动回归动态捕捉关系漂移的核心价值。六、底层原理与实现细节6.1 与静态回归的关系RollingLinearRegression是 LinearRegression 的滚动推广。两者在数据预处理pd.concat→sm.add_constant→ 非法值过滤 →align上完全一致区别在于LinearRegression使用sm.OLS(...).fit()一次性拟合方法返回标量RollingLinearRegression使用RollingOLS(y, X, w).fit()方法返回时间序列。对照测试test_linear_regressiontest_statistics.py与test_rolling_linear_regression的断言方式可以直观看出两者返回类型的差异。6.2 滚动窗口的参数存储位置类文档明确说明The parameters of each rolling window are stored at the end of each window.每个滚动窗口的参数存储在窗口末端。这意味着第t个有效输出位置对应的是以t为右端点的最近w个观测拟合出的模型输出的每个值天然携带截至该时点的最新回归结论非常契合金融研究中对最新关系状态的持续追踪需求。6.3 对齐与脏数据处理是金融时序的常见陷阱真实行情数据常出现序列长度不一致、停牌日缺失、异常值等情况。该类通过先过滤NaN/inf再取索引交集的两步处理保证进入RollingOLS的矩阵完全干净且对齐。这一点在测试用例中体现得淋漓尽致三个序列长度分别为 7、8、7加上一处NaN最终有效样本被自动规整到 6 个。七、典型应用场景结合 gs-quant 的定位面向量化金融的 Python 工具包RollingLinearRegression的典型用法包括因子暴露的动态追踪以个股收益为y以风格因子市值、价值、动量等收益为X用滚动回归估计各因子暴露随时间的变化识别风格切换配对交易与价差建模对两只相关性资产的价差或对数价格做滚动回归观察协整关系是否稳定作为开平仓信号的依据市场状态监测滚动 R² 与残差标准差可用于刻画模型解释力与波动环境的演化例如 R² 骤降可能提示关系结构性变化风险模型的滚动校准将滚动回归系数序列作为输入进一步进入 econometrics 子模块如beta、correlation或 technicals 子模块进行衍生分析。八、注意事项与局限窗口宽度选择w必须严格大于解释变量列数含截距否则直接抛MqValueError更宽泛地说w过小会导致估计噪声大过大则响应迟缓需要根据数据频率与研究目标权衡前导 NaN滚动输出的前w-1个位置恒为NaN下游计算如取均值、绘图需自行处理必须使用pd.Series输入X与y需为 pandas 序列且索引类型应一致如均为日期否则交集对齐可能产生空结果与LinearRegression的返回值差异注意区分静态版本返回标量、滚动版本返回序列避免在代码中混用依赖 statsmodels底层由statsmodels.regression.rolling.RollingOLS驱动其数值行为与 statsmodels 版本相关升级依赖时建议回归测试仓库中的 test_statistics.py 可直接作为验证基准。九、延伸阅读API 文档原始出处docs/classes/gs_quant.timeseries.statistics.RollingLinearRegression.rst类实现与完整 docstringgs_quant/timeseries/statistics.py单元测试gs_quant/test/timeseries/test_statistics.py同模块静态回归类LinearRegressiongs_quant/timeseries/statistics.pyplot_method装饰器实现gs_quant/timeseries/helper.py子模块导出入口gs_quant/timeseries/init.pyfrom .statistics import *关联的统计与计量功能滚动窗口工具定义于 gs_quant/timeseries/helper.py回归相关的beta、correlation等函数见 gs_quant/timeseries/econometrics.py【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门