使用yfR包yf_get()抓取雅虎财经缺失日期收盘价的取值方案
实现方案
yf_get()本身没有内置指定交易日缺值自动回退取数的能力,不需要修改函数源码,封装一层简单的取数逻辑就能实现需求,还能覆盖所有季度节点休市的场景,不局限于12月31日的特殊情况。
核心逻辑
原有代码失效的原因是直接将季度截止日设为拉取的最后日期,如果目标日期为休市日(周末、法定节假日、个股停盘),返回结果中无对应日期的收盘价,会导致后续向量长度不匹配、取值错位。
通用解决思路是拉取目标日期前若干天的区间数据,筛选出不晚于目标日期的最新一条交易记录,即可自动拿到最近的可用收盘价。
可直接复用的代码
首先封装通用的最近收盘价取数函数:
library(yfR) library(dplyr) get_nearest_close <- function(tickers, target_date, lookback_days = 7, thresh_bad_data = 1) { # 拉取目标日期往前lookback_days至目标日期的区间行情 raw_dt <- yf_get( tickers = tickers, first_date = target_date - lookback_days, last_date = target_date, thresh_bad_data = thresh_bad_data ) # 按个股分组,取距目标日期最近的有效交易日收盘价 result <- raw_dt %>% group_by(ticker) %>% filter(ref_date <= target_date) %>% arrange(desc(ref_date)) %>% slice(1) %>% ungroup() %>% mutate(price_close = round(price_close, 2)) %>% select(ticker, actual_trade_date = ref_date, price_close) return(result) }
替换原代码中的分段取数逻辑即可,后续拼接、列名赋值的代码无需改动:
# 当日收盘价 curr <- get_nearest_close(tickers, target_date = Sys.Date()) current_close <- curr$price_close # 各季度节点收盘价 prev_q <- get_nearest_close(tickers, target_date = quarters[1]) prev_q_closes <- prev_q$price_close prev_q2 <- get_nearest_close(tickers, target_date = quarters[2], thresh_bad_data = 0.45) prev_q2_closes <- prev_q2$price_close prev_q3 <- get_nearest_close(tickers, target_date = quarters[3]) prev_q3_closes <- prev_q3$price_close close_prices <- cbind(prev_q3_closes, prev_q2_closes, prev_q_closes, current_close) tick_close <- data.frame(Tickers = tickers, ClosingPrices = close_prices, PercentChanges = percent_changes) # 原有剩余列名赋值、格式转换代码保持不变即可
参数说明
lookback_days:默认值7,覆盖普通周末、短休市场景;如果需要适配春节、国庆等7天以上长假,可将参数调整为15,确保能取到假期前最后一个交易日的数据- 如果需要严格执行「目标日无数据则仅取前1天,再无数据直接报错」的规则,将
lookback_days设为2即可 - 函数返回结果中保留了
actual_trade_date字段,可直接用于核对每只个股实际取到的收盘价对应交易日期,方便数据校验
内容的提问来源于stack exchange,提问作者awilbdliabd
相关产品推荐
相关产品推荐

