如何在R中实现期权定价的网络抓取数据?

时间:2016-05-01 18:11:05

标签: r web-scraping finance trading quantitative-finance

这是我在这个网站上的第一篇文章,我期待随着我的编码技能的提高而越来越多。

我的第一个问题是使用yahoo或google finance从网上抓取选项(来电和看跌)数据。我有兴趣在 R 中运行代码,它会查看给定股票的看涨/卖出的要价。具体来说,我希望运行一个代码来检查所有可选择的股票( CSV 文件,其中包含所有符号可以在https://www.cboe.com/tradtool/symbols/symboldirectory.aspx找到)并返回与这些符号相对应的股票代码列表具有特定价格或低于特定价格的要价的股票,其执行价格在当前交易价格的给定百分比内。

例如,假设我正在考虑目前以每股100美元的价格交易的假想公司ABC。如果该股票存在看跌期权或看涨期权的1美元或更低,执行价格在90美元至110美元之间(例如在当前价格的10%之内),我有兴趣交易该股票。

扩展这一点,我有兴趣生成一种算法,该算法将搜索所有可选择的股票并返回与符合此标准的股票相对应的股票代码列表。

我已经广泛搜索了该网站上的可用资源,并且已经找到了一些有关抓取选项数据的方法的见解,特别是使用下面提供的脚本(为Apple收集数据)并在https://mktstk.com/2014/12/29/start-trading-like-a-quant-download-option-chains-from-google-finance-in-r/中进行了描述。

    library(RCurl)
    library(jsonlite)

    getOptionQuote <- function(symbol){
    output = list()
    url    = paste('http://www.google.com/finance/option_chain?q=', symbol, '&output=json', sep = "")
    x      = getURL(url)
    fix    = fixJSON(x)
    json   = fromJSON(fix)
    numExp = dim(json$expirations)[1]
    for( i in 1:numExp ){
         # download each expirations data
         y       = json$expirations[i,]$y
         m       = json$expirations[i,]$m
         d       = json$expirations[i,]$d
         expName = paste(y, m, d, sep = "_")
         if ( i > 1 ){
              url  = paste('http://www.google.com/finance/option_chain?q=', symbol, '&output=json&expy=', y, '&expm=', m, '&expd=', d, sep = "")
              json = fromJSON(fixJSON(getURL(url)))
         }
         output[[paste(expName, "calls", sep = "_")]] = json$calls
         output[[paste(expName, "puts", sep = "_")]] = json$puts
    }
    return( output )


    fixJSON <- function(json_str){
                   stuff = c( 'cid','cp','s','cs','vol','expiry','underlying_id','underlying_price','p','c','oi','e','b','strike','a','name','puts','calls','expirations', 'y','m','d' )
                   for ( i in 1:length( stuff ) ){
                         replacement1 = paste( ',"', stuff[i], '":', sep = "" )
                         replacement2 = paste( '\\{"', stuff[i], '":', sep = "" )
                         regex1       = paste( ',', stuff[i], ':', sep = "" )
                         regex2       = paste( '\\{', stuff[i], ':', sep = "" )
                         json_str     = gsub( regex1, replacement1, json_str )
                         json_str     = gsub( regex2, replacement2, json_str )
                   }
                   return( json_str )
               }

aapl_opt = getOptionQuote("AAPL")

但是,这个代码不支持同时检查多个股票,因此我的申请没有成功。

1 个答案:

答案 0 :(得分:1)

为多种股票做这件事是直截了当的。试试这个:

res=lapply(c("AAPL","MSFT"),getOptionQuote)
names(res)<-c("AAPL","MSFT")
#str(res)
i=2
plot(res$AAPL[[i]]$strike, res$AAPL[[i]]$oi, type = "s", main = paste("Open Interest by Strike", names(res$AAPL)[i]))

对于问题的其他部分,请从res对象获取信息。