二叉树期权定价

本文介绍了使用两步二叉树方法对欧式和美式看涨、看跌期权进行定价。详细阐述了每种期权的定价原理,并提供了代码实现。

1. 以两步二叉树欧式看涨期权定价为例

2. 代码实现

(1)欧式看涨期权

import numpy as np
#二叉树法为欧式看涨期权定价
def binarytree_europcall(S,K,r,sigma,t,steps):
    '''
    S: 标的资产初始价格;
    K: 期权的执行价格;
    r: 年化无风险利率;
    sigma: 标的资产连续复利收益率的标准差;
    t:以年表示的时间长度;
    steps:二叉树的步长。
    '''
    u = np.exp(sigma*np.sqrt(t/steps))#时间间隔为△t=t/steps
    d = 1/u
    P = (np.exp(r*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]
A1 = binarytree_europcall(S=810,K=800,r=0.05,sigma=0.2,t=0.5,steps=2)
print('二叉树法为欧式看涨期权定价:',round(A1,2))

 

(2)美式看涨期权

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

#二叉树法为美式看涨期权定价
def binarytree_ameripcall(S,K,r,sigma,t,steps):
    '''
    S: 标的资产初始价格;
    K: 期权的执行价格;
    r: 年化无风险利率;
    sigma: 标的资产连续复利收益率的标准差;
    t:以年表示的时间长度;
    steps:二叉树的步长。
    '''
    u = np.exp(sigma*np.sqrt(t/steps))#时间间隔为△t=t/steps
    d = 1/u
    P = (np.exp(r*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):
            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),prices[i]-K)
    return c_values[0]
A2 = binarytree_ameripcall(S=810,K=800,r=0.05,sigma=0.2,t=0.5,steps=2)
print('二叉树法为美式看涨期权定价:',round(A2,2))

(3)欧式看跌期权

#二叉树法为欧式看跌期权定价
def binarytree_europcall(S,K,r,sigma,t,steps):
    '''
    S: 标的资产初始价格;
    K: 期权的执行价格;
    r: 年化无风险利率;
    sigma: 标的资产连续复利收益率的标准差;
    t:以年表示的时间长度;
    steps:二叉树的步长。
    '''
    u = np.exp(sigma*np.sqrt(t/steps))#时间间隔为△t=t/steps
    d = 1/u
    P = (np.exp(r*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]
B1 = binarytree_europcall(S=29,K=30,r=0.03,sigma=0.25,t=1,steps=2)
print('二叉树法为欧式看跌期权定价:',round(B1,2))

(4)美式看跌期权

#二叉树法为美式看跌期权定价
def binarytree_ameripcall(S,K,r,sigma,t,steps):
    '''
    S: 标的资产初始价格;
    K: 期权的执行价格;
    r: 年化无风险利率;
    sigma: 标的资产连续复利收益率的标准差;
    t:以年表示的时间长度;
    steps:二叉树的步长。
    '''
    u = np.exp(sigma*np.sqrt(t/steps))#时间间隔为△t=t/steps
    d = 1/u
    P = (np.exp(r*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]
B2 = binarytree_ameripcall(S=29,K=30,r=0.03,sigma=0.25,t=1,steps=2)
print('二叉树法为美式看涨期权定价:',round(B2,2))

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

远胥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值