程式

使用 vanna volga 計算隱含體積

  • January 16, 2017

我正在嘗試編寫一個 R 腳本,它接受 25d 呼叫並與 ATM 一起放置並創建一個卷。微笑。

我嘗試使用 Castagna 和 Mercurio 提出的方法來計算 vanna-volga 波動率。對於歐洲呼叫,提出的表達是:

C(K) = CBS(K)+ w(K1)$$ CMkt(K1)-CBS(K1) $$+w(K3)

$$ CMkt(K3)-CBS(K3) $$ 其中 w1 和 w3 是根據下面的程式碼計算的。

BSoption <- function(type, S, X, t, r, rf, v)
{

 d1 <- (log(S/X) + (r-rf + 0.5 * v^2) * t)/(v * sqrt(t))
 d2 <- d1 - v*sqrt(t)
 if (type == "c"){
   pnorm(d1)*S*exp(-rf*t) - pnorm(d2)*X*exp(-r*t)
 } else {
   pnorm(-d2)*X*exp(-r*t) - pnorm(-d1)*S*exp(-rf*t)
 }
}

vega <- function(S, X, t, r, rf, v)
{
 d1 <- (log(S/X) + (r -rf + 0.5 * v^2) * t)/(v * sqrt(t))
 Np <- (exp(-d1^2/2))/ sqrt(2 * pi) 
 (S * exp(-rf*t)*sqrt(t) * Np)/100
}

implied.vol <-
 function(type, S, X, t, r, rf, market){
   sig <- 0.20
   sig.up <- 1
   sig.down <- 0.001
   count <- 0
   err <- BSoption(type, S, X, t, r, rf, sig) - market 

   ## repeat until error is sufficiently small or counter hits 1000
   while(abs(err) > 0.00001 && count<1000){
     if(err < 0){
       sig.down <- sig
       sig <- (sig.up + sig)/2
     }else{
       sig.up <- sig
       sig <- (sig.down + sig)/2
     }
     err <- BSoption(type, S, X, t, r, rf, sig) - market
     count <- count + 1
   }

   ## return NA if counter hit 1000
   if(count==1000){
     return(NA)
   }else{
     return(sig)
   }
 }

S <- 0.906
X <- seq(0.7,1.2,0.01)
t <- 1
r <- 0.0507
rf <- 0.047#-log(0.9945049)/t
ATMcost <- BSoption("c",S,XATM,t,r,rf,vATM)

v25p <- 0.13575#vv.inputs$Vol[vv.inputs$Skew == -0.25]
vATM <- 0.132#vv.inputs$Vol[vv.inputs$Skew == 0.0]
v25c <- 0.13425#vv.inputs$Vol[vv.inputs$Skew == 0.25]

X25p <- 0.8350575#BSStrikeFromDelta("p",S,v25p,t,r,rf,0.25)
XATM <- S
X25c <- 1.000846#BSStrikeFromDelta("c",S,t,r,v25c,rf,0.25)

w1 <- (vega(S,X,t,r,rf,vATM)/vega(S,X25p,t,r,rf,v25p))*((log(XATM/X)*log(X25c/X))/(log(XATM/X25p)*log(X25c/X25p)))
w2 <- (vega(S,X,t,r,rf,vATM)/vega(S,XATM,t,r,rf,vATM))*((log(X/X25p)*log(X25c/X))/(log(XATM/X25p)*log(X25c/XATM)))
w3 <- (vega(S,X,t,r,rf,vATM)/vega(S,X25c,t,r,rf,v25c))*((log(X/X25p)*log(X/XATM))/(log(X25c/X25p)*log(X25c/XATM)))

VV.price <- ATMcost + w1*(BSoption("c",S,X25p,t,r,rf,v25p)-BSoption("c",S,X25p,t,r,rf,vATM)) + w3*(BSoption("c",S,X25c,t,r,rf,v25c)-BSoption("c",S,X25c,t,r,rf,vATM))

VV.vol <- 0
for(i in 1:length(X)){
 VV.vol[i] <- implied.vol("c",S,X[i],t,r,rf,VV.price[i])
}
plot(X,VV.price)
plot(X,VV.vol)

正如你所看到的,我計算了期權的伏爾加伏爾加價格,這與給定的報價一致,但是,當我繪製波動率“微笑”時,它實際上根本不是微笑,我不確定我在哪裡會出錯的。

任何幫助深表感謝。

實際上,回答這個問題的最佳方法是使用原始的 Mercurio 和 Castagna 論文,該論文對計算隱含 vol 的最佳方法進行了證明和解釋。

請參閱此處的論文:

http://www.fabiomercurio.it/consistentfxsmile.pdf

在下面的行中,我所要做的就是替換 X

$$ i $$使用 XATM 是因為 vanna volga 方法為滿足對沖 vega,vanna,volga ATM 的期權創建了一個價格,因此您總是得到 vol。與 ATM 罷工。

VV.vol[i] <- implied.vol("c",S,X[i],t,r,rf,VV.price[i])

引用自:https://quant.stackexchange.com/questions/31896