0. Python 期权定价 Notebook 系列导读
本系列从期权合约的收益函数和标的资产模型出发,逐步讨论风险中性定价,并介绍如何用解析公式和数值方法计算期权价格。贯穿各章的问题是:在明确合约、模型和市场输入之后,怎样计算一个期权价格,并评估计算误差?
本系列的特点
各数值方法独立成章。 第 2—6 章分别介绍树方法、蒙特卡罗、有限差分、鞍点近似和傅里叶方法。各章围绕相应方法展开公式推导、算法说明和 Python 实现。
数学与程序放在一起。 公式、算法说明和相应的 Python 程序紧邻呈现。程序拆分为较小的函数,便于将每一步计算与公式对应起来,理解输入、输出和近似方式。
用基准和数值诊断检查结果。 各章通过解析解、独立的数值基准、参数敏感性或收敛结果,说明如何识别误差。不同方法的主要误差来源并不相同,可能来自时间或空间离散、随机抽样、频率截断、区间截断或分布近似。
章节路线
第 1 章介绍期权合约、资产价格模型和风险中性定价,为后续各章提供共同基础。第 2—6 章相互独立,可以按兴趣或计算问题选择学习顺序。阅读某章时,可回查第 1 章中的相关模型和公式。
| Notebook | 内容 | 文件 |
|---|---|---|
| 第 1 章 | 期权收益、随机过程、风险中性定价、Black–Scholes、Greeks 和隐含波动率 | 阅读第 1 章 |
| 第 2 章 | 二叉树和三叉树,以及欧式和美式期权的向后递推 | 02-trees.ipynb(即将上线) |
| 第 3 章 | GBM 和进阶模型(Merton 跳跃扩散、Variance Gamma(VG)、正态逆高斯(NIG))下的蒙特卡罗定价;亚式期权与控制变量、拟蒙特卡罗、三种 Greeks 估计方法以及最小二乘蒙特卡罗 | 第一部分(即将上线) / 第二部分(即将上线) |
| 第 4 章 | 用有限差分离散 Black–Scholes 方程,并以投影方法处理美式期权提前行权 | 04-pde.ipynb(即将上线) |
| 第 5 章 | 使用累积量生成函数进行鞍点近似、尾部概率和期权定价 | 05-saddlepoint.ipynb(即将上线) |
| 第 6 章 | 特征函数、Carr–Madan FFT、CONV 和 COS 方法 | 06-fourier.ipynb(即将上线) |
路径依赖期权可以通过蒙特卡罗模拟累计路径信息;提前行权期权可用树方法、有限差分或最小二乘蒙特卡罗处理行权决策;模型具有可用的特征函数时,傅里叶方法可用于计算欧式期权价格,其中 FFT 可同时计算多个行权价的结果。
如何阅读和使用 Notebook
每个 Notebook 都可以按单元顺序阅读。先看当前部分的模型假设、符号和公式,再读紧随其后的程序;不要只看最终价格或图形,而要留意程序实现了哪一步计算、采用了哪些数值参数,以及结果通过什么方式检查。
程序标题前的“公式与代码对应”说明框列出本程序中需要对照的变量与数学符号,并说明路径数组、网格节点或时间层的排列方式。阅读时可先对照公式查看说明框,再沿着代码中的计算步骤理解实现。
建议先按下载包中的 README.md 准备 Python 环境,再从 Notebook 开头依次运行单元。后面的计算通常会使用前面定义的模型、函数或参数。探索结果时,每次只改变一个输入,并与原有基准比较;这样更容易判断价格变化来自合约、模型还是数值设置。
Python 程序、对象与导入方式
根目录的 README.md 介绍了创建 Python 虚拟环境、安装依赖、运行检查和构建下载包;中文 zh/README.md 概述了 Notebook 系列。本节介绍源文件的职责、模型与合约对象,以及定价函数的导入和调用方式。项目要求 Python 3.11 或更新版本;安装命令请以 README.md 为准。
Python 包的源文件位于 src/quant_option_pricing/。安装后,包名是 quant_option_pricing,应按包路径导入。常用文件的职责如下:
| 文件 | 主要内容 |
|---|---|
contracts.py |
欧式、百慕大式和美式期权合约对象 |
models.py |
Black–Scholes、Merton、Variance Gamma 和 NIG 模型对象及模型计算 |
settings.py |
树方法、蒙特卡罗、PDE、鞍点和 Fourier 方法的数值设置对象 |
black_scholes.py |
Black–Scholes 定价、Greeks 和隐含波动率函数 |
trees.py、monte_carlo.py、pde.py、saddlepoint.py |
各类数值方法的计算函数 |
fourier_pricing.py、fourier.py |
接收 model、option 和 settings 对象的 Fourier 调用接口和底层 Fourier 计算函数 |
对于以对象为输入的定价程序,model 保存波动率、利率、跳跃参数等模型参数;option 保存当前价格、行权价、到期时间和看涨/看跌方向;settings 保存当前数值方法的计算设置,例如时间步数、路径数或截断参数。
看涨/看跌方向保存在 option.cp:取值 1 表示看涨,-1 表示看跌。若将这一取值记为 \(c\),两类期权的到期收益都可写为 \(\max(c(S_T-K),0)\)。
行权时间由合约类型区分:EuropeanOption、BermudanOption 和 AmericanOption 分别表示欧式、百慕大式和美式期权;行权方式不放在 settings 中。
定价算法由相应模块中的函数实现,例如 european_crr_price、european_mc_price、american_pde_price 和 carr_madan_fft_prices。模型对象的 characteristic_function 方法提供模型的特征函数,供傅里叶定价函数调用。
下面以 Carr–Madan FFT 为例,展示包、对象和定价函数如何配合。BlackScholesModel、EuropeanOption 和 CarrMadanSettings 从包的公开接口导入;定价函数从 fourier_pricing.py 导入。没有另行提供行权价数组时,函数会返回 option 中这一份合约行权价对应的价格数组。
from quant_option_pricing import (
BlackScholesModel,
CarrMadanSettings,
EuropeanOption,
)
from quant_option_pricing.fourier_pricing import carr_madan_fft_prices
model = BlackScholesModel(rate=0.05, volatility=0.20)
option = EuropeanOption.call(spot=100.0, strike=100.0, maturity=1.0)
settings = CarrMadanSettings(alpha=1.5, n=4096, eta=0.25)
call_price = carr_madan_fft_prices(model, option, settings)[0]不同章节也会展示直接调用底层函数的写法。阅读时先查看函数签名:数值参数接口直接传入波动率、现价、行权价和到期时间;对象接口从 model、option 和 settings 中读取相应参数。再沿着函数调用回到对应的模型和数值算法。
预备知识与常用符号
阅读本系列需要了解微积分、条件期望、正态分布和基础线性代数,并能定义 Python 函数、使用 NumPy 数组和阅读简单的 Matplotlib 图形。各章会在需要时解释金融概念和数值算法;安装与环境准备见下载包中的 README.md。
全书通常以 \(S_t\) 表示时刻 \(t\) 的标的资产价格,\(S_0\) 表示当前价格,\(K\) 表示行权价,\(T\) 表示到期时间,\(r\) 表示连续复利无风险利率,\(\sigma\) 表示波动率。看涨期权的到期收益为 \((S_T-K)^+\),看跌期权的到期收益为 \((K-S_T)^+\)。时间通常以年为单位;股息、利率或其他市场输入会在相应章节和例子中明确说明。