2022年 11月 9日

python学习之路:期权定价与python实现

一、目前国际上主流的期权定价模型主要有:

  • BSM定价模型
  • BAW定价模型
  • CRR定价模型
  • 二叉树模型

二、模型适用,需要说明的是:

1、可以直接用BS模型计算欧式期权的理论价格。

2、BS模型对欧式期权定价有较好的支持,但美式期权由于可以随时执行,影响模型对时间和价格的参数设置,因此对美式期权定价存在困难。

3、BAW定价模型,对美式期权价格进行了近似解析方法求解。该模型,多用于美式期权定价。

4、CRR模型也可以对美式期权进行定价。

5、二叉树模型对美式期权和欧式期权定价都具有较好的支持,但是为了达到一定的精度,必须有大量的模拟运算,对系统要求较高。

三、欧式期权定价的python实现

#期权定价与希腊字母
import numpy as np
from math import sqrt, log
from scipy import stats

# 欧式期权BSM定价公式


#欧式期权的看涨期权价格及各种希腊值

"""
    Parameters:
    ==========
    S0: float
        标的物初始价格水平
    K: float
       行权价格
    T: float
       到期日
    r: float
       固定无风险短期利率
    sigma: float
       波动因子
    ==========
"""

def d(S0, K, T, r, sigma):
    S0 = float(S0)
    d1 = (np.log(S0 /K) + (r + 0.5 * sigma**2) * T )/(sigma * np.sqrt(T))
    d2 = (np.log(S0 /K) + (r - 0.5 * sigma**2) * T )/(sigma * np.sqrt(T))
    return (d1,d2)

def N(d):
    value = stats.norm.cdf(d, 0, 1)
    return value

#看涨期权价格
def bsm_call_value(S0, K, T, r, sigma):
    S0 = float(S0)
    d1 = d(S0, K, T, r, sigma)[0]
    d2 = d(S0, K, T, r, sigma)[1]
    value = S0 * N(d1) - K * np.exp(-r * T) * N(d2)
    return value
def bsm_call_value_div(S0, K, T, r, sigma, div):
	S0 = float(S0)
	S0 = S0 - div * np.exp(-r * T)
    d1 = d(S0, K, T, r, sigma)[0]
    d2 = d(S0, K, T, r, sigma)[1]
   value = S0 * N(d1) - K * np.exp(-r * T) * N(d2)
    return value
    
#看跌期权价格
def bsm_put_value(S0, K, T, r, sigma):
    S0 = float(S0)
    d1 = d(S0, K, T, r, sigma)[0]
    d2 = d(S0, K, T, r, sigma)[1]
    value = bsm_call_value(S0, K, T, r, sigma) - S0 + K * np.exp(-r * T)
    return value
     
def bsm_delta (S0, K, T, r, sigma, n):
    """
    delta 计算
    认购期权的n为1
    认沽期权的n为-1
     """
    d1 = d(S0, K, T, r, sigma)[0]
    delta = n * N(n * d1)
    return delta

def bsm_gamma(S0, K, T, r, sigma):
    """
    gamma 计算
    """
    S0 = float(S0)
    d1 = d(S0, K, T, r, sigma)[0]
    gamma = N(d1)/(S0*sigma*np.sqrt(T))
    return gamma

def bsm_vega(S0, K, T, r, sigma):
    """
    vega 计算
    """
    S0 = float(S0)
    d1 = d(S0, K, T, r, sigma)[0]
    vega = S0 * N(d1) * np.sqrt(T)
    return vega

def bsm_theta(S0, K, T, r, sigma):
    """
    theta 计算
    """
    d1 = d(S0, K, T, r, sigma)[0]
    d2 = d(S0, K, T, r, sigma)[1]
    theta = -(St * dN(d1) * sigma / (2 * np.sqrt(T))
              + r * K * np.exp(-r * T) * N(d2))
    return theta

def bsm_rho(S0, K, T, r, sigma):
    """
    rho 计算
    """
    d1 = d(S0, K, T, r, sigma)[0]
    d2 = d(S0, K, T, r, sigma)[1]
    rho = K * T * np.exp(-r * T ) * N(d2)
    return rho
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105

四、美式期权的python实现

1、熟悉那几个希腊字母。
2、用Python 写一下,欧式期权、美式期权和二元期权数据模型验证的结果。
3、欧式期权的定价
(1)BS模型公式计算。比较简单,直接用Python 编程,按照公式计算即可实现。
(2)蒙特卡洛模拟计算:Python 版本和Python 向量化版本
最后,还可以进一步计算各种希腊字母。
4、国内市场,豆粕、白糖、玉米、棉花、橡胶的商品期权都是美式期权。

未完待续…