使用ts()函数拆分每日时间序列训练集与测试集的问题排查
问题分析与解决方案
你的代码存在几个关键问题,导致拆分结果不符合预期:
- 数据结构混乱:先给未定义的
RUT_data添加Date列,随后又将RUT_data重新赋值为diff后的收盘价向量,直接丢失了日期信息,无法基于日期准确拆分数据集。 - 固定行数拆分不可靠:用
1:4200这类固定行数拆分,忽略了交易日并非全年无休的事实,2000/01/03至2016/09/30的实际交易日数量未必等于4200,导致拆分边界错误。 - ts对象参数错误:使用
frequency=365不符合金融交易日规律(年交易日约252天),会导致时间序列的时间轴对应完全错位。
修正后的代码
# 读取原始数据 RUT_data_org <- read.csv("RUT.csv") # 处理日期列,确保格式解析正确 RUT_data_org$Date <- as.Date(RUT_data_org$Date, format = "%d-%m-%Y") # 计算收盘价一阶差分,同时保留对应日期信息 RUT_data <- data.frame( Date = RUT_data_org$Date[-1], # diff后的数据对应原数据第2行及以后的日期 Close_diff = diff(RUT_data_org$Close, difference = 1) ) # 基于设定的日期边界拆分训练集和测试集 train_cutoff <- as.Date("2016-09-30") RUT_train <- subset(RUT_data, Date <= train_cutoff) RUT_test <- subset(RUT_data, Date > train_cutoff) # 推荐:转换为xts时间序列(专门处理金融日期序列,操作更灵活) library(xts) RUT_ts_tr <- xts(RUT_train$Close_diff, order.by = RUT_train$Date) RUT_ts_te <- xts(RUT_test$Close_diff, order.by = RUT_test$Date) # 若坚持使用基础ts对象,需调整frequency为年交易日数(约252) # 计算训练集起始/结束的年份与年内交易日位置 train_start_year <- as.integer(format(min(RUT_train$Date), "%Y")) train_start_day <- as.numeric(min(RUT_train$Date) - as.Date(paste0(train_start_year, "-01-01"))) + 1 train_end_year <- as.integer(format(max(RUT_train$Date), "%Y")) train_end_day <- as.numeric(max(RUT_train$Date) - as.Date(paste0(train_end_year, "-01-01"))) + 1 RUT_ts_tr <- ts(RUT_train$Close_diff, start = c(train_start_year, train_start_day), end = c(train_end_year, train_end_day), frequency = 252) # 同理处理测试集的ts对象 test_start_year <- as.integer(format(min(RUT_test$Date), "%Y")) test_start_day <- as.numeric(min(RUT_test$Date) - as.Date(paste0(test_start_year, "-01-01"))) + 1 test_end_year <- as.integer(format(max(RUT_test$Date), "%Y")) test_end_day <- as.numeric(max(RUT_test$Date) - as.Date(paste0(test_end_year, "-01-01"))) + 1 RUT_ts_te <- ts(RUT_test$Close_diff, start = c(test_start_year, test_start_day), end = c(test_end_year, test_end_day), frequency = 252)
关键说明
- 基于日期条件拆分:用
Date <= train_cutoff的逻辑拆分,完全匹配你设定的时间边界,彻底避免固定行数带来的误差。 - 保留日期关联:将diff结果与对应日期存入数据框,确保后续所有操作的时间对应关系准确。
- 优先使用xts:xts是针对金融时间序列设计的工具包,支持直接用日期索引,比基础
ts对象更适配交易日数据的处理场景。
内容的提问来源于stack exchange,提问作者user22855085
相关产品推荐
相关产品推荐

