Как использовать цикл for или Laaply для усеченной t случайной величины на биржевых данных для имитации цен опциона с использованием библиотеки foptions - PullRequest
0 голосов
/ 16 мая 2019

Я генерирую список усеченных случайных t-переменных, затем загружаю цену закрытия акций (quantmod), а затем генерирую список возможных случайных цен акций, когда я пытаюсь подключить это к циклу, или для каждой случайные переменныене опознано.Ниже мой код, функция 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)

1 Ответ

0 голосов
/ 18 мая 2019

В предоставленном вами коде есть ряд проблем. Здорово, что ты такой амбициозный, но я бы порекомендовал тебе немного помедленнее и сосредоточиться на том, чтобы привести в порядок вещи и понять, как работают детали и как они взаимодействуют.

Я добавил комментарии, где были специфические проблемы. Пожалуйста, прочитайте их и постарайтесь понять каждую проблему. Также, пожалуйста, поймите, что я должен был сделать некоторые предположения о ваших намерениях, так как я действительно ничего не знаю об этой теме. Тем не менее, я смог заставить вещи работать, просто исправив некоторые имена переменных и убедившись, что объекты, передаваемые в функции, имеют правильный класс. В частности, 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)
...