以后就在這里寫一些文字,主要是自己各種各樣的學習筆記。盡管現在只是個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]
}