gs-quant FXOptionStrategy 实战指南:用 Python 构建多腿外汇期权策略
【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant
导读
FXOptionStrategy是 gs-quant 量化金融工具包中用于刻画多腿外汇期权策略(如跨式 straddle、宽跨式 strangle、价差组合)的核心仪器类。它通过一组FXOptionLeg腿结构组合出完整的期权策略,并继承了Priceable的全部定价与解析能力。读完本文,你将掌握FXOptionStrategy的完整字段语义、腿的构造方式、序列化规则,以及如何将策略接入 gs-quant 的定价上下文中完成估值。
一、FXOptionStrategy 的定位与源码出处
本文对应的官方类参考页为 docs/classes/gs_quant.instrument.FXOptionStrategy.rst。该页面以 Sphinx autodoc 形式展示了类的全部公开属性,并明确指出:本类的方法(解析、定价等)继承自Priceable,详见 docs/classes/gs_quant.base.Priceable.rst。
从源码看,类的真实定义位于 gs_quant/target/instrument.py 第 2133 行:
@handle_camel_case_args @dataclass_json(letter_case=LetterCase.CAMEL) @dataclass(unsafe_hash=True, repr=False) class FXOptionStrategy(Instrument): pair: Optional[str] = field(default=None, metadata=field_metadata) buy_sell: Optional[BuySell] = field(default=None, metadata=field_metadata) strategy_name: Optional[str] = field(default=None, metadata=field_metadata) legs: Optional[tuple[FXOptionLeg, ...]] = field(default=None, metadata=field_metadata) option_type: Optional[OptionType] = field(default=None, metadata=field_metadata) # ...(其余字段见下文属性表) asset_class: Optional[AssetClass] = field(init=False, default=AssetClass.FX, metadata=field_metadata) type_: Optional[AssetType] = field(init=False, default=AssetType.OptionStrategy, metadata=config(field_name='type', exclude=exclude_none)) name: Optional[str] = field(default=None, metadata=name_metadata)类定义前的三个装饰器决定了它的核心行为:
@handle_camel_case_args:允许以驼峰命名(如notionalAmount)传入构造参数,与 JSON 报文习惯对齐;@dataclass_json(letter_case=LetterCase.CAMEL):提供to_dict()/from_dict()序列化,序列化输出为 camelCase;@dataclass(unsafe_hash=True, repr=False):作为 dataclass 支持按值哈希比较,便于在组合、缓存场景中使用。
对外导出的入口是 gs_quant/instrument/init.py 中的from gs_quant.target.instrument import *,因此业务代码中直接from gs_quant.instrument import FXOptionStrategy即可。
asset_class固定为AssetClass.FX,type固定为AssetType.OptionStrategy,两者不可通过构造函数修改,用于在计算服务端路由到对应的外汇期权定价引擎。
二、完整属性清单与字段语义
参考文档页列出了FXOptionStrategy的全部公开属性,结合源码可整理为以下语义分组。除特别说明外,所有字段均可选(Optional),未赋值字段在序列化时被排除。
2.1 策略级字段
| 属性 | 类型 | 说明 |
|---|---|---|
pair | Optional[str] | 外汇货币对,如"EURUSD"、"USDJPY" |
buy_sell | Optional[BuySell] | 买卖方向,取BuySell.Buy/BuySell.Sell |
strategy_name | Optional[str] | 策略名称标签,用于标识该策略组合 |
legs | Optional[tuple[FXOptionLeg, ...]] | 构成策略的腿序列,是策略的核心载体 |
option_type | Optional[OptionType] | 期权类型,如OptionType.Call/OptionType.Put |
name | Optional[str] | 仪器名称,仅作标识用途 |
2.2 名义与金额字段
| 属性 | 类型 | 说明 |
|---|---|---|
notional_amount | Optional[Union[float, str]] | 名义本金,支持数值或表达式字符串(如"1m") |
notional_currency | Optional[Currency] | 名义本金币种,如Currency.USD |
notional_amount_in_other_currency | Optional[Union[float, str]] | 以对手货币计价的名义金额,用于非本金币种计量的场景 |
settlement_currency | Optional[Currency] | 结算币种 |
settlement_date | Optional[Union[datetime.date, str]] | 结算日期 |
settlement_rate_option | Optional[str] | 结算汇率选项,指定结算时采用的汇率确定方式 |
2.3 合约条款字段
| 属性 | 类型 | 说明 |
|---|---|---|
strike_price | Optional[Union[float, str]] | 执行价,支持数值或表达式(如"atm"、"atm+0.02") |
expiration_date | Optional[Union[datetime.date, str]] | 到期日,支持日期对象或相对表达式(如"3m") |
expiration_time | Optional[str] | 到期时间 |
exercise_style | Optional[OptionExerciseStyle] | 行权方式:European/American等 |
method_of_settlement | Optional[OptionSettlementMethod] | 结算方式:现金结算Cash或实物交割Physical |
premium | Optional[Union[float, str]] | 期权费 |
premium_currency | Optional[Currency] | 期权费币种 |
premium_payment_date | Optional[str] | 期权费支付日 |
2.4 继承自 Instrument 基类的属性
以下属性同样出现在参考文档的属性列表中,但定义在基类Instrument中:
metadata:附加元数据字典;instrument_quantity/quantity_:仪器数量;provider:数据/定价提供商标识;resolution_key:解析键,用于标识解析结果对应的市场数据快照;unresolved:未解析字段列表(解析前存在、解析后被清空);dataclass_json_config:dataclass-json 序列化配置。
这些字段与Priceable的resolve()流程强相关:调用解析后,表达式形式的参数(如"3m"、"atm")会被替换为具体数值,unresolved与resolution_key反映解析状态。
三、腿结构:FXOptionLeg 详解
策略的基本单元是腿。源码中 FXOptionLeg 是一个独立的Instrument子类,字段如下:
class FXOptionLeg(Instrument): buy_sell: Optional[BuySell] # 该腿买卖方向 option_type: Optional[OptionType] # Call / Put notional_amount: Optional[Union[float, str]] # 腿的名义本金 notional_currency: Optional[Currency] # 名义本金币种 notional_amount_in_other_currency: Optional[Union[float, str]] strike_price: Optional[Union[float, str]] # 执行价(可含 "atm" 表达式) expiration_date: Optional[Union[datetime.date, str]] settlement_date: Optional[Union[datetime.date, str]] premium: Optional[Union[float, str]] premium_currency: Optional[Currency] premium_payment_date: Optional[str] settlement_currency: Optional[Currency] settlement_rate_option: Optional[str] method_of_settlement: Optional[OptionSettlementMethod] expiration_time: Optional[str] exercise_style: Optional[OptionExerciseStyle] asset_class: Optional[AssetClass] # 固定 AssetClass.FX type_: Optional[AssetType] # 固定 AssetType.OptionLeg,序列化键为 'type' name: Optional[str]腿自身也是@handle_camel_case_args+@dataclass_json(CAMEL)的 dataclass,序列化行为与策略一致。构造策略时,将若干条FXOptionLeg组装为元组赋给legs字段即可,例如经典的跨式组合:一条 Call 腿 + 一条 Put 腿、同执行价同到期日。
四、实战示例:构造并定价一个外汇期权策略
以下示例展示如何用FXOptionStrategy构造一个 EURUSD 跨式组合(straddle)并接入定价上下文。此模式与仓库 documentation/02_pricing_and_risk/00_instruments_and_measures 中的外汇期权示例用法一致。
from datetime import date from gs_quant.common import BuySell, OptionType, OptionExerciseStyle, Currency from gs_quant.instrument import FXOptionStrategy, FXOptionLeg from gs_quant.markets import PricingContext # 1. 定义两条腿:同执行价、同到期的 Call 与 Put call_leg = FXOptionLeg( buy_sell=BuySell.Buy, option_type=OptionType.Call, notional_amount=10_000_000, notional_currency=Currency.USD, strike_price="atm", # 表达式:以市价 ATM 确定执行价 expiration_date="3m", # 相对到期表达式 expiration_time="10:00", exercise_style=OptionExerciseStyle.European, ) put_leg = FXOptionLeg( buy_sell=BuySell.Buy, option_type=OptionType.Put, notional_amount=10_000_000, notional_currency=Currency.USD, strike_price="atm", expiration_date="3m", expiration_time="10:00", exercise_style=OptionExerciseStyle.European, ) # 2. 组装策略 straddle = FXOptionStrategy( pair="EURUSD", strategy_name="EURUSD 3M Straddle", legs=(call_leg, put_leg), buy_sell=BuySell.Buy, notional_currency=Currency.USD, expiration_date="3m", expiration_time="10:00", ) # 3. 在定价上下文中解析并定价 with PricingContext(pricing_date=date(2026, 9, 14), market="LOCAL", currency=Currency.USD): resolved = straddle.resolve() # 将 "atm"、"3m" 等表达式解析为具体值 price = straddle.price() # 计算策略公允价值(ReportJobFuture) print(price.to_frame())要点说明:
strike_price、expiration_date等支持字符串表达式,这是 gs-quant 的通用约定,resolve()阶段会结合市场数据将其落定为具体数值;解析前策略对象处于"未解析"状态,unresolved属性会列出尚未解析的字段;- 策略级字段(如
buy_sell、expiration_date)可对整个组合生效,各腿级字段则用于刻画腿的独立条款; price()返回异步结果对象(ReportJobFuture),调用.to_frame()或.result()获取估值结果,这是Priceable定价接口的通用返回模式;- 该策略在计算服务端按
type=OptionStrategy路由定价引擎,服务端需要pair对应的外汇市场数据可用(本地模式market="LOCAL"时受本地缓存限制)。
五、序列化:与 JSON 报文无缝对接
由于策略与腿均标注@dataclass_json(letter_case=LetterCase.CAMEL),可以一键导出/导入标准 camelCase JSON,便于存储、传输或在 Marquee 平台侧复用:
payload = straddle.to_dict() # 输出片段: # { # "type": "OptionStrategy", # "pair": "EURUSD", # "strategyName": "EURUSD 3M Straddle", # "buySell": "Buy", # "legs": [ # {"type": "OptionLeg", "buySell": "Buy", "optionType": "Call", "strikePrice": "atm", ...}, # {"type": "OptionLeg", "buySell": "Buy", "optionType": "Put", "strikePrice": "atm", ...} # ], # ... # } restored = FXOptionStrategy.from_dict(payload)同时@handle_camel_case_args允许构造时直接使用notionalAmount、strikePrice等驼峰参数名,与 JSON 字段一一对应。未赋值的可选字段在序列化时会被排除(字段元数据中的exclude=exclude_none配置),保证报文最小化。
六、与单腿 FXOption 及其他 FX 策略的关系
仓库中还存在同族的仪器类(均在 gs_quant/target/instrument.py):
FXOption(第 1170 行):单腿外汇期权,字段与FXOptionLeg高度相似,适合单个期权场景;FXOptionStrategy(第 2133 行):多腿组合,用legs: tuple[FXOptionLeg, ...]承载结构化策略;FXPivot(第 2161 行)、FXTarf(第 2198 行):带目标条款的路径依赖型外汇结构,通过schedules(FXPivotScheduleLeg/FXTarfScheduleLeg)定义分段条款;FXWorstOf/FXWorstOfKO(第 2233 / 2250 行):多资产最差收益类结构,同样以腿元组组织。
选择依据:若只需表达单个期权,用FXOption;需要把多个期权组合成一个可整体定价、整体报价的策略对象时,使用FXOptionStrategy;涉及目标收益、障碍与分段的复杂结构,则对应上述专用类。它们的共同点是都继承自Instrument并享有Priceable的解析、定价、风险度量能力。
七、扩展阅读
- 类参考页:docs/classes/gs_quant.instrument.FXOptionStrategy.rst、docs/classes/gs_quant.instrument.FXOptionLeg.rst
- 基类能力:docs/classes/gs_quant.base.Priceable.rst(
resolve/price/calc等方法来源) - 源码实现:gs_quant/target/instrument.py(
FXOptionLeg见 L1215,FXOptionStrategy见 L2133) - 定价上下文:docs/classes/gs_quant.markets.core.PricingContext.rst
- 实战示例:documentation/02_pricing_and_risk/00_instruments_and_measures 目录下的外汇期权 Notebook
【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考