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

如何将不同日期的标准化股票序列合并绘制到同一图表?

不同时间段股票标准化收益率的合并绘图方案

需求目标:

  • 下载不同时间段的股票数据
  • 对收益率进行标准化(起始值设为1)
  • 将时间对齐至时间0(以各自起始日为第1天)
  • 在同一图表中绘制所有序列以直观对比表现

原代码使用quantmod和ggplot2可生成单只股票的标准化图表,但合并绘制时因各序列日期范围不同,直接合并会产生大量NA值导致失败。


修正后的完整代码

library(quantmod)
library(ggplot2)
library(dplyr)

# 修正字符串分割逻辑,替换非内置的spl函数
Symbols <- unlist(strsplit('AAPL,C', ','))
dates_from <- unlist(strsplit('2000-1-1,2008-1-1', ','))
dates_to <- unlist(strsplit('2000-12-1,2008-12-1', ','))
noS <- length(Symbols)
dataEnv <- new.env()

# 批量下载并处理股票数据
for(i in 1:noS) {
  # 下载对应时间段的调整后收盘价
  getSymbols(Symbols[[i]], 
             src = "yahoo", 
             from = dates_from[[i]], 
             to = dates_to[[i]],
             env = dataEnv, 
             auto.assign = TRUE, 
             use.Adjusted = TRUE)
  # 标准化价格:以起始日价格为基准,所有值除以起始值
  dataEnv[[Symbols[i]]] <- Ad(dataEnv[[Symbols[i]]]) / coredata(Ad(dataEnv[[Symbols[i]]]))[1]
  # 转换为数据框,添加相对时间列和股票标识列
  dataEnv[[Symbols[i]]] <- data.frame(
    Relative_Day = 1:nrow(dataEnv[[Symbols[i]]]),
    Normalized_Price = coredata(dataEnv[[Symbols[i]]]),
    Symbol = Symbols[i]
  )
}

# 合并所有股票数据为长格式数据框(避免NA值问题)
combined_data <- bind_rows(mget(ls(dataEnv), envir = dataEnv))

# 绘制多序列对比图
ggplot(combined_data, aes(x = Relative_Day, y = Normalized_Price, color = Symbol)) +
  geom_line(linewidth = 1) +
  ggtitle("标准化股票价格序列对比(各自起始日为第1天)") +
  xlab("相对交易日") +
  ylab("标准化价格(起始值=1)") +
  theme_minimal() +
  scale_color_brewer(palette = "Set1")

关键修改说明

  • 修复字符串分割错误:替换非R内置的spl函数,用strsplit+unlist实现多股票/日期的拆分
  • 统一数据结构:为每个股票数据添加Symbol标识列和Relative_Day相对时间列,确保所有序列的时间轴以自身起始日为基准对齐
  • 长格式合并:使用dplyr::bind_rows合并数据,避免因日期范围不同产生的NA值,同时适配ggplot的分组绘图逻辑
  • 优化可视化:通过color=Symbol自动区分不同股票线条,添加配色方案提升图表可读性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 13:33:20