У меня есть функция потерь в форме 1/N * сумма (w_i (рыночная_цена-модель_цена) ^ 2), которую я хочу минимизировать с учетом четырех неизвестных параметров (лямбда, vbar, эта, ро). Для этого мне сначала нужно сгенерировать модельные цены с помощью функции HestonCallClosedForm
(написанной Дейлом Робертсом https://github.com/daleroberts/heston/blob/master/heston.r).
Я хочу сохранить сгенерированные значения, чтобы позже передать их функции потерь. Я не могу сохранить значения. Я знаю, что они не могут иметь никакого числового значения (пока), но я уверен, что у R есть способ справиться с этим. Мои данные состоят из 2399 наблюдений, выглядит это так
index_level strike T mid_price riskfree_rate
1 2826.15 2775 16 68.35 2.3825
2 2826.15 2780 16 64.60 2.3825
3 2826.15 2785 16 60.85 2.3825
4 2826.15 2790 16 57.25 2.3825
5 2826.15 2795 16 53.75 2.3825
6 2826.15 2800 16 50.30 2.3825
мой подход к передаче данных следующий:
####calibrating the Heston model
S_t <- calibration_file$index_level
K_t <- calibration_file$strike
tau_t <- calibration_file$T
r_t <- calibration_file$riskfree_rate
r_t <- as.numeric(r) #risk free interest rate
q_t <- 0 #dividend rate
x0 <- c(3.00, 0.05, 0.32, -0.85) #initial parameters (lambda, vbar, eta, rho)
lb <- c(1, 0.01, 0.01, -1) #lower bound
ub <- c(10, 1, 1, -0.2) #upper bound
market_price <- calibration_file$mid_price #market price
wi <- 1/market_price #weight
### getting model prices
loss_function <- function(par) {
par1 <- par[1]
par2 <- par[2]
par3 <- par[3]
par4 <- par[4]
y <- vector(mode="double", length=length(market_price))
e <- vector(mode="double", length=length(market_price))
w <- vector(mode="double", length=length(market_price))
model_prices <- for(i in 1:6) {
y[i] <<- HestonCallClosedForm(lambda=par1, vbar=par2, eta=par3,
rho=par4, v0=0.06, r=r_t[i],
tau=tau_t[i], S=S_t[i], K=K_t[i])
return(y)
}
diff <<- market_price - y
diff_sq <- for(i in 1:6) {
e[i] <<- diff^2
}
diff_sq_w <- for (i in 1:6) {
w[i] <<- wi[i]*e[i]
}
error <<- 1/6 * sum(w)
return(error)
}
### minimize
par_est <- optim(x0, loss_function, method = "L-BFGS-B", upper = ub, lower = lb)
где HestonCallClosedForm
можно найти по приведенной выше ссылке, и он не включен сюда, чтобы не перегружать документ. Функция работает нормально, если введены все параметры, но я не могу сказать R использовать неизвестные. Я всегда получаю ошибку, объект par1 не найден.