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

Power BI中股票20日移动均线计算求助(含异常公式及输出)

Power BI 20日移动均线正确DAX公式及问题排查

原公式问题分析

你用的公式结果和收盘价一致,核心原因是时间窗口筛选逻辑仅命中当前行数据:

  • 直接用MAX(Table[TIMESTAMP]) - 19是按自然日计算,但如果数据是非连续交易日(比如仅工作日有数据),往前19天的窗口内可能只有当前一条有效数据,导致平均结果等于收盘价。
  • ALL(Table[TIMESTAMP])仅清除日期列的筛选,若数据包含多只股票等其他维度,会导致计算逻辑混乱,但当前场景下主要是时间窗口的问题。

正确DAX公式

根据你的数据类型选择对应公式:

1. 连续交易日/按自然日计算20天窗口

适用于每天都有交易数据的场景:

20-day Moving Average = 
CALCULATE(
    AVERAGE(Table[CLOSE]),
    DATESINPERIOD(
        Table[TIMESTAMP],
        MAX(Table[TIMESTAMP]),
        -20,
        DAY
    )
)

2. 非连续交易日/取最近20个交易日平均

适用于仅工作日有数据,需要忽略非交易日的场景:

20-day Moving Average = 
VAR CurrentDate = MAX(Table[TIMESTAMP])
VAR CurrentRowIndex = RANKX(ALL(Table[TIMESTAMP]), Table[TIMESTAMP], , ASC)
RETURN
CALCULATE(
    AVERAGE(Table[CLOSE]),
    FILTER(
        ALL(Table[TIMESTAMP]),
        RANKX(ALL(Table[TIMESTAMP]), Table[TIMESTAMP], , ASC) >= CurrentRowIndex - 19
        && RANKX(ALL(Table[TIMESTAMP]), Table[TIMESTAMP], , ASC) <= CurrentRowIndex
    )
)

3. 多股票场景(含股票代码维度)

如果你的数据包含多只股票,需保留股票维度的上下文,修改公式如下:

20-day Moving Average = 
VAR CurrentStock = MAX(Table[StockCode])
VAR CurrentRowIndex = RANKX(
    FILTER(ALL(Table), Table[StockCode] = CurrentStock),
    Table[TIMESTAMP], , ASC
)
RETURN
CALCULATE(
    AVERAGE(Table[CLOSE]),
    FILTER(
        ALL(Table),
        Table[StockCode] = CurrentStock
        && RANKX(
            FILTER(ALL(Table), Table[StockCode] = CurrentStock),
            Table[TIMESTAMP], , ASC
        ) >= CurrentRowIndex - 19
        && RANKX(
            FILTER(ALL(Table), Table[StockCode] = CurrentStock),
            Table[TIMESTAMP], , ASC
        ) <= CurrentRowIndex
    )
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:05:16