You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ts()函数拆分每日时间序列训练集与测试集的问题排查

问题分析与解决方案

你的代码存在几个关键问题,导致拆分结果不符合预期:

  1. 数据结构混乱:先给未定义的RUT_data添加Date列,随后又将RUT_data重新赋值为diff后的收盘价向量,直接丢失了日期信息,无法基于日期准确拆分数据集。
  2. 固定行数拆分不可靠:用1:4200这类固定行数拆分,忽略了交易日并非全年无休的事实,2000/01/03至2016/09/30的实际交易日数量未必等于4200,导致拆分边界错误。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:53:16