Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据
Posted 大数据部落
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据相关的知识,希望对你有一定的参考价值。
全文链接:http://tecdat.cn/?p=5620
最近我们被客户要求撰写关于金融应用编程的研究报告,包括一些图形和统计输出。
在本文中随机过程对定量融资的许多方面都很有用,包括但不限于衍生品定价,风险管理和投资管理
这些应用程序将在本文后面进一步详细讨论。本节介绍了量化融资中使用的一些流行的随机过程及其在Python中的实现。
模型参数
模型参数类包含以下随机过程使用的所有参数。为了便于理解,这些参数的前缀是它们所用的随机过程的名称。随机过程的校准将涉及寻找与某些历史数据相符的参数值。
绘制结果图
下面的代码使用Matplotlib来绘制一组随机过程。
布朗运动随机过程
布朗运动 是由悬浮在气体或液体中的颗粒表现出的随机运动。这种随机运动是由颗粒与液体或气体中的原子或分子碰撞引起的。布朗运动以植物学家罗伯特·布朗的名字命名,他观察了1827年的随机运动。
在实践中,布朗运动不用于模拟资产价格。我将其包含在内,因为它是本文中讨论的每个其他随机过程的基础。
def plot_stochastic_processes(processes, title):
"""
此方法绘制具有指定标题的随机过程列表
:return:绘制两个图
"""
plt.style.use([\'bmh\'])
fig, ax = plt.subplots(1)
fig.suptitle(title, fontsize=16)
ax.set_xlabel(\'Time, t\')
ax.set_ylabel(\'Simulated Asset Price\')
x_axis = numpy.arange(0, len(processes[0]), 1)
for i in range(len(processes)):
plt.plot(x_axis, processes[i])
plt.show()
以下是此方法生成的输出示例。
def brownian_motion_log_returns(param):
sqrt_delta_sigma = math.sqrt(param.all_delta) * param.all_sigma
return nrand.normal(loc=0, scale=sqrt_delta_sigma, size=param.all_time)
def brownian_motion_levels(param):
return convert_to_prices(param, brownian_motion_log_returns(param))
使用布朗运动随机过程模拟资产价格:5条路径
点击标题查阅往期内容
Matlab马尔可夫链蒙特卡罗法(MCMC)估计随机波动率(SV,Stochastic Volatility) 模型
左右滑动查看更多
01
02
03
04
使用布朗运动随机过程模拟资产价格:500条路径
几何布朗运动随机过程
几何布朗运动(GBM)由费舍尔布莱克和迈伦斯科尔斯推广,他们在1973年的论文“期权定价和公司负债”中使用它来推导出Black Scholes方程。几何布朗运动基本上是布朗运动,具有漂移分量和波动率分量。公式如下
其中是资产价格S在时间t的变化 ; μ是每年预期的百分比漂移,dt代表时间,σ是资产价格中预期的每日波动率,Wt是Wiener过程,也称为布朗运动。如下所示,布朗运动代码用于几何布朗运动方法以构造Wt的序列。
以下是此方法生成的输出示例。请注意,平均而言,生成的路径随着时间的推移而向上漂移,并且可能的收盘价格变化较大。在这个例子中,路径以每年14%的平均速率增长,因此预期收益率等于14%,分别为三年和一年(800天)。
使用几何布朗运动随机过程模拟资产价格。
Merton跳跃扩散随机过程
Robert C. Merton是最早解决Fisher Black和Myron Scholes提出的几何布朗随机过程中一些局限性的学者之一。1997年,默顿和斯科尔斯因其工作获得了诺贝尔经济学奖。
其中是具有速率泊松过程λ和ÿ是对数正态分布的随机变量。
请注意,由于跳跃扩散过程引入了向下的不连续或跳跃,因此资产的平均预期收益率略低。
使用默顿跳跃扩散几何布朗运动随机过程模拟资产价格。
Heston随机波动率过程
原始的几何布朗运动随机过程假设随时间的波动是恒定的。在1990年代早期,Steven Heston放宽了这个假设,并将几何布朗运动模型扩展到包括随机波动率。
请注意,随着时间的推移,资产价格会变得更加不稳定,从而导致潜在资产价格在预测结束时飙升。出现这种现象是因为我将长期平均波动率设定为远高于起始波动率的数字。
使用Heston随机波动率几何布朗运动随机过程模拟资产价格。
COX INGERSOLL ROSS随机过程
在COX INGERSOLL ROSS(CIR) 随机过程是用来描述一段时间的利率变化。
其中是Wiener过程,a是过程均值回复的速率(较大的数字导致更快的均值回复过程),b是长期平均利率,σ是过程的波动率。CIR随机过程如下。
利用Cox Ingersoll Ross均值回归随机过程模拟利率。
ORNSTEIN-UHLENBECK随机过程
Ornstein Uhlenbeck过程以Leonard Ornstein和George Eugene Uhlenbeck命名。Ornstein Uhlenbeck随机过程与CIR过程之间的区别在于CIR过程将随机分量乘以前一个利率值的平方根。
其中是Wiener过程,a是过程均值回复的速率(较大的数字导致更快的均值回复过程),b是长期平均利率,σ是过程的波动率。
利用Ornstein Uhlenbeck均值回归随机过程模拟利率。
衍生品定价和套期保值的随机过程
随机过程在量化金融中的最大应用是衍生品定价。
当对衍生品进行定价时,大多数量子将使用两种方法中的一种。要么为他们定价建立Black Scholes模型,要么他们将使用模拟方法来估计导数的值。这两种技术都严重依赖于使用随机过程来模拟底层证券。
===
衍生定价方法一 Black Schole
Black Scholes模型用于在一组假设下对特定类型的衍生品合约进行定价。这些假设包括:(1)存在无风险利率,任何金额可以借入或借出,(2)基础价格根据几何布朗运动随机过程,(3)进化基础不支付股息,(4)市场上没有套利机会,(5)市场交易成本为零,(6)可以买入或卖出任何数量。
在这些假设下,可以导出着名的Black Scholes偏微分方程。
Black Scholes公式以及各种形式期权定价公式的推导,是过去三十年中衍生品交易所大量增长的主要原因。
导数定价 方法二 - 模拟方法
鉴于Black Scholes公式隐含的局限性和假设,通常采用蒙特卡罗方法(模拟)来为更少的简化假设。
这两个选项在计算复杂性和时间之间进行权衡。每次想要对导数进行定价时,使用模拟方法计算复杂度更高,但是为替代随机过程推导Black Scholes偏微分方程的“等价”更加耗时,然后仍然找到封闭形式的衍生品定价式。因此,大多使用模拟方法。
想要这样做的原因如下图所示。事实上,你如何选择和校准你的随机过程将对期权的预期收益产生重大影响。
红色椭圆形显示市场跳跃的位置 。
===
使用衍生工具进行套期保值
套期保值是风险管理战略。可对冲风险包括股票风险,利率风险,货币风险,信用风险,波动风险和商品风险。套期保值是通过投资与投资组合中的基础负相关的资产来完成的。最简单的例子是在股票上买入看跌期权。当股票表现不佳时,看跌期权表现良好,而整体投资组合并没有像没有对冲时那样糟糕。净效应是收益下降。
公司和基金将尝试确定投资组合所面临的风险因素并对冲这些风险因素。
除了我上面提到的问题之外,还有一些额外的“现实世界”问题。一个例子是一般成本和套期保值程序的复杂性(套期保值可能非常昂贵)。对于组织而言,问题在于,在出现不利损失的情况下,对冲风险或仅仅保留更多资本是否更合理。近年来,诸如Solvency II和Basel III等法规要求银行,对冲基金和保险公司预留更多资金来支持其投资组合。储备通常保留在高流动性证券中,预期收益很低,如国库券。
结论
随机过程对于描述我们世界中的随机过程非常有用。它们用于工程,遗传学,物理学和定量金融。数量使用随机过程来预测市场可能的回报和利率随时间的变化。随机过程通常与蒙特卡罗方法结合使用。
非常感谢您阅读本文,有任何问题请在下面留言!
点击文末 “阅读原文”
获取全文完整代码数据资料。
本文选自《Python金融应用编程:衍生品定价和套期保值的随机过程》。
点击标题查阅往期内容
R语言计算资本资产定价模型(CAPM)中的Beta值和可视化
R语言中进行期权定价的Heston随机波动率模型
R语言基于线性回归的资本资产定价模型(CAPM)
R语言对巨灾风险下的再保险合同定价研究案例:广义线性模型和帕累托分布Pareto distributions分析
R语言Black Scholes和Cox-Ross-Rubinstein期权定价模型案例
R语言用多元ARMA,GARCH ,EWMA, ETS,随机波动率SV模型对金融时间序列数据建模
R语言HAR和HEAVY模型分析高频金融数据波动率
R语言ARMA-GARCH-COPULA模型和金融时间序列案例
R语言分析负利率下金融市场:负利率和年金价值的变化
使用R语言随机波动模型SV处理时间序列中的随机波动率
Python随机波动率(SV)模型对标普500指数时间序列波动性预测
R语言预测波动率的实现:ARCH模型与HAR-RV模型
R语言时间序列GARCH模型分析股市波动率
R语言ARMA-EGARCH模型、集成预测算法对SPX实际波动率进行预测
期权机理与python实践
第一章:期权市场机制
文章目录
前言
期权作为重要的金融衍生产品,在风险对冲,套期保值,价格发现,套利等方面发挥着重要的作用,特别是我国金融衍生品的发展速度较快,如何更好的理解期权产品内涵,知道期权交易的基础知识,掌握关于期权的常见数理模型,是一个金融专业学生的基础素养,也是对期权感兴趣的交易者需要清楚的.这个系列的博文是我个人将自己所掌握的关于期权的内容进行系统整理,对于文中大部分内容,我都会使用python软件进行复现和量化,希望大家能够一起学习,共同进步.
一、期权类型
要了解期权,首先需要认识什么是衍生产品,因为期权是衍生产品的一种.通俗而言,衍生产品就是根据某些基础产品进行派生而来的产品,因此衍生产品的标的资产或者标的变量就是这些基础资产.比如,股票期权就是根据股票价格派生出的一种衍生产品.再如最近经常说的碳中和概念,其也有派生出的碳交易期货期权,其标的资产就是碳交易期货.
长话短说,期权就是一种合约,签订期权合约的交易者就拥有了一种权利,该合约赋予持有人在某一特定日期或该日之前的任何时间以固定价格购进或售出一种资产的权利.
那么,期权的概念了解以后,我们进一步来看期权的类型.联想一下,既然期权是基础资产的衍生产品,而基础资产,如股票,其价格多数时候都是曾献上涨或者下跌的情况,因此期权也可以分为看涨期权和看跌期权.其中,看涨期权持有者拥有在未来的一段时间内可以以某一特定价格买入某种资产的权利,看跌期权持有人拥有在未来的一段时间内可以以某一特定价格卖出某种资产的权利(很容易理解,既然是看涨,那持有者便认为标的资产未来的价格会更高,因此先约定以一个"合算"的价格在未来某一时间买入该资产,同理,看跌一样理解).
在了解期权的类型以后,需要知道期权合约中几个重要的变量或者要素.正如概念中所说的,“以某一特定价格”,这个特定价格通常被称为行权价或者执行价格(敲定价格),"特定时间"通常是到期日或者期限.说到期限,需要补充一点,欧式期权的持有人只有在到期日当天才可以选择是否行驶自己的权利,而美式期权则可以在到期日之前的任一交易日行使权力.
二、期权中的交易者
1.交易者类型
在期权交易过程中,根据交易者对未来行情的看法,可以分为四类:
(1)看涨期权买方:即买入看涨期权
(2)看涨期权卖方:即卖出看涨期权
(3)看跌期权买方:即买入看跌期权
(4)看跌期权卖方:即卖出看跌期权
计算公式为:
假定到期日的股票价格为ST,期权的执行价格为K(没有考虑成本)
欧式看涨期权的多头收益为:max(ST-K,0)
欧式看跌期权的多头收益为:max(K-ST,0)
欧式看涨期权的空头收益为:min(K-ST,0)
欧式看跌期权的空头收益为:min(ST-K,0)
以下为期权多空头收益代码,未考虑交易成本
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
K=8000
ST=np.linspace(7000,9000,100)
h=np.maximum(ST-K,0)
plt.figure()
plt.plot(ST,h,lw=2.5)
plt.xlabel('ST')
plt.ylabel('收益')
plt.title('看涨期权多头')
plt.grid(True)
从以上的图中可以知道,期权买方的收益是无限大,亏损是一定的,期权卖方刚好相反.
这里可以思考一下,看涨期权买方和看跌期权卖方其对标的资产未来的价格表现其实是乐观的,看涨期权卖方和看跌期权买方对标的资产未来价格的看法是消极的.
行文至此,需要再补充一点,期权的买方被称为多头,期权的卖方被称为空头.对期权买方和卖方而言,其权利和义务是极端不对等的.期权买方在支付权利金以后便拥有权利,而没有义务(也就是说买方可以觉得自己是否行权,而没有任何义务),而卖方则相反,只有义务没有权利.
2.举(多)个栗子
那么期权作为衍生产品,为什么会具有如此的重要性,以至于学者和交易者对其兴趣极大?这里举几个例子进行简单的说明(附代码)
例1
投资者买入执行价格为100美元、购买100股股票的看涨期权。假如股票的价格为98元,期权到期日为4个月,购买1股股票的期权价格为5美元。持有者的最初投资为500美元。期权为欧式期权,只能在到期日行权。假如到期时股票价格小于100美元,投资者不会行使权力,假如股票价格大于100美元,期权会被执行。假定到期时股票价格为115美元,通过行使期权权力,投资者可以挣得1500美元,除去最初的期权费用,投资者盈利为1000美元
以下代码展示了本例投资者买入看涨期权后的盈利与最终股票价格之间的关系.
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams["font.sans-serif"]=["SimHei"]
mpl.rcParams["axes.unicode_minus"]=False
S=98
K=100
ST=np.linspace(70,150,100)
X=5
H=np.maximum(ST-K,0)*100-X*100
plt.plot(ST,H)
plt.grid()
plt.title('欧式看涨期权的盈亏')
plt.axhline(0,color='r',linestyle="--",alpha=0.8)
plt.legend(loc=1)
plt.xlabel(' 最终股价')
plt.ylabel(' 盈利(美元)')
my_y_ticks = np.arange(-1000, 5000, 500)
plt.yticks(my_y_ticks)
通过这幅图可以清楚的发现,当股价价格低于行权价时,持有者是不会行使权力的,那么他将损失一定的权利金,当股价高于行权价时,持有者会选择行权,这样起码可以减少损失(算上权利金)或者增加盈利.所以对于看涨期权的买方而言,其盈利是可以无限大的(股价无限上涨),而损失则是锁定的.
例2
看涨期权持有者希望股票价格上涨,而看跌期权持有者希望股票价格下跌.假设看跌期权的执行价格为70美元,以执行价出售100股股票的看跌期权,假定股票当前的价格为65美元,期权到期日为三个月,卖出一份看跌期权的费用为7美元. 投资者最初投资为700美元。欧式期权只有在到期日股票价格低于70美元时才会被行权,假定到期日时股票价格为55美元,投资者能以55美元买入100股股票,按照70美元卖出100股股票,所以投资者盈利为1500美元,减去最初的期权费用700美元,净盈利为800美元.以下代码为上述过程的可视化
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams["font.sans-serif"]=["SimHei"]
mpl.rcParams["axes.unicode_minus"]=False
S1=65
K1=70
ST1=np.linspace(40,150,100)
X1=7
H1=np.maximum(K1-ST1,0)*100-X1*100
plt.plot(ST1,H1)
plt.grid()
plt.title('欧式看跌期权的盈亏')
plt.axhline(0,color='r',linestyle="--",alpha=0.8)
plt.legend(loc=1)
plt.xlabel(' 最终股价')
plt.ylabel(' 盈利(美元)')
my_y_ticks = np.arange(-1000, 5000, 500)
plt.yticks(my_y_ticks)
通过图中可以清楚的看出,看跌期权的持有者在股价小于行权价时会选择行权,股价下跌越多时持有者的盈利越多,而股价上涨时其亏损也是锁定在一定成本之中的.
以上两个例子是分析期权买方的盈利的,而对于期权卖方,其盈利情况则刚好相反.
任何一个期权合约都有两方,一方为期权的多头,即期权的买入方,一方为期权的空头,即期权的卖出方。卖出期权的一方在最初收入期权费,但这一方在今后有潜在的义务,卖出期权的一方的盈亏与买入期权的一方的盈亏相反。 以下代码为期权的卖方盈亏情况.
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams["font.sans-serif"]=["SimHei"]
mpl.rcParams["axes.unicode_minus"]=False
S2=98
K2=100
ST2=np.linspace(70,150,10)
X2=5
H2=-np.maximum(ST2-K2,0)*100+X2*100
plt.plot(ST2,H2)
plt.grid()
plt.title('卖出看涨期权的盈亏')
plt.axhline(0,color='r',linestyle="--",alpha=0.8)
plt.legend(loc=1)
plt.xlabel(' 最终股价')
plt.ylabel(' 盈利(美元)')
my_y_ticks = np.arange(-5000, 1000, 500)
plt.yticks(my_y_ticks)
看涨期权的空头收益与看涨期权多头相反,当股价上涨时,其亏损会变大,而当股价下降时,其盈利是有限的.
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams["font.sans-serif"]=["SimHei"]
mpl.rcParams["axes.unicode_minus"]=False
S3=65
K3=70
ST3=np.linspace(40,150,100)
X3=7
H3=-np.maximum(-ST3+K3,0)*100+X3*100
plt.plot(ST3,H3)
plt.grid()
plt.title('卖出看跌期权的盈亏')
plt.axhline(0,color='r',linestyle="--",alpha=0.8)
plt.legend(loc=1)
plt.xlabel(' 最终股价')
plt.ylabel(' 盈利(美元)')
my_y_ticks = np.arange(-3000, 1000, 500)
plt.yticks(my_y_ticks)
看跌期权空头则与看跌期权多头相反.当股价下跌时,其亏损加大,股价上涨时,其收益有限.
例3 采用期权对冲
投资者5月持有1000股价值28元的股票,投资者担心股票价格下跌,买入看跌期权进行对冲.
7月合约,买入10手看跌期权,期权执行价为27.5元,期权报价为1元,因此期权的持有成本为1000元
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
S=28
K=27.5
D=1000
ST=np.linspace(20,40,100)
h=ST*1000
H=np.maximum(K-ST,0)*1000-1000+ST*1000
plt.plot(ST,h,lw=2.5,color='r',linestyle='--',label='无对冲')
plt.plot(ST,H,lw=2.5,color='m',linestyle='-',label='有对冲')
plt.xlabel('股价(美元)')
plt.ylabel('持有者头寸价值(美元)')
plt.grid(True)
plt.legend(loc=0)
plt.title('证券组合在无对冲和有对冲情况下两个月后的价值')
可以看出,对冲策略的交易成本为1000元,可以确保股票的卖出价格至少为27.5元(合约期限之内).如果到期时股价低于27.5元,则持有者会行驶权利,那么收入为27.5*1000-1000=26500元.如果到期日股价高于27.5元,持有者不行权,但是股价收益会更高.此外,对冲组合能够锁定收益最小值,效果明显由于无对冲的收益.
例4 投机
#利用期权进行投机.假设股票现在的价格为20美元,执行价格为22.5美元,期限为两个月的看涨期权的当前价格为1美元。
两中投机方式
1.买入100股股票
2.买入2000份看涨期权
假设1:股票两个月后上涨至27美元
假设2:股票两个月后下降至15美元
投机收益情况如下
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib import pyplot as plt
import matplotlib
matplotlib.rc("font",family='DengXian')
S=20
K=22.5
ST=np.linspace(10,40,100)
h=100*(ST-20)
H=np.maximum(ST-K,0)*2000-2000
plt.plot(ST,h,lw=2.5,color='r',linestyle='--',label='买入股票')
plt.plot(ST,H,lw=2.5,color='m',linestyle='-',label='买入期权')
plt.xlabel('股价(美元)')
plt.ylabel('利润(美元)')
plt.grid(True)
plt.legend(loc=0)
plt.title('对价格为20美元的股票的两种投机策略的盈亏')
通过图中可知,期权策略可能会引起比股票策略更大的损失,但是也能够获得比股票策略更高的收益.这也说明期权能够提供一种杠杆效应.
总结
这是本系列的第一篇博文,主要是介绍了期权的基本概念,以及期权交易的基础知识,接下来会对期权的交易策略进行介绍.
第二章
前言
本章中,我们将以股票期权为例,介绍影响期权价格的因素,并且通过python进行量化实现。
一、影响期权价格的因素
1.初识BS模型
在这里,我们会想,要说影响期权价格的因素,首先需要有一个具体的公式或者指标来对期权价格进行才对,有了具体的公式和指标,就可以知道影响价格的因素,并且知道这些因素和价格之间的具体影响,比如是正相关还是负相关,抑或是先正后负等等。所以,我们先直观的给出一个期权定价最为经典的计算公式:于 Black-Scholes微分 方 程(B-S微分方程)。
传统理论认为期权的标的资产价格Pt 遵循几何布朗运动,并且期权的价格是时间与股票价格的函数,即Gt=G(Pt,t)。根据伊藤引理与无套利假设,Black等在求 解 B-S微分 方 程 的基础上得到如下BS欧式期权定价模型(不考虑股息,即股息d=0):(具体的BS公式留到后面的篇章再细说)
这里对式子的字母进行说明,Gt为看涨期权的价格;Pt为标的资产的价格;K 为交割价格;φ(x)为标准正态分布函数在x处的取值;T-t为距离到期日的时间间隔;r为无风险利率;σ为标的资产价格的波动率。
2.影响因素
从这些计算公式中可以直观的看出,期权价格与Pt,K,T,t,σ,r等数值密切相关,因此,我们可以认为,影响期权价格的因素主要有以下6个:(考虑股息,若剔除股息,则为5个)。
**(1)**当前股票价格Pt
**(2)**执行价格K
**(3)**期权到期期限T-t
**(4)**股票价格波动率σ
**(5)**无风险利率r
**(6)**股票期权期限内支付的股息d
二、python实践环节
这一部分,我们将对上述的六个影响因素进行说明。
1.股票价格
对看涨期权而言,如果期权进行交割,那么期权的收益就等于股票价格与期权执行价格之差(不考虑交易成本):Pt-K.可以看出,当K一定时,Pt越大,收益越高,看涨期权的价格也就越高。对于看跌期权而言,看跌期权的收益等于期权执行价格减去股票价格,即K-Pt,可知股票价格上涨时,看跌期权的收益会减小,因此看跌期权的价格也会下跌。由此,我们可以直观的感受到,股票价格对看涨期权价格而言是正相关,对看跌期权价格而言是负相关。
代码实现:
from pylab import plt
plt.style.use('seaborn')
%matplotlib inline
import math
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from scipy.integrate import quad
mpl.rcParams['font.family'] = 'serif'
#
# Helper Functions
#
def dN(x):
''' Probability density function of standard normal random variable x. ''' #标准正态随机变量 x 的概率密度函数
return math.exp(-0.5 * x ** 2) / math.sqrt(2 * math.pi)
def N(d):
''' Cumulative density function of standard normal random variable x. '''
return quad(lambda x: dN(x), -20, d, limit=50)[0]
def d1f(St, K, t, T, r, sigma):#设置函数d1
''' Black-Scholes-Merton d1 function.
Parameters see e.g. BSM_call_value function. '''
d1 = (math.log(St / K) + (r + 0.5 * sigma ** 2)* (T - t)) / (sigma * math.sqrt(T - t))
return d1
#
# Valuation Functions
#
#欧式看涨期权函数
def BSM_call_value(St, K, t, T, r, sigma):
''' Calculates Black-Scholes-Merton European call option value.
Parameters
==========
St : float
stock/index level at time t
K : float
strike price
t : float
valuation date
T : float
date of maturity/time-to-maturity if t = 0; T > t
r : float
constant, risk-less short rate
sigma : float
volatility
Returns
=======
call_value : float
European call present value at t
'''
d1 = d1f(St, K, t, T, r, sigma)
d2 = d1 - sigma * math.sqrt(T - t)
call_value = St * N(d1) - math.exp(-r * (T - t)) * K * N(d2)
return call_value
#欧式看跌期权函数
def BSM_put_value(St, K, t, T, r, sigma):
''' Calculates Black-Scholes-Merton European put option value.
Parameters
==========
St : float
stock/index level at time t
K : float
strike price
t : float
valuation date
T : float
date of maturity/time-to-maturity if t = 0; T > t
r : float
constant, risk-less short rate
sigma : float
volatility
Returns
=======
put_value : float
European put present value at t
'''
put_value = BSM_call_value(St, K, t, T, r, sigma) \\
- St + math.exp(-r * (T - t)) * K
return put_value
# Model Parameters
#
points=100
St =2.72 # 50ETF value
K = 2.7 # option strike
t = 0.0 # valuation date
T = 1.0 # maturity date
r = 0.015 # risk-less short rate
sigma = 0.2 # volatility
# C(K) plot现值与股票价格的关系
plt.figure(figsize=(10,8))
slist = np.linspace(2.7, 3, points)
vlist_call = [BSM_call_value(St, K, t, T, r, sigma) for St in slist]
vlist_put = [BSM_put_value(St, K, t, T, r, sigma) for St in slist]
plt.plot(slist, vlist_call,'r',label='call')
plt.plot(slist, vlist_put,'g',label='put')
plt.grid(True)
plt.xlabel('stock price')
plt.ylabel('present value')
2.执行价格
执行价格的分析和股票价格分析紧密相关,回想一下,对看涨期权而言,如果期权进行交割,那么期权的收益就等于股票价格与期权执行价格之差(不考虑交易成本):Pt-K.可以看出,当Pt一定时,K越大,收益越低,看涨期权的价格也就越低。对于看跌期权而言,看跌期权的收益等于期权执行价格减去股票价格,即K-Pt,可知执行价格变大时,看跌期权的收益会增加,因此看跌期权的价格也会上升。由此,我们可以直观的感受到,执行价格对看涨期权价格而言是负相关,对看跌期权价格而言是正相关。
代码如下
# C(K) plot现值与执行价的关系
plt.figure(figsize=(10,8))
plt.figure(figsize=(10,8))
klist = np.linspace(2.2, 3, points)
vlist_call = [BSM_call_value(St, K, t, T, r, sigma) for K in klist]
vlist_put = [BSM_put_value(St, K, t, T, r, sigma) for K in klist]
plt.plot(klist, vlist_call,'r',label='call')
plt.plot(klist, vlist_put,'g',label='put')
plt.grid(True)
plt.xlabel('strike price')
plt.ylabel('present value')
3.期权到期期限
从公式可看出,随时到期期限的增加,看涨期权和看跌期权的价格都会增加。从图中可以看出,同等情况下,看涨期权价格的增加程度更大一些。
代码如下:
# C(T) plot现值与到期时间的关系
plt.figure(figsize=(10,8))
tlist = np.linspace(0, 1, points)
vlist_call = [BSM_call_value(St, K, t, T以上是关于Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据的主要内容,如果未能解决你的问题,请参考以下文章