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 ...
随机推荐
- K8S CoreDNS部署失败,问题分析
1. 查询k8s集群部署pod的基本情况 如下图,我们可知容器coredns和dnsutils都部署成功,但是由于域名解析的问题,导致coredns和dnsutils的容器不断重启(原因heath检查 ...
- 解决plsql中文显示问号(???)问题
最近新买的电脑,配置好数据库连接后,plsql查看数据与插入中文数据都显示问号(???),同事的都正常显示,查看了很多资料,有的说是数据库字符集的原因让修改数据库的字符集,但是我的数据库都是远程连接正 ...
- Python学习笔记之测试函数
11-1 城市和国家:编写一个函数,它接受两个形参:一个城市名和一个国家名.这个函数返回一个格式为City, Country 的字符串,如Santiago, Chile.将这个函数存储在一个名为cit ...
- Linux 下的 mysql 自动备份
Linux 下实现自动备份,主要就是编写好执行备份的 shell script( *.sh )文件,设好权限(可读,可执行).然后利用 Linux 定时任务 crontab 来执行备份脚本就可以了.以 ...
- 来自数组原型 Array.prototype 的遍历函数
1. Array.prototype.forEach() forEach() 是一个专为遍历数组而生的方法,它没有返回值,也不会改变原数组,只是简单粗暴的将数组遍历一次 参数: callback() ...
- javaEE复习重点个人总结
最近在学院或集队的群里看见最多的就是求javaEE大作业了,那么突然有感而发,写点参考性的期末复习总结. 第一章JavaEE 概述: 1:两层体系应用体系结构 安全性低,部署困难,消耗系统资源 2 三 ...
- REDELK的安装和使用
0x00 前言简介 红队的SIEM有两个主要目标: 通过创建一个集中管理中心,收集和丰富来自多个 teamservers的所有相关操作日志,增强了红队人员的可用性和概述.这对于在操作中进行历史搜索以及 ...
- android自定义圆角实线边框,圆角虚线边框,直实线,虚实线,半圆角边框
先上图 在现实项目开发中,单纯的Button,EditText等控件远远不能满足我们项目的UI设计需求,这时候,我们就需要自己动手丰衣足食啦.接下来先给大家介绍一些属性,备注写的都非常清楚啦,我就不啰 ...
- WorkFlow三:配BO对象,事件触发工作流
1.新建个BO对象的字段. 2.新建取数函数: 3.运行事物代码SWO1新建BO对象. 4.新建关键字段: 5.新建BO对象的事件: 6.添加处理方法: 6.调整对象状态,这里是本地对象,不需要释放, ...
- sqlserver清空删除日志
USE [lzdxdb] GO ALTER DATABASE lzdxdb SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE lzdxdb SET ...