十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

gs-quant 时序统计协方差函数 cov 全面解析:窗口机制、数学原理与实战用法

gs-quant 时序统计协方差函数 cov 全面解析:窗口机制、数学原理与实战用法 gs-quant 时序统计协方差函数 cov 全面解析窗口机制、数学原理与实战用法【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant本文围绕 Goldman Sachs 开源量化金融 Python 工具包 gs-quant 中gs_quant.timeseries.statistics.cov函数展开系统讲解其在滚动窗口下计算两条时间序列样本协方差的数学定义、窗口Window参数机制、底层实现分支与性能特性并结合仓库源码与单元测试给出可直接复制运行的实战示例。读完本文你将掌握如何用cov分析资产收益率序列之间的联动关系并能正确选择整型窗口、相对日期窗口与 ramp 参数来拟合实际业务场景。一、函数定位cov 在 gs-quant 中的角色cov定义在 gs_quant/timeseries/statistics.py 中是 gs-quant timeseries 模块“统计量”库的核心成员。该模块的模块级 docstring 明确说明其定位Stats library is for basic arithmetic and statistical operations on timeseries. These include basic algebraic operations, probability and distribution analysis. Generally not finance-specific routines.也就是说cov属于通用的时序统计工具本身不绑定任何资产类别或金融业务而是作为上层金融分析如收益率相关性、因子协方差、组合风险归因的基础构件。在函数文档的See also部分它明确与sum、mean、var互相引荐共同构成一组可组合的滚动统计原语。从装饰器来看cov带有plot_function装饰器见 gs_quant/timeseries/helper.py该装饰器会给函数打上plot_function True标记表明此函数可以被导出到 Marquee Plot Service 作为纯函数使用——这意味着它既可以在本地 Python 环境中调用也可以作为可绘制的分析函数在图表场景中消费。函数签名如下plot_function def cov(x: pd.Series, y: pd.Series, w: Union[Window, int, str] Window(None, 0)) - pd.Series:三个参数中x与y是两条需要计算协方差的时间序列w是控制计算范围的窗口参数默认Window(None, 0)即窗口大小取整条序列长度。二、数学定义无偏样本协方差根据 源码 docstringcov在给定滚动窗口上提供样本协方差的无偏估计量其公式为$$R_t \frac{1}{N-1} \sum_{it-w1}^{t} (X_i - \overline{X_t})(Y_i - \overline{Y_t})$$其中 $N$ 是每个滚动窗口内的观测数即窗口大小 $w$$\overline{X_t}$ 与 $\overline{Y_t}$ 分别是 $X$、$Y$ 两条序列在同一窗口内的样本均值$$\overline{X_t} \frac{\sum_{it-w1}^{t} X_i}{N}, \qquad \overline{Y_t} \frac{\sum_{it-w1}^{t} Y_i}{N}$$两个细节值得注意分母是 $N-1$ 而非 $N$这是样本协方差的无偏估计量Bessel 校正与 numpy/pandas 中ddof1的约定一致。源码中无论是整型窗口分支还是相对日期分支最终都委托给 pandas 的Series.rolling(...).cov()或Series.cov()二者默认均采用ddof1的无偏约定。全序列模式当未提供窗口参数时cov退化为计算两条完整序列之间的单一协方差值但返回值仍保持与x相同索引的时序结构见下文实现分析。三、窗口参数 w 的三种形态窗口参数w的类型注解为Union[Window, int, str]实际上支持四种传法。核心归一化逻辑位于 gs_quant/timeseries/helper.py 的 normalize_window其行为可归纳为下表传入形式示例归一化结果语义不传默认—Window(len(x), 0)窗口为整条序列无 ramp整数22Window(22, 22)窗口为 22 个观测ramp 亦为 22字符串1mWindow(1m 偏移, 1m 偏移)按相对日期构造滚动窗口Window对象Window(22, 10)原样使用窗口 22、ramp 103.1 Window 对象窗口 rampWindow 类 接受两个字段Window(w..., r...)wwindow滚动窗口的大小可以是整数观测数或相对日期字符串如1m、1w、1drramp窗口启动期的长度。若传入Window(22, 10)表示窗口为 22 个观测前 10 个观测作为 ramp 预热期。如果省略r构造器会默认r w见self.r w if r is None else r即 ramp 与窗口等长。ramp 的语义是计算时完整窗口照常滚动但最终输出会丢弃序列前r个观测由apply_ramp实现见 helper.py 的x[window.r:]。这用于避免窗口未“填满”时输出不可靠的早期值。需要注意_check_window的约束helper.py窗口必须大于 0ramp 必须小于序列长度且不小于 0否则抛出MqValueError。3.2 相对日期字符串窗口也支持 pandasDateOffset语义的字符串如1d、1w、1m、1y等。此时normalize_window通过_to_offset将其转换为pd.DateOffsethelper.py滚动窗口按日历时间跨度而非固定观测数截取数据——这对日历分布不均匀的金融数据节假日、停牌日尤其重要。字符串窗口同样会同时设置 window 与 ramp。3.3 整型窗口的注意点直接传整数如cov(x, y, 22)时normalize_window会将其转换为Window(22, 22)即ramp 与窗口等长输出序列将自动去掉前 22 个观测。若想保留全部窗口输出应显式使用Window(22, 0)。四、底层实现两种计算分支cov的核心实现statistics.py只有十几行但包含了两个关键分支w normalize_window(x, w) assert x.index.is_monotonic_increasing, series index is monotonic increasing if isinstance(w.w, pd.DateOffset): values [x.loc[(x.index (idx - w.w).date()) (x.index idx)].cov(y) for idx in x.index] return apply_ramp(pd.Series(values, indexx.index, dtypenp.dtype(float)), w) else: return apply_ramp(x.rolling(w.w, 0).cov(y), w)4.1 前置校验首先通过normalize_window归一化窗口参数然后断言索引单调递增否则直接抛 AssertionError——这是所有滚动统计函数的共同前置约束要求输入序列按时间正序排列最后按窗口类型分流。4.2 整型窗口向量化滚动当窗口为整数观测数时走x.rolling(w.w, 0).cov(y)分支。min_periods0表示不强制最小观测数pandas 会在窗口内样本不足时以NaN填充cov方法默认ddof1。该分支完全向量化性能最好适合高频、大量观测的序列。4.3 相对日期窗口逐点切片当窗口为pd.DateOffset时无法直接使用 pandas 原生滚动它对等间隔观测最有效因此源码采用逐时间点切片的方式对每个索引idx取出(idx - w.w, idx]左开右闭区间内的子序列调用子序列的.cov(y)计算该时点的协方差。这与 var 的 DateOffset 分支 一致var使用np.nanvar(a, ddof1)cov使用 pandas 子序列的.cov。由于每个时点都要做一次切片与计算该分支的复杂度随序列长度线性增长适合日频、周频等观测数适中的场景。无论走哪个分支结果都会经过apply_ramp应用 ramp 裁剪并包装成与x相同索引、floatdtype 的pd.Series返回。五、实战示例5.1 基础用法全序列协方差from gs_quant.timeseries import generate_series, cov from gs_quant.timeseries.econometrics import returns prices_x generate_series(100) prices_y generate_series(100) # 默认窗口整条序列 result cov(returns(prices_x), returns(prices_y)) print(result.tail())generate_series位于 statistics.py用于生成用于演示的模拟价格序列returns位于 econometrics.py默认计算简单算术收益率。将价格先转换为收益率再求协方差是金融分析的标准预处理步骤。5.2 滚动窗口22 个观测# 窗口 22 个观测ramp 亦为 22默认 roll_cov cov(returns(prices_x), returns(prices_y), 22) # 显式控制窗口 22无 ramp roll_cov_no_ramp cov(returns(prices_x), returns(prices_y), Window(22, 0))5.3 相对日期窗口按自然周滚动roll_cov_1w cov(returns(prices_x), returns(prices_y), 1w)5.4 与其他统计量组合构建滚动相关系数协方差是相关系数的分子。结合std可将滚动协方差归一化为滚动相关系数from gs_quant.timeseries.statistics import std, cov from gs_quant.timeseries import Window rx, ry returns(prices_x), returns(prices_y) w Window(22, 10) rolling_corr cov(rx, ry, w) / (std(rx, w) * std(ry, w))六、测试验证cov 的行为契约仓库在 gs_quant/test/timeseries/test_statistics.py 的 test_cov 中固化了cov的三种行为契约可作为理解函数语义的权威参考测试数据日频、含跨周末间隔dates [dt.date(2019,1,1), dt.date(2019,1,2), dt.date(2019,1,3), dt.date(2019,1,4), dt.date(2019,1,7), dt.date(2019,1,8)] x pd.Series([3.0, 2.0, 3.0, 1.0, 3.0, 6.0], indexdates) y pd.Series([3.5, 1.8, 2.9, 1.2, 3.1, 5.9], indexdates)全序列模式cov(x, y)输出[nan, 0.850000, 0.466667, 0.950000, 0.825000, 2.700000]注意首点为NaN无偏协方差在单点窗口上无定义后续每个点都是「截至该时点的累积样本协方差」。整型窗口cov(x, y, Window(2, 0))输出[nan, 0.850000, 0.549999, 1.700000, 1.900000, 4.200000]相对日期窗口cov(x, y, Window(1w, 0))输出[nan, 0.850000, 0.466667, 0.950000, 0.825000, 3.375000]该用例的窗口为 1 周5 个日历日从 2019-01-03 起窗口内始终覆盖完整 5 个观测因此与全序列模式下对应时点完全一致而最后一个时点2019-01-08窗口跨过周末覆盖了更多历史点实际含 6 个观测得到3.375000——这直观展示了相对日期窗口“按日历时间而非固定观测数”截取数据的行为。七、使用注意事项与延伸索引必须单调递增cov在计算前会断言x.index.is_monotonic_increasing乱序序列会直接报错排序可用sort_index()完成。x决定输出索引返回序列的索引与x完全一致协方差计算以x的索引为基准y需与x在时间上对齐建议二者索引完全一致。NaN 传播pandas 滚动协方差默认跳过窗口内的 NaN若希望 NaN 参与得到 NaN 结果需先对输入做插值或填充处理可参考 gs_quant/timeseries/datetime.py 的 interpolate。全序列模式的输出形态不传窗口时返回的是逐点累积协方差序列而非单一标量——每个时点 t 对应「截至 t 的全样本无偏协方差」测试中可见其值随数据累积而演进。与var的关系cov(x, x, w)在数学上等价于var(x, w)二者实现高度同构见 var 源码可用于交叉验证或需要显式协方差结构如协方差矩阵对角线的场景。cov与因子模型协方差Factor.covariance的区别本函数是纯时序统计工具计算两条用户提供序列的样本协方差而 gs_quant/markets/factor.py 的 Factor.covariance 是风险模型层面的因子协方差查询二者使用场景不同不要混淆。八、小结gs_quant.timeseries.statistics.cov是一个设计紧凑、语义明确的滚动协方差原语它以无偏样本协方差为数学内核通过Window/int/str三种窗口形态统一了“按观测数”与“按日历时间”两种滚动方式整型窗口走 pandas 向量化路径、相对日期窗口走逐点切片路径并统一经过 ramp 裁剪与索引对齐后返回。配合returns、std等函数它可以快速搭建滚动相关矩阵、风险归因或因子联动分析等量化研究工作流其全部行为契约均有 单元测试 兜底使用时可放心依赖。相关资源延伸阅读函数完整实现gs_quant/timeseries/statistics.py窗口归一化与 ramp 机制gs_quant/timeseries/helper.py收益率计算gs_quant/timeseries/econometrics.py函数 API 文档入口docs/functions/gs_quant.timeseries.statistics.cov.rst同系列统计函数var、std、mean等的文档目录docs/functions【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表