期权的二叉树定价模型

论坛 期权论坛 期权     
期权匿名问答   2022-10-17 10:13   10968   20
一、套期保值(复制原理)

基本思想:构造一个股票和借款的适当组合,使得无论股价如何变动,投资组合的损益都与期权相同,那么创建该投资组合的成本就是期权的价值。求取看涨期权价值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=prices[i-1]*(u**2)   #计算最后一列的股票价格
        c_values=np.maximum(prices-K,0)  #计算最后一列的期权价值
    for j in range(steps,0,-1):       #逐个节点往前计算
        for i in range(0,j):
            c_values=(P*c_values[i+1]+(1-P)*c_values)*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=prices[i-1]*(u**2)   #计算最后一列的股票价格
        c_values=np.maximum(K-prices,0)  #计算最后一列的期权价值
    for j in range(steps,0,-1):       #逐个节点往前计算
        for i in range(0,j):
            c_values=(P*c_values[i+1]+(1-P)*c_values)*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=prices[i-1]*(u**2)
        c_values=np.maximum(K-prices,0)
    for j in range(steps,0,-1):
        for i in range(0,j):
            prices=prices[i+1]*d
            c_values=np.maximum((P*c_values[i+1]+(1-P)*c_values)*np.exp(-r*t/steps),K-prices)
    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之间。
分享到 :
0 人收藏

20 个回复

倒序浏览
感谢!
求u和d的那部分,能不能写一下展开过程,谢谢
泰勒展开形式忽略二阶项,代入指数展开上面那个公式即可求出
我是带进去求不出u啊,数学捉急
大神,能不能给个完整的求u的过程,真的不会解
没有理解复制原理,虽然公式推倒很简单,但是不理解公式的意思。
第二节为什么要把p用 u, d, r 表示?
为了后面的方便计算,尤其后面多步二叉树。你看后面计算的案例理解起来可能会更直观一些。
σ这个回报率标准差怎么求?
见我这篇文章——<估计波动率和相关系数>

https://zhuanlan.zhihu.com/p/350469981
NameError: name 'np' is not defined
import numpy as np
反手就是一个赞!
第三步里189.34是怎么来的?
行权价800,高处800的部分就是损益
二叉树可以做障碍期权定价吗比如向上敲出看跌期权
大佬,看不出来这怎么是个二叉树的[思考]。倒是用树自己写了一个。
举一个欧式看跌吧!!感谢大佬
里面有啊,欧式看跌和美式看跌。是不是图片没显示出来?
十分感谢你的付出[红心]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:391992
帖子:78399
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP