如何在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
相关产品推荐
相关产品推荐

