以后就在这里写一些文字,主要是自己各种各样的学习笔记。尽管现在只是个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]
}