обходной путь для переноса данных в R с учетом мини-опционных контрактов

Я подключал цепочки опций с помощью функции в quantmod под названием getOptionsChain. Теперь, когда на такие акции, как GOOG, AAPL и т. д., предлагаются мини-опционные контракты, в моем коде возникает ошибка. Я вырезаю числа после символа, и теперь мини-контракты проходят через все данные с помощью GOOG7. Есть идеи?

library(quantmod)
underlying <- 'GOOG'
# set what your volatility forcast or assumption is
volforcast <- .25
# Get symbols current price
yqf <- "Last Trade (Price Only)"
underlying.price <- getQuote(underlying,what=yahooQF(yqf))$Last

OC <- getOptionChain(underlying, NULL)
#check data
head(OC)
lputs <- lapply(OC, FUN = function(x) x$puts)
head(lputs) #check for NA values, yahoo returns all NA values sometimes
puts <- do.call('rbind', lputs )
#check data
head(puts,150)

symbols <- as.vector(unlist(lapply(lputs, rownames)))
expiries <- unlist(lapply(symbols, function(x) {
  regmatches(x=x, regexpr('[0-9]{6}', x)) } ))
puts$maturity <- as.numeric((as.Date(expiries, "%y%m%d") - Sys.Date())/365)
GetIV <- function(type, value,
              underlying, strike,dividendYield, riskFreeRate, maturity, volatility,
              timeSteps=150, gridPoints=151) {


  AmericanOptionImpliedVolatility(type, value,
                                  underlying, strike,dividendYield, riskFreeRate, maturity,  volatility, timeSteps=150, gridPoints=151)$impliedVol
}
#this is the part that throws the error due to NA values in puts$maturity
puts$IV <- mapply(GetIV, value = puts$Ask, strike = puts$Strike, maturity = puts$maturity,
                  MoreArgs= list(type='put', underlying= underlying.price,
                  dividendYield=0, riskFreeRate = 0.01,  
                  volatility = volforcast), SIMPLIFY=TRUE)
#this is the error Error: Date's serial number (-2147442285) outside allowed range [367-109574],      i.e. [January 1st, 1901-December 31st, 2199]

Я хочу избежать добавления строк, где puts$maturity равно NA.


person cdcaveman    schedule 30.03.2013    source источник
comment
Вы должны хотя бы показать нам, что это за ошибка. Сообщение об ошибке? Неправильный ответ? Компьютер загорелся?   -  person Spacedman    schedule 30.03.2013
comment
Поскольку вы знаете год и месяц истечения срока действия из names(OC), вы можете изменить слишком общее регулярное выражение [0-9]{6} на что-то более точное, например 1304[0-9]{2}.   -  person Vincent Zoonekynd    schedule 30.03.2013
comment
1304 первый? если вы нажмете (поставите, 10), вы увидите GOOG150117P01260000, срок действия которого истекает 17 января 2015 года. .. это GOOG7130420P00780000 с GOOG7, представляющим мини-контракты с GOOG7, которые бросают Na's   -  person cdcaveman    schedule 30.03.2013


Ответы (2)


Для краткого фильтра, который удаляет «GOOG7» или любой базовый символ безопасности, за которым следует «7», попробуйте следующее:

symbols <- grep(paste("^",underlying,"[0-6,8-9]", sep="", collapse = NULL), 
                symbols, value = TRUE)
person Erastotle    schedule 30.03.2013
comment
Можно также искать GOOG7 и invert, чтобы оставить только те, которые не являются GOOG7: grep(paste("^", underlying, "7", sep=""), symbols, value=TRUE, invert=TRUE). Этот код должен работать до тех пор, пока в списке не появятся варианты, срок действия которых истекает в 2070 году. - person GSee; 30.03.2013
comment
Еще один способ получить все, что не имеет 7 после тикера: grep(paste("^",underlying,"[^7]", sep=""), symbols, value = TRUE). Внутри скобок ([]) ^ означает не - person GSee; 30.03.2013

Вам нужны только строки, где puts$maturity не NA? Это позволит достичь этой цели:

puts <- puts[!is.na(puts$maturity), ]

Другой вариант, как @VincentZoonekynd рекомендуется использовать лучшее регулярное выражение.

Например, он ищет символы, начинающиеся с заглавных букв, за которыми следуют 6 цифр, за которыми следует либо «C», либо «P», за которыми следуют 8 цифр, и ничего больше. Он не будет подбирать символы, которые имеют 7 цифр после тикера.

symbols <- c("GOOG7130420P00695000", "GOOG130426P00720000")
grep("^[A-Z]+\\d{6}[CP]\\d{8}$", symbols, value=TRUE)
#[1] "GOOG130426P00720000"

^[A-Z]+: начинается с (^) любой заглавной буквы ([A-Z]), один или несколько раз (+)
\\d{6}: за которыми следуют 6 ({6}) цифр (\\d)
[CP]: за которыми следует буква "C" или "P"
\\d{8}$: заканчивается 8 ({8}) цифрами (\\d) и ничего после них ($)


Согласно пожеланиям в комментариях, вот один из способов удалить ненужные строки, прежде чем делать что-либо еще. Он просто воссоздает объект только с тем, что вам нужно.

OC <- lapply(OC, function(x) {
  list(calls=x$calls[grep("[A-Z]\\d{6}[CP]\\d{8}$", rownames(x$calls)), ],  
       puts=x$puts[grep("[A-Z]\\d{6}[CP]\\d{8}$", rownames(x$puts)), ],
       symbol=x$symbol)
})
person GSee    schedule 30.03.2013
comment
в то время как это хорошо ... в коде есть другие зависимости, которые заставляют его ломаться ... в идеале список «OC» должен иметь подмножество GOOG7 .. - person cdcaveman; 30.03.2013
comment
Извините @cdcaveman, я думал, что это ясно. Попробуйте это lputs <- lapply(OC, FUN = function(x) x$puts[grep("[A-Z]\\d{6}[CP]\\d{8}$", rownames(x$puts)), ]). Если это не сработает, я проработаю ваш код и обновлю ответ. - person GSee; 30.03.2013
comment
я действительно думаю, что лучше всего сразу же подмножить данные в переменной «OC» .. это список списков .. я не уверен, как это сделать .. я уверен, что мог бы применить этот grep как аргумент некоторой функции, которая возвращает измененные списки - person cdcaveman; 30.03.2013
comment
интересно.. у меня это работает с lputs <- lapply(OC, FUN = function(x) x$puts[grep("[A-Z]\\d{6}[CP]\\d{8}$", rownames(x$puts)), ]) - person cdcaveman; 31.03.2013