使用xts标准化股票图表

时间:2018-01-02 10:33:06

标签: r xts quantmod

我想用quantmod做一个项目并比较股票图表。由于这些图表通常具有不同的绝对值,我希望通过跳过第一个值来规范化。

加载数据

getSymbols(Symbols = "^IXIC", verbose = FALSE, warnings = TRUE, src = "yahoo", symbol.lookup = TRUE, auto.assign = getOption('getSymbols.auto.assign',TRUE))

IXIC_test1 <- IXIC/2   

效果很好,因为我再次获得了一个时间序列

> head(IXIC_test1)
       IXIC.Open IXIC.High IXIC.Low IXIC.Close IXIC.Volume IXIC.Adjusted
2007-01-03  1214.860  1227.310 1197.330   1211.580  1217640000      1211.580
2007-01-04  1211.910  1230.255 1206.875   1226.715  1052105000      1226.715
2007-01-05  1222.535  1222.535 1210.295   1217.125  1030180000      1217.125
2007-01-08  1217.625  1222.815 1210.565   1219.100   952810000      1219.100
2007-01-09  1221.630  1224.935 1211.780   1221.915  1072080000      1221.915
2007-01-10  1217.020  1230.670 1213.950   1229.665  1137105000      1229.665

但是,当我尝试使用

IXIC_Norm <- IXIC/first(IXIC)

我只得到一行

> head(IXIC_Norm)
       IXIC.Open IXIC.High IXIC.Low IXIC.Close IXIC.Volume IXIC.Adjusted
2007-01-03         1         1        1          1           1             1

有人可以告诉我,为什么这不起作用?

由于 Vladi

1 个答案:

答案 0 :(得分:2)

在执行规范化时,您必须循环遍历矩阵coredata(IXIC)的行。您在问题中显示的结果是第一行数据自行划分的结果。根据预期的输出,后续行不会被第一行数据分割。

试试这个:它将使用apply()函数循环遍历时间序列对象并执行规范化,然后返回一个矩阵。使用as.xts()函数将矩阵转换回时间序列对象。

library('xts')
as.xts(t(apply( IXIC, 1, function(x) x/first(IXIC))))
#            IXIC.Open IXIC.High IXIC.Low IXIC.Close IXIC.Volume IXIC.Adjusted
# 2007-01-03 1.0000000 1.0000000 1.000000   1.000000   1.0000000      1.000000
# 2007-01-04 0.9975717 1.0023996 1.007972   1.012492   0.8640526      1.012492
# 2007-01-05 1.0063176 0.9961094 1.010828   1.004577   0.8460465      1.004577
# 2007-01-08 1.0022760 0.9963375 1.011054   1.006207   0.7825055      1.006207
# 2007-01-09 1.0055727 0.9980649 1.012069   1.008530   0.8804573      1.008530
# 2007-01-10 1.0017780 1.0027377 1.013881   1.014927   0.9338598      1.014927

数据:

library('xts')
df1 <- read.table(text='ds IXIC.Open IXIC.High IXIC.Low IXIC.Close IXIC.Volume IXIC.Adjusted
2007-01-03  1214.860  1227.310 1197.330   1211.580  1217640000      1211.580
           2007-01-04  1211.910  1230.255 1206.875   1226.715  1052105000      1226.715
           2007-01-05  1222.535  1222.535 1210.295   1217.125  1030180000      1217.125
           2007-01-08  1217.625  1222.815 1210.565   1219.100   952810000      1219.100
           2007-01-09  1221.630  1224.935 1211.780   1221.915  1072080000      1221.915
           2007-01-10  1217.020  1230.670 1213.950   1229.665  1137105000      1229.665', header=TRUE)

rownames(df1) <- df1$ds
df1$ds <- NULL
IXIC <- xts(df1, order.by=as.Date(rownames(df1),"%Y-%m-%d"))