I don't know if anyone here has done the same thing, but I took the S&P index prices from the past several years, and calculated for each date the winning probability of selling american style calls that are 2 standard deviations above current price using standard text book formulas (please see formulas at the end of the posting), hoping to find some sort of pattern or range in the probabilities. But guess what I have found? Both winning and losing trades have pretty much the SAME "winning probability distribution"! The success probability for winning trades range from about 40% to almost 100%. The success probability for trades that ended up losing range also from about 40% to almost 100%. So am I missing something in my formulas? If not, how is text book probability calculation USEFUL AT ALL? I don't think I missed anything in my formulas because I have compared their results to other option softwares out there.
By the way, for the volatility, skew, and kurtosis values I passed to the formulas, I have used different periods: past 15 days, past 30 days, past 60 days, past 2000 days, variable (depending how far away from expiration). Spent a lot of time, got the same results.
=============== VBA FORMULAS ==================
'''''''''''''''''''''''''''''''''''''''''''''''
' explanation:
'
' u - current price
' s - strike
' r - risk free interest rate (in decimal)
' v - volatility (in decimal)
' t - time to expiration (# days divided by 365)
' sk - skew (in decimal)
' kt - kurtosis (in decimal)
' dv - dividend in percentage, not applicable to indices
'
' getITMProbNonNorm():
' Probability that price will reached strike price s,
' assume non-normal distribution.
' Success probability of selling a call at s will be:
' 1 - getITMProbNonNorm().
'
' getITMProb():
' Probability that price will reached strike price s,
' assume normal distribution.
' Success probability of selling a call at s will be:
' 1 - getITMProb().
'
'''''''''''''''''''''''''''''''''''''''''''''''''
Function getITMProbNonNorm(u As Double, _
s As Double, _
r As Double, _
v As Double, _
t As Double, _
sk As Double, _
kt As Double, _
Optional dv = 0) As Double
dim zi As Double
dim i As Integer
dim z As Double
dim step As Double
dim sum As Double
dim t1#, t2#
z = (Log(s / u) - (r - dv - v ^ 2 / 2) * t) / (v * Sqr(t))
step = (z + 7) / 200
sum = 0
For i = 1 To 200
zi = -7 + i * step - step / 2
t1 = (sk / 6) * (zi ^ 3 - 3 * zi)
t2 = ((kt - 3) / 24) * (zi ^ 4 - 6 * zi ^ 2 + 3)
sum = sum + norm(zi) * (1 + t1 + t2) * step
Next i
getITMProbNonNorm = 1 - sum
End Function
Function getITMProb(u As Double, _
s As Double, _
r As Double, _
v As Double, _
t As Double, _
Optional dv = 0) As Double
getITMProb = 1 - snorm((Log(s / u) - _
(r - dv - v ^ 2 / 2) * t) / (v * Sqr(t)))
End Function
'normal cumulative function
Function snorm(z)
Dim w As Integer
Dim y As Single
Dim c1, c2, c3, c4, c5, c6
c1 = 2.506628
c2 = 0.3193815
c3 = -0.3565638
c4 = 1.7814779
c5 = -1.821256
c6 = 1.3302744
If z > 0 Or z = 0 Then
w = 1
Else: w = -1
End If
y = 1 / (1 + 0.2316419 * w * z)
snorm = 0.5 + w * (0.5 - (Exp(-z * z / 2) / c1) * _
(y * (c2 + y * (c3 + y * (c4 + y * (c5 + y * c6))))))
End Function
'normal distribution function
Private Function norm(z As Double) As Double
norm = 1 / Sqr(2 * PI) * Exp(-z ^ 2 / 2)
End Function
By the way, for the volatility, skew, and kurtosis values I passed to the formulas, I have used different periods: past 15 days, past 30 days, past 60 days, past 2000 days, variable (depending how far away from expiration). Spent a lot of time, got the same results.
=============== VBA FORMULAS ==================
'''''''''''''''''''''''''''''''''''''''''''''''
' explanation:
'
' u - current price
' s - strike
' r - risk free interest rate (in decimal)
' v - volatility (in decimal)
' t - time to expiration (# days divided by 365)
' sk - skew (in decimal)
' kt - kurtosis (in decimal)
' dv - dividend in percentage, not applicable to indices
'
' getITMProbNonNorm():
' Probability that price will reached strike price s,
' assume non-normal distribution.
' Success probability of selling a call at s will be:
' 1 - getITMProbNonNorm().
'
' getITMProb():
' Probability that price will reached strike price s,
' assume normal distribution.
' Success probability of selling a call at s will be:
' 1 - getITMProb().
'
'''''''''''''''''''''''''''''''''''''''''''''''''
Function getITMProbNonNorm(u As Double, _
s As Double, _
r As Double, _
v As Double, _
t As Double, _
sk As Double, _
kt As Double, _
Optional dv = 0) As Double
dim zi As Double
dim i As Integer
dim z As Double
dim step As Double
dim sum As Double
dim t1#, t2#
z = (Log(s / u) - (r - dv - v ^ 2 / 2) * t) / (v * Sqr(t))
step = (z + 7) / 200
sum = 0
For i = 1 To 200
zi = -7 + i * step - step / 2
t1 = (sk / 6) * (zi ^ 3 - 3 * zi)
t2 = ((kt - 3) / 24) * (zi ^ 4 - 6 * zi ^ 2 + 3)
sum = sum + norm(zi) * (1 + t1 + t2) * step
Next i
getITMProbNonNorm = 1 - sum
End Function
Function getITMProb(u As Double, _
s As Double, _
r As Double, _
v As Double, _
t As Double, _
Optional dv = 0) As Double
getITMProb = 1 - snorm((Log(s / u) - _
(r - dv - v ^ 2 / 2) * t) / (v * Sqr(t)))
End Function
'normal cumulative function
Function snorm(z)
Dim w As Integer
Dim y As Single
Dim c1, c2, c3, c4, c5, c6
c1 = 2.506628
c2 = 0.3193815
c3 = -0.3565638
c4 = 1.7814779
c5 = -1.821256
c6 = 1.3302744
If z > 0 Or z = 0 Then
w = 1
Else: w = -1
End If
y = 1 / (1 + 0.2316419 * w * z)
snorm = 0.5 + w * (0.5 - (Exp(-z * z / 2) / c1) * _
(y * (c2 + y * (c3 + y * (c4 + y * (c5 + y * c6))))))
End Function
'normal distribution function
Private Function norm(z As Double) As Double
norm = 1 / Sqr(2 * PI) * Exp(-z ^ 2 / 2)
End Function