7.1 7.1 金融数学工单:给"未来的选择权"定价


7.1 金融数学工单:给"未来的选择权"定价

本节摘要:期权的价值来自未来的不确定性,为它定价是随机数学最著名的应用。本节从无套利直觉讲到二叉树模型的复制论证,再用蒙特卡洛为路径依赖期权定价,最后落地风控语言:VaR 与 CVaR 怎么报告、边际怎么读。所有代码可跑,结论带业务话术。

能力清单

阅读完本节,你应当能够:

  1. 用复制组合论证解释"为什么定价与真实概率无关";
  2. 实现二叉树与蒙特卡洛两条定价路线并核对一致性;
  3. 用 VaR/CVaR 组合报告组合风险,说明两者的分工。

工单背景:一张认购合约值多少钱

持有一张认购期权,就拥有"一个月后以约定价格 100 元买入股票"的权利(不是义务)。到期时股价高于 100 就行权赚差价,低于就作废——收益是折线形的:下行有底、上行无限。卖方收了权利金,承担上行风险。权利金该收多少?这不是拍出来的,是算出来的。

定价的核心直觉叫无套利:市场上不该存在"零成本稳赚"的机会。由此推出一个反直觉的结论——定价不需要预测股价涨跌的概率。论证靠复制:用"买一部分股票加借一笔钱"构造一个组合,让它在每种未来状态下都与期权收益完全相同;那么期权的今天价格必须等于这个复制组合的今天成本,否则低买高卖就能套利。注意复制组合里的比例由"让两种状态收益相等"解出,整个过程没有出现真实概率——出现的只是无风险利率(折现用)。

二叉树:把复制论证做成算法

假设一个月后股价只有两个状态:涨到 110 或跌到 90。持有数量 d 股股票加现金 B,要求两种状态下都等于期权收益:

import numpy as np S0, K, u, d = 100.0, 100.0, 110.0, 90.0 r = 0.01 # 月度无风险利率 cu, cd = max(u - K, 0), max(d - K, 0) # 两种状态的期权收益 # 复制方程: d*u + B*(1+r) = cu; d*d_ + B*(1+r) = cd (d_ 为下跌价) shares = (cu - cd) / (u - d) cash = (cu - shares * u) / (1 + r) price = shares * S0 + cash print(f"复制组合: 持股 {shares:.3f} 股 + 现金 {cash:.2f}") print(f"期权公平价: {price:.3f}") # 风险中性概率校验: p*(cu) + (1-p)*(cd) 再折现 应等于同一价 p = ((1 + r) * S0 - d) / (u - d) price2 = (p * cu + (1 - p) * cd) / (1 + r) print(f"风险中性概率 p = {p:.3f}, 折现期望价 {price2:.3f}")

两条路殊途同归:价格等于"风险中性概率下的期望收益折现"。风险中性概率不是真实概率,它是从当前股价反推出来的加权系数,把"人们厌恶风险"的偏好打包封装了。这个视角的威力在多期模型里兑现:把一个月拆成几十步,每步两状态,倒推回去就是二叉树定价的完整算法——美式期权(可提前行权)在每个节点加一步"行权与持有的较大者"即可。

路径依赖期权(比如亚式期权,收益取决于路径均价)用树很笨拙,蒙特卡洛是主场:模拟几万条价格路径,逐条算收益,平均后折现。

import numpy as np rng = np.random.default_rng(66) S0, K, r, sigma, T, n_steps, n_paths = 100, 100, 0.03, 0.2, 1.0, 252, 100_000 dt = T / n_steps # 欧式认购:蒙特卡洛 与 解析公式对照 z = rng.standard_normal((n_paths, n_steps)) increments = (r - 0.5*sigma**2)*dt + sigma*np.sqrt(dt)*z ST = S0 * np.exp(increments.sum(axis=1)) call_mc = np.exp(-r*T) * np.maximum(ST - K, 0).mean() from scipy.stats import norm d1 = (np.log(S0/K) + (r + sigma**2/2)*T) / (sigma*np.sqrt(T)) d2 = d1 - sigma*np.sqrt(T) call_bs = S0*norm.cdf(d1) - K*np.exp(-r*T)*norm.cdf(d2) print(f"蒙特卡洛: {call_mc:.3f} 解析公式: {call_bs:.3f}") # 亚式(均价)期权:树难做 模拟顺手 A = S0 * np.exp(np.cumsum(increments, axis=1)).mean(axis=1) asian = np.exp(-r*T) * np.maximum(A - K, 0).mean() print(f"亚式认购: {asian:.3f}(低于欧式, 因均价波动小于期末价)")

蒙特卡洛与解析公式的差应在标准误之内;亚式低于欧式的直觉是"平均比单个更稳"——波动被平均稀释,权利金自然便宜。定价工单的验收标准是两条独立路线对上,单路线结果(尤其自己刚写的代码)不直接上线。

风险报告:VaR 与 CVaR 成对交付

第 4 章备好的工具在此落地。持有一万股的股票组合,明日 95% VaR 是"亏损以 95% 概率不超过的线",CVaR 是"越线之后的平均亏损"。报告话术要点:VaR 不是最坏情形(还有 5% 的尾部),尾部深度看 CVaR;监管与内部限额两个口径要一致。

import numpy as np rng = np.random.default_rng(7) holding = 10_000 z = rng.standard_normal(400_000) pnl = holding * 100 * (np.exp(-0.5*0.02**2 + 0.02*z) - 1) var95 = np.quantile(pnl, 0.05) cvar95 = pnl[pnl <= var95].mean() print(f"95% VaR: 亏损线 {-var95:,.0f} 元") print(f"95% CVaR: 越线后平均 {-cvar95:,.0f} 元") print(f"尾部最深单日 {-pnl.min():,.0f} 元") # 边际贡献: 头寸翻倍 风险线性放大吗 pnl2 = pnl * 2 print(f"头寸翻倍后 VaR: {-np.quantile(pnl2, 0.05):,.0f}")

线性持仓下风险随头寸线性放大;但组合里一旦有期权(收益折线非线性),风险与头寸就不是线性关系——此时边际风险要靠局部重估或模拟差分,这正是金融机构风控系统的日常计算。第 6 章的优化语言可以接管下一步:以 CVaR 为约束或目标做仓位配置,把"风险不超过多少"写进模型正则。

⚠️ 常见坑:把正态假设下算出的 VaR 当万能尺。金融回报的尾部比正态厚得多,极端日子的实测亏损经常越过正态 VaR 数倍;厚尾建模(历史模拟、极值理论)是衍生品组合的必修课。

💡 关键直觉:定价与风险管理是同一枚硬币——定价问"不确定性值多少钱",风控问"不确定性会咬多深"。两者共享随机模拟的基础设施,一个面向产品,一个面向仓位。

金融工单双视图

金融工单双视图

本节要点回顾

  • 无套利与复制是定价的地基,价格与真实涨跌概率无关;
  • 风险中性概率是反推的加权系数,不是预测;
  • 二叉树适合欧式与美式,蒙特卡洛适合路径依赖,双路线对上是验收线;
  • 亚式低于欧式:平均稀释波动,权利金打折;
  • VaR 与 CVaR 成对交付,厚尾下正态假设会低估尾部深度。

作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U