我国的期货期权均为美式期权,对美式期权的定价采用美式期权二叉树方法。下面对美式期权二叉树方法做一简介:
- 输入量: 步数step、离到期时间t、标的价格S、执行价K、利率μ、波动率σ
- 计算过程:
Step1 : 计算步长∆t=t/step ,计算上涨概率 u= e^σ∆t , 计算下跌概率 u= e^(-σ∆t)。
Step2 : 计算风险中性概率 p=(e^(-r∆t)-d)/(u-d),如果标的是期货,则风险中性概率修改为p=(1-d)/(u-d) 。
Step3 : 从左至右形成标的价格树,节点0的价格为S, 则假设至当前步v,标的价格共上升i 步,下降j步, 则步v标的价格 S_(i,j)=S_0ui*dj , 其中 i+j=v 。
Step4: 从右至左形成期权价格树,从最后一步的价格开始,同一步相邻节点(例如S_(i,j+1)和S_(i+1,j))的价格可推导出两相邻节点父节点S_(i,j)期权贴现价格为 〖DV〗(i,j)=(C(i,j+1)(1-p)+C_(i+1,j)*p)*e^(-r∆t) ,最外层的贴现价值为零。 该节点看涨的行权价值为 E_(i,j)=max(S_(i,j+1)-K,0) ,看跌期权的行权价值为E_(i,j)=max(〖K-S〗(i,j+1),0) , 该节点的期权价值为 C(i,j) =max(〖DV〗(i,j), E(i,j) ) 。当步骤进行到根节点时,即为期权价格。
可以参考对应的python 代如下:
def binomialTree(callPut, spot, strike, rate, sigma, tenor, N=2000, american=True):
# Each time step period
deltaT = float(tenor) / N
u = np.exp(sigma * np.sqrt(deltaT))
d = 1.0 / u
a = np.exp(rate * deltaT)
p = (a - d) / (u - d)
oneMinusP = 1.0 - p
# Initialize the arrays
fs = np.asarray([0.0 for i in xrange(N + 1)])
# Stock tree for calculations of expiration values
fs2 = np.asarray([(spot * u ** j * d ** (N - j)) for j in xrange(N + 1)])
# Vectorize the strikes to speed up expiration check
fs3 = np.asarray([float(strike) for i in xrange(N + 1)])
# Compute the Binomial Tree leaves, f_{N, j}
if callPut == 'Call':
fs[:] = np.maximum(fs2 - fs3, 0.0)
else:
fs[:] = np.maximum(-fs2 + fs3, 0.0)
# Calculate backward the option prices
for i in xrange(N - 1, -1, -1):
fs[:-1] = np.exp(-rate * deltaT) * (p * fs[1:] + oneMinusP * fs[:-1])
fs2[:] = fs2[:] * u
if american:
# Simply check if the option is worth more alive or dead
if callPut == 'Call':
fs[:] = np.maximum(fs[:], fs2[:] - fs3[:])
else:
fs[:] = np.maximum(fs[:], -fs2[:] + fs3[:])
return fs[0]
参考文献:
[1]http://keeprunning.sg/american-vanilla-option-pricing-binomial-tree-method/