0

インプライド ボラティリティを計算するために、Python で SABR (確率的アルファ、ベータ、ロー) を実装しようとしています。このリンクは、スライド 17 から始まる SABR を非常に正確かつ簡潔に説明しています: http://lesniewski.us/papers/presentations/MIT_March2014.pdf

この方法は簡単に思えますが、私が抱えている問題は、プログラムを実行するたびに ZeroDivisonError が発生することです。これは、キャリブレーション中に最初の alpha、rho、および sigma0 を誤って選択したことが原因である可能性があると考えています。ただし、最小値が見つかることを保証するために初期値を選択する方法をオンラインで見つけることができません。

これが私のコードです:

# args = [alpha, rho, sigma0]
# The other parameters (T, K, F0, beta, rho, marketVol) are globals
def calcImpliedVol(args):
    alpha = args[0] 
    rho = args[1]
    sigma0 = args[2]

    # From MIT powerpoint, slide 21
    Fmid = (F0 + K) / 2.0
    gamma1 = 1.0 * beta / Fmid
    gamma2 = 1.0 * beta * (beta - 1) / Fmid**2
    xi = 1.0 * alpha / (sigma0 * (1 - beta)) * (F0**(1-beta) - K**(1-beta))
    e = T * alpha**2 # From MIT powerpoint, slide 19

    # From MIT powerpoint, slide 21
    impliedVol = \
        1.0 * alpha * log(F0/K) / D(rho, xi) * \
        (1 + ((2 * gamma2 - gamma1**2 + 1 / Fmid**2)/24.0 * (sigma0 * Fmid**beta / alpha)**2 + \
        (rho * gamma1 / 4.0) * (sigma0 * Fmid**beta / alpha) + ((2 - 3 * rho**2) / 24.0)) * e) - \
        marketVol

    # Returns lambda function in terms of alpha, rho, sigma0
    return impliedVol;

# From MIT powerpoint, slide 21
def D(rho, xi):
    result = log((sqrt(1 - 2 * rho * xi + xi**2) + xi - rho) / (1-rho))
    return result

# Find optimal alpha, rho, sigma0 that minimizes calcImpliedVol - marketVol
def optimize():
    result = optimize.minimize(calcImpliedVol, [alpha_init, rho_init, sigma0_init])
    return result

どうもありがとう、助けてくれてありがとう!

4

2 に答える 2

0

検索間隔の境界を操作します。

于 2015-12-12T23:36:08.370 に答える