R語言實現期權二叉樹定價的函數

以后就在這里寫一些文字,主要是自己各種各樣的學習筆記。盡管現在只是個ATM管理員,但勉強也算是金融行業從業者,內容以金融為主,如果學到些其他旁門左道的東西,也會考慮分享一下。

2014年12月20日

最近在學R語言,看過《R語言初學者指南》,看了約翰霍普金斯大學的?R語言編程?

網絡公開課(非常推薦這個課程,不過不建議剛開始接觸R就看,對于沒有編程基礎的人還是有點難度,建議先看《R語言初學者指南》),感覺收獲頗多,自己也手癢想寫點什么東西,于是乎想寫個期權定價函數。結果自己折騰了半天還是寫不出來,最后只能把《EXCEL及VBA高級金融建模》里面的VBA函數照搬過來,發覺還是能用。不過R語言的循環著實不太好用,二叉樹劃分到5000步以上計算時間就已經相當長了,或者是算法還有優化的空間。

#歐式期權

EUOption <- function(iopt, S, X, r, q, tyr, sigma, nstep){

#iopt 1 call, -1 put

#S 現價

#X 行權價

#r 無風險利率

#q 紅利收益率

#tyr 期限

#sigma 波動率(標準差)

#nstep 二叉樹步數

delt <- tyr/nstep #每一步的期限

erdt <- exp(r*delt) #折現因子

ermqdt <- exp((r-q)*delt) #考慮股利效應

u <- exp(sigma*sqrt(delt))

d <- 1/u

P <- (ermqdt - d)/(u - d)

Pstar <- 1-P

vvec <- vector(length = nstep + 1)#例如9步二叉樹最后會有10個結果

#算出最后一期全部可能的股價情形下的期權價值

for(i in 1 :nstep +1){

vvec[i] <- max(iopt*(S*u^(i-1)*d^(nstep +1 -i) - X),0)#注意iopt后面的括號,-1的時候為看跌期權,括號要把X也包進來

}

#倒推回去各個節點的價值

for(j in nstep : 1){

for(k in 1 : j)

{vvec[k] <- (P*vvec[k+1] + Pstar*vvec[k])/erdt}

}

vvec[1]

}


#可選擇美式或者歐式期權的函數

OptionPrice <- function(iopt, iea, S, X, r, q, tyr, sigma, nstep){

#iopt 1 call, -1 put

#iea 1歐式,2為美式

#S 現價

#X 行權價

#r 無風險利率

#q 紅利收益率

#tyr 期限

#sigma 波動率(標準差)

#nstep 二叉樹步數

delt <- tyr/nstep #每一步的期限

erdt <- exp(r*delt) #折現因子

ermqdt <- exp((r-q)*delt) #考慮股利效應

u <- exp(sigma*sqrt(delt))

d <- 1/u

P <- (ermqdt - d)/(u - d)

Pstar <- 1-P

vvec <- vector(length = nstep + 1)#例如9步二叉樹最后會有10個結果

#算出最后一期全部可能的股價情形下的期權價值

for(i in 1 :nstep +1){

vvec[i] <- max(iopt*(S*u^(i-1)*d^(nstep +1 -i) - X),0)}#注意iopt后面的括號,-1的時候為看跌期權,括號要把X也包進來

#美式期權#倒推回去各個節點的價值

for(j in nstep : 1){

for(k in 1 : j){

vvec[k] <- (P*vvec[k+1] + Pstar*vvec[k])/erdt

if(iea == 2){vvec[k] <- max(vvec[k],iopt*(S*u^(k-1)*d^(j-k) - X))}#和純粹歐式不同,如總共9步,這里只需要算到第8步

}

}

vvec[1]

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容