Options UDFs

Function dOne(Stock, Exercise, time, Interest, sigma)
dOne = (Log(Stock / Exercise) + Interest * time) / (sigma * Sqr(time)) + 0.5 * sigma * Sqr(time)
End Function

'---------------------------------------------------

Function optionCall(Stock, Exercise, time, Interest, sigma)
optionCall = Stock * Application.NormSDist(dOne(Stock, Exercise, time, Interest, sigma)) - Exercise * Exp(-time * Interest) * Application.NormSDist(dOne(Stock, Exercise, time, Interest, sigma) - sigma * Sqr(time))
End Function

'---------------------------------------------------

Function optionPut(Stock, Exercise, time, Interest, sigma)
optionPut = optionCall(Stock, Exercise, time, Interest, sigma) + Exercise * Exp(-Interest * time) - Stock
End Function

'---------------------------------------------------

Function optionIvolCall(Premium, Stock, Strike, time, rate)
  
Dim i As Integer

  s = Stock
  x = Strike
  t = time
  r = rate
  op = Premium
  i = 0
  
  lowValue = 0
  hiValue = 2
  c = 0.25

    comp = optionCall(s, x, t, r, c)
  
  Do While (Abs(op - comp) > 0.001)
      c = (lowValue + hiValue) / 2
      comp = optionCall(s, x, t, r, c)
          If (op > comp) Then
            lowValue = c
            Else
            hiValue = c
          End If
    i = i + 1
    If (i > 100) Then
    Exit Function
    End If
  Loop
  optionIvolCall = c
End Function

'---------------------------------------------------

Function optionIvolPut(Premium, Stock, Strike, time, rate)
  
Dim i As Integer
  s = Stock
  x = Strike
  t = time
  r = rate
  i = 0
  
  lowValue = 0
  hiValue = 2
  c = 0.25

    op = Premium + s - x * Exp(-r * t)
    
    comp = optionCall(s, x, t, r, c)
  
  Do While (Abs(op - comp) > 0.001)
      c = (lowValue + hiValue) / 2
      comp = optionCall(s, x, t, r, c)
          If (op > comp) Then
            lowValue = c
            Else
            hiValue = c
          End If
    i = i + 1
    If (i > 100) Then
    Exit Function
    End If
  Loop
  optionIvolPut = c
End Function