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 中的统计建模入口
LinearRegression与RollingLinearRegression均定义于 gs_quant/timeseries/statistics.py(分别为第 1083 行与第 1173 行),并被模块级from .statistics import *统一导出(见 gs_quant/timeseries/init.py),因此可直接通过gs_quant.timeseries.LinearRegression或gs_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)| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
X | pd.Series或list[pd.Series] | 必填 | 解释变量观测值。传单个 Series 表示一元回归;传 Series 列表表示多元回归,各序列按列拼接 |
y | pd.Series | 必填 | 因变量观测值 |
fit_intercept | bool | True | 是否在模型中拟合截距项 |
注意:fit_intercept必须是布尔值,否则抛出MqTypeError('expected a boolean value for "fit_intercept"')(见 statistics.py)。
2.2 构造时的数据预处理流程(源码级拆解)
从 statistics.py 的实现看,__init__依次完成五个步骤,理解它们对正确使用至关重要:
- 矩阵化:
X为列表时用pd.concat(X, axis=1)按列拼接;为单个 Series 时用X.to_frame()转为单列 DataFrame。 - 加截距列:
fit_intercept=True时调用sm.add_constant(df)在最前插入全 1 列。 - 重命名列索引:列名被重写为
0, 1, 2, ...(带截距时)或1, 2, 3, ...(不带截距时),这正是后续coefficient(i)中i索引编号的来源。 - 清洗非法值:分别过滤
X与y中任一位置为NaN、+inf、-inf的行。 - 日期对齐:用
df.align(y, 'inner', axis=0)仅保留两者日期/时间索引的交集。
也就是说:只要X与y的时间索引不完全一致,构造器会静默裁剪到交集;只要任一条序列存在缺失值或无穷值,对应日期行会被剔除后再回归。这保证了金融数据常见的"数据长度不一致、有空缺"场景下仍能稳定建模。
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_time、interval、time_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.0、coefficient(1)=1.0、coefficient(2)=3.0,r_squared()=1.0,standard_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)| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
X | pd.Series或list[pd.Series] | 必填 | 解释变量观测值,语义同LinearRegression |
y | pd.Series | 必填 | 因变量观测值 |
w | int | 必填 | 每个滚动窗口包含的观测数 |
fit_intercept | bool | True | 是否拟合截距 |
3.2 与静态回归的三大差异
- 窗口约束:
w必须严格大于解释变量个数(含截距列),否则抛出MqValueError('Window length must be larger than the number of explanatory variables')(statistics.py)。例如两个解释变量 + 截距共 3 列,窗口至少为 4。 - 参数按窗口输出:所有结果都是与时间索引对齐的
pd.Series,而非标量。每个窗口的参数值记录在该窗口的最后一个时间点上,因此序列的前w-1个位置为NaN。 - 无
predict方法:官方文档(RollingLinearRegression.rst)仅列出coefficient、fitted_values、r_squared、standard_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)触发MqValueError,fit_intercept=1触发MqTypeError。
四、边界条件与错误处理速查
| 场景 | 行为 |
|---|---|
fit_intercept非布尔 | MqTypeError,两个类一致 |
滚动窗口w <= 列数(含截距列) | MqValueError |
X与y索引错位 | 自动取日期交集(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 的导入列表),可进一步与模块内其他统计函数(correlation、beta、winsorize等)组合,构建完整的因子研究管线。
需要说明的是:两个类都要求输入为 pandas 序列(通常以DatetimeIndex或日期索引为索引);在真实行情场景中,X/y可直接来自 gs-quant 的行情获取函数(如各get_*_series系列接口),与本模块天然兼容。
六、小结
LinearRegression与RollingLinearRegression是 gs-quant 时间序列统计模块中对 statsmodels 回归能力的高质量封装:前者提供全样本静态回归的系数、R²、拟合值、预测与残差误差标准差;后者在固定观测数窗口上滚动拟合,输出逐时点的系数与统计量序列。二者共享严格的数据清洗与日期对齐机制、统一的MqTypeError/MqValueError校验,以及可被绘图框架调用的@plot_method接口,是金融因子研究与回归分析中开箱即用的基础工具。
【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考