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

gs-quant 时间序列日期过滤指南:深入解析 gs_quant.timeseries.algebra.filter_dates

gs-quant 时间序列日期过滤指南深入解析 gs_quant.timeseries.algebra.filter_dates【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant在量化研究中按日期裁剪时间序列例如剔除节假日、剔除历史某段异常区间、只保留特定交易日是最常见的预处理操作。gs-quant 的filter_dates函数正是为此设计它依据FilterOperator与日期或日期列表的组合逻辑从pd.Series索引中筛选/剔除对应日期的数据点未指定任何参数时则默认清除缺失值。读完本文你将掌握filter_dates的完整参数语义、六种运算符的实际效果、边界与异常行为以及它在 gs-quant 代数库gs_quant/timeseries/algebra.py中的底层实现原理能够直接在自己的回测与数据清洗流程中复用。函数定位与 API 概览filter_dates定义于 gs_quant/timeseries/algebra.py与filter_按数值过滤、add、multiply等函数同属 gs-quant 的代数algebra库并被from .algebra import *导出至 gs_quant/timeseries/init.py因此可以直接从gs_quant.timeseries导入使用from gs_quant.timeseries import filter_dates函数签名如下plot_function def filter_dates( x: pd.Series, operator: Optional[FilterOperator] None, dates: Union[list[dt.date], dt.date] None ) - pd.Series:x目标时间序列要求为索引为日期datetime.date的pd.SeriesoperatorFilterOperator枚举描述日期筛选逻辑例如FilterOperator.LESSdates单个datetime.date或datetime.date列表即要从序列中过滤的日期返回值按指定规则筛选后的时间序列pd.Series。filter_dates被 gs_quant/timeseries/helper.py 中的plot_function装饰器标记fn.plot_function True表示该函数可以被导出为 plottool 的纯函数供绘图场景调用——这从侧面说明日期过滤是分析链路中的常用基础操作。FilterOperator六种日期比较运算符过滤逻辑的核心是FilterOperator枚举定义于 gs_quant/timeseries/algebra.py枚举成员枚举值字符串语义FilterOperator.LESSless_than小于FilterOperator.GREATERgreater_than大于FilterOperator.L_EQUALSl_equals小于等于FilterOperator.G_EQUALSg_equals大于等于FilterOperator.EQUALSequals等于FilterOperator.N_EQUALSnot_equals不等于使用方式与filter_一致详见同文件 algebra.py通过枚举名.value可直接获得字符串形式例如FilterOperator.LESS.value less_than。完整行为语义过滤逻辑逐项拆解filter_dates的语义需要结合源码仔细理解——它过滤的是“比较结果为真”的日期。函数体逻辑如下if dates is None and operator is None: x x.dropna(axis0, howany) # 默认清除缺失值 elif dates is None: raise MqValueError(No date is specified for the operator) # 有运算符无日期 → 报错 elif isinstance(dates, list) and operator not in [FilterOperator.EQUALS, FilterOperator.N_EQUALS]: raise MqValueError(Operator does not work for list of dates) # 列表仅支持等于/不等于 else: if operator FilterOperator.EQUALS: dates dates if isinstance(dates, list) else [dates] x x.loc[~x.index.isin(dates)] # 剔除指定日期 elif operator FilterOperator.N_EQUALS: dates dates if isinstance(dates, list) else [dates] x x.loc[x.index.isin(dates)] # 仅保留指定日期 elif operator FilterOperator.GREATER: x x.loc[x.index dates] # 剔除日期之后的数据 elif operator FilterOperator.LESS: x x.loc[x.index dates] # 剔除日期之前的数据 elif operator FilterOperator.L_EQUALS: x x.loc[x.index dates] # 剔除日期当天及之前 elif operator FilterOperator.G_EQUALS: x x.loc[x.index dates] # 剔除日期当天及之后 else: raise MqValueError(Unexpected operator: operator)默认行为清除缺失值当operator与dates均为None时函数调用dropna(axis0, howany)清除序列中的NaN行。这是最常用的数据清洗姿势import pandas as pd import datetime as dt from gs_quant.timeseries import filter_dates s pd.Series([1.0, float(nan), 1.0, 1.0], index[dt.date(2019, 1, 1), dt.date(2019, 1, 2), dt.date(2019, 1, 3), dt.date(2019, 1, 4)]) filter_dates(s) # 2019-01-01 1.0 # 2019-01-03 1.0 # 2019-01-04 1.0注意与filter_不同filter_dates的默认行为同样适用且得到测试用例test_filter_datesgs_quant/test/timeseries/test_algebra.py的专门验证。EQUALS精确剔除指定日期传入单个日期时剔除该日期的数据点传入日期列表时一次性剔除列表中所有日期from gs_quant.timeseries import FilterOperator # 剔除 2019-01-02 filter_dates(s, FilterOperator.EQUALS, dt.date(2019, 1, 2)) # 2019-01-01 1.0 # 2019-01-03 1.0 # 2019-01-04 1.0 # 剔除 2019-01-02 与 2019-01-04 filter_dates(s, FilterOperator.EQUALS, [dt.date(2019, 1, 2), dt.date(2019, 1, 4)]) # 2019-01-01 1.0 # 2019-01-03 1.0N_EQUALS只保留指定日期“反向过滤”语义与直觉相反N_EQUALS过滤掉“不等于指定日期”的数据即只保留传入的日期单个或列表# 只保留 2019-01-02 filter_dates(s, FilterOperator.N_EQUALS, dt.date(2019, 1, 2)) # 2019-01-02 1.0 # 只保留 2019-01-02 与 2019-01-04 filter_dates(s, FilterOperator.N_EQUALS, [dt.date(2019, 1, 2), dt.date(2019, 1, 4)]) # 2019-01-02 1.0 # 2019-01-04 1.0N_EQUALS适合“只看特定几个关键日期”的场景例如只观察再平衡日或到期日的价格。GREATER / LESS / L_EQUALS / G_EQUALS按日期范围裁剪这四种运算符的过滤规则可汇总为下表同样以dt.date(2019, 1, 2)为基准序列含 2019-01-01 至 2019-01-04 四个点运算符剔除条件结果保留典型用途GREATER日期晚于基准基准日及之前剔除未来/近期数据回测防未来函数LESS日期早于基准基准日及之后截取某一时点之后的数据L_EQUALS日期早于或等于基准基准日之后剔除某日含之前的全部数据G_EQUALS日期晚于或等于基准基准日之前剔除某日含之后的全部数据示例对应测试 test_algebra.py 中的断言# 剔除 2019-01-02 之后的数据GREATER过滤“大于”基准者 filter_dates(s, FilterOperator.GREATER, dt.date(2019, 1, 2)) # 2019-01-01 1.0 # 2019-01-02 1.0 # 剔除 2019-01-03 之前的数据LESS过滤“小于”基准者 filter_dates(s, FilterOperator.LESS, dt.date(2019, 1, 3)) # 2019-01-03 1.0 # 2019-01-04 1.0 # 剔除 2019-01-02 当天及之前L_EQUALS filter_dates(s, FilterOperator.L_EQUALS, dt.date(2019, 1, 2)) # 2019-01-03 1.0 # 2019-01-04 1.0 # 剔除 2019-01-03 当天及之后G_EQUALS filter_dates(s, FilterOperator.G_EQUALS, dt.date(2019, 1, 3)) # 2019-01-01 1.0 # 2019-01-02 1.0记忆口诀运算符描述的是“被移除对象”的条件。GREATER移除“大于基准”的日期LESS移除“小于基准”的日期L_EQUALS移除“小于等于基准”的日期G_EQUALS移除“大于等于基准”的日期。这与filter_的数值过滤语义完全对称。参数限制与异常行为从源码与测试可以总结出三条硬性约束违反时抛出MqValueErrorgs_quant自定义异常见 gs_quant/errors.py提供了operator但未提供dates→MqValueError(No date is specified for the operator)运算符必须配合日期使用二者要么同时提供要么同时省略走默认 dropna 分支dates为列表且运算符不是EQUALS或N_EQUALS→MqValueError(Operator does not work for list of dates)只有“等于/不等于”支持批量日期范围类运算符GREATER/LESS 等只接受单个日期因为“大于某个日期集合”在语义上不成立传入未知运算符如0→MqValueError(Unexpected operator: operator)源码在抛出前会把非字符串运算符强制转为字符串以便报错信息可读。测试 test_algebra.py 中对应的异常断言with pytest.raises(MqValueError): algebra.filter_dates(all_pos, 0, 0) # 非法运算符 with pytest.raises(MqValueError): algebra.filter_dates(all_pos, 0) # 有运算符无日期 with pytest.raises(MqValueError): algebra.filter_dates(all_pos, FilterOperator.GREATER, [dt.date(2019, 1, 2), dt.date(2019, 1, 4)]) # 列表 范围运算符与 filter_ 的对比按值过滤 vs 按日期过滤filter_dates与同文件的 filter_ 构成一对互补工具维度filter_filter_dates过滤对象序列值Real序列索引上的日期参数名valuedates默认行为dropna清除缺失值dropna清除缺失值批量支持value为标量dates支持列表仅 EQUALS/N_EQUALS典型场景剔除 0 值、剔除异常价格剔除节假日、按日期范围截断一个典型的组合用法先用filter_清洗数值异常再用filter_dates裁剪研究区间。实战场景回测防未来函数与节假日剔除结合 gs-quant 的实际使用习惯filter_dates最常见的两个场景如下。场景一截取历史窗口防止未来数据泄漏import datetime as dt from gs_quant.timeseries import generate_series, filter_dates, FilterOperator prices generate_series(100) # 生成 100 个交易日的模拟序列 today dt.date.today() filter_dates(prices, FilterOperator.LESS, today) # 仅保留今天及之后的数据 filter_dates(prices, FilterOperator.G_EQUALS, today) # 仅保留今天之前的数据其中generate_series来自 gs_quant/timeseries/statistics.py用于快速构造测试序列也是官方文档示例docs/functions/gs_quant.timeseries.algebra.filter_dates.rst的 autofunction 文档中的演示素材。场景二剔除特定日期如停牌日、特殊事件日filter_dates(prices, FilterOperator.EQUALS, [dt.date(2024, 12, 25), dt.date(2024, 1, 1)])源码级实现要点索引匹配基于pd.Index.isinEQUALS/N_EQUALS通过x.index.isin(dates)做集合判断因此要求传入的dates与序列索引类型一致均为datetime.date否则无法命中范围比较基于布尔索引GREATER/LESS等通过x.loc[比较布尔掩码]实现未做显式排序断言建议保证序列索引单调递增plot_function装饰器filter_dates带有fn.plot_function True标记意味着它可以被导出为 plottool 纯函数在绘图工作流中直接调用而不依赖会话状态测试覆盖完整test_filter_dates覆盖了默认去空、单个/列表日期、全部六种运算符及三类异常路径是理解函数边界行为的最佳参考。小结filter_dates是 gs-quant 代数库中面向日期索引的过滤原语默认清洗缺失值EQUALS/N_EQUALS支持精确剔除或保留指定日期含批量列表GREATER/LESS/L_EQUALS/G_EQUALS用于按范围裁剪时间序列。理解其“运算符描述被移除对象条件”的语义再结合 algebra.py 的源码与 test_algebra.py 的测试用例即可在回测防未来函数、节假日剔除、区间截取等场景中准确使用避免踩中“列表仅支持等于/不等于”“运算符必须搭配日期”等边界陷阱。【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

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

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