二叉树期权定价python代码_期权的二叉树定价模型

一、套期保值(复制原理)

基本思想:构造一个股票和借款的适当组合,使得无论股价如何变动,投资组合的损益都与期权相同,那么创建该投资组合的成本就是期权的价值。求取看涨期权价值call的具体步骤如下:

H:购买股票的数量的比率(套期保值比率);

S0:股票的初始价格;

r:1年的无风险利率;

b:以无风险利率借款初始额;

u:股票的上升幅度;

d:股票的下降幅度;

1年后,价格可能50%上升为Su=uS0,也可能50%下降到Sd=dS0

1年后,如果股票上升,收益:Cu=HSu-b(1+r) ①

1年后,如果股票下降,收益:Cd=HSd-b(1+r) ②

由①②两式可以解得:

组合投资成本=看涨期权价值Call=购买股票支出-借款

二、风险中性原理

基本思想:假设投资者对待风险的态度是中性的,所有证券的预期报酬率都应当是无风险利率。风险中性的投资者不需要额外的收益补偿其承担的风险。在风险中性的世界里,将期望值用无风险利率折现,可以获得现金流量的现值。

购买股票的数量为H,卖出1份看涨期权价格为call;

从0到△t时刻,股票上升收益为fu,股票下降收益为fd

股票如果上升,投资价值为HS0u-fu

股票如果下降,投资价值为HS0d-fd

在风险中性下,则应当满足上升与下降后的价值相同。

如果股票上升,则价值为

看涨期权的价值为call,有

假定股票上升的概率为p,下降的概率为1-p,有

由以上两式消去call,最终可以解得

其中p为股票价格上升概率,△t为股票初始S0上升到S0u这段年化时间。

u:股票的上升幅度;d:股票的下降幅度;

三、多步二叉树——欧式看涨/看跌期权

下面主要讲解以风险中性原理来构建二叉树。

1.两步二叉树

2.多步二叉树

当二叉树模型扩展到n步后,其计算的方法仍然是相同的,从后往前依次计算出每个节点的期权价格,并乘以对应的风险中性概率,直到求出t=0时刻的期权价格。检验发现,当n达到比较大时,二叉树模型所确定的期权价格趋于一个平稳的值(如图所示),这也在一定程度上说明了二叉树模型的合理性和实用性。

对于n步二叉树的上升幅度u和下降幅度d的求解方法如下:

股票收益率在短期时间△t的方差是σ^2△t,其中σ是波动率。

使用统计学中的标准公式,收益的方差为E(R2)-[E(R)]2,其中R是收益,E表示期望值。在二叉树的一个步骤中,上升概率为p的收益为u-1,下降概率为1-p的收益为d-1。因此,我们需要选择u和d,以便:

将以下p值代入上式,

采用指数函数展开式

忽略二阶项以后的阶数,有

可以求得一般的参数如下:

△t为每两步之间的年化时间;

p为股票上升的概率,则下降概率为1-p;

u为股票上升的幅度,d为股票下降的幅度。

【案例分析1】两步二叉树的欧式看涨期权

Python实现:

import numpy as np

#二叉树模型对欧式看涨期权定价

def binarytree_europcall(S,K,r,q,sigma,t,steps):

'''S:标的资产初始价格;K:期权的执行价格;r:年化无风险利率;q:连续分红的红利率;sigma:标的资产连续复利收益率的标准差;t:以年表示的时间长度;steps:二叉树的步长。'''

u=np.exp(sigma*np.sqrt(t/steps)) #时间间隔为△t=t/steps

d=1/u

P=(np.exp((r-q)*t/steps)-d)/(u-d)

prices=np.zeros(steps+1) #生成最后一列的股票价格空数组

c_values=np.zeros(steps+1) #生成最后一列的期权价值空数组

prices[0]=S*d**steps #最后一行最后一列的股票价格

c_values[0]=np.maximum(prices[0]-K,0)#最后一行最后一列的期权价值

for i in range(1,steps+1):

prices[i]=prices[i-1]*(u**2) #计算最后一列的股票价格

c_values[i]=np.maximum(prices[i]-K,0) #计算最后一列的期权价值

for j in range(steps,0,-1): #逐个节点往前计算

for i in range(0,j):

c_values[i]=(P*c_values[i+1]+(1-P)*c_values[i])*np.exp(-r*t/steps)

return c_values[0]

A=binarytree_europcall(S=810,K=800,r=0.05,q=0.02,sigma=0.2,t=0.5,steps=2)

print('运用二叉树模型计算欧式看涨期权的价格为:',round(A,1))

四、多步二叉树——美式看涨/看跌期权

美式期权可能提前行权,要在欧式期权的基础上加一步是否提前行权的判断。定价过程变为:

①计算叶子节点的期权价值。

②向前加权平均并折现,得到前一层节点的期权价值。

③判断在该节点是否提前行权,若提前行权的话,将提前行权的期权价值更新为本节点的期权价值。

④不断重复2和3步至0时刻。

判断是否提前行权,需要先计算提前行权的收益。提前行权的收益为本节点上股票的预期价格减执行价格。如果收益大于期权价值,说明提前行权获利更多,因此会提前行权;反之则不会。

【案例分析2】两步二叉树的欧式看跌期权与美式看跌期权对比。

Python实现:

#二叉树模型对欧式看跌期权定价

def binarytree_europput(S,K,r,q,sigma,t,steps):

'''S:标的资产初始价格;K:期权的执行价格;r:年化无风险利率;q:连续分红的红利率;sigma:标的资产连续复利收益率的标准差;t:以年表示的时间长度;steps:二叉树的步长。'''

u=np.exp(sigma*np.sqrt(t/steps)) #时间间隔为△t=t/steps

d=1/u

P=(np.exp((r-q)*t/steps)-d)/(u-d)

prices=np.zeros(steps+1) #生成最后一列的股票价格空数组

c_values=np.zeros(steps+1) #生成最后一列的期权价值空数组

prices[0]=S*d**steps #最后一行最后一列的股票价格

c_values[0]=np.maximum(K-prices[0],0)#最后一行最后一列的期权价值

for i in range(1,steps+1):

prices[i]=prices[i-1]*(u**2) #计算最后一列的股票价格

c_values[i]=np.maximum(K-prices[i],0) #计算最后一列的期权价值

for j in range(steps,0,-1): #逐个节点往前计算

for i in range(0,j):

c_values[i]=(P*c_values[i+1]+(1-P)*c_values[i])*np.exp(-r*t/steps)

return c_values[0]

B=binarytree_europput(S=29,K=30,r=0.03,q=0,sigma=0.25,t=1,steps=2)

print('运用二叉树模型计算欧式看跌期权的价格为:',round(B,3))

Python实现:

#二叉树模型对美式看跌期权定价

def binarytree_americaput(S,K,r,q,sigma,t,steps):

'''S:标的资产初始价格;K:期权的执行价格;r:年化无风险利率;q:连续分红的红利率;sigma:标的资产连续复利收益率的标准差;t:以年表示的时间长度;steps:二叉树的步长。'''

u=np.exp(sigma*np.sqrt(t/steps))

d=1/u

P=(np.exp((r-q)*t/steps)-d)/(u-d)

prices=np.zeros(steps+1)

c_values=np.zeros(steps+1)

prices[0]=S*d**steps

c_values[0]=np.maximum(K-prices[0],0)

for i in range(1,steps+1):

prices[i]=prices[i-1]*(u**2)

c_values[i]=np.maximum(K-prices[i],0)

for j in range(steps,0,-1):

for i in range(0,j):

prices[i]=prices[i+1]*d

c_values[i]=np.maximum((P*c_values[i+1]+(1-P)*c_values[i])*np.exp(-r*t/steps),K-prices[i])

return c_values[0]

C=binarytree_americaput(S=29,K=30,r=0.03,q=0,sigma=0.25,t=1,steps=2)

print('运用二叉树模型计算美式看跌期权的价格为:',round(C,3))

【拓展】如果我们不断扩充二叉树的步数,比如4步的计算如下:

Python实现:

D=binarytree_americaput(S=29,K=30,r=0.03,q=0,sigma=0.25,t=1,steps=4)

print('运用二叉树模型计算美式看跌期权的价格为:',round(D,3))

当二叉树的步数增加,则模型更为精确。例如,步数分别为20,50,100和500,相应的美式看跌期权的价格分别为3.082,3.067,3.059和3.055.在实践中,我们通常使用步长至少在30-50之间。

附录:欢迎大家关注微信公众号了解更多!谢谢