如何对齐SP500等五大指数时间序列至共同交易日?报错求助
问题解决:时间序列对齐报错(下标越界)
错误信息翻译
sp500_aligned <- Cl(sp500)[all_dates]
Error in[.xts(Cl(sp500), all_dates) : 下标越界
错误原因
核心问题是你指定的时间区间内,五大指数没有共同的交易日。不同地区交易所的交易日规则差异极大:比如沙特TASI的周末是周五、周六,而SP500、DAX等欧美市场以及SSEC、HSI的周末是周六、周日,再加上各自独立的节假日安排,导致all_dates最终是空向量,用空向量索引xts对象就会触发下标越界错误。
修正方案
没必要强行找所有市场的共同交易日,以下两种方案更贴合实际建模需求:
方案1:用merge.xts自动对齐并保留所有日期
这种方式会保留所有出现过的交易日,缺失的收盘价用NA填充,后续可根据建模需求处理缺失值:
library(quantmod) # 获取各指数收盘价数据 sp500 <- Cl(getSymbols("^GSPC", src = "yahoo", auto.assign = FALSE, from = "2017-10-09", to = "2022-09-29")) ssec <- Cl(getSymbols("000001.SS", src = "yahoo", auto.assign = FALSE, from = "2017-10-09", to = "2022-09-29")) hsi <- Cl(getSymbols("^HSI", src = "yahoo", auto.assign = FALSE, from = "2017-10-09", to = "2022-09-29")) tasi <- Cl(getSymbols("^TASI.SR", src = "yahoo", auto.assign = FALSE, from = "2017-10-09", to = "2022-09-29")) dax <- Cl(getSymbols("^GDAXI", src = "yahoo", auto.assign = FALSE, from = "2017-10-09", to = "2022-09-29")) # 合并所有序列,自动对齐日期 aligned_data <- merge(sp500, ssec, hsi, tasi, dax, join = "outer") # 重命名列名便于识别 colnames(aligned_data) <- c("SP500", "SSEC", "HSI", "TASI", "DAX") # 可选:过滤掉缺失值过多的行(比如保留至少3个指数有数据的日期) filtered_data <- aligned_data[rowSums(!is.na(aligned_data)) >= 3, ]
方案2:对齐到某一基准市场的交易日
如果你想以某个市场的交易日为基准(比如SP500),只保留该市场开盘的日期,其他指数对应日期无数据则补NA:
library(quantmod) # 获取数据并提取收盘价 sp500 <- Cl(getSymbols("^GSPC", src = "yahoo", auto.assign = FALSE, from = "2017-10-09", to = "2022-09-29")) ssec <- Cl(getSymbols("000001.SS", src = "yahoo", auto.assign = FALSE, from = "2017-10-09", to = "2022-09-29")) hsi <- Cl(getSymbols("^HSI", src = "yahoo", auto.assign = FALSE, from = "2017-10-09", to = "2022-09-29")) tasi <- Cl(getSymbols("^TASI.SR", src = "yahoo", auto.assign = FALSE, from = "2017-10-09", to = "2022-09-29")) dax <- Cl(getSymbols("^GDAXI", src = "yahoo", auto.assign = FALSE, from = "2017-10-09", to = "2022-09-29")) # 以SP500的交易日为基准 benchmark_dates <- index(sp500) # 对齐所有序列到基准日期 aligned_data <- merge( sp500[benchmark_dates], ssec[benchmark_dates], hsi[benchmark_dates], tasi[benchmark_dates], dax[benchmark_dates] ) colnames(aligned_data) <- c("SP500", "SSEC", "HSI", "TASI", "DAX")
补充说明
- 直接求全球不同市场的共同交易日几乎没有实际价值,数据量会极少甚至为空
- 建模时可根据需求处理缺失值:比如用前值填充(
na.locf(aligned_data))、线性插值(na.approx(aligned_data)),或删除含缺失值的行(na.omit(aligned_data))
内容的提问来源于stack exchange,提问作者Dr. Statistics
相关产品推荐
相关产品推荐

