1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 二叉树期权定价python代码_欧式和美式期权的二叉树和Greek(1)——PYTHON

二叉树期权定价python代码_欧式和美式期权的二叉树和Greek(1)——PYTHON

时间:2021-03-01 16:02:33

相关推荐

二叉树期权定价python代码_欧式和美式期权的二叉树和Greek(1)——PYTHON

欧式和美式期权(Option)是最基础的衍生证卷。如何定价是初学金融工程者的必备知识。二叉树的又是最简单但是容易理解的工具。在网上有期权计算器可以很容易得到。但是练习自己编写还是有收益的。

欧式期权的无套利定价code非常简单:首先定义组合数,然后计算在不同节点的收益和概率,最后相加。

def nCr(n,r):

f =

math.factorial

return f(n)

/ (f(r) * f(n-r))

class Option(object):

def

__init__(self,s0,sigma,r,t,n,k,type=''):

self.s0=s0

self.sigma=sigma

self.r=r

self.t=t

self.n=n

self.k=k

self.type=type

def

Eu_price(self):

time=float(self.t)/self.n

u=math.exp(self.sigma*time**0.5)

d=math.exp(-self.sigma*time**0.5)

p=(math.exp(self.r*time)-d)/(u-d)

payment=0

for i in range(self.n+1):

if self.type=='Call':

pay=max(((self.s0*u**(self.n-2*i))-self.k),0)

elif self.type=='Put':

pay=max(self.k-((self.s0*u**(self.n-2*i))),0)

ppay=pay*nCr(self.n,i)*((1-p)**i)*(p**(self.n-i))

payment+=ppay

payment=payment/math.exp(self.r*self.t)

return payment

#××××××××××××××××××××××××××××××××××××××××××××××#

newoption = Option(100.0,0.2,0.05,1.0,100,100.0,type='Put')

print newoption.Eu_price()

#××××××××××××××××××××××××××××××××××××××××××××××#

美式期权作为可以提前practice的期权,就复杂的多。

可以先定义一个List,然后向前递归,取节点价值(practice)和发展价值的较大值。起点的价值就是定价。

import math

class Option(object):

def

__init__(self,s0,sigma,r,t,n,k,type=''):

self.s0=s0

self.sigma=sigma

self.r=r

self.t=t

self.n=n

self.k=k

self.type=type

def

Am_price(self):

time=float(self.t)/self.n

u=math.exp(self.sigma*time**0.5)

d=math.exp(-self.sigma*time**0.5)

p=(math.exp(self.r*time)-d)/(u-d)

pay=[]

for i in range(self.n+1):

if self.type=='Call':

pay.append(max(((self.s0*u**(self.n-2*i))-self.k),0))

elif self.type=='Put':

pay.append(max((self.k-(self.s0*u**(self.n-2*i))),0))

for j in range(self.n-1,-1,-1):

ppay=[]

qpay=[]

for m in range(j+1):

if self.type=='Call':

qpay.append((max(((self.s0*u**(j-2*m))-self.k),0)))

elif self.type=='Put':

qpay.append((max((self.k-(self.s0*u**(j-2*m))),0)))

ppay.append((pay[m]*p+pay[m+1]*(1-p))*math.exp(-self.r*time))

pay[m]=max(qpay[m],ppay[m])

return pay[0]

#在定价的基础上,Greek就很容易得到了,只需要取一个极小的变化值,然后得到微分即可。

def delta(self):

ds=0.1

new=Option(self.s0,self.sigma,self.r,self.t,self.n,self.k,self.type)

new1=Option(self.s0+ds,self.sigma,self.r,self.t,self.n,self.k,self.type)

return (new1.Am_price()-new.Am_price())/ds

def

gamma(self):

ds=0.1

new=Option(self.s0,self.sigma,self.r,self.t,self.n,self.k,self.type)

new1=Option(self.s0+ds,self.sigma,self.r,self.t,self.n,self.k,self.type)

return (new1.delta()-new.delta())/ds

def

vega(self):

dsigma=0.0001

new=Option(self.s0,self.sigma,self.r,self.t,self.n,self.k,self.type)

new1=Option(self.s0,self.sigma+dsigma,self.r,self.t,self.n,self.k,self.type)

return (new1.Am_price()-new.Am_price())/dsigma/100

def

theta(self):

dt=0.0001

new=Option(self.s0,self.sigma,self.r,self.t,self.n,self.k,self.type)

new1=Option(self.s0,self.sigma,self.r,self.t+dt,self.n,self.k,self.type)

return -(new1.Am_price()-new.Am_price())/dt

def

rho(self):

dr=0.0001

new=Option(self.s0,self.sigma,self.r,self.t,self.n,self.k,self.type)

new1=Option(self.s0,self.sigma,self.r+dr,self.t,self.n,self.k,self.type)

return (new1.Am_price()-new.Am_price())/dr/100

def

lamda(self):

new=Option(self.s0,self.sigma,self.r,self.t,self.n,self.k,selfi.type)

return new.delta()*self.s0/new.Am_price()

#以上是几个例子,还可有很容易编写其他的code。在此基础上,Delta 对冲的计算也很容易。

#As a beginner of financial engineering and computer science ,It

is a good practice to writesimple programs.

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。