QuantLib 金融计算——案例之普通欧式期权分析
如果未做特别说明,文中的程序都是 python3 代码。
QuantLib 金融计算——案例之普通欧式期权分析
载入 QuantLib 和其他包:
import QuantLib as ql
import numpy as np
import pandas as pd
print(ql.__version__)
1.15
概述
从金融工程中最简单的案例——“普通欧式期权公式法定价”入手,介绍 QuantLib 中期权分析的基本组件,以及如何将这些组件拼接成为一个完整的计算流程。
普通欧式期权公式法定价
采用《期权、期货及其他衍生产品(第 7 版)》第 17 章中的例子:
- 类型:普通欧式看涨期权
- 当前价格:49$
- 敲定价格:50$
- 无风险利率:5%
- 年化波动率:20%
- 期限:20 周
使用 BS 公式为上述期权定价,并计算希腊值。
1. 配置期权合约条款
# 配置日期计算条款
calendar = ql.UnitedStates(ql.UnitedStates.NYSE)
dayCounter = ql.Actual365Fixed(ql.Actual365Fixed.Standard)
todayDate = ql.Date(11, ql.July, 2019)
maturity = todayDate + ql.Period(20, ql.Weeks)
settlementDate = todayDate
# 配置期权参数
stock = 49
strike = 50
riskFreeRate = 0.05
volatility = 0.2
# 配置全局估值日期
ql.Settings.instance().evaluationDate = todayDate
2. 构建期权对象
# 配置行权条款
europeanExercise = ql.EuropeanExercise(maturity)
optionType = ql.Option.Call
payoff = ql.PlainVanillaPayoff(
type=optionType, strike=strike)
# 构建期权对象
europeanOption = ql.VanillaOption(
payoff=payoff,
exercise=europeanExercise)
3. 配置定价引擎
underlying = ql.SimpleQuote(stock)
underlyingH = ql.QuoteHandle(underlying)
# 无风险利率的期限结构
flatRiskFreeTS = ql.YieldTermStructureHandle(
ql.FlatForward(
settlementDate, riskFreeRate, dayCounter))
# 波动率的期限结构
flatVolTS = ql.BlackVolTermStructureHandle(
ql.BlackConstantVol(
settlementDate, calendar,
volatility, dayCounter))
# 构建 BS 过程
bsProcess = ql.BlackScholesProcess(
s0=underlyingH,
riskFreeTS=flatRiskFreeTS,
volTS=flatVolTS)
# 基于 BS 过程的公式定价引擎
pricingEngine = ql.AnalyticEuropeanEngine(
bsProcess)
europeanOption.setPricingEngine(pricingEngine)
4. 计算
# RESULTS
print("Option value =", europeanOption.NPV())
print("Delta value =", europeanOption.delta())
print("Theta value =", europeanOption.theta())
print("Theta perday =", europeanOption.thetaPerDay())
print("Gamma value =", europeanOption.gamma())
print("Vega value =", europeanOption.vega())
print("Rho value =", europeanOption.rho())
Option value = 2.395988448539984
Delta value = 0.5213970624832108
Theta value = -4.309457134907618
Theta perday = -0.011806731876459226
Gamma value = 0.06563585494066533
Vega value = 12.089225358769994
Rho value = 8.88039853654583
题外话:天数计算规则
上述例子中的计算结果和书中给出的结果略有出入,依经验判断,最有可能造成计算不一致的原因是“天数计算规则的不一致”。
详细来说,书中期权的期限是 20 周,作者认为 20 周等于 0.3846 年,可能的依据有:
- \(20 \times 7 / 364(\text{not } 365) \approx 0.3846\) (即 Actual/364)或
- \(20 \times 5(\text{weekday}) / [52(\approx 365/7)\times 5(\text{weekday})] \approx 0.3846\)
目前,QuantLib 中并不支持这两种天数计算规则。例子中出现的规则
Actual365Fixed(Actual365Fixed.Standard)认为 20 周等于 0.38356 年:print(dayCounter.yearFraction(settlementDate, maturity))
# 0.3835616438356164
对于期权来说,天数计算规则的影响可能微不足道,但是对于固定收益类金融工具及其衍生品来说,天数计算规则的选择至关重要,“失之毫厘,谬以千里”。
Quote 带来的便利
QuantLib 中有相当多的组件接受 Handle 类型的参数,而这些参数通常持有一个 Quote 类型的变量。借助“观察者模式”,用户修改 Quote 类型变量的值将会自动通知相关组件,并使其重新进行性计算,而无需再次构建一遍计算流程。对于某些用途来讲,这带来了相当大的便利。
# USE QUOTE
stock_array = np.arange(
start=30, stop=70, step=0.01)
NPV = np.array([np.nan] * len(stock_array))
delta = np.array([np.nan] * len(stock_array))
theta = np.array([np.nan] * len(stock_array))
# thetaPerDay = np.array([np.nan] * len(stock_array))
gamma = np.array([np.nan] * len(stock_array))
vega = np.array([np.nan] * len(stock_array))
rho = np.array([np.nan] * len(stock_array))
for i, v in enumerate(stock_array):
# 重置 Quote 对象的值
underlying.setValue(v)
# 无须再次配置计算流程,直接计算
NPV[i] = europeanOption.NPV()
delta[i] = europeanOption.delta()
theta[i] = europeanOption.theta()
# thetaPerDay[i] = europeanOption.thetaPerDay()
gamma[i] = europeanOption.gamma()
vega[i] = europeanOption.vega()
rho[i] = europeanOption.rho()
result = pd.DataFrame(
data=dict(
NPV=NPV,
delta=delta,
theta=theta,
# thetaPerDay=thetaPerDay,
gamma=gamma,
vega=vega, rho=rho),
index=stock_array)
result.plot(subplots=True)

总结
下面用一副图显示上述例子中的若干变量如何汇聚成一个计算流程:

QuantLib 金融计算——案例之普通欧式期权分析的更多相关文章
- QuantLib 金融计算——QuantLib 入门
目录 QuantLib 金融计算--QuantLib 入门 简介 主要功能 安装与使用 学习指南 The HARD Way The EASY Way QuantLib 金融计算--QuantLib 入 ...
- QuantLib 金融计算——数学工具之数值积分
目录 QuantLib 金融计算--数学工具之数值积分 概述 常见积分方法 高斯积分 如果未做特别说明,文中的程序都是 Python3 代码. QuantLib 金融计算--数学工具之数值积分 载入模 ...
- QuantLib 金融计算
我的微信:xuruilong100 <Implementing QuantLib>译后记 QuantLib 金融计算 QuantLib 入门 基本组件之 Date 类 基本组件之 Cale ...
- QuantLib 金融计算——基本组件之 Currency 类
目录 QuantLib 金融计算--基本组件之 Currency 类 概述 构造函数 成员函数 如果未做特别说明,文中的程序都是 python3 代码. QuantLib 金融计算--基本组件之 Cu ...
- QuantLib 金融计算——高级话题之模拟跳扩散过程
目录 QuantLib 金融计算--高级话题之模拟跳扩散过程 跳扩散过程 模拟算法 面临的问题 "脏"的方法 "干净"的方法 实现 示例 参考文献 如果未做特别 ...
- QuantLib 金融计算——修复 BatesProcess 中的两个 Bug
QuantLib 金融计算--修复 BatesProcess 中的两个 Bug 我发现了 BatesProcess 中的两个 Bug: 基类 HestonProcess::factors 的返回值取决 ...
- QuantLib 金融计算——基本组件之 Date 类
目录 QuantLib 金融计算--基本组件之 Date 类 Date 对象的构造 一些常用的成员函数 一些常用的静态函数 为估值计算配置日期 如果未做特别说明,文中的程序都是 Python3 代码. ...
- QuantLib 金融计算——基本组件之 Calendar 类
目录 QuantLib 金融计算--基本组件之 Calendar 类 Calendar 对象的构造 一些常用的成员函数 自定义假期列表 工作日修正 如果未做特别说明,文中的程序都是 Python3 代 ...
- QuantLib 金融计算——基本组件之 DayCounter 类
目录 QuantLib 金融计算--基本组件之 DayCounter 类 DayCounter 对象的构造 一些常用的成员函数 如果未做特别说明,文中的程序都是 Python3 代码. QuantLi ...
随机推荐
- Node.js自动本地重启服务器
node.js在本地项目中,更新 了代码 是不会自动刷新 的,要重启才能生效,每次更改代码又手动重启这样很麻烦. 可以安装 个supervisor.全局安装supervisor npm install ...
- mysql单个表拆分成多个表
一.横向拆分 create table 新表的名称 select * from 被拆分的表 order by id limit int1,int2 int1为其实位置,int2为几条 注意:这样拆分后 ...
- CPU和Memory压力测试方法
一:用原生Centos自带的工具 1. CPU 下面命令会创建 CPU 负荷,方法是通过压缩随机数据并将结果发送到 /dev/null: cat /dev/urandom | gzip -9 > ...
- 用 np.logspace() 创建等比数列
np.logspace( start, stop, num=50, endpoint=True, base=10.0, dtype=None, axis=0, ) Docstring: Return ...
- ACM模板(转载)
转载自:https://blog.csdn.net/f_zyj/article/details/51594851 创建自:https://blog.csdn.net/ZDL_0908/article/ ...
- LCD驱动程序之层次分析
1.回顾字符设备驱动程序: 字符设备驱动编写的一般步骤: 1)主设备号 2)构造file_operations结构体体 .open = xxxx .read = xxxxx 3)register_ch ...
- DataOps Reading Notes
质量.效率.成本.安全,是运维工作核心四要素. AIOps 技术会涉及到数据收集方面的基础监控,服务监控和业务监控,甚至会涉及到与持续交付流水线的数据和状态整合(比如在软件发布的阶段会自动关闭某些监控 ...
- nodemcu固件的烧录及lua开发
一.板子介绍 NodeMCU 1.0/ESP 8266 12E 该模块是安信可公司生产的,并且提供全部开发资料. 对该模块的开发有两种方式: 一种是基于乐鑫官方推出的SDK开发包在 安信可ESP的一体 ...
- Jmeter函数助手—自带方法
1.${__time()}---->当前时间,一串数字格式 2.${__time(yyyy-MM-dd)}----->当前日期,年-月-日格式 3.${__time(yyyy-MM-dd ...
- 网络编程——sockaddr 与 sockaddr_in
struct sockaddr 这个结构体是linux的网络编程接口中用来表示IP地址的标准结构体,bind.connect等函数中都需要这个结构体,这个结构体是兼容IPV4和IPV6的. 在实际编程 ...