zhimakaimen 發表於 13-3-9 22:14

为什么fb的put call算出隐含波动率相差这么大?

 我用两分法计算的隐含波动率,取4月13日到期的,利率用的10年期国债,股息率把上四个季度的股息相加除以前收盘,时间是距离4月13日天数收盘的天数除以365,结果如下,fb 和 c 的call put算出来相差很多,aapl比较接近,谁能告诉我为什么?




                Parameters    fb    fb    c    c    aapl    aapl
    Stock Price    28.58    28.58    45    45    430.58    430.58
    Strike Price    28.5    29    44    46    430    435
    Time to maturity    0.09863                    0.09863
    Risk Free Rate    2.00E-02                   
    Dividend Yield    0    0    8.89E-04    8.89E-04    0.0187    0.0187
    Option Price    1.1    1.28    2.26    1.85    18.38    15.95
                           
    Result                       
    Implied       Volatility    0.288569    0.403835    0.298672    0.400219    0.335815    0.333568


程序帖在这里,这是我从维基百科上下载的,只修改了参数输入部分,

Public TargetColume As Integer

Function BlackScholesCall( _
   ByVal S As Double, _
   ByVal X As Double, _
   ByVal T As Double, _
   ByVal r As Double, _
   ByVal d As Double, _
   ByVal v As Double) As Double
   Dim d1 As Double
   Dim d2 As Double
   d1 = (Log(S / X) + (r - d + v ^ 2 / 2) * T) / v / Sqr(T)
   d2 = d1 - v * Sqr(T)
   BlackScholesCall = Exp(-d * T) * S * Application.NormSDist(d1) - X * Exp(-r * T) * Application.NormSDist(d2)
   End Function

Function ImpliedVolatility( _
   ByVal S As Double, _
   ByVal X As Double, _
   ByVal T As Double, _
   ByVal r As Double, _
   ByVal d As Double, _
   ByVal Price As Double) As Double

    Dim epsilonABS As Double
   Dim epsilonSTEP As Double
   Dim volMid As Double
   Dim niter As Integer
   Dim volLower As Double
   Dim volUpper As Double

    epsilonABS = 0.0000001
   epsilonSTEP = 0.0000001
   niter = 0
   volLower = 0.001
   volUpper = 1

    Do While volUpper - volLower >= epsilonSTEP Or Abs(BlackScholesCall(S, X, T, r, d, volLower) - Price) >= epsilonABS And epsilonABS <= Abs(BlackScholesCall(S, X, T, r, d, volUpper) - Price) >= epsilonABS
       volMid = (volLower + volUpper) / 2
       If Abs(BlackScholesCall(S, X, T, r, d, volMid) - Price) <= epsilonABS Then
         Exit Do
       ElseIf ((BlackScholesCall(S, X, T, r, d, volLower) - Price) * (BlackScholesCall(S, X, T, r, d, volMid) - Price) < 0) Then
         volUpper = volMid
       Else
      volLower = volMid
       End If
       niter = niter + 1
   Loop

    ImpliedVolatility = volLower

End Function

Function CalcImpliedVolatility()

Dim S, X, T, r, d, Price As Double
   Dim volatility As Double

S = ActiveSheet.Cells(6, TargetColume).Value
   X = ActiveSheet.Cells(7, TargetColume).Value
   T = ActiveSheet.Cells(8, "B").Value
   r = ActiveSheet.Cells(9, "B").Value
   d = ActiveSheet.Cells(10, TargetColume).Value
   Price = ActiveSheet.Cells(11, TargetColume).Value

volatility = ImpliedVolatility(S, X, T, r, d, Price)

ActiveSheet.Cells(14, TargetColume).Value = volatility

End Function

Private Sub CommandButton1_Click()

CalcImpliedVolatility

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
TargetColume = Target.Column
End Sub

頁: [1]
查看完整版本: 为什么fb的put call算出隐含波动率相差这么大?