gs-quant HistoricalPricingContext 实战指南:多日期历史估值与风险计算 gs-quant HistoricalPricingContext 实战指南多日期历史估值与风险计算【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant本指南以 gs-quant 仓库中 HistoricalPricingContext 类文档 为核心系统讲解如何在一次上下文中对同一金融工具批量计算多个历史日期的估值与风险度量。读完本文你将掌握HistoricalPricingContext的完整参数语义、start/end/dates三种日期构造方式、同步与异步执行模式以及其派生类BackToTheFuturePricingContext的前瞻估值能力并能在真实交易分析、回测与研报复盘中直接落地使用。一、什么是 HistoricalPricingContext在 gs-quant 中PricingContextgs_quant/markets/core.py负责控制定价与市场数据行为定价日期、市场数据来源地NYC/LDN/HKG、异步或批处理模式、缓存策略等。而HistoricalPricingContext是它的一个直接子类定位非常明确——“A context for producing valuations over multiple dates”用于在多个日期上产生估值的上下文源码位于 gs_quant/markets/historical.py。它的核心价值在于传统PricingContext只针对单一pricing_date计算而历史分析如回测收益、历史波动率归因、逐日 delta 对冲需要同一笔交易在几十甚至上百个历史日期上逐一估值。HistoricalPricingContext把“构造日期序列 → 逐日构建风险请求 → 汇总成一条结果序列”封装成一个可复用的with上下文。从继承关系看它调用了父类构造器并强制设置use_historical_diddles_onlyTrue仅使用历史市场数据点并将自己构造出的日期序列保存在内部属性__date_range中historical.py。二、构造参数详解日期、执行模式与数据来源HistoricalPricingContext.__init__的完整签名如下见 historical.pyHistoricalPricingContext( startNone, # 起始日期或“end 之前的业务日数量”int endNone, # 结束日期默认为今天 calendars(), # 节假日日历 datesNone, # 自定义日期可迭代对象 is_asyncNone, # True 立即返回 futureFalse 阻塞等待默认 False is_batchNone, # 预计运行超过 3 分钟时使用避免超时 use_cacheNone, # 是否把结果存入定价缓存默认 False visible_to_gsNone, # 风险请求内容是否对 GS 可见默认 False request_priorityNone, # 风险请求的优先级 csa_termNone, # 计算所用的 CSA 条款默认本地货币 OIS 指数 market_data_locationNone, # 市场数据来源地NYC、LDN 或 HKG默认 LDN timeoutNone, # 批处理操作超时时间 show_progressNone, # 是否显示 tqdm 进度条 use_server_cacheNone, # 是否在 GS 服务器端缓存查询结果 providerNone, # 用于定价请求的 GenericRiskApi 实现 )1. 日期参数的三种用法start/end/dates源码中日期解析逻辑位于 historical.py规则如下提供start且不提供dates与end配合生成日期序列。若end缺省则默认为今天start可以是datetime.date也可以是int此时表示“end之前 N 个业务日”。序列通过gs_quant.datetime.date.date_range(start, end, calendarscalendars)生成date_range 实现自动排除节假日。提供dates且不提供start直接使用你给定的任意日期可迭代对象适合回测引擎传入自定义状态日期如 generic_engine.py 中with HistoricalPricingContext(datesp.dates)的用法。同时提供start与dates抛出ValueError(Must supply start or dates, not both)。两者都不提供抛出ValueError(Must supply start or dates)。2. 执行模式与性能相关参数参数默认值作用is_asyncFalseTrue 时立即返回 future适合并行提交大量任务is_batchFalse用于预计运行超过 3 分钟的计算避免请求超时可与is_async任意组合use_cacheFalse将结果写入本地定价缓存PricingCache弱引用字典见 core.py相同 RiskKey 的重复计算直接命中缓存use_server_cacheFalse在 GS 服务器端缓存查询结果timeout无批处理操作的超时秒数show_progressFalse显示 tqdm 进度条request_priority无风险请求优先级3. 市场与数据相关参数market_data_location市场数据来源地可选NYC、LDN、HKG默认LDN。该值同时决定了收盘市场日期的计算见CloseMarket的roll_hr_and_min与close_market_datemarkets.py。csa_term计算所用 CSA信用支持附件条款默认取本地货币 OIS 指数。visible_to_gs风险请求内容是否对 GS 可见默认False。providerGenericRiskApi实现默认使用instrument.provider见 historical.py。父类PricingContext还支持marketMarket对象、market_behaviour曲线构建行为ContraintsBased或Calibrated默认前者、set_parameters_only等参数core.py这些同样可以被HistoricalPricingContext继承使用。注意父类会在pricing_date超过今天 5 天以上时抛出ValueError提示改用RollFwd场景来处理未来日期core.py。三、快速上手历史价格序列计算以官方文档示例为基础计算一只 DKK 利率互换在过去 10 个业务日的价格序列from gs_quant.instrument import IRSwap from gs_quant.markets import HistoricalPricingContext ir_swap IRSwap(Pay, 10y, DKK) with HistoricalPricingContext(10): # 10 截至今天的 10 个业务日 price_f ir_swap.price() # 在每个历史日期上提交价格计算 price_series price_f.result() # 阻塞等待返回序列结果更一般地可同时计算多个风险度量。例如计算过去 150 个业务日的价格对应官方教程 06_calc_swap_price_historically.ipynb 中的用法import datetime as dt from gs_quant.markets import HistoricalPricingContext with HistoricalPricingContext(150): # 150 个业务日 price_f swap.price() price_history price_f.result() # 一条覆盖 150 个日期的序列也支持显式日期区间与自定义日期列表with HistoricalPricingContext(dt.date(2025, 3, 25), dt.date(2025, 3, 27)): price_f swap.price() with HistoricalPricingContext(dates[dt.date(2025, 3, 25), dt.date(2025, 3, 26), dt.date(2025, 3, 27)]): price_f swap.price()在长区间上推荐开启进度条与批处理with HistoricalPricingContext(startstart_date, endend_date, is_batchTrue, csa_termEUR-OIS): price_f swap.price()其中is_batchTrue配合自定义csa_term正是仓库内容示例 inflation_covid19_recovery_trade.ipynb 中的真实用法。四、逐日估值的工作机制从日期到 RiskKey理解HistoricalPricingContext的关键在于其calc实现historical.pydef calc(self, instrument, risk_measure): futures [] provider instrument.provider if self.provider is None else self.provider scenario self._scenario parameters self._parameters location self.market.location for date in self.__date_range: risk_key RiskKey(provider, date, self._market(date, location), parameters, scenario, risk_measure) futures.append(self._calc(instrument, risk_key)) return HistoricalPricingFuture(futures)工作流程可以概括为四步确定 provider未显式指定provider时使用instrument.provider逐日构造RiskKey每个历史日期对应一个RiskKey(provider, date, market, parameters, scenario, risk_measure)其中市场对象由_market(date, location)生成——即带日期的CloseMarkethistorical.py确保每个日期取用当日收盘市场数据批量提交计算通过self._calc(instrument, risk_key)将每个日期的风险请求提交到活动上下文父类_calc实现见 core.py会先查询PricingCache缓存命中则直接返回结果避免重复计算返回聚合 future所有单日 future 被打包进HistoricalPricingFuture。结果聚合HistoricalPricingFutureHistoricalPricingFuture定义于 gs_quant/risk/results.py它在_set_result中取出每个单日结果剔除ErrorValue/异常后将多个日期的结果组合compose成一条序列结果若全部日期均失败则记录错误日志并把首个错误结果返回。因此price_f.result()拿到的是一个覆盖全部日期的复合结果FloatWithInfo/DataFrameWithInfo等而不是单个数值。在回测引擎中的实际应用HistoricalPricingContext是 gs-quant 回测框架的核心基础设施之一。在 generic_engine.py 中回测引擎针对每个交易路径的日期状态直接构造HistoricalPricingContext(dates...)来批量计算组合风险with HistoricalPricingContext(datesp.dates): backtest.calculations len(risks) * len(p.dates) port p.trade if isinstance(p.trade, Portfolio) else Portfolio([p.trade]) p.results port.calc(tuple(risks))同样地generic_engine_action_impls.py 中也会用HistoricalPricingContext(datesstates, csa_term...)来推进路径依赖计算。这说明凡需要“同一批工具在一串日期上逐日估值”的场景都可以直接用该上下文完成。五、进阶BackToTheFuturePricingContext 与前瞻估值BackToTheFuturePricingContext是HistoricalPricingContext的直接子类historical.py在历史估值之上叠加了面向未来日期的估值能力适用于“今天模拟未来某天交易会如何定价”这类前瞻分析。新增参数 roll_to_fwdsroll_to_fwdsTrue默认对晚于pricing_date的未来日期假设远期曲线实现fwd curve is realised即市场沿着远期曲线演化roll_to_fwdsFalse假设即期利率实现spot rates are realised。其calc逻辑historical.py对日期序列做了分支处理过去或当前日期date pricing_date与HistoricalPricingContext一致使用该日期的CloseMarket和基础场景未来日期date pricing_date构造MarketDataScenario(RollFwd(datedate, realise_fwdself._roll_to_fwds, nameself.name))RollFwd定义见 target/common.py复用当前市场对象将定价日期滚动到未来。官方示例假设今天在 2020-07-06 与 2020-07-14 之间import datetime as dt from gs_quant.instrument import IRSwap from gs_quant.markets import BackToTheFuturePricingContext ir_swap IRSwap(Pay, 10y, DKK) with BackToTheFuturePricingContext(dt.date(2020, 7, 6), dt.date(2020, 7, 14), roll_to_fwdsTrue): price_f ir_swap.price() price_series price_f.result()它在仓库中的真实用途可见于内容示例 00_us_election_analysis/0003_trades.ipynbwith BackToTheFuturePricingContext(datesdates, roll_to_fwdsTrue)以及 11-FX Election Hedge.ipynb 中对“BackToTheFuturePricingContextHistoricalPricingContextRollFwd”的说明。六、常用属性速查HistoricalPricingContext继承自PricingContext以下属性均可直接访问属性含义date_range本上下文覆盖的日期元组自定义实现见 historical.pypricing_date定价日期默认按market_data_location的今日业务日core.pymarket当前市场对象默认按定价日期与市场位置构建CloseMarketcore.pymarket_data_location市场数据来源地默认LDNcore.pyis_async/is_batch异步模式 / 批处理模式use_cache是否使用定价缓存默认 Falseuse_server_cache是否使用服务器端缓存visible_to_gs请求内容是否对 GS 可见csa_term计算所用 CSA 条款request_priority风险请求优先级timeout批处理超时show_progress是否显示进度条use_historical_diddles_only是否仅使用历史市场数据点本类构造时强制为 Trueset_parameters_only置 True 时不阻止内嵌定价上下文提交任务active_context/is_current/is_entered上下文生命周期状态当前活动上下文、是否当前、是否已进入clone/default_value克隆上下文 / 默认值来自ContextBaseWithDefault上下文还支持clone()复制以及通过PricingContext.current修改默认上下文如PricingContext.current PricingContext(market_data_locationLDN)见 core.py。七、典型应用场景与最佳实践场景一逐日滚动对冲模拟仓库示例 3-Systematic Selling.ipynb 与 4-Delta Hedging.ipynb 展示了典型用法外层用一个覆盖整段历史区间的大HistoricalPricingContext(startstart_date, endend_date, show_progressTrue)批量计算持仓风险内层再对每个交易日在更窄的窗口上嵌套计算。场景二历史波动率与曲线形态分析12-Structuring for Uncertaintly.ipynb 指出在HistoricalPricingContext中不调用resolve()的期权会在序列中的每一天自动重新确定行权价re-strike从而得到每日都是 1.5% OTMS 的期权成本历史——这是做波动率结构分析的常用技巧。最佳实践小结明确日期语义start为 int 时表示业务日数量为date时表示日期二者不可与dates混用。长区间开启批处理预计单次计算超过 3 分钟时务必设置is_batchTrue避免请求超时。异步提交、统一取回is_asyncTrue可立即拿到 future适合在回测中批量提交后再统一result()。善用缓存use_cacheTrue可让重复的 RiskKey 直接命中PricingCache显著减少重复请求。未来日期请用 RollFwd 语义需要前瞻估值时使用BackToTheFuturePricingContext而非直接设置未来pricing_date父类会拒绝超过今天 5 天以上的定价日期。八、参考文件索引类文档docs/classes/gs_quant.markets.historical.HistoricalPricingContext.rst核心实现gs_quant/markets/historical.py含HistoricalPricingContext与BackToTheFuturePricingContext父类实现gs_quant/markets/core.pyPricingContext、PricingCache结果聚合gs_quant/risk/results.pyHistoricalPricingFuture日期生成gs_quant/datetime/date.pydate_range市场对象gs_quant/markets/markets.pyCloseMarket场景对象gs_quant/target/common.pyRollFwd回测集成gs_quant/backtests/generic_engine.py、gs_quant/backtests/generic_engine_action_impls.py官方教程06_calc_swap_price_historically.ipynb、05_resolve-a-trade.ipynb实战示例3-Systematic Selling.ipynb、4-Delta Hedging.ipynb、inflation_covid19_recovery_trade.ipynb、00_us_election_analysis/0003_trades.ipynb【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考