Я генерирую список усеченных случайных t-переменных, затем загружаю цену закрытия акции (quantmod), затем генерирую список возможных случайных цен акций, когда я пытаюсь включить это в цикл в lapply или для каждого, случайные переменные не распознаются. Ниже мой код, функция lapply выдает ошибку:
library(truncdist)
library(quantmod)
library(fOptions)
randomT <- rt(4,6)
randomOut <- dtrunc(randomT, spec = "t", df = 6,a= -2, b= 2)
startDate <- as.Date("2018-01-01")
# Specify period of time we are interested in
randomOut <- randomT
endDate <- as.Date("2019-05-09")
getSymbols('SPY',src='yahoo',from = startDate,to = endDate)
SpRtn <- dailyReturn(SPY,type='arithmetic')
rtn <- sum(SPYreturns)
dev <- sd(SPYreturns)
vol <- dev*sqrt(250)
dt <- 1/250
current <- tail(SPY$SPY.Close,1)
dayRtn <- rtn*dt
dayVol <- vol*sqrt(dt)
guess <- function (randomOut) current * exp(dayRtn + Vol * randomOut)
expected <- lapply (randomOut, FUN = guess)
gsb <- function() {
GBSOption (TypeFlag = "p", S = expected,
X = 280,
ime = 18/250,
r = 0.022,
b = 0,
sigma =0.16
)
}
lapply(expected, FUN = gsb)
Последняя лаппа не дает ответа, первая лаппа работает нормально. Функция vol в предположениях должна быть dayVol, а время в функции gsb написано с ошибкой.
Я признаю, что мой код плохой, но я новичок в кодировании на R, вы удалили некоторые важные части, необходимые для запуска, я добавляю, редактирую и публикую
error > lapply(ожидаемый, FUN = gsb) Ошибка в FUN(X[[i]], ...) : неиспользуемый аргумент (X[[i]]) >
исправлен код ниже, все еще с вышеуказанной ошибкой.
randomT <- rt(4,6) должна быть запущена первой строкой, затем строка randout<-randomT должна быть удалена
У меня проблемы с редактированием переполнения стека и с тем, как добавить код, это меня бесконечно смущает, инструкции могут иметь смысл для робота-человека, они определенно не удобны для обычного пользователя.
комментарии остались от вырезания и вставки,и не нужны были я забыл удалить на скорую руку.
Вместо того, чтобы просто перечислять проблемы с кодом, вы должны их исправить.
Я отформатировал ваш код, не изменяя его. Пожалуйста, посмотрите, как я это сделал.
В коде, который вы предоставляете, есть ряд проблем. Здорово, что вы так амбициозны, но я бы порекомендовал вам немного замедлиться и сосредоточиться на очистке вещей и на понимании того, как работают части и как они взаимодействуют.
Я добавил комментарии, где были определенные проблемы. Пожалуйста, прочтите их и постарайтесь разобраться в каждом вопросе. Пожалуйста, поймите также, что мне пришлось высказать некоторые предположения о ваших намерениях, так как я действительно ничего не знаю об этой теме. Тем не менее, я смог заставить все работать, просто исправив имена некоторых переменных и убедившись, что объекты, передаваемые в функции, имеют правильный класс. В частности, 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)
Да, я ценю вашу тяжелую работу, это именно то, чего я намеревался достичь, вы выбрали ошибки, которые я обнаружил, а также семантические и синтаксические ошибки, которые я не мог понять. Это было сделано с некоторой поспешностью. это показывает, что традиционная финансовая теория утверждает, что доходность акций является логарифмически нормальной, это использовало крах торговых кризисов козырей, чтобы проверить, что цены действительно могут быть смоделированы в эти периоды с усеченным t-распределением с 6 степенями свободы, я оценивал возможный эффект на конкретную забастовку шпионских опций. Большое спасибо, как мне оставить положительный отзыв?
Я рад слышать, что это работает @nhoj. Вы можете оставить положительный отзыв, приняв его с помощью ✓ слева, а также проголосовав за ответ.
Вы вывалили сюда много плохо отформатированного кода и попросили нас это исправить. Взгляните на Как создать минимальный воспроизводимый пример. Некоторые из них не имеют особого смысла:
randomOut
присваивается, а затем сразу перезаписывается, комментарии занимают несколько строк без#
, аVol
используется в функцииguess
, но никогда не назначается (хотяvol
есть). Кроме того, вы говорите, что функция в прилипчивая, но их две, и вы не говорите нам, какая из них вызывает проблемы. Пожалуйста, очистите свой код и сократите его до чего-то более управляемого.