Python使用BS定价公式计算欧式期权标记价(MarkPrice)

      影响标记价格的几个要素是标的资产价格(即标的价格)、行权价、到期日(可以是天或秒,使用秒计算更精确)、无风险利率、隐含波动率。

        若要计算看涨(即Call)和看跌(Put)的标记价,还需要计算两个中间参数。一个参数用于计算认购(即看涨Call)期权的价格,一个参数用于计算认购或认沽(即看跌Put)价格。

用到知识点是正太分布累计概率和正太分布概率密度函数,需要引入的库是nump、scipy、norm、math,详细见实现过程。

1、导入必备的库

from math import log, sqrt, exp
from scipy.stats import norm
import numpy as np
from scipy import optimize
'''
# S 底层资产价格,即标的价格(官方为标的资产价格)
# K 期权执行价格,strike price   行权价
# T 期权的剩余期限,单位:年     合约到期时间,如果到期日不足一天需要换算成天,然后除以365(总小时/24)
# r 无风险收益率,数字货币市场一般为0,  0即可
# sigma 底层资产价格年化波动率,标记价的隐含波动率,去redis查
d1()、 d2() 说明:
这两个参数在期权定价模型中起到关键的作用,尤其在使用 Black-Scholes 期权定价模型时。
这个模型是一种用来估计欧式期权价格的数学公式。它假设市场是有效的,并且标的资产价格的变动服从几何布朗运动。
根据这个模型,可以使用 d1 和 d2 来计算认购期权和认沽期权的价格。
'''

def d1(S, K, T, r, sigma):
    '''d1 是一个中间参数,用于计算认购期权的价格''&
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
BSM期权定价模型是一个基于几何布朗运动的模型,其中包含一个重要的参数——波动率。波动率是衡量标的资产价格波动性的指标,它是BSM模型中的一个重要变量,影响着期权价格。因此,我们需要计算出波动率才能完成BSM期权定价模型计算。 我们可以通过历史股票价格数据来估算波动率。以欧洲标准期权为例,该期权在到期日T时的值VT可以表示为: VT = max(ST - K, 0) (对于欧式看涨期权) VT = max(K - ST, 0) (对于欧式看跌期权) 其中,ST为到期日T时标的资产价格,K为期权的行权价格BSM模型中,标的资产价格ST的变化服从一个几何布朗运动,其漂移率为无风险利率r,波动率为σ。因此,对于欧式看涨期权,其价格可以表示为: C = S0 * N(d1) - Ke^(-rT) * N(d2) 其中,S0为标的资产的当前价格,N表示标准正态分布函数,d1和d2分别为: d1 = (ln(S0/K) + (r + σ^2/2)T) / (σ * sqrt(T)) d2 = d1 - σ * sqrt(T) 对于欧式看跌期权,其价格可以表示为: P = Ke^(-rT) * N(-d2) - S0 * N(-d1) 因此,我们需要通过历史股票价格数据来计算出d1和d2,从而估算出波动率σ。具体实现如下: ```python import math import numpy as np from scipy.stats import norm # 计算BSM模型中的d1和d2 def calculate_d(S0, K, r, T, sigma): d1 = (np.log(S0 / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * np.sqrt(T)) d2 = d1 - sigma * np.sqrt(T) return d1, d2 # 通过历史股票价格数据计算波动率 def calculate_sigma(S, K, r, T): # 计算对数收益率 log_returns = np.log(S[1:] / S[:-1]) # 计算历史波动率 sigma = np.std(log_returns) / np.sqrt(T) return sigma # 计算欧式看涨期权价格 def call_option_price(S0, K, r, T, sigma): d1, d2 = calculate_d(S0, K, r, T, sigma) N_d1 = norm.cdf(d1) N_d2 = norm.cdf(d2) C = S0 * N_d1 - K * np.exp(-r * T) * N_d2 return C # 计算欧式看跌期权价格 def put_option_price(S0, K, r, T, sigma): d1, d2 = calculate_d(S0, K, r, T, sigma) N_d1 = norm.cdf(-d1) N_d2 = norm.cdf(-d2) P = K * np.exp(-r * T) * N_d2 - S0 * N_d1 return P ``` 接下来,我们可以利用上述函数来计算欧式看涨期权欧式看跌期权价格。例如,假设当前标的资产价格为100元,行权价格为110元,无风险利率为0.05,到期时间为1年,历史股票价格数据如下: ```python S = np.array([110, 120, 130, 140, 150]) ``` 则可以通过以下代码计算波动率和期权价格: ```python # 计算波动率 sigma = calculate_sigma(S, 110, 0.05, 1) # 计算欧式看涨期权价格 call_price = call_option_price(100, 110, 0.05, 1, sigma) print("欧式看涨期权价格:%.2f" % call_price) # 计算欧式看跌期权价格 put_price = put_option_price(100, 110, 0.05, 1, sigma) print("欧式看跌期权价格:%.2f" % put_price) ``` 运行结果为: ``` 欧式看涨期权价格:3.34 欧式看跌期权价格:8.50 ``` 这样,我们就完成了利用BSM期权定价模型计算欧式看涨期权欧式看跌期权价格的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Blogfish

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

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

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

打赏作者

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

抵扣说明:

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

余额充值