R语言遍历道指股票计算最低收盘价时循环返回相同值求助
解决R语言遍历道指成分股计算最低收盘价的重复值问题
错误原因分析
你遇到的问题核心是循环遍历对象错误:
- 你生成的
DOW_st是一个单列的data.frame,当用for (i in DOW_st)循环时,R会遍历data.frame的列(而非单个股票代码),所以每次循环的i都是整个股票代码向量。 tq_get接受多个代码时会返回所有股票的合并数据,此时计算min(data_i$close)得到的是所有股票收盘价的全局最小值,自然所有结果都重复这个值。
修正后的循环代码
先调整股票代码的存储格式为向量,再遍历单个代码:
library(tidyquant); library(dplyr) # 获取道指成分股代码,转为向量格式(直接取symbol列) DOW_st <- tq_index("DOW")$symbol # 去掉最后一行(若为合计行) DOW_st <- DOW_st[-length(DOW_st)] # 初始化结果存储的data.frame DOW_st_data <- data.frame() for (sym in DOW_st) { # 获取单只股票的价格数据 data_i <- tq_get(sym, from = "1980-01-01", to = "2024-06-20", get = "stock.prices") # 计算该股票的最低收盘价 min_close <- min(data_i$close, na.rm = TRUE) # 将结果合并到data.frame中 DOW_st_data <- bind_rows(DOW_st_data, tibble(symbol = sym, min_close = min_close)) }
更高效的tidyverse批量处理方案
完全不用循环,利用tidyquant的批量处理能力,代码更简洁且效率更高:
library(tidyquant); library(dplyr) DOW_st_data <- tq_index("DOW") %>% # 保留股票代码列 select(symbol) %>% # 去掉最后一行合计 filter(row_number() <= n() - 1) %>% # 批量获取所有股票的价格数据 tq_get(get = "stock.prices", from = "1980-01-01", to = "2024-06-20") %>% # 按股票代码分组 group_by(symbol) %>% # 计算每组的最低收盘价 summarise(min_close = min(close, na.rm = TRUE))
内容的提问来源于stack exchange,提问作者Rana
相关产品推荐
相关产品推荐

