Python で三項ツリーを実装するのに苦労してい ます。二項ツリーの非常に優れたソリューション (およびベクトル化されたバージョン) を見つけたので、それを三項の場合に変更しようとしています。
これが私が持っているものです:
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]を実装する方法がわかりません。
ベクトル化されたバージョンではできないかもしれませんが、単純なツリーで試してみましたが、同様に失敗しました。
この場合、2 項または BS 価格は使用していません。