有限差分法也叫偏微分方程法,是一种通过有限差分来近似导数并求解偏微分方程的方法。对于金融衍生品,其 价格至少跟标的价格(S)与时间(t)相关,因此该金融衍生品所对应的随机微分方程(SDE)一定含有 S 与 t 的偏导数,即为偏微分方程(PDE)。
PDE 方法原理
在 BS 模型下,原生资产 (以股票价格为例) 的随机微分方程(SDE)如下:
根据费曼卡兹定理,可以将 SDE 转变为 PDE:
其中V(S(t),t) ,可将 V 理解为是任意构建的投资组合,该组合仅与 S 和 t 相关,因此对于所有结构的衍生品, 都符合上面的 PDE 方程。所以虽然要解的是这个 PDE,但核心是不同的衍生品需要选取不同的的边际条件。边 际条件的不同,相同的 PDE 解出来的就是不同衍生品的价格。此处提及的边际条件包括以下三条:
而衍生品在期初的价格即为 V(S,t=0),即是我们希望定价得到的结果。
例如欧式看涨期权,它的边际条件就是:
对于边界条件(3),当时间 t 趋于 T,即看涨期权在到期时刻,其边际条件就是看涨期权的到期收益方程。
对于边界条件(4),当标的价格 S 趋于 0 时,此时看涨期权代表的买权已经无任何价值,因此 V=0.
对于边界条件(5),当标的价格 S 趋于无穷大时,此时看涨期权为深度实值期权,将其价值贴现到 t 时刻,则与 (5)所列结果相同。
得到 PDE 和边界条件后,就需要使用网格搜索法进行从后向前定价推导。 我们将时间 T 作为横坐标,标的价格 S 作为纵坐标。然后将距离行权时间 T 等分成 N 份足够短的时间∆t = T N ; 同时设定一个足够大的价格 Smax ,使得 Smax 远远超过行权价 K,并且将 Smax 也等分为 M 份,使得∆S =
Smax M 。此时,我们得到了一个 MⅹN 的矩阵,可以视作一个网格,网格的横纵坐标轴分别是时间维度和资产价格 维度。
得到网格与边界条件后,我们需要得到 t=0 时,纵坐标上的所有点,即需要知道在定价初始时刻,不同标的 S 价 格下的衍生品价格。因此 PDE 方法是从边界条件倒推出初始价格,是从后至前的推导过程。
接下来就是有限差分法求解过程,可分为显式、隐式和半隐式方法。本文采用半隐式方法对 PDE 进行离散化处 理,假设:
对于差分方式只能用近似非法,在时间维度上有以下三种差分方法:
在空间维度上,通常使用中央差分方法:
带入 PDE 中,
完全显式法
完全显式法对应后向差分,将上面向后差分表达式带入,再将Sj = j∆S,ti = i∆t 带入公式(2)的 PDE 方程中可 求得
完全隐式法
完全隐式法是使用了前向差分。
半隐式法
半隐式法是介于显示与隐式中间,试用中间差分实现,并令 θ=0.5。
python实践
import pandas as pd
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
from crank_nicolson_method import *
if __name__=='__main__':
s=np.arange(50,150,5)
k=100
t=5./12.
r=0.1
sigma=0.4
smax=200
m=100
n=1000
is_put=True
res=pd.DataFrame()
for st in s:
a=FD_Explicit_European(st,k,t,r,sigma,smax,m,n,is_put).price()
b=FD_Implicit_European(st,k,t,r,sigma,smax,m,n,is_put).price()
c=FD_CrankN_European(st,k,t,r,sigma,smax,m,n,is_put).price()
res=res.append(pd.DataFrame({'s':st,'explicit':a,'implicit':b,'crank':c},index=range(len(s))),ignore_index=False)
print(res)
plt.figure(figsize=(15,4))
plt.plot(res['s'],res['explicit'],'r.',label='explicit')
plt.plot(res['s'],res['implicit'],'b--',label='implicit')
plt.plot(res['s'],res['crank'],'g-',label='crank')
plt.ylabel('option_value')
plt.xlabel('st')
plt.legend()
plt.show()