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]

}

你可能感兴趣的:(R语言实现期权二叉树定价的函数)