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

如何在ggplot2时间序列图中为SMA均线交叉添加向上标记?

解决SMA金叉标记问题

要在你的SMA图表里添加SMA.15上穿SMA.50的˄标记,核心是先精准识别金叉发生的时间点,再将标记定位到对应位置。我帮你调整了代码,分两步实现:

步骤1:识别金叉信号

首先在原始数据中找出SMA.15从下方穿越到SMA.50上方的日期。这里用dplyr的lag()函数对比相邻两天的SMA差值,判断转折点:

library(tidyverse)
library(tidyquant) # 假设你已加载该包,原代码用到了AAPL数据

# 处理数据,标记金叉点
AAPL_signals <- AAPL %>%
  select(date, close, SMA.15, SMA.50) %>%
  # 计算当天与前一天的SMA差值
  mutate(sma_diff = SMA.15 - SMA.50,
         prev_sma_diff = lag(sma_diff)) %>%
  # 金叉条件:前一天SMA.15低于SMA.50,当天反超
  filter(prev_sma_diff < 0 & sma_diff > 0) %>%
  # 保留标记需要的日期和价格位置(选SMA.15的价格即可)
  select(date, price = SMA.15) %>%
  # 添加要显示的标记文本
  mutate(signal = "˄")

步骤2:绘制带标记的图表

保留你原有的线图逻辑,叠加金叉标记层。这里用geom_text来放置˄,还可以微调位置让标记更清晰:

AAPL %>%
  select(date, close, SMA.15, SMA.50) %>%
  gather(key = type, value = price, close:SMA.50) %>%
  ggplot(aes(x = date, y = price, col = type)) +
  geom_line() +
  # 添加金叉标记:稍微往上偏移一点避免和线条重叠
  geom_text(data = AAPL_signals, 
            aes(x = date, y = price + 2, label = signal),
            color = "darkblue", size = 5, inherit.aes = FALSE) +
  theme(legend.position="bottom") +
  ggtitle("Simple Moving Averages with tidyquant") +
  xlab("") +
  ylab("Stock Price")

小调整建议

  • 如果标记位置不合适,可以修改y = price + 2里的数值,根据你的股价范围增减偏移量;
  • 若想让信号更醒目,可搭配geom_point先画个圆点,再叠加文本标记;
  • 如果需要标记死叉(SMA.15下穿SMA.50),只需把过滤条件改成prev_sma_diff > 0 & sma_diff < 0,标记换成˅即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:26:56