Back to Insights
Quant·25 min read·2026-03-30·Options Pricing

从零实现 Black-Scholes 期权定价:Python 完整代码 + Greeks 深度解析 2026

Black-Scholes Option Pricing from Scratch: Complete Python Code + Greeks Deep Dive 2026

本文由 Citadel Securities Quant Researcher 撰写,从数学推导到 Python 实现,完整拆解 Black-Scholes 期权定价模型。包含 Delta、Gamma、Theta、Vega、Rho 五大希腊字母的直觉解释和代码实现,以及波动率微笑(Volatility Smile)的成因分析。适合量化求职者和金融工程学生收藏。

核心结论(TL;DR)

非常有用,尽管它有诸多假设限制。在实际工作中,Black-Scholes 被用作:(1) 期权定价的基准模型,用于计算隐含波动率;(2) Greeks 计算的标准工具(即使使用更复杂的模型,Greeks 的概念仍然相同);(3) 对冲策略的基础框架。高级模型(Heston、SABR)是在 Black-Scholes 基础上的扩展,而不是替代。

为什么 Black-Scholes 是量化金融的基石

Black-Scholes 模型(1973 年)是现代量化金融的奠基之作,Myron Scholes 和 Robert Merton 因此获得 1997 年诺贝尔经济学奖(Fischer Black 于 1995 年去世,未能获奖)。尽管这个模型有诸多假设限制,但它仍然是期权定价的基准模型,也是所有高级期权模型(随机波动率模型、跳扩散模型)的出发点。

  1. 对于量化求职者,深入理解 Black-Scholes 模型有三重价值:
  2. 面试必考:Goldman Sachs Strats、J.P. Morgan Quant Research 的面试中,Black-Scholes 推导和 Greeks 计算是标准考点
  3. 思维框架:Black-Scholes 的推导过程展示了如何用数学工具(随机微积分、偏微分方程)解决金融问题,是量化思维的典型范例
  4. 实践基础:即使在实际工作中使用更复杂的模型,Black-Scholes 仍然是校准和对冲的基准

数学推导:从几何布朗运动到 Black-Scholes 方程

假设条件

  • Black-Scholes 模型基于以下假设:
  • 标的资产价格 $S$ 遵循几何布朗运动(GBM):$dS = \mu S dt + \sigma S dW_t$
  • 无风险利率 $r$ 恒定
  • 波动率 $\sigma$ 恒定(这是最强的假设,也是模型最大的局限)
  • 无交易成本,可以连续交易
  • 无股息支付

伊藤引理(Itô's Lemma)

设期权价格 $V = V(S, t)$,由伊藤引理: $$dV = \left(\frac{\partial V}{\partial t} + \mu S \frac{\partial V}{\partial S} + \frac{1}{2}\sigma^2 S^2 \frac{\partial^2 V}{\partial S^2}\right)dt + \sigma S \frac{\partial V}{\partial S} dW_t$$

Delta 对冲消除随机项

构建一个由期权空头和 $\Delta = \partial V / \partial S$ 单位标的资产多头组成的组合 $\Pi = -V + \Delta S$: $$d\Pi = -dV + \Delta dS = -\left(\frac{\partial V}{\partial t} + \frac{1}{2}\sigma^2 S^2 \frac{\partial^2 V}{\partial S^2}\right)dt$$

随机项 $dW_t$ 被消除!这个组合是无风险的,因此其收益率必须等于无风险利率 $r$: $$d\Pi = r\Pi dt = r(-V + \Delta S) dt$$

Black-Scholes 偏微分方程(PDE)

整理得到著名的 Black-Scholes PDE: $$\frac{\partial V}{\partial t} + rS\frac{\partial V}{\partial S} + \frac{1}{2}\sigma^2 S^2 \frac{\partial^2 V}{\partial S^2} - rV = 0$$

解析解

对于欧式看涨期权(行权价 $K$,到期时间 $T$),Black-Scholes PDE 的解析解为: $$C = S N(d_1) - K e^{-rT} N(d_2)$$ 其中: $$d_1 = \frac{\ln(S/K) + (r + \sigma^2/2)T}{\sigma\sqrt{T}}, \quad d_2 = d_1 - \sigma\sqrt{T}$$ $N(\cdot)$ 是标准正态分布的累积分布函数。

Python 完整实现

python
1import numpy as np
2from scipy.stats import norm
3import matplotlib.pyplot as plt
4from dataclasses import dataclass
5from typing import Literal
6
7@dataclass
8class BSMOption:
9    """Black-Scholes-Merton 期权定价模型
10    
11    参数:
12        S: 标的资产当前价格
13        K: 行权价
14        T: 到期时间(年)
15        r: 无风险利率(年化)
16        sigma: 波动率(年化)
17        option_type: 'call' 或 'put'
18    """
19    S: float
20    K: float
21    T: float
22    r: float
23    sigma: float
24    option_type: Literal['call', 'put'] = 'call'
25    
26    def _d1_d2(self):
27        """计算 d1 和 d2"""
28        d1 = (np.log(self.S / self.K) + 
29              (self.r + 0.5 * self.sigma**2) * self.T) / \
30             (self.sigma * np.sqrt(self.T))
31        d2 = d1 - self.sigma * np.sqrt(self.T)
32        return d1, d2
33    
34    def price(self) -> float:
35        """计算期权理论价格"""
36        d1, d2 = self._d1_d2()
37        if self.option_type == 'call':
38            return (self.S * norm.cdf(d1) - 
39                    self.K * np.exp(-self.r * self.T) * norm.cdf(d2))
40        else:  # put
41            return (self.K * np.exp(-self.r * self.T) * norm.cdf(-d2) - 
42                    self.S * norm.cdf(-d1))
43    
44    def delta(self) -> float:
45        """Delta: 期权价格对标的资产价格的一阶导数"""
46        d1, _ = self._d1_d2()
47        if self.option_type == 'call':
48            return norm.cdf(d1)
49        else:
50            return norm.cdf(d1) - 1
51    
52    def gamma(self) -> float:
53        """Gamma: Delta 对标的资产价格的导数(二阶导数)"""
54        d1, _ = self._d1_d2()
55        return norm.pdf(d1) / (self.S * self.sigma * np.sqrt(self.T))
56    
57    def theta(self) -> float:
58        """Theta: 期权价格对时间的导数(每日时间价值损耗)"""
59        d1, d2 = self._d1_d2()
60        term1 = -(self.S * norm.pdf(d1) * self.sigma) / (2 * np.sqrt(self.T))
61        if self.option_type == 'call':
62            term2 = -self.r * self.K * np.exp(-self.r * self.T) * norm.cdf(d2)
63        else:
64            term2 = self.r * self.K * np.exp(-self.r * self.T) * norm.cdf(-d2)
65        return (term1 + term2) / 365  # 转换为每日
66    
67    def vega(self) -> float:
68        """Vega: 期权价格对波动率的导数(每 1% 波动率变化)"""
69        d1, _ = self._d1_d2()
70        return self.S * norm.pdf(d1) * np.sqrt(self.T) / 100
71    
72    def rho(self) -> float:
73        """Rho: 期权价格对无风险利率的导数(每 1% 利率变化)"""
74        _, d2 = self._d1_d2()
75        if self.option_type == 'call':
76            return self.K * self.T * np.exp(-self.r * self.T) * norm.cdf(d2) / 100
77        else:
78            return -self.K * self.T * np.exp(-self.r * self.T) * norm.cdf(-d2) / 100
79    
80    def greeks_summary(self) -> dict:
81        """返回所有 Greeks 的汇总"""
82        return {
83            'Price': self.price(),
84            'Delta': self.delta(),
85            'Gamma': self.gamma(),
86            'Theta (daily)': self.theta(),
87            'Vega (per 1%)': self.vega(),
88            'Rho (per 1%)': self.rho(),
89        }
90
91
92# 示例:Apple 看涨期权
93option = BSMOption(
94    S=185.0,    # 当前股价
95    K=190.0,    # 行权价
96    T=30/365,   # 30 天到期
97    r=0.05,     # 5% 无风险利率
98    sigma=0.25, # 25% 年化波动率
99    option_type='call'
100)
101
102print("=== Black-Scholes 期权定价结果 ===")
103for key, value in option.greeks_summary().items():
104    print(f"{key:20s}: {value:.6f}")

五大 Greeks 的直觉解释与实际应用

Delta(Δ):方向性风险

Delta 衡量标的资产价格变化 1 元时,期权价格的变化量。看涨期权的 Delta 在 0 到 1 之间,看跌期权在 -1 到 0 之间。

直觉:Delta 可以理解为期权在到期时价内(in-the-money)的概率的近似值。深度价内(deep ITM)的看涨期权 Delta ≈ 1(几乎确定会被行权);深度价外(deep OTM)的看涨期权 Delta ≈ 0(几乎不会被行权);平值(ATM)期权 Delta ≈ 0.5。

实际应用:做市商通过持有 Delta 单位的标的资产来对冲期权的方向性风险,这就是"Delta 对冲"。一个 Delta 为 0.6 的看涨期权,需要做空 0.6 股标的资产来实现 Delta 中性。

Gamma(Γ):凸性风险

Gamma 是 Delta 对标的资产价格的导数,衡量 Delta 的变化速度。Gamma 在平值期权附近最大,在深度价内或价外时趋近于零。

直觉:Gamma 代表期权的"凸性"——如果你持有期权多头(Long Gamma),标的资产大幅波动对你有利(无论方向);如果你做空期权(Short Gamma),你希望标的资产保持稳定。

Theta(Θ):时间价值损耗

Theta 衡量随着时间流逝,期权价值的损耗速度(通常为负值)。临近到期时,Theta 的绝对值增大,时间价值损耗加速。

直觉:Theta 是 Gamma 的"代价"——Long Gamma(持有期权多头)意味着 Short Theta(时间价值损耗)。这就是为什么期权做市商需要在 Gamma 收益和 Theta 损耗之间寻找平衡。

Vega(ν):波动率风险

Vega 衡量波动率变化 1% 时,期权价格的变化量。所有期权的 Vega 都是正值(波动率越高,期权价值越高)。

直觉:如果你预期市场波动率将上升(如在重要经济数据发布前),可以通过买入期权(Long Vega)来获利。这就是"波动率交易"的基础。

Rho(ρ):利率风险

Rho 衡量无风险利率变化 1% 时,期权价格的变化量。对于短期期权,Rho 的影响相对较小;对于长期期权(LEAPS),Rho 可能很显著。

Black-Scholes 期权定价计算器

实时计算期权价格与 Greeks

输入参数

$
$
yr
%
%

计算结果

Call 期权理论价格
$8.2159
d₁ = 0.2475  |  d₂ = 0.1061ATM
Δ Delta价格变动 $1 时的期权价值变化
0.6255
Γ GammaDelta 对价格变动的敏感度
0.0274
Θ Theta每日时间价值损耗 (-0.0224/day)
0.0224
ν Vega波动率变动 1% 时的价值变化
0.2736
ρ Rho利率变动 1% 时的价值变化
0.2717

内在价值

$0.0000

时间价值

$8.2159

本计算器仅供学习参考,不构成任何投资建议。Black-Scholes 模型假设无股息、连续交易、常数波动率。

Free Download

免费领取《完整 Greeks 速查卡》 PDF

包含全部 5 大 Greeks 公式、直觉解释、常考题型和典型考题答案。已有 800+ 量化学员领取。

波动率微笑(Volatility Smile):Black-Scholes 的局限与现实

Black-Scholes 模型假设波动率恒定,但市场现实并非如此。隐含波动率(Implied Volatility)是指使 Black-Scholes 公式给出的理论价格等于市场观察价格的波动率值。

波动率微笑的现象:对于同一标的资产、同一到期日但不同行权价的期权,隐含波动率并不相同。通常,深度价外的看跌期权(低行权价)和深度价外的看涨期权(高行权价)的隐含波动率高于平值期权,形成"微笑"形状。

波动率偏斜(Volatility Skew):在股票市场中,低行权价(价外看跌)的隐含波动率通常高于高行权价(价外看涨),形成"偏斜"而非对称的"微笑"。这反映了市场对尾部风险(市场大幅下跌)的额外定价。

  1. 成因分析
  2. 尾部风险溢价:市场参与者愿意为保护性看跌期权(Protective Put)支付额外溢价,推高低行权价期权的隐含波动率
  3. 杠杆效应:股价下跌时,公司债务/股权比率上升,波动率倾向于上升
  4. 跳跃风险:市场存在跳跃(Jump)的可能性,而 GBM 无法捕捉这一特征

实际影响:波动率微笑的存在意味着 Black-Scholes 模型在定价价外期权时存在系统性偏差。这催生了更复杂的模型,如 Heston 随机波动率模型、SABR 模型和局部波动率模型。

想深入学习期权定价和 Greeks 管理?

AT&T Career Quant Track 提供从 Black-Scholes 到随机波动率模型的完整培训体系。 我们的导师来自顶级 Quant 机构,可以帮助你将理论知识转化为面试竞争力。

预约免费 Quant 技术诊断,获取你的专属学习计划 →

扩展:Monte Carlo 期权定价

python
1import numpy as np
2
3def monte_carlo_option_price(
4    S: float, K: float, T: float, r: float, sigma: float,
5    option_type: str = 'call', n_simulations: int = 100_000
6) -> tuple[float, float]:
7    """
8    Monte Carlo 期权定价
9    返回: (价格估计, 标准误差)
10    """
11    # 生成标的资产到期价格
12    Z = np.random.standard_normal(n_simulations)
13    S_T = S * np.exp((r - 0.5 * sigma**2) * T + sigma * np.sqrt(T) * Z)
14    
15    # 计算到期收益
16    if option_type == 'call':
17        payoffs = np.maximum(S_T - K, 0)
18    else:
19        payoffs = np.maximum(K - S_T, 0)
20    
21    # 折现到当前时刻
22    discounted_payoffs = np.exp(-r * T) * payoffs
23    
24    price = np.mean(discounted_payoffs)
25    std_error = np.std(discounted_payoffs) / np.sqrt(n_simulations)
26    
27    return price, std_error
28
29
30# 对比 Black-Scholes 解析解和 Monte Carlo 结果
31np.random.seed(42)
32mc_price, mc_se = monte_carlo_option_price(
33    S=185.0, K=190.0, T=30/365, r=0.05, sigma=0.25
34)
35bs_price = BSMOption(185.0, 190.0, 30/365, 0.05, 0.25).price()
36
37print(f"Black-Scholes 解析解: {bs_price:.4f}")
38print(f"Monte Carlo 估计:    {mc_price:.4f} ± {mc_se:.4f}")
39print(f"相对误差:            {abs(mc_price - bs_price) / bs_price * 100:.2f}%")

常见问题 · FAQ

Black-Scholes 模型在实际工作中还有用吗?+

非常有用,尽管它有诸多假设限制。在实际工作中,Black-Scholes 被用作:(1) 期权定价的基准模型,用于计算隐含波动率;(2) Greeks 计算的标准工具(即使使用更复杂的模型,Greeks 的概念仍然相同);(3) 对冲策略的基础框架。高级模型(Heston、SABR)是在 Black-Scholes 基础上的扩展,而不是替代。

面试中需要推导 Black-Scholes 公式吗?+

在 Goldman Sachs Strats 和 J.P. Morgan Quant Research 的面试中,能够推导 Black-Scholes PDE(使用伊藤引理和 Delta 对冲论证)是一个重要加分项。但完整推导解析解(求解 PDE)通常不是必须的。更重要的是理解模型的假设、局限性和 Greeks 的直觉含义。

Python 实现期权定价需要哪些数学基础?+

实现 Black-Scholes 公式本身只需要基础的 Python 和 scipy.stats 库。但要真正理解代码背后的数学,需要:微积分(偏微分方程)、概率论(正态分布)和随机微积分基础(伊藤引理)。建议先理解数学,再写代码,而不是反过来。

隐含波动率和历史波动率有什么区别?+

历史波动率(Historical Volatility)是基于过去价格数据计算的实际波动率;隐含波动率(Implied Volatility)是从当前期权市场价格反推出的波动率,代表市场对未来波动率的预期。两者的差异(波动率风险溢价)本身就是一个重要的交易信号。

Free Resource

免费领取【Quant 求职全套资料包】

包含 CV 模板、面试题库、Networking 模板信及完整的求职 Timeline。已有 1,200+ 学员领取。

不发垃圾邮件,随时可取消订阅

Share

Related Insights

继续深入 · Quant 赛道

Sophie W.

Sophie W. · Optiver

Quant20 min read

英国量化实习申请时间线 2026:Jane Street / Citadel / Optiver 全流程拆解

量化实习申请的时间线比大多数留学生预想的要早得多——Jane Street 和 Citadel 的 Summer Internship 申请窗口通常在大三 9 月开放,错过即等一年。本文由 AT&T Career Quant Track 导师团队整理,提供 2026 申请季各顶级机构的精确申请时间线、截止日期和备考节奏规划。

阅读全文
Dr. James L.

Dr. James L. · Citadel Securities

Quant26 min read

Quant Python 面试实战:从 NumPy 到 Backtest 的 30 道代码题精讲

量化面试的 Python 编程题与普通 SWE 面试有本质区别——它考察的是你用代码解决金融数学问题的能力。本文精选 30 道 Two Sigma、Citadel、Jane Street 等机构的 Python 面试真题,覆盖 NumPy 矩阵运算、统计建模、Monte Carlo 模拟和策略回测,每题附完整代码和解析。

阅读全文
Dr. James L.

Dr. James L. · Citadel Securities

Quant25 min read

随机微积分面试速查:Itô 引理、布朗运动与随机微分方程完全解析

随机微积分是量化金融的数学核心,也是 Goldman Sachs Strats、J.P. Morgan Quant Research 等高端岗位面试的必考内容。本文系统梳理布朗运动的性质、Itô 引理的应用、Black-Scholes 方程的推导,以及面试中最高频的随机微积分题型,附完整解题框架。

阅读全文
Dr. James L.

Dr. James L. · Citadel Securities

Quant28 min read

Jane Street 量化面试题精解:100 道概率论 + Brainteaser 真题与解析

本文汇集 100 道 Jane Street 及顶级 Quant 机构面试中的高频概率论和 Brainteaser 题目,涵盖期望值、条件概率、随机游走、博弈论和组合数学五大核心考点,每题附详细解析和延伸思考,是 Quant 面试备考的核心资料。

阅读全文
Sophie W.

Sophie W. · Optiver

Quant22 min read

Optiver 80-in-8 心算测试完全备考指南:从零到满分的系统训练方案

Optiver 的 80-in-8 心算测试是量化面试中最具标志性的筛选环节,也是大多数候选人最容易在准备不足时折戟的关卡。本文由 Optiver 在职 Trader 撰写,系统拆解测试结构、高频题型和训练方法,提供从零基础到稳定 90%+ 准确率的完整备考方案。

阅读全文
Alex (Chen Wei) Zhang

Alex (Chen Wei) Zhang · Jane Street

Quant25 min read

留学生 Quant 量化求职完全指南 2026:Jane Street / Citadel / Optiver 全流程备战

本文是面向英国留学生的量化求职权威指南,涵盖 Jane Street、Citadel、Optiver、Two Sigma、G-Research 等顶级量化机构的面试流程、核心考察维度、备考资源和第一手备战策略。基于 AT&T Career 40+ 位量化导师的实战经验,帮助你从零到拿到 Quant Offer。

阅读全文
探索更多 · 相关搜索词