def AsianFwdVega(Fwd, strike, RlzAvg, Vol, Texp, AvgPeriod, Rd):
Fwd = float(Fwd)
strike = float(strike)
RlzAvg = float(RlzAvg)
if AvgPeriod > Texp:
x = strike * (AvgPeriod / Texp) - RlzAvg * (AvgPeriod - Texp) / Texp
else:
x = strike
tau = numpy.max([0, Texp - AvgPeriod])
if AvgPeriod > 0:
M = (2.0 * exp(Vol * Vol * Texp) - 2.0 * exp(Vol * Vol * tau) * (1.0 + Vol * Vol * (Texp - tau))) / \
((Vol ** 4) * ((Texp - tau) ** 2))
volA = sqrt(log(M) / Texp)
else:
volA = Vol
if x < 0:
return 0
else:
if Texp < AvgPeriod:
multi = Texp / AvgPeriod
else:
multi = 1.0
if AvgPeriod > 0:
dM = 4.0 * (exp(Vol * Vol * Texp) * Texp * Vol - exp(Vol * Vol * tau) \
* ((Vol ** 3) * tau * (Texp - tau) + Vol * Texp)) / \
((Vol ** 4) * (Texp - tau) * (Texp - tau)) - \
8.0 * (exp(Vol * Vol * Texp) - exp(Vol * Vol * tau) * (1.0 + Vol * Vol * (Texp - tau))) / \
((Vol ** 5) * (Texp - tau) * (Texp - tau))
dvA = 1.0 / (2.0 * volA) / Texp / M * dM
else:
dvA = 1.0
Asiand1 = (log(Fwd / x) + volA * volA * 0.5 * Texp) / (volA * sqrt(Texp))
ND = exp(-(Asiand1 * Asiand1 * 0.5)) / sqrt(2 * pi)
return multi * Fwd * exp(-Rd * Texp) * ND * sqrt(Texp) * dvA * 0.01
评论列表
文章目录