В предоставленном вами коде есть ряд проблем. Здорово, что ты такой амбициозный, но я бы порекомендовал тебе немного помедленнее и сосредоточиться на том, чтобы привести в порядок вещи и понять, как работают детали и как они взаимодействуют.
Я добавил комментарии, где были специфические проблемы. Пожалуйста, прочитайте их и постарайтесь понять каждую проблему. Также, пожалуйста, поймите, что я должен был сделать некоторые предположения о ваших намерениях, так как я действительно ничего не знаю об этой теме. Тем не менее, я смог заставить вещи работать, просто исправив некоторые имена переменных и убедившись, что объекты, передаваемые в функции, имеют правильный класс. В частности, GBSOption
требует числовую переменную для S
, но expected
имеет класс xts
. Вам нужно задать для него что-то вроде S = expected[[1]]
, чтобы оно заработало.
Этот код должен работать, но я не могу гарантировать, что он делает то, что должен:
library(truncdist)
library(quantmod)
library(fOptions)
# You assign randomOut using dtrunc, then immediately overwrite it with
# randomT. Is that a mistake?
randomT <- rt(4,6)
randomOut <- dtrunc(randomT, spec = "t", df = 6, a = -2, b = 2)
#randomOut <- randomT
# Specify period of time we are interested in
startDate <- as.Date("2018-01-01")
endDate <- as.Date("2019-05-09")
getSymbols('SPY', src = 'yahoo', from = startDate, to = endDate)
SpRtn <- dailyReturn(SPY, type = 'arithmetic')
# You use SPYreturns in your orginal code, but there is no assignment to
# SPYreturns. Do you mean SpRtn?
rtn <- sum(SpRtn)
dev <- sd(SpRtn)
vol <- dev * sqrt(250)
dt <- 1/250
current <- tail(SPY$SPY.Close, 1)
dayRtn <- rtn*dt
dayVol <- vol*sqrt(dt)
# You use `Vol` in the `guess` function, but the variable is called `vol`.
guess <- function (randomOut) current * exp(dayRtn + vol * randomOut)
expected <- lapply (randomOut, FUN = guess)
gsb <- function(expected) {
GBSOption (TypeFlag = "p",
# This was probably your biggest issue. `expected` points to an
# xts object, but you need numeric, which means you need to
# extract the first SPY.Close value.
S = expected[[1]],
X = 280,
# You had `ime` here, but you need `Time`.
Time = 18/250,
r = 0.022,
b = 0,
sigma =0.16
)
}
lapply(expected, FUN = gsb)