option-pricing
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseOption Pricing — Skill de Tooling
期权定价 — 工具类Skill
Pricing de opciones para backtesting y analisis. 5 metodos
implementados, todos en flat Python + numpy (sin dependencias externas
pesadas, sin abstracciones, sin clases). Cada funcion es ~100 lineas o
menos y acepta escalares.
Performance objetivo (medida en este skill):
- Black-Scholes: 0.0012 ms/op (~800.000 opciones/seg)
- BAW (American closed-form): 0.0014 ms/op (~730.000 opciones/seg)
- Binomial N=500: 3 ms/op — 2000x mas lento que BS, pero preciso
Para la teoria detallada de cada metodo, ver .
references/REFERENCE.md用于回测与分析的期权定价工具。已实现5种方法,全部采用扁平化Python+numpy编写(无重型外部依赖、无抽象层、无类结构)。每个函数约100行或更少,支持标量输入。
目标性能(本工具实测数据):
- Black-Scholes:0.0012毫秒/单期权(约800,000单/秒)
- BAW(美式闭式解):0.0014毫秒/单期权(约730,000单/秒)
- Binomial(N=500):3毫秒/单期权 — 比BS慢2000倍,但精度更高
如需了解各方法的详细理论,可查看。
references/REFERENCE.mdQuick start
快速开始
bash
undefinedbash
undefined1. Black-Scholes (europea)
1. Black-Scholes(欧式期权)
py scripts/option_pricing.py bs --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20
py scripts/option_pricing.py bs --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20
2. Binomial CRR (europea o americana)
2. Binomial CRR(欧式或美式期权)
py scripts/option_pricing.py binomial --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20 --style american
py scripts/option_pricing.py binomial --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20 --style american
3. Trinomial (europea o americana)
3. Trinomial(欧式或美式期权)
py scripts/option_pricing.py trinomial --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20
py scripts/option_pricing.py trinomial --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20
4. Monte Carlo (europea, antithetic variates)
4. Monte Carlo(欧式期权,对偶变量)
py scripts/option_pricing.py mc --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20 --paths 200000
py scripts/option_pricing.py mc --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20 --paths 200000
5. Longstaff-Schwartz (americana via MC)
5. Longstaff-Schwartz(基于蒙特卡洛的美式期权定价)
py scripts/option_pricing.py lsm --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20
--style american --paths 100000 --steps 50
--style american --paths 100000 --steps 50
py scripts/option_pricing.py lsm --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20
--style american --paths 100000 --steps 50
--style american --paths 100000 --steps 50
6. Barone-Adesi-Whaley (americana closed-form)
6. Barone-Adesi-Whaley(美式闭式解)
py scripts/option_pricing.py bs2 --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20 --q 0.04
--style american
--style american
py scripts/option_pricing.py bs2 --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20 --q 0.04
--style american
--style american
7. Greeks analiticos (BS)
7. 解析希腊字母(基于BS模型)
py scripts/option_pricing.py greeks --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20
py scripts/option_pricing.py greeks --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20
8. Implied volatility
8. 隐含波动率
py scripts/option_pricing.py iv --S 100 --K 100 --T 0.25 --r 0.05 --price 4.62
py scripts/option_pricing.py iv --S 100 --K 100 --T 0.25 --r 0.05 --price 4.62
9. P(ITM) y P(Profit) bajo medida risk-neutral Q
9. 风险中性测度Q下的实值概率(P(ITM))与盈利概率(P(Profit))
py scripts/option_pricing.py pitm --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20
py scripts/option_pricing.py pitm --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20 --premium 4.62
py scripts/option_pricing.py pitm --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20
py scripts/option_pricing.py pitm --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20 --premium 4.62
10. Superficie de precios across strikes
10. 不同行权价的价格曲面
py scripts/option_pricing.py surface --S 100 --T 0.25 --r 0.05 --sigma 0.20
--K-min 80 --K-max 120 --K-step 5
--K-min 80 --K-max 120 --K-step 5
py scripts/option_pricing.py surface --S 100 --T 0.25 --r 0.05 --sigma 0.20
--K-min 80 --K-max 120 --K-step 5
--K-min 80 --K-max 120 --K-step 5
11. Heston 1993 (vol estocastica, sonrisa via Fourier)
11. Heston 1993(随机波动率,通过Fourier实现波动率微笑)
py scripts/option_pricing.py heston --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20
--v0 0.04 --kappa 2.0 --theta 0.04 --sigma_v 0.3 --rho -0.5
--v0 0.04 --kappa 2.0 --theta 0.04 --sigma_v 0.3 --rho -0.5
py scripts/option_pricing.py heston --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20
--v0 0.04 --kappa 2.0 --theta 0.04 --sigma_v 0.3 --rho -0.5
--v0 0.04 --kappa 2.0 --theta 0.04 --sigma_v 0.3 --rho -0.5
12. Bates 1996 (Heston + Merton jumps, captura crash risk)
12. Bates 1996(Heston+Merton跳跃模型,捕捉崩盘风险)
py scripts/option_pricing.py bates --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20
--v0 0.04 --kappa 2.0 --theta 0.04 --sigma_v 0.3 --rho -0.5
--lam 1.0 --mu_J -0.05 --sigma_J 0.10
--v0 0.04 --kappa 2.0 --theta 0.04 --sigma_v 0.3 --rho -0.5
--lam 1.0 --mu_J -0.05 --sigma_J 0.10
py scripts/option_pricing.py bates --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20
--v0 0.04 --kappa 2.0 --theta 0.04 --sigma_v 0.3 --rho -0.5
--lam 1.0 --mu_J -0.05 --sigma_J 0.10
--v0 0.04 --kappa 2.0 --theta 0.04 --sigma_v 0.3 --rho -0.5
--lam 1.0 --mu_J -0.05 --sigma_J 0.10
13. Comparar todos los metodos aplicables
13. 对比所有适用方法
py scripts/option_pricing.py all --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20
py scripts/option_pricing.py all --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20
Validar contra casos de assets/validation_cases.json
验证资产/validation_cases.json中的测试用例
py scripts/option_pricing.py validate
py scripts/option_pricing.py validate
Benchmark de todos los metodos
所有方法的基准测试
py scripts/option_pricing.py bench --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20
---py scripts/option_pricing.py bench --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20
---Estructura del skill
工具结构
skills/option-pricing/
├── SKILL.md # Este archivo (guia rapida)
├── references/
│ └── REFERENCE.md # Teoria completa de los 5 metodos
├── assets/
│ ├── defaults.json # Parametros default para el CLI
│ └── validation_cases.json # Casos de test (Hull Examples + extra)
└── scripts/
└── option_pricing.py # CLI con 15 modos + validate + benchskills/option-pricing/
├── SKILL.md # 本文件(快速指南)
├── references/
│ └── REFERENCE.md # 5种方法的完整理论文档
├── assets/
│ ├── defaults.json # CLI默认参数
│ └── validation_cases.json # 测试用例(含Hull示例及额外用例)
└── scripts/
└── option_pricing.py # 包含15种模式+验证+基准测试的CLIParametros del CLI (comunes a todos los modos)
CLI通用参数(所有模式适用)
| Flag | Default | Descripcion |
|---|---|---|
| 100.0 | Spot price del subyacente |
| 100.0 | Strike |
| 0.25 | Tiempo a maturity en anos (0.25 = 3 meses) |
| 0.05 | Tasa libre de riesgo (continua anual) |
| 0.0 | Dividend yield continuo anual |
| 0.20 | Volatilidad anualizada |
| call | call o put |
| european | european o american |
| 500 | Pasos del tree / pasos temporales de LSM |
| 100000 | Paths de Monte Carlo |
| 42 | Seed para reproducibilidad |
| True | Activar variates antitetic (MC) |
| False | Output en JSON en vez de tabla |
Defaults se cargan de (modificables).
assets/defaults.json| 标记 | 默认值 | 描述 |
|---|---|---|
| 100.0 | 标的资产现货价格 |
| 100.0 | 行权价 |
| 0.25 | 到期时间(年,0.25即3个月) |
| 0.05 | 连续年化无风险利率 |
| 0.0 | 连续年化股息率 |
| 0.20 | 年化波动率 |
| call | call(看涨期权)或put(看跌期权) |
| european | european(欧式)或american(美式) |
| 500 | 树模型步数 / LSM时间步数 |
| 100000 | 蒙特卡洛模拟路径数 |
| 42 | 随机种子(保证可复现) |
| True | 启用对偶变量(蒙特卡洛) |
| False | 输出格式为JSON而非表格 |
默认参数加载自(可修改)。
assets/defaults.jsonLos 9 metodos + benchmarks (medidos en Python 3.14 + numpy 2.4.4)
9种方法+基准测试(基于Python 3.14 + numpy 2.4.4实测)
Inputs del benchmark (ATM call, mismos valores para todos los metodos):
. Medido con 2000 reps (o
menos para metodos lentos), Windows 11. No asumido — medido con
sobre la funcion expuesta por el skill.
S=100, K=100, T=0.25, r=0.05, q=0, sigma=0.20time.perf_counter()| Metodo | Time complexity | us/op (medido) | ops/sec | Estilo | Error tipico |
|---|---|---|---|---|---|
Black-Scholes | O(1) | 2.4 us | 419k/s | European | 0 (closed) |
P(ITM) | O(1) | 1.1 us | 908k/s | Ambos | 0 (closed N(d2)) |
Greeks (BS) | O(1) | 3.9 us | 257k/s | European | 0 (closed) |
BS2/BAW | O(1) | 3.6 us | 276k/s | American | <1% vs binomial N=2000 |
IV solve | O(log(1/eps) * 1 opcion) | 82 us | 12k/s | Ambos | 1e-7 |
Heston | O(N_GL) ~ O(1) | 398 us | 2.5k/s | European | <0.1% |
Binomial N=500 | O(N^2) | 5.6 ms | 178/s | Ambos | ~0.5% |
Bates | O(15 * N_GL) | 6.2 ms | 160/s | European | <0.5% |
MC paths=10k | O(paths) | 1.3 ms | 788/s | European | ~1% (stderr) |
Trinomial N=500 | O(N^2) | 9.4 ms | 107/s | Ambos | ~0.3% |
MC paths=100k | O(paths) | 5.6 ms | 177/s | European | ~0.1% (stderr) |
Binomial N=2000 | O(N^2) | 31 ms | 32/s | Ambos | ~0.1% |
LSM paths=10k | O(paths * steps) | ~150 ms | ~7/s | American | ~1-2% |
基准测试输入(平值看涨期权,所有方法参数一致):
。测试重复2000次(慢方法次数更少),环境为Windows 11。数据为实测值 — 通过统计工具暴露的函数耗时。
S=100, K=100, T=0.25, r=0.05, q=0, sigma=0.20time.perf_counter()| 方法 | 时间复杂度 | 微秒/单期权(实测) | 单/秒 | 类型 | 典型误差 |
|---|---|---|---|---|---|
Black-Scholes | O(1) | 2.4 | 419k/s | 欧式 | 0(闭式解) |
P(ITM) | O(1) | 1.1 | 908k/s | 两者均支持 | 0(基于N(d2)闭式解) |
Greeks (BS) | O(1) | 3.9 | 257k/s | 欧式 | 0(闭式解) |
BS2/BAW | O(1) | 3.6 | 276k/s | 美式 | 与Binomial N=2000相比误差<1% |
IV solve | O(log(1/eps) * 1单期权) | 82 | 12k/s | 两者均支持 | 1e-7 |
Heston | O(N_GL) ~ O(1) | 398 | 2.5k/s | 欧式 | <0.1% |
Binomial N=500 | O(N^2) | 5600 | 178/s | 两者均支持 | ~0.5% |
Bates | O(15 * N_GL) | 6200 | 160/s | 欧式 | <0.5% |
MC paths=10k | O(paths) | 1300 | 788/s | 欧式 | ~1%(标准误) |
Trinomial N=500 | O(N^2) | 9400 | 107/s | 两者均支持 | ~0.3% |
MC paths=100k | O(paths) | 5600 | 177/s | 欧式 | ~0.1%(标准误) |
Binomial N=2000 | O(N^2) | 31000 | 32/s | 两者均支持 | ~0.1% |
LSM paths=10k | O(paths * steps) | ~150000 | ~7/s | 美式 | ~1-2% |
Como leer esta tabla
表格解读
- us/op = microsegundos por opcion (mas bajo = mas rapido)
- ops/sec = operaciones por segundo que se pueden hacer en backtesting
- Para backtesting masivo (>10k opciones por ejecucion): usar ,
bs,bs2(todos >2.5k/s)heston - Para validacion contra un valor conocido: (0.1% error)
binomial --steps 2000 - Para sonrisa/calibracion: (~400 us, O(1))
heston - Para stress testing con crashes: (~6 ms, O(1) con serie truncada)
bates - Para Americanas en masa: (3.6 us) — NO
bs2(5.6 ms) nibinomial(150 ms)lsm
- us/op = 微秒/单期权(数值越小速度越快)
- ops/sec = 每秒处理单期权数(回测时的处理能力)
- 对于大规模回测(单次执行>10k单期权):使用、
bs、bs2(均>2.5k单/秒)heston - 用于验证已知值:使用(误差0.1%)
binomial --steps 2000 - 用于波动率微笑/校准:使用(约400微秒,O(1))
heston - 用于崩盘压力测试:使用(约6毫秒,截断级数下O(1))
bates - 用于批量美式期权:使用(3.6微秒)— 不要使用
bs2(5.6毫秒)或binomial(150毫秒)lsm
Resumen de time complexity
时间复杂度总结
- O(1) closed-form: BS, BS2/BAW, Heston (Fourier), P(ITM), Greeks, IV
- O(N^2) tree: Binomial CRR, Trinomial Boyle
- O(paths): MC, MC antithetic
- O(paths * steps): LSM, MCS con paths
- O(15) serie: Bates (15 terminos Heston)
Regla para backtesting: las 3 closed-form (BS, BS2, Heston) corren
~300k ops/sec combinadas. Para 1M opciones se tarda ~3 seg. Suficiente
para backtests de 1-2 semanas de data historica con multiples strikes/expiries.
- O(1)闭式解:BS、BS2/BAW、Heston(Fourier)、P(ITM)、Greeks、IV
- O(N^2)树模型:Binomial CRR、Trinomial Boyle
- O(paths):MC、MC对偶变量
- O(paths * steps):LSM、带路径的MCS
- O(15)级数:Bates(15项Heston级数)
回测规则:3种闭式解方法(BS、BS2、Heston)合计约300k单/秒。处理1M单期权约需3秒,足以支撑1-2周历史数据、多行权价/到期日的回测需求。
Los 5 metodos (legacy)
5种经典方法(旧版)
—
1. Black-Scholes (bs
)
bsindustria. No funciona para americanas.
Cuando usar: cualquier opcion europea. Backtesting de masa (1M+
opciones/dia). Greeks analiticos (extension directa).
业界标准闭式解,仅支持欧式期权。
适用场景:任何欧式期权。大规模回测(每日1M+单期权)。解析希腊字母(直接扩展)。
2. Binomial Cox-Ross-Rubinstein (binomial
)
binomial2. Binomial Cox-Ross-Rubinstein (binomial
)
binomialArbol discreto. Soporta europeas Y americanas con ejercicio temprano.
O(N^2), ~3 ms/op con N=500. Convergencia O(1/N).
Cuando usar: opciones americanas con precision ~0.5% (N=2000) o
~0.1% (N=10000). Tambien para validar la implementacion de BS convergiendo
N->inf.
离散树模型,支持欧式与美式期权的提前行权。时间复杂度O(N^2),N=500时约3毫秒/单期权。收敛速度O(1/N)。
适用场景:需要0.5%精度(N=2000)或0.1%精度(N=10000)的美式期权。也可通过N→∞验证BS实现的正确性。
3. Trinomial Boyle (trinomial
)
trinomial3. Trinomial Boyle (trinomial
)
trinomialArbol con 3 branches (up/middle/down). Similar al binomial pero mejor
condicionamiento numerico. ~1.5x mas lento que binomial para mismo N, pero
necesita ~30% menos pasos para misma precision.
Cuando usar: cuando binomial da oscilaciones raras (T largo, sigma
alto). Alternativa con convergencia mas estable.
包含3个分支(上涨/持平/下跌)的树模型。与Binomial类似,但数值稳定性更好。相同N下比Binomial慢约1.5倍,但达到相同精度所需步数少约30%。
适用场景:当Binomial出现异常波动(到期时间长、波动率高)时。收敛更稳定的替代方案。
4. Monte Carlo con antithetic variates (mc
)
mc4. 带对偶变量的蒙特卡洛 (mc
)
mcSimulacion. Solo europeas. O(paths), ~25 ms/op con paths=100k.
Antithetic variates reduce varianza ~50-70% (factor 2-3x en samples
efectivos).
Cuando usar: opciones path-dependent (asianas, barrier, lookback) — el
skill no las implementa aun pero el framework es extensible. Validacion de
BS con ruido MC. Opciones con payoffs custom.
模拟方法,仅支持欧式期权。时间复杂度O(paths),paths=100k时约25毫秒/单期权。对偶变量可降低方差约50-70%(有效样本量提升2-3倍)。
适用场景:路径依赖型期权(亚式、障碍、回望)— 本工具暂未实现,但框架可扩展。用MC噪声验证BS。自定义收益结构的期权。
5. Longstaff-Schwartz (lsm
)
lsm5. Longstaff-Schwartz (lsm
)
lsmMonte Carlo para americanas. Regresion least-squares sobre polinomios de
S para estimar continuation value. O(paths * steps), ~50 ms/op con
paths=100k, steps=50.
Cuando usar: opciones americanas con payoffs complejos donde BAW no
aplica. Multi-asset american (basket options). Da lower bound del
precio verdadero.
针对美式期权的蒙特卡洛方法。基于S的多项式进行最小二乘回归,估算续期价值。时间复杂度O(paths * steps),paths=100k、steps=50时约50毫秒/单期权。
适用场景:BAW不适用的复杂收益结构美式期权。多资产美式期权(一篮子期权)。提供真实价格的下界。
Bonus: Barone-Adesi-Whaley (bs2
)
bs2附加功能:Barone-Adesi-Whaley (bs2
)
bs2Closed-form aproximada para americanas. O(1), ~1.4 us/op — tan rapido
como BS. Error <1% vs binomial N=2000. Para cae a binomial
internamente.
q >= rCuando usar: backtesting de opciones americanas en masa. Reemplazo de
binomial cuando se necesita O(1) por opcion.
美式期权的近似闭式解。时间复杂度O(1),约1.4微秒/单期权 — 与BS速度相当。与Binomial N=2000相比误差<1%。当时自动切换为Binomial模型。
q >= r适用场景:批量美式期权回测。当需要O(1)单期权耗时时代替Binomial。
Bonus: Implied Volatility (iv
)
iv附加功能:隐含波动率 (iv
)
ivResuelve dado un precio de mercado observado. Bisection,
~0.6 ms por solve. Para europeas usa BS; para americanas usa binomial
N=500 como pricing engine.
sigma_implCuando usar: cuando tenes precios de mercado y queres inferir la
volatilidad que el mercado esta priceando. Input para superficies de
vol y modelos de vol estocastica.
根据观察到的市场价格求解隐含波动率。采用二分法,每次求解约0.6毫秒。欧式期权使用BS模型;美式期权使用N=500的Binomial作为定价引擎。
sigma_impl适用场景:拥有市场价格时,推断市场定价的波动率。作为波动率曲面与随机波动率模型的输入。
Bonus: P(ITM) y P(Profit) (pitm
)
pitm附加功能:实值概率(P(ITM))与盈利概率(P(Profit)) (pitm
)
pitmProbabilidad bajo la medida risk-neutral Q (no real-world) de que
la opcion termine ITM al vencimiento. Closed-form via / ,
~300 ns/op.
N(d2)N(-d2)- P(ITM): para call,
N(d2)para putN(-d2) - P(Profit): con strike efectivo
N(d2')K +/- premium
Cuando usar: filtrar trades con en backtesting,
calcular expected value, comparar estrategias con misma prima pero
distinta P(Profit), sizing con Kelly criterion.
P(Profit) > X%CUIDADO: la drift bajo Q es , no la real. Para probabilidad
real-world, pasar la drift esperada como (no la risk-free).
r - qr风险中性测度Q(非真实世界)下,期权到期时处于实值状态的概率。通过 / 闭式解计算,约300纳秒/单期权。
N(d2)N(-d2)- P(ITM):看涨期权为,看跌期权为
N(d2)N(-d2) - P(Profit):有效行权价为时的
K +/- 权利金N(d2')
适用场景:回测中筛选的交易,计算期望值,比较权利金相同但P(Profit)不同的策略,使用Kelly准则调整仓位。
P(Profit) > X%注意:测度Q下的漂移为,而非真实世界漂移。如需真实世界概率,将预期漂移作为传入(而非无风险利率)。
r - qrEjemplos practicos
实用示例
Backtesting de estrategia long-volatility sobre SPY
SPY波动率多头策略回测
bash
undefinedbash
undefinedPara cada dia historico:
针对每个历史交易日:
1. Obtener IV actual (e.g. de yahoo-finance) y precio de mercado
1. 获取当前隐含波动率(例如从yahoo-finance)与市场价格
2. Calcular precio teorico con IV_historica
2. 使用历史隐含波动率计算理论价格
3. Comparar contra precio de mercado
3. 与市场价格对比
Precio teorico con IV_historica
基于历史隐含波动率的理论价格
py scripts/option_pricing.py bs --S 580 --K 580 --T 0.08 --r 0.05 --sigma 0.18
py scripts/option_pricing.py bs --S 580 --K 580 --T 0.08 --r 0.05 --sigma 0.18
-> 12.34
-> 12.34
Precio teorico con IV_actual (subestimada por el mercado)
基于当前隐含波动率(市场低估)的理论价格
py scripts/option_pricing.py bs --S 580 --K 580 --T 0.08 --r 0.05 --sigma 0.22
py scripts/option_pricing.py bs --S 580 --K 580 --T 0.08 --r 0.05 --sigma 0.22
-> 15.67
-> 15.67
P&L esperado = (market - teorico) = 15.67 - 12.34 = +3.33 (long vol paga)
预期盈亏 = (理论价格 - 市场价格) = 15.67 - 12.34 = +3.33(波动率多头盈利)
undefinedundefinedComputar IV sobre toda la cadena de opciones
计算整条期权链的隐含波动率
bash
undefinedbash
undefinedPara cada strike/expiry:
针对每个行权价/到期日:
py scripts/option_pricing.py iv --S 580 --K 590 --T 0.08 --r 0.05 --price 8.50
py scripts/option_pricing.py iv --S 580 --K 590 --T 0.08 --r 0.05 --price 8.50
-> 0.2145 (la IV implicita de esa opcion)
-> 0.2145(该期权的隐含波动率)
undefinedundefinedGreeks para delta-hedging
Delta对冲的希腊字母计算
bash
py scripts/option_pricing.py greeks --S 580 --K 580 --T 0.08 --r 0.05 --sigma 0.20 --jsonbash
py scripts/option_pricing.py greeks --S 580 --K 580 --T 0.08 --r 0.05 --sigma 0.20 --jsonDevuelve {delta: 0.512, gamma: 0.018, vega: 0.85, theta: -0.12, rho: 0.31}
返回结果 {delta: 0.512, gamma: 0.018, vega: 0.85, theta: -0.12, rho: 0.31}
Comprar 1000 opc + short 512 acciones = delta neutral
买入1000张期权 + 做空512股股票 = Delta中性
undefinedundefinedPricing de opcion americana sobre dividendo payer
分红标的美式期权定价
bash
undefinedbash
undefinedOpcion sobre indice con yield alto (e.g. SPX con div yield ~1.5%)
高股息率指数期权(例如SPX股息率~1.5%)
py scripts/option_pricing.py bs2 --S 5800 --K 5800 --T 0.25 --r 0.05 --q 0.015
--sigma 0.18 --type call --style american
--sigma 0.18 --type call --style american
py scripts/option_pricing.py bs2 --S 5800 --K 5800 --T 0.25 --r 0.05 --q 0.015
--sigma 0.18 --type call --style american
--sigma 0.18 --type call --style american
-> ~123.45 (vs BS europea ~120.10, premium de early exercise = $3.35)
-> 123.45(对比欧式BS价格120.10,提前行权溢价=3.35美元)
undefinedundefinedComparar todos los metodos aplicables
对比所有适用方法
El modo ejecuta todos los metodos compatibles con el elegido,
mas las utilidades (P(ITM), P(Profit), Greeks).
all--stylebash
undefinedall--stylebash
undefinedEjemplo 1: American put (Hull 21.1)
示例1:美式看跌期权(Hull 21.1)
py scripts/option_pricing.py all --S 50 --K 50 --T 0.4167 --r 0.10 --sigma 0.40
--type put --style american
--type put --style american
py scripts/option_pricing.py all --S 50 --K 50 --T 0.4167 --r 0.10 --sigma 0.40
--type put --style american
--type put --style american
Output (9 rows: BS, Binomial, Trinomial, MC, LSM, BS2, P(ITM), P(Profit), Greeks):
输出(9行:BS、Binomial、Trinomial、MC、LSM、BS2、P(ITM)、P(Profit)、Greeks):
+---------------------------+------------------+-----------------------+
+---------------------------+------------------+-----------------------+
| Method | Config | Price / Value |
| Method | Config | Price / Value |
+---------------------------+------------------+-----------------------+
+---------------------------+------------------+-----------------------+
| Black-Scholes | closed-form O(1) | 4.076101 | (europea ref)
| Black-Scholes | closed-form O(1) | 4.076101 | (欧式参考价)
| Binomial CRR | N=500 | 4.283160 |
| Binomial CRR | N=500 | 4.283160 |
| Trinomial | N=500 | 4.283429 |
| Trinomial | N=500 | 4.283429 |
| Monte Carlo | paths=100000 | 4.077892 +/- 0.0254 | (europea)
| Monte Carlo | paths=100000 | 4.077892 +/- 0.0254 | (欧式)
| Longstaff-Schwartz | paths=100000 | 4.258337 |
| Longstaff-Schwartz | paths=100000 | 4.258337 |
| BS2/BAW (closed-form) | O(1) | 4.283766 |
| BS2/BAW (closed-form) | O(1) | 4.283766 |
| P(ITM) | N(d2) bajo Q | 0.4871 |
| P(ITM) | N(d2) bajo Q | 0.4871 |
| P(Profit) vs BS price | premio=4.0761 | 0.3588 |
| P(Profit) vs BS price | 权利金=4.0761 | 0.3588 |
| Greeks (delta/gamma/vega) | BS closed-form | d=-0.3857 g=+0.0296 |
| Greeks (delta/gamma/vega) | BS closed-form | d=-0.3857 g=+0.0296 |
+---------------------------+------------------+-----------------------+
+---------------------------+------------------+-----------------------+
Ejemplo 2: European call (incluye Heston y Bates, NO incluye LSM/BS2)
示例2:欧式看涨期权(包含Heston与Bates,不含LSM/BS2)
py scripts/option_pricing.py all --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20
py scripts/option_pricing.py all --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20
Output (9 rows: BS, Binomial, Trinomial, MC, Heston, Bates, P(ITM), P(Profit), Greeks):
输出(9行:BS、Binomial、Trinomial、MC、Heston、Bates、P(ITM)、P(Profit)、Greeks):
+---------------------------+----------------------------------------+-----------------------+
+---------------------------+----------------------------------------+-----------------------+
| Method | Config | Price / Value |
| Method | Config | Price / Value |
+---------------------------+----------------------------------------+-----------------------+
+---------------------------+----------------------------------------+-----------------------+
| Black-Scholes | closed-form O(1) | 4.614997 |
| Black-Scholes | closed-form O(1) | 4.614997 |
| Binomial CRR | N=500 | 4.613001 |
| Binomial CRR | N=500 | 4.613001 |
| Trinomial | N=500 | 4.613999 |
| Trinomial | N=500 | 4.613999 |
| Monte Carlo | paths=100000 | 4.620907 +/- 0.0295 |
| Monte Carlo | paths=100000 | 4.620907 +/- 0.0295 |
| Heston 1993 | v0=s2, k=2, th=s2, sv=0.3, rho=-0.5 | 4.577095 |
| Heston 1993 | v0=s2, k=2, th=s2, sv=0.3, rho=-0.5 | 4.577095 |
| Bates 1996 | Heston + lam=1, mu_J=-0.05, sig_J=0.10 | 4.924756 |
| Bates 1996 | Heston + lam=1, mu_J=-0.05, sig_J=0.10 | 4.924756 |
| P(ITM) | N(d2) bajo Q | 0.5299 |
| P(ITM) | N(d2) bajo Q | 0.5299 |
| P(Profit) vs BS price | premio=4.6150 | 0.3534 |
| P(Profit) vs BS price | 权利金=4.6150 | 0.3534 |
| Greeks (delta/gamma/vega) | BS closed-form | d=+0.5695 g=+0.0393 |
| Greeks (delta/gamma/vega) | BS closed-form | d=+0.5695 g=+0.0393 |
+---------------------------+----------------------------------------+-----------------------+
+---------------------------+----------------------------------------+-----------------------+
**Reglas del `all`**:
- `--style american`: incluye LSM y BS2 (los unicos metodos para americanas)
- `--style european`: incluye Heston y Bates (son european-only)
- Ambos: BS, Binomial, Trinomial, MC, P(ITM), P(Profit), Greeks
Parametros default de Heston/Bates cuando se invoca via `all` (calibrados a
equity US tipico): `v0=sigma^2, kappa=2, theta=v0, sigma_v=0.3, rho=-0.5,
lambda=1, mu_J=-0.05, sigma_J=0.10`. Para parametros custom, usar los
modos `heston` / `bates` directamente.
---
**`all`模式规则**:
- `--style american`:包含LSM与BS2(仅有的美式期权方法)
- `--style european`:包含Heston与Bates(仅支持欧式期权)
- 两种模式均包含:BS、Binomial、Trinomial、MC、P(ITM)、P(Profit)、Greeks
通过`all`模式调用时,Heston/Bates的默认参数(校准至典型美股):`v0=sigma^2, kappa=2, theta=v0, sigma_v=0.3, rho=-0.5, lambda=1, mu_J=-0.05, sigma_J=0.10`。如需自定义参数,请直接使用`heston`/`bates`模式。
---Casos de uso NO soportados
不支持的场景
- Opciones path-dependent (asianas, barrier, lookback): el skill solo implementa MC para europeas. Extender el framework con funciones de payoff custom.
- Opciones exoticas multi-asset (basket, rainbow, spread): el LSM puede extenderse facilmente. Documentar caso por caso.
- Dividendos discretos: el modelo asume dividend yield continuo . Para dividendos discretos (e.g. fechas conocidas) usar q equivalente o ajustar el modelo.
q - Stochastic volatility (Heston, SABR): no implementado. Para backtesting de estos modelos se necesita otra libreria (QuantLib).
- 路径依赖型期权(亚式、障碍、回望):本工具仅实现了欧式期权的MC方法。可扩展框架添加自定义收益函数。
- 多资产奇异期权(一篮子、彩虹、价差):LSM可轻松扩展。需逐个场景文档说明。
- 离散分红:模型假设连续股息率。对于离散分红(例如已知分红日期),可使用等效q或调整模型。
q - 随机波动率模型(Heston、SABR):未实现。如需回测这些模型,需使用其他库(如QuantLib)。
Performance tips para backtesting masivo
大规模回测性能优化技巧
- Usar BS o BAW siempre que sea posible. Son ~2000x mas rapidos que binomial.
- Evitar allocs innecesarias: para un batch de 1M opciones, las funciones ya son O(1)/op. No se puede mejorar mucho mas en Python puro.
- Reusar : crear uno solo y pasar la seed a MC/LSM. El default de la CLI ya usa
numpy.random.Generator.default_rng - Vectorizar inputs: las funciones del skill aceptan escalares. Para
vectorizar sobre un array, usar o mapear manualmente. La libreria
np.vectorize(bs_price)puede dar 10-50x speedup adicional si se compila JIT.numba - Precomputar factores comunes: para un batch donde solo cambia S,
precomputar y solo variar S en el loop.
T, r, q, sigma, K
- 尽可能使用BS或BAW:它们比Binomial快约2000倍。
- 避免不必要的内存分配:处理1M单期权时,函数已达到O(1)/单的效率。纯Python环境下难以进一步优化。
- 复用:仅创建一个生成器并将种子传入MC/LSM。CLI默认已使用
numpy.random.Generator。default_rng - 向量化输入:工具函数支持标量输入。如需对数组向量化,可使用或手动映射。使用
np.vectorize(bs_price)进行JIT编译可额外提升10-50倍速度。numba - 预计算公共因子:仅S变化的批量计算中,预计算,仅在循环中改变S。
T, r, q, sigma, K
Validacion
验证功能
El modo corre 10 casos de
(5 europeos, 4 americanos, 1 put-call parity) y reporta pass/fail:
validateassets/validation_cases.jsonbash
py scripts/option_pricing.py validatevalidateassets/validation_cases.jsonbash
py scripts/option_pricing.py validate=== Black-Scholes European ===
=== Black-Scholes European ===
[OK] Hull 9th ed Example 15.6 (ATM call): got 4.7594, ref 4.7594
[OK] Hull第9版示例15.6(平值看涨期权):计算值4.7594,参考值4.7594
[OK] ... (5/5 pass)
[OK] ... (5/5通过)
=== American (Binomial N=2000) ===
=== American (Binomial N=2000) ===
[OK] Hull 9th ed Example 21.1: got 4.2841, ref 4.2841
[OK] Hull第9版示例21.1:计算值4.2841,参考值4.2841
[OK] ... (4/4 pass)
[OK] ... (4/4通过)
=== Put-Call Parity (BS) ===
=== Put-Call Parity (BS) ===
[OK] C - P = 4.8770575499, Sexp(-qT) - Kexp(-rT) = 4.8770575499
[OK] C - P = 4.8770575499, Sexp(-qT) - Kexp(-rT) = 4.8770575499
0 failure(s)
0个失败用例
Para agregar casos custom, editar `assets/validation_cases.json`.
---
如需添加自定义测试用例,编辑`assets/validation_cases.json`即可。
---API como libreria (no solo CLI)
作为库使用(不仅限于CLI)
Las funciones se pueden importar directamente en Python:
python
from scripts.option_pricing import bs_price, binomial_price, mc_european_price, lsm_price, bs2_american_price, bs_greeks, implied_vol可直接在Python中导入函数:
python
from scripts.option_pricing import bs_price, binomial_price, mc_european_price, lsm_price, bs2_american_price, bs_greeks, implied_volPricing
定价计算
c = bs_price(100, 100, 0.25, 0.05, 0.0, 0.20, "call") # 4.615
p = binomial_price(100, 100, 0.25, 0.05, 0.0, 0.20, 500, "put", "european")
c = bs_price(100, 100, 0.25, 0.05, 0.0, 0.20, "call") # 4.615
p = binomial_price(100, 100, 0.25, 0.05, 0.0, 0.20, 500, "put", "european")
Greeks (solo BS)
希腊字母(仅BS模型)
g = bs_greeks(100, 100, 0.25, 0.05, 0.0, 0.20, "call")
g = bs_greeks(100, 100, 0.25, 0.05, 0.0, 0.20, "call")
-> {"delta": 0.569, "gamma": 0.039, "vega": 19.64, "theta": -10.47, "rho": 13.08}
-> {"delta": 0.569, "gamma": 0.039, "vega": 19.64, "theta": -10.47, "rho": 13.08}
Implied vol
隐含波动率
iv = implied_vol(4.62, 100, 100, 0.25, 0.05, 0.0, "call", "european")
iv = implied_vol(4.62, 100, 100, 0.25, 0.05, 0.0, "call", "european")
-> 0.2003
-> 0.2003
Todas las funciones son **flat** (sin clases), aceptan escalares y
devuelven floats. Para vectores, usar `np.vectorize` o comprehensions.
---
所有函数均为**扁平化**(无类结构),支持标量输入并返回浮点数。如需处理向量,可使用`np.vectorize`或列表推导式。
---Licencia
许可证
MIT
MIT