使用tq_get下载雅虎财经DAX指数数据能否填充周末缺失日期
问题场景
开发Shiny应用过程中需要在同一张图表绘制两类收益曲线:
- 加密货币投资组合收益
- DAX指数(雅虎财经代码为
^GDAXI)收益
两类数据存在时间粒度不匹配问题:DAX指数仅包含每周5个交易日的行情数据,加密货币为每周7天连续交易数据,相同时间区间下DAX数据点更少,无法直接对齐绘图。需求为补全DAX数据中周末、节假日缺失的日期行,缺失值填充为NA即可,后续可通过na.locf函数完成数值补全。
原实现代码存在两处可修正的问题:tq_get调用中to参数多写了一个逗号,重复执行了两次dax_daily_returns的计算逻辑。
实现方案
雅虎财经接口返回的股票、指数类数据默认仅包含交易日条目,没有内置参数可以自动返回非交易日的空行,可通过生成完整日期序列做左连接的方式补全所有日期,缺失值会自动初始化为NA,完全匹配后续处理需求。
完整可运行代码如下:
library(tidyquant) library(zoo) library(dplyr) # 拉取DAX指数原始行情数据 dax <- tq_get("^GDAXI", from = "2020-01-01", to = "2021-01-01", get = "stock.prices") # 生成指定时间区间内的完整自然日序列 full_dates <- tibble( date = seq.Date(from = as.Date("2020-01-01"), to = as.Date("2021-01-01"), by = "day") ) # 左连接补全所有日期,非交易日的行情字段自动填充为NA dax_with_na <- full_dates %>% left_join(dax, by = "date") # 按需调用na.locf用上一个有效交易日的数值填充NA dax_imputed <- dax_with_na %>% mutate(across(c(open, high, low, close, adjusted, volume), ~na.locf(.x, na.rm = FALSE))) # 计算日度收益、累计收益,此时日期维度和加密货币数据完全对齐 dax_daily_returns <- dax_imputed %>% tq_transmute(select = adjusted, mutate_fun = periodReturn, period = "daily", col_rename = "ret") dax_cum_returns <- dax_daily_returns %>% mutate(cr = cumprod(1 + ret))
优化提示:如果需要和加密货币数据的日期100%精准对齐,无需手动生成日期序列,直接提取加密货币数据框中的日期列作为左表和DAX数据连接即可,可自动适配不同时间区间、时区带来的日期差异。
内容的提问来源于stack exchange,提问作者Silura
相关产品推荐
相关产品推荐

