我一直在研究并尝试了大量不同的东西,并且试图让这个函数为程序提取X,td,D0的矢量输入是不成功的。最终我想看看期权的价值在罢工,除息和股息金额变化时如何变化,而不是同时变化,而是一次变化。这是为了离散股息,我不考虑收益率。这是我的第一个真正的程序,并且只使用r作为计算器,因此我不仅仅是在耳后湿润,而是从头到脚滴水。我真的很感激任何帮助。
DivADJBSM<-function(S, X, rf, T,td, sigma,D0) {
values <- matrix(,3,2)
Dd<-(D0*exp(-rf*T)) #discounted dividend#
Sd<-(S-Dd) #Stock adjusted for present value of dividends#
Xd1=(X-D0) #Strike adjusted after dividend paid#
K=td/T #dividend payment to terminal date impact#
SigA=(sigma*S)/(Sd) #adjusted volatility full#
WSig=(sigma*S)/(S-(Dd*K)) #volatility adjustment impact of payment date#
d1 <- (log(Sd/Xd1)+(rf*T))/(SigA*sqrt(T)) +((SigA*sqrt(T))/2)
d2 <- d1 - (SigA * sqrt(T))
d3 <- (log(Sd/Xd1)+(rf*T))/(WSig*sqrt(T)) +((WSig*sqrt(T))/2)
d4 <- d3 - (WSig * sqrt(T))
d5 <- (log(S/X)+(rf*T))/(sigma*sqrt(T)) +((sigma*sqrt(T))/2)
d6 <- d5 - (sigma * sqrt(T))
values[1] <- (Sd)*pnorm(d1) - (Xd1)*exp(-rf*T)*pnorm(d2)
values[4] <- (Xd1)*exp(-rf*T)*pnorm(-d2)-(Sd)*pnorm(-d1)
values[2] <- (Sd)*pnorm(d3) - (Xd1)*exp(-rf*T)*pnorm(d4)
values[5] <- (Xd1)*exp(-rf*T)*pnorm(-d4)-(Sd)*pnorm(-d3)
values[3] <- (S)*pnorm(d5) - (X)*exp(-rf*T)*pnorm(d6)
values[6] <- (X)*exp(-rf*T)*pnorm(-d6)-(S)*pnorm(-d5)
print("Calls COL=1, Puts COL=2, Full Vol ADJ ROW=1, Weighted Vol ROW=2, Std BSM ROW=3")
values
}
答案 0 :(得分:1)
您可以使用lapply
完成所需的操作。这是一个简单的例子:
> fun<-function(x) x^2
> lapply(1:3,fun)
[[1]]
[1] 1
[[2]]
[1] 4
[[3]]
[1] 9
如果你有多个参数,那么默认情况下它会迭代第一个参数,但你可以通过在lapply
调用结束时命名其余参数来指定哪一个被迭代:
> fun<-function(x,y,z) c(x,y^2,z^3)
> lapply(1:3,fun,2,3)
[[1]]
[1] 1 4 27
[[2]]
[1] 2 4 27
[[3]]
[1] 3 4 27
> lapply(1:3,fun,x=2,z=3)
[[1]]
[1] 2 1 27
[[2]]
[1] 2 4 27
[[3]]
[1] 2 9 27
> lapply(1:3,fun,x=2,y=3)
[[1]]
[1] 2 9 1
[[2]]
[1] 2 9 8
[[3]]
[1] 2 9 27
为了在你的函数中使用它,你将不得不重命名X
参数,因为X
也是lapply
的参数之一,它会弄乱事物起来。