Julia中绘制DataFrame叠加简单移动平均线出现日期显示异常问题
问题根因分析
- 核心问题:叠加SMA线时未指定对应的x轴序列,导致坐标维度不匹配
- 次要问题:Date列未转换为标准Date类型,存在兼容性隐患
你仅传入SMA的y值给
plot!()时,Plots.jl会默认使用1:length(y)的整数索引作为x轴,而你初始绘制收盘价时用的x轴是真实日期序列(Plots内部会将Date类型转换为万级别的时间戳数值),两套x轴的数值范围完全错位,最终表现为SMA线位置偏移、日期显示错乱。
你之前尝试排序DataFrame的操作无法生效,是因为排序后绘制SMA时依然没有传入对应的日期x轴,还是使用默认索引作为x,本质问题没有解决。
修正步骤
1. 补全数据预处理
首先加载Dates库,将Any类型的Date列转换为标准Date类型,同时提前完成日期排序:
using DataFrames, XLSX, StatsPlots, Indicators, Dates df = DataFrame(XLSX.readtable("Demo-sv.xlsx", "Blad3")...) # 转换Date列为标准Date类型,避免兼容性问题 df[!, :Date] = Date.(df.Date) df[!, :Closeprice] = Float64.(df.Closeprice) # 直接原地排序,保证时间序列顺序正确 sort!(df, :Date)
2. 对齐坐标轴绘制SMA
叠加SMA时必须同时传入与SMA序列一一对应的日期x轴,不能仅传入y值:
# 先绘制基础收盘价折线图 @df df plot(:Date, :Closeprice, label="收盘价", xlabel="日期", ylabel="价格") # 计算200周期SMA sma_200 = sma(df.Closeprice, n=200) # 叠加时同时传入日期x轴与SMA的y轴值 plot!(df.Date, sma_200, label="200周期简单移动平均线")
特殊情况处理
如果使用的指标库返回的SMA序列是截断格式(即仅返回可计算的有效部分,长度比原收盘价短n-1位),则需要匹配截取对应长度的日期序列:
# 匹配截取第200行到末尾的日期序列,和截断后的SMA对齐 plot!(df.Date[200:end], sma_200, label="200周期简单移动平均线")
内容的提问来源于stack exchange,提问作者hbrovell
相关产品推荐
相关产品推荐

