Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 从CBOE下载VIX期货价格_R_Web Scraping - Fatal编程技术网

R 从CBOE下载VIX期货价格

R 从CBOE下载VIX期货价格,r,web-scraping,R,Web Scraping,我试图通过下载此页面上的所有CSV文件来获取VIX期货的历史价格(http://cfe.cboe.com/Products/historicalVIX.aspx). 以下是我用于执行此操作的代码: library(XML) #Extract all links for url url <- "http://cfe.cboe.com/Products/historicalVIX.aspx" doc <- htmlParse(url) links <- xpathSApply(

我试图通过下载此页面上的所有CSV文件来获取VIX期货的历史价格(http://cfe.cboe.com/Products/historicalVIX.aspx). 以下是我用于执行此操作的代码:

library(XML)

#Extract all links for url
url <- "http://cfe.cboe.com/Products/historicalVIX.aspx"
doc <- htmlParse(url)
links <- xpathSApply(doc, "//a/@href")
free(doc)

#Filter out URLs ending with csv and complete the link.
links <- links[substr(links, nchar(links) - 2, nchar(links)) == "csv"]
links <- paste("http://cfe.cboe.com", links, sep="")

#Peform read.csv on each url in links, skipping the first two URLs as they are not relevant.
c <- lapply(links[-(1:2)], read.csv, header = TRUE)
经过进一步调查,我意识到这是因为一些CSV文件的格式不同。如果我手动加载URL
链接[9]
,我会看到第一行有以下免责声明:

CFE data is compiled for the .......use of CFE data is subject to the Terms and Conditions of CBOE's Websites.
大多数其他文件(例如
链接[8]
链接[10]
)都很好,因此这似乎是随机插入的。有没有什么魔法可以用来处理这个问题


谢谢。

我的包中有一个
getSymbols.cfe
方法(用于包中的函数),这将使这一过程变得更加简单

#install.packages('qmao', repos='http://r-forge.r-project.org')
library(qmao)
这来自于
?getSymbols.cfe
的示例部分(请阅读帮助页,因为函数有一些参数,您可能希望与默认值不同)

这不仅仅是为了VIX

getSymbols(c("VM","GV"),src='cfe') #The mini-VIX and Gold vol contracts expiring this month
如果您不熟悉
getSymbols
,默认情况下,它会将数据存储在
.GlobalEnv
中,并返回保存的对象的名称

> getSymbols("VX_Z12", src='cfe')
[1] "VX_Z12"

> tail(VX_Z12)
           VX_Z12.Open VX_Z12.High VX_Z12.Low VX_Z12.Close VX_Z12.Settle VX_Z12.Change VX_Z12.Volume VX_Z12.EFP VX_Z12.OpInt
2012-10-26       19.20       19.35      18.62        18.87          18.9           0.0         22043         15        71114
2012-10-31       18.55       19.50      18.51        19.46          19.5           0.6         46405        319        89674
2012-11-01       19.35       19.35      17.75        17.87          17.9          -1.6         40609       2046        95720
2012-11-02       17.90       18.65      17.55        18.57          18.6           0.7         42592       1155       100691
2012-11-05       18.60       20.15      18.43        18.86          18.9           0.3         28136        110       102746
2012-11-06       18.70       18.85      17.75        18.06          18.1          -0.8         35599        851       110638

编辑

我现在明白了,我没有回答你的问题,而是给你指出了另一种得到同样错误的方法!使代码正常工作的一个简单方法是为
read.csv
制作一个包装器,使用
readLines
查看第一行是否包含免责声明;如果是,请跳过第一行,否则正常使用
read.csv

myRead.csv <- function(x, ...) {  
  if (grepl("Terms and Conditions", readLines(x, 1))) { #is the first row the disclaimer?
    read.csv(x, skip=1, ...)  
  } else read.csv(x, ...)
}
L <- lapply(links[-(1:2)], myRead.csv, header = TRUE)

myRead.csv我的包中有一个
getSymbols.cfe
方法(用于包中的函数),这将使这一过程变得更加简单

#install.packages('qmao', repos='http://r-forge.r-project.org')
library(qmao)
这来自于
?getSymbols.cfe
的示例部分(请阅读帮助页,因为函数有一些参数,您可能希望与默认值不同)

这不仅仅是为了VIX

getSymbols(c("VM","GV"),src='cfe') #The mini-VIX and Gold vol contracts expiring this month
如果您不熟悉
getSymbols
,默认情况下,它会将数据存储在
.GlobalEnv
中,并返回保存的对象的名称

> getSymbols("VX_Z12", src='cfe')
[1] "VX_Z12"

> tail(VX_Z12)
           VX_Z12.Open VX_Z12.High VX_Z12.Low VX_Z12.Close VX_Z12.Settle VX_Z12.Change VX_Z12.Volume VX_Z12.EFP VX_Z12.OpInt
2012-10-26       19.20       19.35      18.62        18.87          18.9           0.0         22043         15        71114
2012-10-31       18.55       19.50      18.51        19.46          19.5           0.6         46405        319        89674
2012-11-01       19.35       19.35      17.75        17.87          17.9          -1.6         40609       2046        95720
2012-11-02       17.90       18.65      17.55        18.57          18.6           0.7         42592       1155       100691
2012-11-05       18.60       20.15      18.43        18.86          18.9           0.3         28136        110       102746
2012-11-06       18.70       18.85      17.75        18.06          18.1          -0.8         35599        851       110638

编辑

我现在明白了,我没有回答你的问题,而是给你指出了另一种得到同样错误的方法!使代码正常工作的一个简单方法是为
read.csv
制作一个包装器,使用
readLines
查看第一行是否包含免责声明;如果是,请跳过第一行,否则正常使用
read.csv

myRead.csv <- function(x, ...) {  
  if (grepl("Terms and Conditions", readLines(x, 1))) { #is the first row the disclaimer?
    read.csv(x, skip=1, ...)  
  } else read.csv(x, ...)
}
L <- lapply(links[-(1:2)], myRead.csv, header = TRUE)

myRead.csv谢谢。我不需要重新发明轮子。谢谢你指出VX_N13在第一排有免责声明。我将尝试尽快修补以处理此问题。@GSee是否有类似getQuote.cfe的可用软件。我正在四处寻找,却找不到它。因为使用getSmbols.cfe提供的数据有点晚,“请注意:cfe数据直到下一个工作日上午10:00左右才可用。”问题是从何处获取(接近)实时数据。对我来说,一个明显的地方是互动经纪人。。。还有其他想法吗(谷歌、雅虎等)?谢谢你。我不需要重新发明轮子。谢谢你指出VX_N13在第一排有免责声明。我将尝试尽快修补以处理此问题。@GSee是否有类似getQuote.cfe的可用软件。我正在四处寻找,却找不到它。因为使用getSmbols.cfe提供的数据有点晚,“请注意:cfe数据直到下一个工作日上午10:00左右才可用。”问题是从何处获取(接近)实时数据。对我来说,一个明显的地方是互动经纪人。。。还有其他想法吗(谷歌、雅虎等)?Thnx。