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

使用R语言构建Neuralnet应用时提取股票调整价格并计算移动平均线的报错求助

解决R语言提取股票调整价格并计算移动平均线的报错问题

我来帮你排查下这个问题——你遇到的错误核心原因是**getSymbols返回的是xts时间序列对象**,而非普通数据框,而且你引用调整价格列的方式不对:你用了固定的$tickers.adjusted,但实际上每只股票的调整价格列名是[股票代码].Adjusted这种动态格式(比如苹果股票的列名是AAPL.Adjusted)。

下面我给你修正后的代码,再逐个解释关键改动:

修正后的完整代码(核心改动在最后循环部分)

# 导入库
library(quantmod)
library(BatchGetSymbols)
library(TTR)
library(shiny)
library(lubridate)
library(neuralnet)

# 获取前20只标普500股票代码
df_SP500 <- GetSP500Stocks()
tickers <- head(df_SP500$Tickers,20)

# 设置时间范围
my_date <- Sys.Date()
first.date <- my_date %m-% years(20)
last.date <- Sys.Date()

# 批量拉取股票数据
stockValues <- list()
for (i in 1:length(tickers)){
 stockValues[[i]] <- getSymbols(tickers[i],auto.assign = FALSE, from = first.date)
}

# 提取调整价格并计算移动平均线
df_Svalues <- list()

for (i in 1:length(tickers)){
  # 1. 动态生成当前股票的调整价格列名
  adj_col_name <- paste0(tickers[i], ".Adjusted")
  # 2. 从xts对象中提取调整价格列
  df_Svalues[[i]] <- stockValues[[i]][, adj_col_name]
  
  # 3. 用TTR包的SMA函数直接计算移动平均线(无需先初始化0)
  df_Svalues[[i]]$mav10 <- SMA(df_Svalues[[i]][, 1], n = 10)
  df_Svalues[[i]]$mav50 <- SMA(df_Svalues[[i]][, 1], n = 50)
  df_Svalues[[i]]$mav200 <- SMA(df_Svalues[[i]][, 1], n = 200)
}

# 查看结果结构
str(df_Svalues)

关键改动说明

  1. 动态列名生成
    每只股票的xts对象列名都是代码.Adjusted格式,所以用paste0(tickers[i], ".Adjusted")拼接出当前股票的调整价格列名,避免了固定列名的错误。

  2. xts对象的列提取方式
    对xts时间序列对象,用[, 列名]的方式提取列比$更可靠,尤其是处理动态列名时,能避免语法错误。

  3. 直接计算移动平均线
    不用先初始化mav10 <- 0,直接用TTR包的SMA()函数计算——它会自动处理前n-1个周期的NA值(比如前9天没有10日均线),结果更符合金融数据的逻辑。

进阶优化:避免循环,合并所有股票数据

如果后续需要统一处理所有股票数据,还可以把所有调整价格合并成一个大的xts对象,再批量计算均线,代码更简洁:

# 合并所有股票的调整价格
all_adj_prices <- do.call(merge, lapply(stockValues, function(x) x[, grep("Adjusted", colnames(x))]))
colnames(all_adj_prices) <- tickers

# 批量计算各周期均线
all_mav10 <- SMA(all_adj_prices, n = 10)
colnames(all_mav10) <- paste0(tickers, "_mav10")
all_mav50 <- SMA(all_adj_prices, n = 50)
colnames(all_mav50) <- paste0(tickers, "_mav50")
all_mav200 <- SMA(all_adj_prices, n = 200)
colnames(all_mav200) <- paste0(tickers, "_mav200")

# 合并所有数据(原始价格+均线)
all_data <- merge(all_adj_prices, all_mav10, all_mav50, all_mav200)

内容的提问来源于stack exchange,提问作者Bill Moran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 20:17:30