雁起平沙的网络日志

数量金融与R

用R获取郑州商品交易所历史数据

| Comments

本文主要讨论如何用R语言从郑州商品交易所网站上获取期货合约交易数据

郑商所网站提供了查询每日行情的页面,它提供的数据比大商所的要复杂一些,2010年至2013年的网页格式一样,地址也是同样的形式,请看

打开网页可以看到,网页提供了“打印”,“Excel”和“txt”三个选项,只要把地址后面的.html改为.txt就可以得到文本格式的数据,那么就可以逐一下载数据文件,读入数据。

这四年的数据可以这样获取:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
getZceData <- function(dates){
  require(RCurl)
  zceDatabase <- data.frame()
  for (date in dates) {
    str1 <- "http://www.czce.com.cn/portal/exchange/"
    str2 <- "/datadaily/"
    date <- as.character(date)
    year <- substr(date, 1, 4)
    url <- paste(str1, year, str2, date, ".txt", sep = "")
    if (!url.exists(url)) {
      next
    } else {
      colnames <- c("品种月份", "昨结箿", "今开盘", "最高价", "最低价",
        "今收盘", "今结算", "涨跌1", "涨跌2", "成交量", "空盘量",
        "增减量", "成交额", "交割结算价")
      fileName <- paste("zce", date, ".txt", sep = "")

      if (!file.exists(fileName)) {
        download.file(url, fileName, quiet = T)
      }
      zceData <- read.table(fileName, header = F, skip = 1, sep = ",", col.names = colnames)
      zceData <- zceData[(zceData[, 1] != "小计") & (zceData[, 1] != "总计"), ]
      zceData$date <- date
      zceDatabase <- rbind(zceDatabase, zceData)
    }
  }
  return(zceDatabase)
}

但是查询2009年及之前的数据返回的是网页形式,那就需要从网页上读取。

看下面几个链接

网页格式很统一,数据在被table标签包裹,并且是在第二个table标签中,XML包的readHTMLTable函数可以读取table标签中的内容,但是当网页中有汉字的时候,汉字会变成乱码,慎用!

不过,本文的情况有点特殊,汉字只出现在table的第一行表头,以及“小计”、“总计”的行,这些行本来就是要去掉的,所以对我们没影响。

下面只给出关键代码:

1
2
3
4
5
6
require(XML)
require(stringr)
url <- "http://www.czce.com.cn/portal/exchange/jyxx/hq/hq20060106.html"
tb <-readHTMLTable(url)[[2]]
tb <- sapply(tb,str_trim)
df <-as.data.frame(apply(tb,2,function(x) iconv(x, from = "gb2312", to = "UTF-8")))

再把第一列为NA的行去除就行了。

Comments