
gs-quant 工作日统计函数business_day_count完全指南精确计算两个日期之间的营业日数量【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quantbusiness_day_count是 Goldman Sachs 开源量化工具包 gs-quant 中gs_quant.datetime.date模块的核心日期工具之一用于统计两个日期或两组日期之间的营业日business day数量是金融领域计算工作日、交易日与计息周期的基石函数。本文将结合仓库源码gs_quant/datetime/date.py与测试用例完整解析其参数语义、日历体系、向量化能力与真实应用场景帮助你直接在量化研究与策略开发中落地使用。函数签名与返回值语义business_day_count的定义如下def business_day_count( begin_dates: DateOrDates, end_dates: DateOrDates, calendars: Union[str, tuple[str, ...]] (), week_mask: Optional[str] None, ) - Union[int, tuple[int, ...]]:其中DateOrDates Union[dt.date, Iterable[dt.date]]gs_quant/datetime/date.py。参数类型默认值说明begin_datesdt.date或日期可迭代对象必填起始日期可批量传入end_datesdt.date或日期可迭代对象必填结束日期可批量传入calendarsstr或tuple[str, ...]()用于确定节假日的工作日历见下文日历体系week_maskOptional[str]None自定义周末分布默认以周六、周日为周末返回值传入单个日期时返回int营业日数量传入日期集合时返回tuple[int, ...]每个元素对应一对日期的营业日数量顺序与输入一致。核心语义结束日期是排他性的该函数底层直接封装numpy.busday_countgs_quant/datetime/date.py因此继承 NumPy 的边界语义end_dates当天不计入结果统计的是区间[begin, end)内的营业日数量起始日期自身若为营业日则计入。例如business_day_count(dt.date(2024, 1, 1), dt.date(2024, 1, 8))统计的是 1 月 1 日含到 1 月 8 日不含之间按日历过滤后的工作日数。这一点在计算距到期日还有多少个交易日过去 N 个交易日的波动率等场景中需要特别注意避免重复加一天或少算一天。开箱即用的最小示例官方文档给出的典型用法docs/functions/gs_quant.datetime.date.business_day_count.rst为import datetime as dt today dt.date.today() bus_days business_day_count(today, today dt.timedelta(days7))更完整的示例import datetime as dt from gs_quant.datetime import business_day_count # 单日期对计算 7 个自然日跨度内的营业日数 business_day_count(dt.date(2024, 1, 1), dt.date(2024, 1, 8)) # 例如输出: 5 若 1/1 为周一且无节假日 # 指定交易所日历如纽约证券交易所 business_day_count(dt.date(2019, 7, 1), dt.date(2019, 7, 8), calendarsNYSE) # 向量化同时计算多组日期对 begin (dt.date(2024, 1, 1), dt.date(2024, 2, 1)) end (dt.date(2024, 2, 1), dt.date(2024, 3, 1)) business_day_count(begin, end) # 返回 tuple[int, ...]注意gs_quant.datetime包通过from .date import *导出了该函数gs_quant/datetime/init.py因此可以直接from gs_quant.datetime import business_day_count。日历体系calendars参数与GsCalendarbusiness_day_count的日历逻辑完全委托给 GsCalendarcalendar GsCalendar.get(calendars) res np.busday_count(begin_dates, end_dates, busdaycalcalendar.business_day_calendar(week_mask))calendars 支持的取值类型calendars参数可接受字符串如NYSE纽约证券交易所、LSE、TSE等交易所标识字符串元组如(NYSE, LSE)表示同时考虑多个交易所的节假日PricingLocation枚举如PricingLocation.NYC、PricingLocation.LDN、PricingLocation.HKG、PricingLocation.TKOgs_quant/common.py 中定义Currency枚举如Currency.USD、Currency.GBP按货币关联的节假日历空元组()默认不叠加任何节假日只按week_mask过滤周末。从源码看GsCalendar构造函数会把字符串/枚举统一包装为元组gs_quant/datetime/gscalendar.py并在holidays属性中把输入拆分为货币与交易所两组分别从两个数据集拉取节假日gs_quant/datetime/gscalendar.py交易所节假日来自Dataset.GS.HOLIDAY按exchange字段查询货币节假日来自Dataset.GS.HOLIDAY_CURRENCY按currency字段查询两组合并去重后作为 NumPybusdaycalendar的holidays传入。这意味着一旦你指定了真实交易所或货币business_day_count统计的就是同时剔除周末与官方节假日的真实交易日数量而不是简单剔除周六日。日期范围限制与缓存GsCalendar对节假日数据有明确的时间边界gs_quant/datetime/gscalendar.pyDATE_LOW_LIMIT dt.date(1952, 1, 1) DATE_HIGH_LIMIT dt.date(2052, 12, 31)即节假日查询覆盖 1952-01-01 至 2052-12-31超出该范围的日期无法获得完整的节假日数据。另外节假日结果缓存在 TTL 缓存中maxsize128, ttl600即 10 分钟过期gs_quant/datetime/gscalendar.py重复计算相同日历参数时不会反复请求数据集。说明若在未配置GsSession的环境中使用指定日历如NYSE底层依赖数据集服务默认参数calendars()的纯周末统计则完全本地化无需联网。自定义周末week_mask参数week_mask用长度为 7 的字符串定义一周中哪些天是工作日位置对应周一至周日1表示工作日、0表示休息日。默认值为1111100周一至周五工作周六、周日休息定义于GsCalendar.DEFAULT_WEEK_MASKgs_quant/datetime/gscalendar.py。常见定制# 周日至周四工作中东市场风格 business_day_count(d1, d2, week_mask0111110) # 仅周一至周五但把周三视为休息日极端演示 business_day_count(d1, d2, week_mask1101101)向量化批量计算begin_dates与end_dates均支持可迭代对象底层一次性交给np.busday_count批量求值返回tuple。这在以下场景极为高效# 批量计算一组估值日到各自到期日的剩余交易日 valuation_dates (dt.date(2024, 3, 1), dt.date(2024, 3, 4), dt.date(2024, 3, 5)) maturity_dates (dt.date(2024, 6, 1), dt.date(2024, 6, 1), dt.date(2024, 6, 1)) remaining_days business_day_count(valuation_dates, maturity_dates)批量调用时要求两个集合长度一致、按位置一一对应。返回值始终是tuple即使只有一个元素便于后续与 pandas Series 或列表对齐。仓库内的真实应用波动率年化换算仓库内容目录中的 inflation_covid19_recovery_trade.ipynb 展示了business_day_count的一个典型实战用法——把区间波动率按交易日数量换算成年化波动率from gs_quant.datetime import business_day_offset, business_day_count vol_3m infla_vol.iloc[-1] * np.sqrt(business_day_count(back_3m, today))这里business_day_count(back_3m, today)计算出回溯区间内的实际营业日数量作为波动率年化sqrt(N)缩放的指数。这类用工作日而非自然日做时间度量的做法正是该函数在量化研究中最常见的用途——波动率、收益率、周转率等指标的年化分母都应当使用交易日历。与兄弟函数配合使用business_day_count属于gs_quant.datetime.date模块中完整的工作日工具族docs/datetime.rst四者组合可覆盖绝大多数日期运算is_business_day判断某日期是否为营业日同样支持calendars与week_maskbusiness_day_offset对日期施加营业日偏移并滚动到最近营业日roll支持raise/forward/preceding等常与business_day_count配套使用——先定位日期再统计天数prev_business_date返回给定日期默认今天的前一个营业日date_range按营业日步长生成日期序列。一个完整的工作流示例import datetime as dt from gs_quant.datetime import business_day_count, business_day_offset # 找到今天之前的第 5 个营业日再统计这两个点之间的营业日数即 5 start business_day_offset(dt.date.today(), -5, rollpreceding) n business_day_count(start, dt.date.today())边界条件、注意事项与测试验证排他性边界再次强调end_dates当天不计入统计。这是 NumPybusday_count的既定语义也是最容易踩的坑。若你需要包含结束日当天的闭区间计数请自行1或把结束日期顺延一天。输入校验begin_dates与end_dates必须都是日期或日期集合且长度匹配calendars传入不存在的日历标识时GsCalendar.holidays_from_dataset会通过数据集覆盖范围coverage做校验gs_quant/datetime/gscalendar.py当前版本默认skip_valid_checkTrue仅记录Ignoring invalid calendar ...警告未来版本将抛ValueError。因此生产环境应确保日历标识真实有效。测试佐证仓库测试目录中gs_quant/test/datetime_/test_gscalendar.py通过 mock 数据集验证了GsCalendar对单一日历PricingLocation.NYC与元组日历(NYC, LDN)的节假日加载行为并展示了节假日数据来源Dataset.get_data的调用方式同目录 test_date.py 则覆盖了日期模块的其余功能。这些测试可作为你理解日历数据流和自行验证行为的参考。适用前提与限制小结适用版本与运行环境以当前仓库代码为准函数依赖 NumPy 与gs_quant包内模块导入前需确保依赖可用日历数据依赖使用calendars指定真实交易所/货币时依赖数据集服务与GsSession配置仅做周末过滤时默认参数无需网络时间范围节假日数据覆盖 1952-01-01 至 2052-12-31超出范围的日期无法获得完整节假日信息缓存机制节假日结果 10 分钟 TTL 缓存调用GsCalendar.reset()可主动清空gs_quant/datetime/gscalendar.py。掌握business_day_count的边界语义、日历参数与向量化特性即可在 gs-quant 中精准度量交易区间、完成波动率年化、计算剩余交易日等高频量化任务结合business_day_offset、is_business_day等兄弟函数可以构建完整、可靠的交易日历运算体系。【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考