Python中的三叉树

时间:2015-11-07 16:44:15

标签: python numpy finance computational-finance

我正在努力在Python中实现sys/types.h man page。我找到了trinomial tree(和very nice solution)二项式树,我正在尝试将其更改为三项式案例。
这就是我所拥有的:

def Trinomial(type, S0, K, r, sigma, T, N=2000):
import numpy as np
t = float(T) / N
#fixed lambda
lam = np.sqrt(5)
# up and down factor will be constant for the tree so we calculate outside the loop
u = np.exp(lam * sigma * np.sqrt(t))
d = 1.0 / u

#to work with vector we need to init the arrays using numpy
fs =  np.asarray([0.0 for i in xrange(2*N + 1)])

#we need the stock tree for calculations of expiration values
fs2 = np.asarray([(S0 * u**j) for j in xrange(-N, N+1)])

#we vectorize the strikes as well so the expiration check will be faster
fs3 =np.asarray( [float(K) for i in xrange(2*N + 1)])

#formulas, that can be found in the pdf document
a = np.exp(r*t/2.0)
b = np.exp(-sigma * np.sqrt(t/2.0))
c = np.exp(sigma * np.sqrt(t/2.0))
p_u = ( ( a - b ) / ( c - d ) )**2 
p_d = ( ( c - a ) / ( c - b ) )**2
p_m = 1 - p_u - p_d

# Compute the leaves, f_{N, j}
if type =="C":
    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(-r * t) * (p_u * fs[1:] + p_d * fs[:-1] + p_m*fs[-1])

return fs[0]

当然,它按预期工作,例如呼叫

print Trinomial("C",100, 100, 0.1, 0.1, 5, 3)

应输出39到40之间的东西 我最关心的是:

fs2 = np.asarray([(S0 * u**j) for j in xrange(-N, N+1)])

fs[:-1] = np.exp(-r * t) * (p_u * fs[1:] + p_d * fs[:-1] + p_m*fs[-1])

我不确定我是否正确填充了初始树,并且我100%肯定,反向计算选项价格无效。我不知道如何从开头链接的pdf中实现公式[10] 也许它无法在矢量化版本上完成,但我尝试使用简单的树并且也失败了。
在这种情况下,我没有使用二项式或BS价格,因为我的配置是用三叉树来做。

1 个答案:

答案 0 :(得分:0)

我刚开始接受Python,并且已经构建了二项式和三项式模型,只是为了测试我的理解,特别是关于数组。

对于终端股票价格数组,我已经从InitialStock * u **(iSteps - i)下台,因为我从零到2 * iSteps + 1即ie。我从最顶级的股票价格InitialStock * u **(iSteps)开始,然后向下走,直到我到达InitalStock * u **( - iSteps)并填充TerminalStock数组从0到2 * iSteps + 1(即最后一个)数组元素是InitialStock * u **( - iSteps)。因为我来自VBA的土地,我还没有拿起雄辩的(因此,简短的,有时难以阅读的Python风格),我的循环看起来像这样:

for i in range(0, 2*iSteps+1) :

    # Terminal stock is initial with up staps and down steps
    dblStockTerminal = dblStock * u ** float(iSteps - i)

    # compute intrinsic values at terminal stock value
    dblTrinOpt[i][iSteps] = max( dblSwitch * (dblStockTerminal - dblStrike), 0 )

我已将dblTrinOpt数组初始化为dblTrinOpt = np.ndarray((2 * iSteps + 1,iSteps + 1),float),因此它在终端股票价格和iStep时间步长中具有2 * iSteps价格元素,其中iSteps = OptionTerm / NumberOfSteps。是的,为我笨重的python代码道歉! (但我必须阅读它)。

之后,我的选项计划如下(是的,代码再次不优雅):

#------------------------------------------
# steps in time from Terminal to Initial Stock price
#------------------------------------------
for i in range(iSteps-1, -1, -1) :

    #------------------------------------------
    # steps in price range from highest to lowest
    #------------------------------------------
    for j in range(0, 2*i+1) :

        #------------------------------------------
        # discount average of future option value
        # as usual, trinomial averages three values
        #------------------------------------------
        dblTrinOpt[j][i] = dblDisc * (pu * dblTrinOpt[j][i+1] + pm * \
            dblTrinOpt[j+1][i+1] + pd * dblTrinOpt[j+2][i+1])

之后,我的Trinomial函数将dblTrinOpt [0] [0]作为最终贴现期权价格。

我想以更易读的形式编写它,以便更容易添加两个组件: (a)美国期权工具,因此跟踪每个树节点的股票价格(因此,像障碍和百慕大人这样的东西将是一个简单的补充,并且 (b)在每一端增加两个额外的终端价格,以便在零时刻,我有三个股票和期权值,这样我就可以计算delta和gamma而无需重新计算期权树(即避免碰撞和重新计算方法)。我希望这有帮助,即使我没有修复你的特定代码,但解释了逻辑。