|
我用两分法计算的隐含波动率,取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
|
評分
-
查看全部評分
|