如何用R的auto.arima模型预测每日股价并解决日期不显示问题?
我来帮你解决这个问题!用auto.arima做股价预测时,默认结果确实只会显示预测步长的数字索引,要给预测值配上对应交易日的日期,关键是生成符合股市休市规则的未来交易日序列,再把它和预测结果绑定到一起。下面结合你的现有代码一步步修改:
步骤1:完善原始数据的日期绑定
先把你提取的日期列合并到股价数据框里,避免后续处理混乱:
library(quantmod) library(forecast) library(bizdays) # 用来生成合规交易日,需先安装:install.packages("bizdays") # 获取AAPL股价数据 Stock_df <- as.data.frame(getSymbols(Symbols = "AAPL", src = "yahoo", from = "2017-05-08", env = NULL)) # 提取日期并合并到数据框 Stock_df$Dates <- as.POSIXlt(rownames(Stock_df)) rownames(Stock_df) <- NULL # 移除原行名,避免索引混淆 # 整理你要建模的价格列(这里以开盘价为例) Stock_df$Open <- Stock_df$AAPL.Open
步骤2:构建时间序列并训练模型
用xts格式(quantmod原生的时间序列格式)存储股价数据,让auto.arima能识别时间维度:
# 转换为xts时间序列 Stock_xts <- xts(Stock_df$Open, order.by = Stock_df$Dates) # 训练auto.arima模型 model <- auto.arima(Stock_xts) # 设定要预测的未来交易日数量(比如30天) h <- 30 # 生成预测结果 fc <- forecast(model, h = h)
步骤3:生成符合规则的未来交易日
股市有周末、节假日休市,不能直接用自然日递增,用bizdays生成NYSE标准的交易日:
# 加载NYSE交易日历规则 load_calendar("NYSE") # 获取原始数据的最后一个交易日 last_trading_day <- tail(Stock_df$Dates, 1) # 生成未来h个交易日(移除第一个重复的起始日) future_dates <- bizseq(last_trading_day, length.out = h + 1)[-1]
步骤4:绑定日期与预测结果
把预测值、置信区间和对应的交易日整合成数据框,就能看到带日期的完整预测结果了:
# 构建最终预测结果数据框 forecast_result <- data.frame( 交易日 = as.Date(future_dates), 预测开盘价 = as.numeric(fc$mean), 95%置信下限 = as.numeric(fc$lower[,2]), 95%置信上限 = as.numeric(fc$upper[,2]) ) # 查看前5条结果 head(forecast_result)
替代方案:不用额外包生成交易日
如果不想安装bizdays,可以用quantmod先获取未来一段日期的空股价数据,从中提取交易日:
# 获取最后交易日往后40天的空数据(确保覆盖需要的h个交易日) future_stock <- getSymbols("AAPL", src = "yahoo", from = last_trading_day + 1, to = last_trading_day + 40, env = NULL) # 提取前h个交易日 future_dates <- index(future_stock)[1:h]
这样处理后,你的预测结果就会和对应的交易日一一对应,再也不会只有单调的数字索引啦!
内容的提问来源于stack exchange,提问作者Cricketer
相关产品推荐
相关产品推荐

