如何在R中进行SV模型的波动率预测

Python029

如何在R中进行SV模型的波动率预测,第1张

1、打开一个空白Excel工作表,打开VBA编辑器(点击菜单:工具 ->宏 ->Visual Basic编辑器):

2、插入模块(点击VBA编辑器菜单:插入 ->模块):

3、将以下代码复制/粘贴到代码窗口中:

Function CallOpt(stock, exercise, maturity, rate, volatility) As Double

D1 = (Log(stock / exercise) + (rate + (volatility ^ 2) / 2) * maturity) / (volatility * Sqr(maturity))

D2 = D1 - volatility * Sqr(maturity)

CallOpt = stock * Application.NormSDist(D1) - exercise * Exp(-rate * maturity) * Application.NormSDist(D2)

End Function

Function PutOpt(stock, exercise, maturity, rate, volatility) As Double

D1 = (Log(stock / exercise) + (rate + (volatility ^ 2) / 2) * maturity) / (volatility * Sqr(maturity))

D2 = D1 - volatility * Sqr(maturity)

PutOpt = exercise * Exp(-rate * maturity) * Application.NormSDist(-D2) - stock * Application.NormSDist(-D1)

End Function

粘贴完成后如下图:

3、关闭“Visual Basic 编辑器”窗口,回到工作表。此时若查看函数列表,可看到在“用户定义”类别中增加了两个函数,CallOpt和PutOpt:

=CallOpt(stock,exercise,maturity,rate,volatility) 用于计算认购权证的理论价格;

=PutOpt(stock,exercise,maturity,rate,volatility) 用于计算认沽权证的理论价格。

两个函数都是需要5个变量,依次为:

stock-正股现价;

exercise-权证行权价;

maturity-权证剩余期限(折算成年,在Excel中=(到期日-当前日)/365);

rate-无风险利率(一般取国债的年收益率);

volatility-波动率(一般取正股最近3个月的历史波动率);

现在只需要在单元格中输入函数名并依顺序输入各变量,就可轻而易举的算出权证理论价格了。若还有不明白的,请将下表复制/粘贴到工作表“A1”单元格中试试看。

最后将该Excel文件保存起来。记住,以后每次打开该文件,都会出现以下的安全警告,记得一定要点选“启用宏”,否则自定义函数将不能使用。

FMStable这个包里有

或者

Function ImpliedCallVolatility(UnderlyingPrice, ExercisePrice, Time, Interest, Target, Dividend)

High = 5

Low = 0

Do While (High - Low) >0.0001

If CallOption(UnderlyingPrice, ExercisePrice, Time, Interest, (High + Low) / 2, Dividend) >Target Then

High = (High + Low) / 2

Else: Low = (High + Low) / 2

End If

Loop

ImpliedCallVolatility = (High + Low) / 2

End Function

Function ImpliedPutVolatility(UnderlyingPrice, ExercisePrice, Time, Interest, Target, Dividend)

High = 5

Low = 0

Do While (High - Low) >0.0001

If PutOption(UnderlyingPrice, ExercisePrice, Time, Interest, (High + Low) / 2, Dividend) >Target Then

High = (High + Low) / 2

Else: Low = (High + Low) / 2

End If

Loop

ImpliedPutVolatility = (High + Low) / 2

End Function