gs-quant 时间序列线性回归实战:LinearRegression 与 RollingLinearRegression 完全指南
2026/9/15 21:11:48 网站建设 项目流程

gs-quant 时间序列线性回归实战:LinearRegression 与 RollingLinearRegression 完全指南

【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant

本篇技术指南聚焦 gs-quant 的gs_quant.timeseries.statistics模块中两个核心统计建模类——LinearRegression(普通最小二乘 OLS 回归)与RollingLinearRegression(滚动窗口 OLS 回归)。它们面向金融时间序列场景,直接解决"用一条或多条解释变量序列拟合因变量、输出系数/R²/拟合值/预测值/误差标准差"的问题。读完本文,你将掌握这两个类的完整参数语义、数据预处理规则、全部方法的调用方式与返回形态,并能用仓库自带的测试与示例快速上手。

一、模块定位:timeseries.statistics 中的统计建模入口

LinearRegressionRollingLinearRegression均定义于 gs_quant/timeseries/statistics.py(分别为第 1083 行与第 1173 行),并被模块级from .statistics import *统一导出(见 gs_quant/timeseries/init.py),因此可直接通过gs_quant.timeseries.LinearRegressiongs_quant.timeseries.RollingLinearRegression导入。模块 docstring 将其定位为"用于时间序列的基础算术与统计运算,通常不涉及金融专属逻辑",回归建模正是其中承担"关系度量"职责的部分。

官方 API 文档对应页面为 docs/classes/gs_quant.timeseries.statistics.LinearRegression.rst(列出 5 个方法)与 docs/classes/gs_quant.timeseries.statistics.RollingLinearRegression.rst(列出 4 个方法),类名与方法签名均由 Sphinxautoclass直接从源码 docstring 生成。

底层实现依赖两个成熟的统计库:

  • statsmodels.api.OLS:静态 OLS 拟合;
  • statsmodels.regression.rolling.RollingOLS:滚动 OLS 拟合(导入语句见 statistics.py)。

这意味着两个类的数值内核并非 gs-quant 自研,而是对 statsmodels 回归结果的一层"金融时间序列友好"封装:自动完成数据清洗、日期对齐与结果序列化。

二、LinearRegression:静态 OLS 回归

2.1 构造参数

LinearRegression(X, y, fit_intercept=True)
参数类型默认值说明
Xpd.Serieslist[pd.Series]必填解释变量观测值。传单个 Series 表示一元回归;传 Series 列表表示多元回归,各序列按列拼接
ypd.Series必填因变量观测值
fit_interceptboolTrue是否在模型中拟合截距项

注意:fit_intercept必须是布尔值,否则抛出MqTypeError('expected a boolean value for "fit_intercept"')(见 statistics.py)。

2.2 构造时的数据预处理流程(源码级拆解)

从 statistics.py 的实现看,__init__依次完成五个步骤,理解它们对正确使用至关重要:

  1. 矩阵化X为列表时用pd.concat(X, axis=1)按列拼接;为单个 Series 时用X.to_frame()转为单列 DataFrame。
  2. 加截距列fit_intercept=True时调用sm.add_constant(df)在最前插入全 1 列。
  3. 重命名列索引:列名被重写为0, 1, 2, ...(带截距时)或1, 2, 3, ...(不带截距时),这正是后续coefficient(i)i索引编号的来源。
  4. 清洗非法值:分别过滤Xy中任一位置为NaN+inf-inf的行。
  5. 日期对齐:用df.align(y, 'inner', axis=0)仅保留两者日期/时间索引的交集。

也就是说:只要Xy的时间索引不完全一致,构造器会静默裁剪到交集;只要任一条序列存在缺失值或无穷值,对应日期行会被剔除后再回归。这保证了金融数据常见的"数据长度不一致、有空缺"场景下仍能稳定建模。

2.3 五个方法逐一说明

官方文档列出的方法(见 LinearRegression.rst)如下:

coefficient(i: int) -> float

返回第i个解释变量的估计系数。i=0对应截距(仅当fit_intercept=True时可用),i=1起依次对应第一、第二个解释变量的回归斜率。实现为self._res.params[i](statistics.py)。

r_squared() -> float

返回决定系数 R²,即模型解释的方差比例。实现为self._res.rsquared(statistics.py)。

fitted_values() -> pd.Series

返回用原始输入X回代模型得到的拟合值序列,索引与对齐后的输入一致。实现为self._res.fittedvalues(statistics.py)。

predict(X_predict) -> pd.Series

对外部新数据做预测。X_predict同样接受单个 Series 或 Series 列表,且必须与训练时解释变量的列结构一致。内部会按训练时的fit_intercept设置决定是否自动添加截距列(statistics.py)。

standard_deviation_of_errors() -> float

返回误差项(残差)的标准差,即回归的标准误差,实现为np.sqrt(self._res.mse_resid)(statistics.py)。

关于@plot_method装饰器:以上五个方法均被 helper.py 中的plot_method装饰。该装饰器为方法打上plot_method = True标记(表明可被 Marquee Plot Service 导出),并自动吞掉调用方传入的real_timeintervaltime_filter等额外关键字参数。因此这些方法在绘图/回测等统一调用框架下可以无差别地被调度。

2.4 官方示例与运行验证

类 docstring 给出的最小示例(statistics.py):

from gs_quant.timeseries import LinearRegression, generate_series x1 = generate_series(100) x2 = generate_series(100) y = generate_series(100) r = LinearRegression([x1, x2], y, True) print(r.r_squared())

其中generate_series(length, direction)(statistics.py)生成服从随机游走的价格序列:X_t = (1 + R) · X_{t-1},其中R ~ N(0, 1),共length个观测,索引为连续自然日。

仓库测试 test_statistics.py 中test_regression给出了精确数值验证:对y = 10 + x1 + 3·x2的构造数据,coefficient(0)=10.0coefficient(1)=1.0coefficient(2)=3.0r_squared()=1.0standard_deviation_of_errors()=0(完美拟合时误差为 0),并演示了用两个新日期上的x1/x2预测出 30.0 与 34.0。测试还覆盖了一个关键约束:fit_intercept=1(非布尔)会触发MqTypeError

三、RollingLinearRegression:滚动窗口 OLS 回归

3.1 构造参数

RollingLinearRegression(X, y, w, fit_intercept=True)
参数类型默认值说明
Xpd.Serieslist[pd.Series]必填解释变量观测值,语义同LinearRegression
ypd.Series必填因变量观测值
wint必填每个滚动窗口包含的观测数
fit_interceptboolTrue是否拟合截距

3.2 与静态回归的三大差异

  1. 窗口约束w必须严格大于解释变量个数(含截距列),否则抛出MqValueError('Window length must be larger than the number of explanatory variables')(statistics.py)。例如两个解释变量 + 截距共 3 列,窗口至少为 4。
  2. 参数按窗口输出:所有结果都是与时间索引对齐的pd.Series,而非标量。每个窗口的参数值记录在该窗口的最后一个时间点上,因此序列的前w-1个位置为NaN
  3. predict方法:官方文档(RollingLinearRegression.rst)仅列出coefficientfitted_valuesr_squaredstandard_deviation_of_errors四个方法,滚动回归不提供对外预测接口。

3.3 四个方法及其返回形态

coefficient(i: int) -> pd.Series:第i个系数的滚动时间序列(statistics.py)。

r_squared() -> pd.Series:每个窗口的决定系数序列(statistics.py)。

fitted_values() -> pd.Series:每个窗口末端时刻的拟合值。其实现值得注意(statistics.py):不是直接取RollingOLS的 fittedvalues,而是用"对齐后的X逐元素乘以各列滚动参数后按行求和",即(X · β)的内积形式,保证了拟合值在窗口内有效观测上的一致性。

standard_deviation_of_errors() -> pd.Series:每个窗口残差标准差的序列,np.sqrt(mse_resid)(statistics.py)。

3.4 运行示例与测试验证

docstring 示例(statistics.py):

from gs_quant.timeseries import RollingLinearRegression, generate_series x1 = generate_series(100) x2 = generate_series(100) y = generate_series(100) r = RollingLinearRegression([x1, x2], y, 22) # 22 个观测的滚动窗口 print(r.r_squared())

测试test_rolling_linear_regression(test_statistics.py)以窗口w=4、双解释变量 + 截距验证了:

  • 前 3 个时间点所有结果均为NaN(窗口未满);
  • 各窗口系数、R²、拟合值、残差标准差均与预期序列精确一致(如r_squared()序列为[NaN, NaN, NaN, 1.0, 0.964029, 0.901961]);
  • w=3(不大于列数 3)触发MqValueErrorfit_intercept=1触发MqTypeError

四、边界条件与错误处理速查

场景行为
fit_intercept非布尔MqTypeError,两个类一致
滚动窗口w <= 列数(含截距列)MqValueError
Xy索引错位自动取日期交集(inner对齐)
数据含NaN/±inf对应行剔除后再回归
X传入单个 Series自动to_frame()按一元回归处理
X传入 Series 列表按列拼接,多元回归
滚动窗口未满(前w-1期)结果为NaN

五、典型应用场景

在 gs-quant 的金融时间序列生态中,这两个类的典型用法包括:

  • 因子暴露分析:以因子收益序列为X、资产收益为y,静态回归输出全样本 beta 与 R²;滚动回归观察 beta 随时间的漂移,判断因子关系是否稳定;
  • 对冲比例估计:以对冲工具收益为解释变量估计对冲比率(coefficient(1)),并监控滚动对冲比率的时变性;
  • 基差/价差关系的分段检验:结合 Window 这类窗口工具,或rolling_apply(见 helper.py 的导入列表),可进一步与模块内其他统计函数(correlationbetawinsorize等)组合,构建完整的因子研究管线。

需要说明的是:两个类都要求输入为 pandas 序列(通常以DatetimeIndex或日期索引为索引);在真实行情场景中,X/y可直接来自 gs-quant 的行情获取函数(如各get_*_series系列接口),与本模块天然兼容。

六、小结

LinearRegressionRollingLinearRegression是 gs-quant 时间序列统计模块中对 statsmodels 回归能力的高质量封装:前者提供全样本静态回归的系数、R²、拟合值、预测与残差误差标准差;后者在固定观测数窗口上滚动拟合,输出逐时点的系数与统计量序列。二者共享严格的数据清洗与日期对齐机制、统一的MqTypeError/MqValueError校验,以及可被绘图框架调用的@plot_method接口,是金融因子研究与回归分析中开箱即用的基础工具。

【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询