嘿,我试图将两个不同的函数应用于一个时间序列。第一个函数说明问题,第二个函数使用optim
解决问题。
我已经尝试将两个函数放到一个函数中,以将此一个函数应用于时间序列。 现在最大的问题是我无法返回计算值。 R告诉我: *返回错误(V_A,Vola_A,DD,PD): 不允许多参数返回*
我想删除return(V_A, Vola_A, DD, PD)
行
但是,如果执行此操作,则会打印出我不想要的值(我什至不知道它到底是什么)。
这是我的代码:
data <- read.zoo(data)
cca <- function(V_LCL,Vola_LCL,Barriere,rf,HZ) {
cca_min <- function(x) {
V_A <- x[1]
Vola_A <- x[2]
d1 <- (log(V_A/Barriere)+(rf+Vola_A^2/2)*HZ)/(Vola_A*sqrt(HZ))
d2 <- d1-Vola_A*sqrt(HZ)
G <- V_A*pnorm(d1)-Barriere*exp(-rf*HZ)*pnorm(d2)-V_LCL
H <- pnorm(d1)*Vola_A*V_A-Vola_LCL*V_LCL
return(G^2+H^2) #Summe der Residuen.
}
cca_fin <- optim(c(V_A = V_LCL, Vola_A = Vola_LCL),cca_min)
V_A <- cca_fin$par[1]
Vola_A <- cca_fin$par[2]
d1 <- (log(V_A/Barriere)+(rf+Vola_A^2/2)*HZ)/(Vola_A*sqrt(HZ))
d2 <- d1-Vola_A*sqrt(HZ)
DD <- d2
PD <- pnorm(-d2)
}
solution <- apply(data, MARGIN = 1, FUN=function(data) cca(V_LCL=data[["V_LCL"]], Vola_LCL=data[["Vola_LCL"]], Barriere=data[["Barriere"]], rf=data[["rf"]], HZ=1))
我希望得到一个包含5个不同列的数据框。日期和我之前提到的4种不同的回报。
要自己“重建”问题:
#dput(head(data,10))
structure(c(75500410877, 77601206594, 79186519481, 80974008790,
82537645824, 83864068176, 85170542638, 85919899689, 86511152529,
86661504323, 0.079017183, 0.07855107, 0.077269899, 0.0712223,
0.069432901, 0.069656866, 0.069367016, 0.070503068, 0.071102523,
0.073219234, 9.2e+10, 87939600000, 84480400000, 80973200000,
7.74e+10, 7.45e+10, 70886400000, 67668720000, 64408640000, 61210800000,
0.028605, 0.030294737, 0.033022727, 0.033166667, 0.033309524,
0.033631818, 0.03641, 0.038721739, 0.038452381, 0.041755), .Dim = c(10L,
4L), .Dimnames = list(NULL, c("V_LCL", "Vola_LCL", "Barriere",
"rf")), index = structure(c(12784, 12815, 12843, 12874, 12904,
12935, 12965, 12996, 13027, 13057), class = "Date"), class = "zoo")
我需要更改/添加什么代码?
答案 0 :(得分:3)
如果我们将return
与list
(如果长度不同)或data.frame
一起使用,它将返回
return(data.frame(V_A, Vola_A, DD, PD))
do.call(rbind, apply(data, MARGIN = 1, FUN=function(data)
cca(V_LCL=data[["V_LCL"]],
Vola_LCL=data[["Vola_LCL"]], Barriere=data[["Barriere"]],
rf=data[["rf"]], HZ=1)))
# V_A Vola_A DD PD
#2005-01-01 83050451962 0.68779085 -0.45110142 6.740418e-01
#2005-02-01 85361327254 0.64400360 -0.32116690 6.259580e-01
#2005-03-01 87105171426 0.60232917 -0.19554222 5.775158e-01
#2005-04-01 89071409714 0.54911211 -0.04056589 5.161790e-01
#2005-05-01 90791410452 0.48899014 0.14996570 4.403958e-01
#2005-06-01 92250475072 0.42087446 0.37724425 3.529960e-01
#2005-07-01 93687596965 0.06307322 4.96737159 3.393323e-07
#2005-08-01 94511889722 0.06415389 5.77931393 3.750293e-09
#2005-09-01 95162267830 0.06458672 6.60665865 1.965455e-11
#2005-10-01 95327654820 0.06656895 7.24865868 2.104595e-13
<< / p>