QuantLib 金融计算——案例之普通欧式期权分析

2023-11-03 23:59

本文主要是介绍QuantLib 金融计算——案例之普通欧式期权分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • QuantLib 金融计算——案例之普通欧式期权分析
    • 概述
    • 普通欧式期权公式法定价
      • 1. 配置期权合约条款
      • 2. 构建期权对象
      • 3. 配置定价引擎
      • 4. 计算
      • 题外话:天数计算规则
    • Quote 带来的便利
    • 总结

如果未做特别说明,文中的程序都是 python3 代码。

QuantLib 金融计算——案例之普通欧式期权分析

载入 QuantLib 和其他包:

import QuantLib as ql
import numpy as np
import pandas as pdprint(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. 计算

# RESULTSprint("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 QUOTEstock_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)

232518-20190714170058131-252664972.png

总结

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

232518-20190714170105966-109512616.png

转载于:https://www.cnblogs.com/xuruilong100/p/11184791.html

这篇关于QuantLib 金融计算——案例之普通欧式期权分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/weixin_30352645/article/details/96444598
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/341781

相关文章

Java集成Onlyoffice的示例代码及场景分析

《Java集成Onlyoffice的示例代码及场景分析》:本文主要介绍Java集成Onlyoffice的示例代码及场景分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 需求场景:实现文档的在线编辑,团队协作总结:两个接口 + 前端页面 + 配置项接口1:一个接口,将o

Java Stream.reduce()方法操作实际案例讲解

《JavaStream.reduce()方法操作实际案例讲解》reduce是JavaStreamAPI中的一个核心操作,用于将流中的元素组合起来产生单个结果,:本文主要介绍JavaStream.... 目录一、reduce的基本概念1. 什么是reduce操作2. reduce方法的三种形式二、reduce

IDEA下"File is read-only"可能原因分析及"找不到或无法加载主类"的问题

《IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题》:本文主要介绍IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题,具有很好的参... 目录1.File is read-only”可能原因2.“找不到或无法加载主类”问题的解决总结1.File

Spring Boot 整合 Redis 实现数据缓存案例详解

《SpringBoot整合Redis实现数据缓存案例详解》Springboot缓存,默认使用的是ConcurrentMap的方式来实现的,然而我们在项目中并不会这么使用,本文介绍SpringB... 目录1.添加 Maven 依赖2.配置Redis属性3.创建 redisCacheManager4.使用Sp

springboot项目redis缓存异常实战案例详解(提供解决方案)

《springboot项目redis缓存异常实战案例详解(提供解决方案)》redis基本上是高并发场景上会用到的一个高性能的key-value数据库,属于nosql类型,一般用作于缓存,一般是结合数据... 目录缓存异常实践案例缓存穿透问题缓存击穿问题(其中也解决了穿透问题)完整代码缓存异常实践案例Red

Dubbo之SPI机制的实现原理和优势分析

《Dubbo之SPI机制的实现原理和优势分析》:本文主要介绍Dubbo之SPI机制的实现原理和优势,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Dubbo中SPI机制的实现原理和优势JDK 中的 SPI 机制解析Dubbo 中的 SPI 机制解析总结Dubbo中

C#继承之里氏替换原则分析

《C#继承之里氏替换原则分析》:本文主要介绍C#继承之里氏替换原则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#里氏替换原则一.概念二.语法表现三.类型检查与转换总结C#里氏替换原则一.概念里氏替换原则是面向对象设计的基本原则之一:核心思想:所有引py

Java计算经纬度距离的示例代码

《Java计算经纬度距离的示例代码》在Java中计算两个经纬度之间的距离,可以使用多种方法(代码示例均返回米为单位),文中整理了常用的5种方法,感兴趣的小伙伴可以了解一下... 目录1. Haversine公式(中等精度,推荐通用场景)2. 球面余弦定理(简单但精度较低)3. Vincenty公式(高精度,

Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例

《Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例》本文介绍Nginx+Keepalived实现Web集群高可用负载均衡的部署与测试,涵盖架构设计、环境配置、健康检查、... 目录前言一、架构设计二、环境准备三、案例部署配置 前端 Keepalived配置 前端 Nginx

基于Go语言实现Base62编码的三种方式以及对比分析

《基于Go语言实现Base62编码的三种方式以及对比分析》Base62编码是一种在字符编码中使用62个字符的编码方式,在计算机科学中,,Go语言是一种静态类型、编译型语言,它由Google开发并开源,... 目录一、标准库现状与解决方案1. 标准库对比表2. 解决方案完整实现代码(含边界处理)二、关键实现细