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

