def OneTouch( IsHigh, IsDelayed, Spot, Strike, Vol, Texp, Rd, Rf ):
'''Prices a one touch option. IsHigh=True means it knocks up and in; False
means down and in. IsDelayed=True means it pays at the end; False means it
pays on hit.'''
if ( IsHigh and Spot >= Strike ) or ( not IsHigh and Spot <= Strike ):
if IsDelayed:
return exp( -Rd * Texp )
else:
return 1
if Vol <= 0 or Texp <= 0: return 0
Alpha = log( Strike / float( Spot ) )
Mu = Rd - Rf - Vol * Vol / 2.
if IsDelayed:
if IsHigh:
Price = exp( -Rd * Texp ) * ( cnorm( ( -Alpha + Mu * Texp ) / Vol / sqrt( Texp ) ) \
+ exp( 2 * Mu * Alpha / Vol / Vol ) * cnorm( ( -Alpha - Mu * Texp ) / Vol / sqrt( Texp ) ) )
else:
Price = exp( -Rd * Texp ) * ( cnorm( ( Alpha - Mu * Texp ) / Vol / sqrt( Texp ) ) \
+ exp( 2 * Mu * Alpha / Vol / Vol ) * cnorm( ( Alpha + Mu * Texp ) / Vol / sqrt( Texp ) ) )
else:
MuHat = sqrt( Mu * Mu + 2 * Rd * Vol * Vol )
if IsHigh:
Price = exp( Alpha / Vol / Vol * ( Mu - MuHat ) ) * cnorm( ( -Alpha + MuHat * Texp ) / Vol / sqrt( Texp ) ) \
+ exp( Alpha / Vol / Vol * ( Mu + MuHat ) ) * cnorm( ( -Alpha - MuHat * Texp ) / Vol / sqrt( Texp ) )
else:
Price = exp( Alpha / Vol / Vol * ( Mu + MuHat ) ) * cnorm( ( Alpha + MuHat * Texp ) / Vol / sqrt( Texp ) ) \
+ exp( Alpha / Vol / Vol * ( Mu - MuHat ) ) * cnorm( ( Alpha - MuHat * Texp ) / Vol / sqrt( Texp ) )
return Price
评论列表
文章目录