波动率微笑曲线,用 gs-quant 一段代码画出来:外汇期权定价实战指南
【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant
做外汇期权定价(FX option pricing)绕不开一个问题:市场给的波动率不是一个数,而是随执行价弯曲的一条曲线。用 gs-quant 这套 Python 工具包,我们可以先算出一条指数加权波动率(exponentially weighted volatility)曲线作为建模输入,再对接 FXOption 合约和 PricingContext 完成定价。本文给出一条可直接运行的最小路径和参数上的取舍建议。
先看效果:跑完能得到什么
跑通后你会得到三样东西:
- 一条按日期索引的波动率曲线:输入是任意价格时间序列,输出是年化后的百分比数值;
- 一条平滑的"微笑"形态:近期数据权重高,曲线跟随市场节奏走;
- 可对接定价的上下文:把
FXOption放进PricingContext,即可取价格和风险指标。
核心输入函数exponential_volatility定义在gs_quant/timeseries/technicals.py,它内部是三步合成:先取returns,再做指数加权标准差exponential_std,最后年化并乘以 100 转为百分比。
一句话讲清波动率微笑
想象卖保险:保的小额单不怕多,因为赔付概率稳定;保的车价越高,定价越不敢拍脑袋,费率往上抬。外汇期权类似——深度虚值的远月期权(尾部风险大),市场要求的隐含波动率就更高,整条执行价对波动率的曲线两端翘起、中间下凹,像一张微笑的嘴。这条曲线就是波动率微笑(Volatility Smile)。
最小可运行示例
下面是全文唯一的完整代码。本地用generate_series生成 250 天数据,无需真实行情即可验证流程;接上真实数据后把第一行换成你的价格序列即可。
from gs_quant.timeseries import generate_series, exponential_volatility, returns # 1. 模拟 250 天的外汇价格序列(真实场景替换为你的数据) prices = generate_series(250) # 2. 算收益率,检查数据质量 ret = returns(prices) # 3. 指数加权波动率曲线,beta=0.9 贴近风险模型常用口径 vol = exponential_volatility(prices, beta=0.9) # 4. 快速校验:首尾值与均值 print(vol.head()) print(f"均值 {vol.mean():.2f}% 最新 {vol.iloc[-1]:.2f}%") # 5. 接入定价:外汇期权 + 定价上下文 from gs_quant.instrument import FXOption from gs_quant.markets import PricingContext option = FXOption(pair='EURUSD', option_type='Call', strike_price=1.08, expiration_date='1m', notional_amount=1e6, notional_currency='USD', buy_sell='Buy') with PricingContext(): option.price() # 需具备数据源授权;无授权时本步骤会提示鉴权错误关键代码拆解
beta 决定了曲线"听谁的"
exponential_volatility的第二个参数beta控制历史数据的衰减速度,取值范围是[0, 1)。直觉上它像一个"记忆长度"旋钮:beta=0.9时最近几天主导结果,曲线反应灵敏但抖;beta=0.75(函数默认值)记忆更长,曲线更平。公式本身不复杂:
$$\sigma_t = \sqrt{(1-\beta)\sum_{i\ge 0}\beta^{i} r_{t-i}^2}$$
大白话:把每天的收益率平方后按beta逐日打折加权,开根号得到波动率,再年化。所以 beta 越大,"最近一次跳价"对当前数值的绑架越深。
为什么是指数加权,而不是简单滚动窗口
exponential_volatility内部调用的exponential_std定义在gs_quant/timeseries/statistics.py。滚动窗口波动率对窗口外的突变直接归零,而指数加权让老数据按几何级数衰减。对 FX 市场来说,隔夜事件(央行决议、数据发布)的影响需要"慢慢退场"而不是明天突然消失,这正是加权结构擅长的地方。
曲线怎么喂给定价
FXOption的定义在gs_quant/target/instrument.py,pair、option_type、strike_price、notional_amount、notional_currency是最少要给的字段。定价时通过PricingContext(定义在gs_quant/markets/core.py)提供市场数据源,option.price()返回定价结果。想拿到 Delta 等希腊字母时,在 context 里指定对应指标即可。没有数据源授权时,定价会报鉴权错误,前四步的波动率计算不受影响。
参数选择与易踩的坑
- beta:0.9 是风险建模常用值(RiskMetrics 口径接近 0.94),做曲线平滑展示时降到 0.7 左右;beta 取 0.99 以上曲线几乎冻结,0.5 以下则和滚动窗口没太大差别。
- 单位:函数输出已年化且乘了 100,打印出来
12.3表示 12.3%,不要再除一次 100。 - 数据对齐:
returns默认一阶差分,输入序列如果含缺失日期,先补齐再算,否则波动率会被空值污染。 - 定价报错:本地跑
option.price()需要数据源凭据,报AuthError属正常现象,不影响前四步。
延伸方向
两条值得继续挖的路:一是把vol接到 Plotly 上画微笑曲线,exponential_volatility带@plot_function装饰器,仓库文档docs/timeseries.rst里有对应说明;二是用gs_quant/markets/scenario.py的场景机制对波动率做冲击,看同一份期权在不同 vol 下的价格变化。
波动率微笑是外汇期权定价的地基,把 beta 的取舍想清楚,这条曲线就站得住了。剩下的事,就是拿真实行情把这套流程跑一遍。
【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考