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

gs-quant 时间序列分析指南:first 函数——提取序列首值并广播全期

gs-quant 时间序列分析指南first 函数——提取序列首值并广播全期【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant导读gs_quant.timeseries.analysis.first是 Goldman Sachs 开源量化工具包 gs-quant 中用于提取时间序列首个观测值、并以该常量值重建整条序列的核心分析函数。在波动率归一化、收益基准对齐、组合建仓日快照等场景中它常与last、last_value配合使用将任意时长的价格序列折叠为一个可广播的常数序列。本文以官方 API 文档 docs/functions/gs_quant.timeseries.analysis.first.rst 为骨架结合其源码实现与单元测试完整讲解该函数的数学语义、使用方式、底层原理与边界行为读完即可在 gs-quant 中直接使用并理解其行为细节。一、函数定位gs_quant.timeseries.analysis 模块中的序列首值函数first属于 gs-quant 的 timeseries 分析库。该模块在源码注释中定义为包含用于分析时间序列属性的函数库包括滞后lagging、差分differencing、自相关、协整及其他操作见 gs_quant/timeseries/analysis.py 顶部模块注释。整个模块通过 gs_quant/timeseries/init.py 中的from .analysis import *对外导出因此用户可以按以下任一方式导入from gs_quant.timeseries import first from gs_quant.timeseries.analysis import first该函数对应的 API 文档页面docs/functions/gs_quant.timeseries.analysis.first.rst是一个典型的 Sphinxautofunction指令其全部文档内容直接取自源码中first函数的 docstring并与同级函数文档如 docs/functions/gs_quant.timeseries.analysis.last.rst构成一个完整的首值/末值函数族。二、函数签名与参数说明从 gs_quant/timeseries/analysis.py 可以看到函数定义plot_function def first(x: pd.Series) - pd.Series: First value of series :param x: time series :return: time series of first value ... return pd.Series(x.iloc[0], x.index)参数与返回值的完整说明项目说明函数名first参数xpd.Series任意以日期或时间戳为索引的时间序列如价格序列、收益率序列、波动率序列返回值pd.Series与输入x完全相同的索引但每个索引位置的值均为x.iloc[0]输入序列的第一个有效位置的值装饰器plot_function标记该函数可被导出为纯函数供绘图工具链使用相关函数last取末值并广播、last_value取末值返回标量注意first的参数无需额外配置项输入输出均为pd.Series这与diff带obs滞后参数、lag带mode参数等带配置参数的函数形成对比属于最简单的无状态折叠类函数。三、数学语义把序列折叠成首值常量官方 docstring 给出的数学定义非常明确$$R_t X_0$$其中 $X_0$ 是序列的第一个值。也就是说first并不返回一个标量而是返回一条与输入序列等长的、每一时刻取值都为 $X_0$ 的常数序列 series generate_series(100) # 生成长度 100 的随机价格序列 first(series) # 返回 100 个点、每点都等于 series 首个值这里generate_series来自 gs_quant/timeseries/statistics.py它从初始水平 100 出发、按标准正态增量 $X_t (1 R)X_{t-1}$ 生成模拟价格序列是 gs-quant 文档中广泛使用的示例数据生成器。与常见直觉的区别很多开发者会以为first(series)等价于series.iloc[0]取标量。实际上它返回的是首值广播序列——标量值被填充到整个索引上。这一点在下一节的测试用例中体现得淋漓尽致。四、行为验证单元测试给出的精确预期仓库中的单元测试 gs_quant/test/timeseries/test_analysis.py 精确刻画了first的行为def test_first(): dates [ dt.date(2019, 1, 1), dt.date(2019, 1, 2), dt.date(2019, 1, 3), dt.date(2019, 1, 4), ] x pd.Series([1.0, 2.0, 3.0, 4.0], indexdates) result first(x) expected pd.Series([1.0, 1.0, 1.0, 1.0], indexdates) assert_series_equal(result, expected, objFirst)测试确认了三个关键行为索引完整保留输出序列的索引与输入完全一致2019-01-01 至 2019-01-04 四个日期全部保留值全部等于首值输入[1.0, 2.0, 3.0, 4.0]输出[1.0, 1.0, 1.0, 1.0]四个位置均为 1.0不丢弃任何观测first是整序列折叠 广播而非截取首点。五、实现原理一行代码背后的细节first的核心实现只有一行return pd.Series(x.iloc[0], x.index)其底层行为可以从几个角度拆解x.iloc[0]取首个位置值iloc基于位置索引因此无论输入索引是DatetimeIndex、普通日期对象还是自定义索引均可工作pd.Series(value, index)广播构造用单个标量值和完整索引构造新 Seriespandas 会把该标量广播到每个索引位置从而得到常数序列plot_function导出标记该装饰器定义在 gs_quant/timeseries/helper.py实现仅是为函数对象设置fn.plot_function True标识该函数应作为纯函数导出到绘图工具链plottool。因此first也可在 gs-quant 的图表/可视化流程中直接作为数据处理步骤调用。从源码结构看first与last的实现刻意保持了对仗见 gs_quant/timeseries/analysis.py但存在一个值得注意的差异函数实现对 NaN 的处理firstpd.Series(x.iloc[0], x.index)不做 NaN 清洗直接取第 0 个位置的值lastpd.Series(x.dropna().iloc[-1], x.index)先dropna()再取最后一个有效值last_valuex.dropna().iloc[-1]空序列抛MqValueError先dropna()返回标量边界情况提示由于first直接使用iloc[0]若输入序列第一个位置为NaN输出序列将整体为NaN且空序列会抛出IndexErroriloc[0]无元素可取。若需要首个非空值语义可以自行组合x.dropna()后再调用first或参考last/last_value的清洗模式。这也是与last家族在实现上的一个不对称之处使用前应根据数据质量决定是否需要预清洗。六、实战用法在量化分析中的典型组合6.1 与last配对衡量序列累计变化from gs_quant.timeseries import first, last, generate_series prices generate_series(100) # 100 个观测的模拟价格 start_level first(prices) # 全程等于首日价格的常数序列 end_level last(prices) # 全程等于末日价格的常数序列 pct_change (end_level / start_level - 1) * 100 # 序列形式呈现的累计涨跌幅6.2 建仓日基准对齐在组合归因或相对收益分析中常用建仓日价格作为基准。first(price_series)返回的常数序列天然携带与行情序列一致的日期索引可直接参与减法、除法等逐点运算from gs_quant.timeseries import first # benchmark 与 portfolio_prices 索引一致 excess_flat portfolio_prices / first(portfolio_prices) - first(benchmark) / first(benchmark)6.3 在绘图/分析管线中作为纯函数由于plot_function的标记见 gs_quant/timeseries/helper.pyfirst可以像其他 timeseries 函数一样被嵌入 gs-quant 的分析与绘图管线对原始序列做参考水平归一化后绘图直观展示序列相对起点水平的走势。6.4 与波动率/收益归一化结合把first的输出作为除数可以得到以首值为 1.0 的归一化序列便于在同一张图上比较价格量级差异巨大的多只资产from gs_quant.timeseries import first normalized asset_close / first(asset_close) # 每只资产从 1.0 出发七、易混淆函数辨析在 gs-quant 的 timeseries 模块中围绕端点值有三个容易混淆的函数其 API 文档页分别位于 docs/functions/gs_quant.timeseries.analysis.first.rst、docs/functions/gs_quant.timeseries.analysis.last.rst 与 docs/functions/gs_quant.timeseries.analysis.last_value.rst函数返回值类型语义空序列行为first(x)pd.Series全期等于 $X_0$ 的常数序列IndexErrorlast(x)pd.Series全期等于最后一个非空值 $X_T$ 的常数序列返回空结果last_value(x)标量int/float直接返回最后一个非空值抛MqValueError(cannot get last value of an empty series)其中last_value对空序列会抛出MqValueError见 gs_quant/timeseries/analysis.py且其测试用例gs_quant/test/timeseries/test_analysis.py明确覆盖了空序列与含 NaN 序列两种场景。选用时需要序列输出选first/last需要标量输出选last_value需要容 NaN 请对first的输入先做dropna()。八、使用前提与限制适用环境本指南基于当前仓库 gs-quant 中的实现Apache License 2.0函数依赖 pandasSeries需要以pd.Series传入numpy数组或list不在签名支持范围内索引要求函数对索引类型无强约束iloc按位置取数但 gs-quant 的时间序列惯例是日期索引测试中使用了原生dt.date对象索引也完全支持NaN 语义first不清理 NaN首位置为空时整体为 NaN这是与last系列最关键的差异务必在实际数据中确认首观测有效空序列空 Series 会因iloc[0]越界而报错调用前建议做x.empty判断。小结gs_quant.timeseries.analysis.first以一行实现完成了首值提取 全期广播两个动作是 gs-quant 时间序列分析工具箱中最基础也最常用的端点函数之一。理解它返回序列而非标量的语义、与last/last_value在 NaN 处理上的不对称性以及在单元测试 gs_quant/test/timeseries/test_analysis.py 中固化的精确行为即可在归一化、基准对齐、累计变化度量等场景中放心使用并与diff、lag、count等模块内其他分析函数自由组合。【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

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

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