σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft Academy学习路线
Ctrl K
AO
+1.2k 位学习者
登录加入 ↗
学习路线
AO
+1.2k 位学习者
登录
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
Python 学习路线›模块 4 · 固定收益与期权定价›主题 4.8·~55分钟中级

Black–Scholes 公式

路线进度模块 4/11 · 主题 8/16
4.8 Black–Scholes 公式
—实验得分— / 100总 XP—连续天数—

期权的公式

1973 年,布莱克和斯科尔斯证明:如果股价服从波动率恒定的对数正态模型,期权可以通过交易股票和债券来复制,因此它的价格并不取决于投资者认为上涨有多大可能。欧式看涨期权的价格是 S * N(d1) - K * exp(-rT) * N(d2):期权到期实值时你得到的股票,按一个类似概率的数加权,减去你支付的折现行权价,按风险中性的行权概率 N(d2) 加权。看跌期权由平价关系得出。

d1 = (ln(S/K) + (r + sigma^2/2) T) / (sigma sqrt(T)) d2 = d1 - sigma sqrt(T) C = S N(d1) - K e^(-rT) N(d2)
import math

def norm_cdf(x):
    return 0.5 * (1 + math.erf(x / math.sqrt(2)))      # N(x): the probability that a standard normal is below x

print(round(norm_cdf(0.0), 4), round(norm_cdf(1.96), 4))      # 0.5 0.975

def d1_d2(spot, strike, rate, sigma, t):
    d1 = (math.log(spot / strike) + (rate + 0.5 * sigma ** 2) * t) / (sigma * math.sqrt(t))
    return d1, d1 - sigma * math.sqrt(t)

d1, d2 = d1_d2(100, 100, 0.05, 0.2, 1)
print(round(d1, 4), round(d2, 4))                               # 0.35 0.15

看涨与看跌

N 是标准正态分布函数,Python 的 math.erf 可以给出 0.5 * (1 + erf(x / sqrt(2)))。d1 和 d2 综合了价内程度 ln(S/K)、漂移以及期权存续期内的波动率。由此:看涨 = S * N(d1) - K * exp(-rT) * N(d2),看跌 = K * exp(-rT) * N(-d2) - S * N(-d1)。现价 100、行权价 100、利率 5%、波动率 20%、期限一年时,看涨价格 10.45,看跌 5.57,差额 4.88 恰好等于平价值 S - K * exp(-rT)。

def bs_call(spot, strike, rate, sigma, t):
    d1, d2 = d1_d2(spot, strike, rate, sigma, t)
    return spot * norm_cdf(d1) - strike * math.exp(-rate * t) * norm_cdf(d2)

def bs_put(spot, strike, rate, sigma, t):
    d1, d2 = d1_d2(spot, strike, rate, sigma, t)
    return strike * math.exp(-rate * t) * norm_cdf(-d2) - spot * norm_cdf(-d1)

call, put = bs_call(100, 100, 0.05, 0.2, 1), bs_put(100, 100, 0.05, 0.2, 1)
print(round(call, 4), round(put, 4))                            # 10.4506 5.5735
print(round(call - put, 4), round(100 - 100 * math.exp(-0.05), 4))   # 4.8771 4.8771   put-call parity holds

是什么在推动价格

有五个输入决定价格。行权价越高,看涨期权越便宜(80:24.59,100:10.45,120:3.25)。波动率越高,两种期权都越贵,因为更大的不确定性只会为持有者增加上行空间(10%:6.81,20%:10.45,40%:18.02)。到期时间越长,价格也越高(3 个月:4.62,1 年:10.45,4 年:25.21)。请注意,股票的预期收益率完全没有出现在公式中:只需要估计波动率,所以报价的期权价格常常直接用波动率来表示。

for strike in (80, 100, 120):
    print("strike", strike, round(bs_call(100, strike, 0.05, 0.2, 1), 4))      # 24.5888, 10.4506, 3.2475
for sigma in (0.1, 0.2, 0.4):
    print("sigma", sigma, round(bs_call(100, 100, 0.05, sigma, 1), 4))         # 6.805, 10.4506, 18.023
for t in (0.25, 1, 4):
    print("t", t, round(bs_call(100, 100, 0.05, 0.2, t), 4))                   # 4.615, 10.4506, 25.2133
# Time value: the call is worth more than its intrinsic value (what it would pay if it expired today)
intrinsic = max(100 - 100 * math.exp(-0.05), 0)
print(round(intrinsic, 4), round(bs_call(100, 100, 0.05, 0.2, 1) - intrinsic, 4))     # 4.8771 5.5735   intrinsic value and time value
一个有假设的模型布莱克-斯科尔斯假设波动率恒定、价格对数正态且无跳跃、无股息、欧式行权、交易无摩擦。真实市场里波动率随行权价和日期变化(波动率微笑),还有跳跃和厚尾。尽管如此,这个公式仍是市场的通用语言,所以价格常以隐含波动率报价,这是后面一个主题的内容。
  • N(x) = 0.5 * (1 + erf(x / sqrt(2))),以及 d1 = (ln(S/K) + (r + sigma²/2) T) / (sigma sqrt(T))、d2 = d1 - sigma sqrt(T)。
  • 看涨 = S N(d1) - K e^(-rT) N(d2);看跌 = K e^(-rT) N(-d2) - S N(-d1);二者之差是平价值 S - K e^(-rT)。
  • 价格随波动率和期限上升,随看涨期权行权价下降;股票的预期收益率不出现,只需要波动率。

下一节:Delta,股价变动一美元时期权价格变动多少。

实验:评分内容

  • 用 norm_cdf 构建钟形曲线的累积概率25 分
  • 用 d1_d2 计算布莱克-斯科尔斯的两个量25 分
  • 用 bs_call 为看涨期权定价25 分
  • 用 bs_put 为看跌期权定价25 分
资源管理器 · lab-73-1
▾ lab-73-1
…
bash · 浏览器内
learner@quantcraft:~/lab-73-1$
Python 尚未加载PythonLn 1, Col 1Spaces: 4UTF-8

要重置此主题吗?

lab-73-1 中的所有内容将恢复为初始文件,终端也会被清空。你当前的解答将丢失,且无法撤销。

将被重置
  • main.py → 初始代码
  • 终端历史与测试输出
  • 未提交的更改
将被保留
  • 实验最高得分
  • 你的 XP 与连续天数
  • 讲解进度与笔记

登录后即可运行你的代码。

所有讲解均可免费阅读。创建账户或登录后,即可运行代码、运行测试并提交此实验。

  • 浏览器内 IDE 与 bash 终端,无需安装
  • 即时评分、XP 以及你在学习路线中的位置
创建账户登录
或
使用 GitHub 继续