我试过一次三叉数,不错的。可以去掉zigzag效果。
Function Tri_put(S, X, r, d, sigma, Tmat, N, American_FLAG)
Dim dt As Single
Dim up_step As Single
Dim down_step As Single
Dim pup As Single
Dim pmm As Single
Dim pdown As Single
ReDim opt(0 To 2 * N) As Single
ReDim opt_new(0 To 2 * N) As Single
ReDim S_array(0 To 2 * N) As Single
dt = Tmat / N
up_step = Exp(sigma * Sqr(3 * dt))
down_step = Exp(-sigma * Sqr(3 * dt))
pup = Sqr(dt / (12 * sigma ^ 2)) * (r - sigma ^ 2 / 2) + 1 / 6
pmm = 2 / 3
pdown = 1 - pup - pmm
For i = 0 To 2 * N
S_array(i) = S * (up_step ^ (i - N))
opt(i) = max(X - S_array(i), 0)
Next i
For j = 1 To N
For i = j To 2 * N - j
opt_new(i) = Exp(-r * dt) * (pup * opt(i + 1) + pmm * opt(i) + pdown * opt(i - 1))
If American_FLAG = 1 Then
If (X - S_array(i)) > opt_new(i) Then
opt_new(i) = (X - S_array(i))
End If
End If
Next i
For i = j To 2 * N - j
opt(i) = opt_new(i)
Next i
Next j
Tri_put = opt(N)
End Function