2

我一直在使用 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]

我想避免添加行 where puts$maturityis NA

4

2 回答 2

1

你只想要行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)
})
于 2013-03-30T17:19:48.543 回答
1

对于删除“GOOG7”或后跟“7”的任何底层证券符号的简洁过滤器,请尝试以下操作:

symbols <- grep(paste("^",underlying,"[0-6,8-9]", sep="", collapse = NULL), 
                symbols, value = TRUE)
于 2013-03-30T18:22:26.903 回答