载入数据 把 CSV 文件转换为 zoo 对象需要几个步骤: - 将读入的两个文件变成两个数据框。
- 把字符串格式的日期转换为Date对象。
- 把两个数据转换为zoo对象。
- 合并两个zoo对象。
代码如下: library(zoo) # 载入 zoo 包
# 把 CSV 文件转换为数据框 # gld <- read.csv("http://ichart.finance.yahoo.com/table.csv?s=GLD&ignore=.csv", stringsAsFactors=F) gdx <- read.csv("http://ichart.finance.yahoo.com/table.csv?s=GDX&ignore=.csv", stringsAsFactors=F) # 第一列包含日期,用as.Date 把字符串转换为Date对象 # gld_dates <- as.Date(gld[,1]) gdx_dates <- as.Date(gdx[,1])
# 第七列是调整后的收盘价。用 zoo 函数建立 zoo 对象 # gld <- zoo(gld[,7], gld_dates) gdx <- zoo(gdx[,7], gdx_dates)
# merge 函数合并两个 zoo 对象 # t.zoo <- merge(gld, gdx, all=FALSE)
# 现在 t.zoo 是 zoo 对象,而统计函数期望使用数据框 # t <- as.data.frame(t.zoo)
# 告诉用户日期的范围 # cat("日期范围:", format(start(t.zoo)), "到", format(end(t.zoo)), "\n")
as.Date 函数默认日期是国际标准格式 yyyy-mm-dd, 如果要转换为美国常用格式 mm/dd/yy, 要做下面转换。
gld_dates <- as.Date(gld[,1], format="%m/%d/%y") gdx_dates <- as.Date(gdx[,1], format="%m/%d/%y") 计算价差 首先构造价差, 然后对价差进行单位根检验。如果价差在单位园内,那么可以两支股票有协整关系。
价差定义为: S = y - (β × x ) β 是对冲比价,使用普通最小二乘法计算。重新调整,可以用下面的方程找出最优 β 。
y = (-β) × x 这是去掉截距的最简单线性方程。R中使用 lm 函数拟合线性模型。
# lm 函数使用OLS建立线性回归模型, m, 强迫截距为零,然后提取第一个回归系数 # m <- lm(gld ~ gdx + 0, data=t) beta <- coef(m)[1]
cat("套保率:", beta, "\n")
# 现在计算价差 # sprd <- tgldbetatgdx 协整关系检验<="" td=""> =""> |