资讯动态

gs_quant 时序代数库 weighted_sum:加权和/加权均值计算的实现原理与实战指南

发布时间:2026/9/15 12:58:24 来源:尧图企业网站定制
gs_quant 时序代数库 weighted_sum加权和/加权均值计算的实现原理与实战指南【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant导读weighted_sum是 gs_quant 时间序列代数模块gs_quant.timeseries.algebra中用于计算多条时间序列加权和的函数。在量化研究中它最常见的应用场景是构造篮子Basket——将若干条资产价格或收益序列按权重合成一条组合序列。本文基于仓库中的官方 API 文档docs/functions/gs_quant.timeseries.algebra.weighted_sum.rst与其源码实现展开读者读完将掌握weighted_sum的签名、归一化权重语义、日历对齐与重索引机制、异常校验规则以及它和basket_series、generate_series等相关函数的分工与配合方式。函数签名与参数说明weighted_sum定义于 gs_quant/timeseries/algebra.py其完整签名如下plot_function def weighted_sum(series: list[pd.Series], weights: list) - pd.Series:参数类型说明serieslist[pd.Series]输入的多条时间序列每条均为 pandasSeries索引为日期weightslist与series一一对应的权重列表元素必须为float或int返回值pd.Series加权求和后得到的组合时间序列文档 docstring 中亦称为 weighted average函数使用plot_function装饰器修饰该装饰器定义于 gs_quant/timeseries/helper.py这意味着它不仅能以 Python 函数方式调用还可被 Chart Service 等上层服务暴露为可绘图/可调度的公开时序函数——algebra.py文件头部注释明确说明Chart Service will attempt to make public functions (not prefixed with _) from this module available。关键语义归一化的加权均值从源码第 820 行的核心计算逻辑可以确认weighted_sum实际计算的是归一化权重下的加权均值而非简单的加权和return sum(series[i] * weights[i] for i in range(len(series))) / sum(weights)即先对每条序列逐元素乘以其权重并累加再除以所有权重之和。因此当权重为[0.7, 0.3]时等效于按 70% / 30% 的比例合成组合序列当权重为[1, 1]时等效于两条序列的算术平均权重本身无需归一化为和为 1函数内部会统一做归一化处理这给权重表达如百分比、小数、任意比例整数带来便利。源码实现原理深度解析weighted_sum的实现gs_quant/timeseries/algebra.py可拆解为三个核心步骤1. 输入校验类型与数量强约束if not all(isinstance(x, pd.Series) for x in series): raise MqTypeError(expected a list of time series) if not all(isinstance(y, (float, int)) for y in weights): raise MqTypeError(expected a list of number for weights) if len(weights) ! len(series): raise MqValueError(must have one weight for each time series)series中每个元素必须是pd.Series否则抛出MqTypeErrorweights中每个元素必须是float或int字符串等非法类型会被拒绝否则抛出MqTypeError权重个数必须与序列个数严格相等one weight for each time series否则抛出MqValueError。测试用例 gs_quant/test/timeseries/test_algebra.py 恰好覆盖了这三种异常路径传入非 Series 元素如3、传入字符串权重如.6、权重数量不匹配如仅传[0.4]均会触发MqError。2. 日历交集对齐仅保留共同交易日cal pd.DatetimeIndex( reduce( np.intersect1d, (curve.index for curve in series), ) )weighted_sum采用**日历交集calendar intersection**策略使用functools.reduce与np.intersect1d逐条求取所有输入序列日期索引的交集得到各序列共同存在的交易日集合cal。这意味着输出序列只覆盖所有输入序列都“有数”的日期任何一条序列缺失数据的日期都会被剔除天然规避了 NaN 传播问题。3. 重索引与加权累加series [s.reindex(cal) for s in series] weights [pd.Series(w, indexcal) for w in weights] return sum(series[i] * weights[i] for i in range(len(series))) / sum(weights)将每条序列重索引到交集日历cal上同时把标量权重广播为与cal同索引的常量 Series随后逐元素相乘累加并除以权重总和。由于输入序列已对齐且权重为常量此步不引入插值属于纯向量化计算。测试用例验证gs_quant/test/timeseries/test_algebra.py 给出了可复现的数值验证对两条长度不同的序列a pd.Series([1, 2, 3, 4], indexpd.date_range(2020-01-01, periods4, freqD)) b pd.Series([24, 27, 30], indexpd.date_range(2020-01-01, periods3, freqD)) actual weighted_sum([a, b], [0.3, 0.6])由于两序列日期交集仅为前三天2020-01-01 至 2020-01-03结果为[16.333333, 18.666666, 21]。以 2020-01-01 为例(1×0.3 24×0.6) / (0.30.6) (0.314.4)/0.9 16.33与预期一致。该用例同时直观展示了日历交集 归一化加权两大核心语义。官方文档示例构造 70/30 篮子weighted_sum的 docstring即 weighted_sum.rst 所渲染的 autofunction 内容给出了构造篮子的最小示例from gs_quant.timeseries.algebra import weighted_sum from gs_quant.timeseries.statistics import generate_series # 生成两条 100 个观测值的随机价格序列 prices1 generate_series(100) prices2 generate_series(100) # 按 70%/30% 权重合成篮子 mybasket weighted_sum([prices1, prices2], [0.7, 0.3])其中generate_seriesgs_quant/timeseries/statistics.py按随机游走模型X_t (1 R)·X_{t-1}R 为标准正态随机变量生成日期索引的模拟价格序列length控制观测数量direction可设为START_TODAY默认或END_TODAY控制序列是始于今天还是止于今天。上述示例适合快速验证weighted_sum的行为也可替换为真实行情序列如get_series拉取的资产价格数据直接用于实战。与 basket_series 的分工对比docstring 的See also部分将weighted_sum与basket关联。仓库中实际对应的是回测模块的basket_seriesgs_quant/timeseries/backtesting.py两者定位不同维度weighted_sumbasket_series输入价格/收益序列任意数值序列价格序列return_type目前仅支持超额收益计算单步加权平均无再平衡概念按rebal_freq日/周/月定期再平衡内部调用backtest_basket成本不涉及交易成本支持costs参数传入执行成本如 5bps输出组合数值序列组合收益序列默认ExcessReturn因此若只需对一组序列做一次性静态合成应选weighted_sum若需模拟含再平衡频率与交易成本的回测组合则用basket_series。使用建议与注意事项日期对齐是隐式的weighted_sum自动取各序列日期的交集因此无需预先手动对齐。但这也意味着若某条序列在关键日期缺数该日期会整体从结果中消失请确认这是否符合研究预期。权重无需归一化传入[0.7, 0.3]与[7, 3]计算结果等价便于直接使用百分比或目标权重。类型约束严格series必须为pd.Series列表、weights必须为数值列表且两者长度必须一致否则分别抛出MqTypeError/MqValueError。结合代数模块其他函数使用weighted_sum位于 gs_quant/timeseries/algebra.py 的代数函数族中可与add、multiply、returns等组合构建更复杂的合成指标如先对各资产取收益率再做加权模块中所有公开函数均遵循完整 docstring 类型注解的规范便于在 Chart Service 等场景中被自动识别与调度。参考文件索引官方 API 文档docs/functions/gs_quant.timeseries.algebra.weighted_sum.rst核心实现gs_quant/timeseries/algebra.py单元测试gs_quant/test/timeseries/test_algebra.py相关函数generate_seriesgs_quant/timeseries/statistics.py、basket_seriesgs_quant/timeseries/backtesting.py【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价