使用 xts 规范化股票图表

Normalizing stock charts using xts

我想用 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

有人能告诉我,为什么这行不通吗?

执行归一化时,您必须遍历矩阵 coredata(IXIC) 的行。如问题所示,您得到的结果是第一行数据被自身划分的结果。根据预期输出,没有后续行除以第一行数据。

试试这个:它将使用 apply() 函数循环遍历时间序列对象并执行归一化,然后 returns 一个矩阵。使用 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"))