期权的定价方法

Python016

期权的定价方法,第1张

这是一个老题目了,在知乎里也有一些类似的问题,但总感觉所有回答都有所欠缺,所以希望在这里对所有的数值方法进行一个梳理。按照我个人的分类,期权定价的数值方法分为五个大类:解析解方法,树方法,偏微分方程数值解方法,蒙特卡洛方法,傅立叶变换方法。

1)解析解方法:

一个期权定价问题,其实就是根据已知的随机微分方程(SDE)模型,然后来求解关于这个随机过程函数表达式的过程。这也是为什么随机微积分和Ito lemma会是金融工程的核心知识之一,因为Ito直接告诉了我们一个随机过程的函数所满足的新SDE:

\rm{d}f(t, X_{t})=\frac{\partial f}{\partial t}\rm{d}t + \frac{\partial f}{\partial X_t}\rm{d}X_t + \frac{1}{2}\frac{\partial^2 f}{\partial X_t^2}\rm{d}[X, X]_t

然后,如果我们可以求出这个SDE的解析解,那么一个欧式无路径依赖期权的价格就是它在终值时刻折现的期望值。这就是一种期权定价的解析解方法,当然你也可以利用PDE来求解,由于Feynman Kac定理的存在,PDE和条件期望的答案会是一致的。

而这类方法的优点是显而易见的,一旦解析解存在,那么期权的价格公式计算速度就会非常之快,不论做拟合还是优化都会有效率上质的提升,而这类方法的缺点也很明显,那就是,对于大部分模型和大部分奇异期权,解析解未必存在。

2)树方法

之所以叫树方法而不叫二叉树,是因为我们也将讨论三叉树模型,但其实本质思想是一模一样的。

如果告知你了一个标的资产的波动率,那么你可以通过下述式子构造一个N段的二叉树的上下波动:

u = \rm{e}^{\sigma\sqrt{T/N}}, d = \rm{e}^{-\sigma\sqrt{T/N}}

然后利用逆推,来得到初始时刻的期权价格。

那么三叉树呢?首先要明白一个道理,除了满足了下列条件的三叉树模型(u是上叉,d是下叉,l是中叉)

其余的三叉树都是incomplete market。在其余的树模型下,我们只能做到super-replicate,而不能完成perfect hedge。而这独有的一种三叉树模型,也成为了最常用的树模型之一。或许有人好奇为什么有二叉树了,还有人使用更麻烦的三叉树。这是因为三叉树的收敛速度要高于二叉树。

那么树模型的优缺点又是什么呢?树模型有一个任何连续时间模型都无法取代的优点,那就是每一个定价,在树模型里,不论美式、欧式、路径依赖、奇异,通过Backward Induction Principle得到价格,永远都是伴随着显式对冲策略的。而在连续时间模型里,想获得连续时间对冲策略的这类问题,是一个倒向随机微分方程(BSDE)问题,有很多时候并不是那么好解决的,尤其是当期权有奇异或美式属性的时候。

另一方面,树模型缺点也显而易见,高维度问题树模型是不能解决的,所以对于多个标的资产的问题,尤其是具有相关系数的资产,我们只能诉之于他法。而从速度上来讲,树模型的收敛速度是要低于PDE方法的。

3)PDE方法

很多对于quantitative finance陌生的人也会听说过Black Scholes PDE。而实际上,不同的随机模型,都会对应不同的PDE。BS PDE只不过是单资产符合几何布朗运动随机模型的PDE表达罢了。因为对于期权,我们往往知晓它最终到期日的payoff,所以我们用payoff函数来作为这个PDE的终值条件。

如果PDE存在解析解,最优办法自然也是求解析解。然而,如果解析解不存在,我们就必须诉诸数值方法。最常用的数值解方法就是有限差分,也就是将所有变量构造一个网格,然后利用网格上的差分方法来估计偏导数,进而将PDE问题转化为代数问题。而对于期权定价的PDE,我们会根据期权的性质,获得这个PDE终值条件和边值条件。然而,有时候根据不同的模型,我们可能得到的并不是一个简单的PDE,而可能是PIDE(partial integral differential equation),也就是在PDE中多了积分项,这时候,我们需要同时再借助数值积分来完成数值计算。

PDE的数值问题自然还有很多的选择,有限元、谱方法都在列。但期权定价PDE本身并不像很多物理PDE有很大的非线性程度,边界也并没有那么奇怪,所以基本上有限差分是可以解决绝大部分问题的。

有限差分法分三种:显式差分,隐式差分,交错差分。我们不深入研究算法,但几个点就是:稳定性上,显式差分是条件稳定的,另外两种都是无条件稳定;计算复杂度上,显示最简单,隐式次之,交错最繁琐;精确性上,显式、隐式是同阶的,交错差分的特殊情形,显式和隐式各占一半时,也就是Crank-Nicolson差分,精度会在时间上也上升一阶。

另外,在期权定价中PDE有两大类,正向和倒向。传统的BS PDE就是倒向的一个典型例子,它的终值条件就是期权的payoff function。而一个倒向PDE所对应的正向PDE,它不再是期权价格满足的PDE,而是这个标的的“价格密度”所满足的PDE。这个“价格密度”被称为State price,或者Arrow Debreu price,抑或是Green function。而这个在我之前的一篇文章有介绍过

Arrow Debreu price与快速拟合

而PDE方法的缺点主要有两点:路径依赖问题,高维度问题。很多路径依赖问题的PDE形式是很麻烦,甚至无法表达的,比如亚氏期权,比如回望期权。而对于高维度问题,如果PDE的数值方法会从平面网格上升到空间网格,在复杂度上不但繁琐,而且在边值条件上更难以控制。而PDE的优点则是速度快,而且根据差分的数值方法,在计算Greeks的时候不需要加以再次的bumping计算。举个例子,如果不降维,一个具有两个assets的期权的有限差分就是这样的一个立方网格:

4)蒙特卡洛方法

蒙特卡洛方法是目前应用范围最广泛的方法了。因为不存在提前行权属性的期权价格其实就是一个期望,所以我们就可以通过模拟很多的路径,来用平均数估计真实期望。而美式或百慕大这种具有提前行权属性的期权,它的期权价格其实是一个随机优化问题。这类问题我们可以采用regression-based Monte Carlo,也就是最小二乘蒙特卡洛,利用regression来估计conditional NPV,然后再用蒙特卡洛求解当前价值。

所以说,蒙特卡洛方法是最为general的方法了。然而,蒙特卡洛的缺点也是显而易见:因为要模拟上百万条路径,而且对于奇异期权还要做路径上的计算,美式更要做回归,蒙特卡洛方法成为了计算时间长的代名词。但幸运的是,我们有三种提速的方法:1,利用方差缩减,在保证方差恒定的基础上,可以减少模拟路径;2,利用Multi-level 蒙特卡洛,减少complexity;3,利用GPU或超级计算机,进行并行计算。

对于普通蒙特卡洛方法,上述三种方法都是可行的,而且GPU的提速是非常显著的。对于方差缩减,得强调一点的就是,一般而言,最简单的方式是对偶变量,其次是控制变量,然后是利用条件期望,最难的是importance sampling,而在效果和适用范围上,它们的排序往往是刚好相反的。比如美式期权的最小二乘蒙特卡洛,方差缩减的最有效手法就是important sampling,其他方法的效果很小。

这里另外再着重强调一下最小二乘蒙特卡洛。最小二乘蒙特卡洛的流程大致如下:首先,正向模拟标的路径;其次,倒向在每个时间节点,对所有路径值进行回归,估算条件期望,直到初始时间点;最后,求平均。所以值得注意的一点就是,在这里,如果单纯使用GPU cluster进行提速,效果并不是很理想,因为路径模拟并不是最消耗时间的步骤,对所有路径回归才是。虽然如此,但其实还是可以用GPU cluster来对回归精度加以提升,比如可以将路径进行归类,然后将global regressor转换成多个local regressor。

总的来说,蒙特卡洛方法是期权定价中适用范围最广的数值方法,但也是最慢的方法。然而,我们可以利用方差缩减、复杂度缩减,以及GPU计算来优化我们的蒙特卡洛算法,达到提速与增加精确性的目的。

5)傅立叶方法

傅立叶方法也被称为特征函数法,利用的就是对于很多的模型,它们的特征函数往往是显式表达的,比如靠具有independent increment的infinitely divisible process来决定的模型,因为在这样的情况下,我们有Levy-Khintchine representation,很多拟合性质很好的过程,比如Variance Gamma,Normal Inverse Gaussian都属于这一类。而特征函数实际上可以看作是一个随机变量的傅立叶变换,这也就是这个名字的由来。

如果我们有显式表达的特征函数,我们可以通过傅立叶逆变换来得到原随机变量的密度,进而达到求解期权价格的目的。一般来讲,这样的方法要比PDE方法更加快速,因为数值积分的速度要比微分方程数值解的速度要快。然而,这类方法的缺陷也是显而易见的,路径依赖性和维度问题,以及我们必须要有显式表达的特征函数。

总结:

在这里,我们只讲一些面上的东西。具体深入的东西,我会在公众号:衍生财经上详谈。

 实物期权,一种期权,其底层证券是既非股票又非期货的实物商品。这实物商品自身(货币,债券,货物)构成了该期权的底层实体。又叫股票期权(equity option)和指数期权(index option)。是管理者对所拥有实物资产进行决策时所具有的柔性投资策略。

实物期权定价

偏微分方程法(PDE),立足于用偏微分方程和边界条件表示期权价值及其变化,期权价值使用一个等式表示为输入量的直接函数。

如果存在解析解,此种方法将是最简捷的。最著名的便是B-S期权定价模型。但这种方法更适合计算金融期权,对多阶段及多种实物期权并存的情况不适合。

序言一

序言二

前言

第0章导言:千里之行,始于足下

——写给读者的话

0.1简单实例

0.2Abaqus脚本编程的优势

0.3学习方法

0.4如何看待本书

0.5心愿

第1章Python语言基础

1.1简介

1.1.1Python语言的特点

1.1.2运行Python脚本

1.2开发工具

1.2.1PythonWin开发工具

1.2.2Abaqus中的Python开发环境(PDE)

1.2.3EditPlus编辑器的Python开发环境配置

1.3基础知识

1.3.1编码规则

1.3.2数据类型

1.3.3变量和常量

1.3.4运算符和表达式

1.3.5文件类型

1.4内置数据结构

1.4.1元组(tuple)

1.4.2列表(list)

1.4.3字典(dictionary)

1.4.4序列(sequence)

1.5结构化程序设计

1.5.1条件语句(if...elif...else)

1.5.2循环语句(while,for...in)

1.6函数、模块和包

1.6.1函数(function)

1.6.2模块(module)

1.6.3包(package)

1.7面向对象编程

1.7.1类和对象

1.7.2属性和方法

1.7.3继承(inheritance)

1.7.4多态性(polymorphism)

1.8输入/输出

1.8.1文件

1.8.2存储器

1.9异常和异常处理

1.9.1使用try...except语句测试异常

1.9.2使用raise语句引发异常

1.9.3自定义异常

1.9.4使用try...finally语句关闭文件

1.10本章小结

第2章Abaqus脚本接口

2.1Abaqus脚本接口简介

2.1.1Abaqus脚本接口与Abaqus/CAE的通信

2.1.2命名空间(namespace)

2.1.3Abaqus中的各种脚本接口

2.1.4运行脚本的方法

2.1.5创建脚本的方法

2.2Abaqus脚本接口基础知识

2.2.1使用《Abaqus Scripting Reference Manual》

2.2.2Abaqus脚本接口中的数据类型

2.2.3面向对象编程与Abaqus脚本接口

2.2.4异常和异常处理

2.3在Abaqus/CAE中使用脚本接口

2.3.1Abaqus对象模型

2.3.2复制和删除对象

2.3.3指定区域

2.3.4指定视口中的显示对象

2.4实例

2.5本章小结

第3章编写脚本快速建模

3.1交互式输入

3.1.1getInput(...)函数

3.1.2getInputs(...)函数

3.1.3getWarningReply(...)函数

3.2创建材料库

3.2.1录制宏(macro)

3.2.2通过录制宏来创建材料库

3.3创建插件程序

3.3.1简介

3.3.2使用RSG对话框构造器创建对话框

3.3.3创建并运行内核脚本

3.4本章小结

第4章编写脚本访问输出数据库

4.1简介

4.1.1三组概念

4.1.2使用对象模型编写脚本

4.2输出数据库对象模型

4.2.1模型数据

4.2.2结果数据

4.3从(向)输出数据库读取(写入)数据

4.3.1打开(创建)输出数据库

4.3.2读取(写入)模型数据

4.3.3读取(写入)结果数据

4.3.4读取(写入)场输出数据

4.3.5读取(写入)历史输出数据

4.3.6设置默认的显示变量

4.4计算Abaqus得到的分析结果

4.4.1数学运算规则

4.4.2有效的数学运算

4.4.3粗略计算

4.4.4结果转换

4.5实例

4.5.1读取节点信息和单元信息

4.5.2读取场输出数据

4.5.3创建输出数据库并添加数据

4.5.4查找Mises应力的最大值

4.5.5计算位移增量

4.5.6计算平均应力

4.6提高脚本执行效率的技巧

4.7本章小结

第5章编写脚本进行其他后处理

5.1自动后处理

5.1.1简介

5.1.2实例

5.2外部数据的后处理

5.2.1简介

5.2.2实例

5.3本章小结

第6章脚本的高级处理功能

6.1监控分析作业

6.1.1简介

6.1.2实例

6.2优化分析

6.2.1简介

6.2.2实例

6.3调试脚本

6.3.1跟踪法

6.3.2异常抛出及确认

6.3.3通过输出语句或注释发现异常

6.3.4使用Python调试器

6.3.5智能开发环境(IDE)

6.3.6Abaqus中的PDE

6.4查询数据

6.5本章小结

附录

附录APython语言中的保留字

附录BPython语言中的运算符

附录CPython语言中的常用函数

附录D中文索引

附录E英文索引

附录F本书中用到的方法(函数)

附录G本书中用到的模块

参考文献