DAX实现多股票每日环比涨幅(含基准值对比)的问题求助
DAX实现多股票每日环比涨幅(含基准值对比)的问题求助
一、资源与样本数据
- 样本PBIX文件:Here is the Sample PBIX File - Here
- 样本数据表:
StockQuoteTable,包含字段:- StartDate
- EndDate
- QuotePull.Column1.CH_SYMBOL(股票代码)
- QuotePull.Column1.CH_TRADE_HIGH_PRICE(当日最高价)
- QuotePull.Column1.CH_TRADE_LOW_PRICE(当日最低价)
- QuotePull.Column1.CH_OPENING_PRICE(开盘价)
- QuotePull.Column1.CH_CLOSING_PRICE(收盘价)
- QuotePull.Column1.CH_LAST_TRADED_PRICE(当日最后成交价)
- QuotePull.Column1.CH_PREVIOUS_CLS_PRICE(前收盘价)
- QuotePull.Column1.CH_TOT_TRADED_QTY(成交量)
- QuotePull.Column1.CH_TOT_TRADED_VAL(成交金额)
- QuotePull.Column1.CH_52WEEK_HIGH_PRICE(52周最高价)
- QuotePull.Column1.CH_52WEEK_LOW_PRICE(52周最低价)
- QuotePull.Column1.CH_TOTAL_TRADES(成交笔数)
- QuotePull.Column1.CH_TIMESTAMP(交易日期)
- QuotePull.Column1.VWAP(加权平均价)
样本数据示例:
| CH_SYMBOL | StartDate | EndDate | CH_TRADE_HIGH_PRICE | CH_TRADE_LOW_PRICE | CH_OPENING_PRICE | CH_CLOSING_PRICE | CH_LAST_TRADED_PRICE | CH_PREVIOUS_CLS_PRICE | CH_TOT_TRADED_QTY | CH_TOT_TRADED_VAL | CH_52WEEK_HIGH_PRICE | CH_52WEEK_LOW_PRICE | CH_TOTAL_TRADES | CH_TIMESTAMP | VWAP |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| HDFCBANK | 01-Jan-23 | 31-Dec-23 | 1714.9 | 1696 | 1697 | 1709.25 | 1708.65 | 1705.25 | 12505713 | 21353650105 | 1757.5 | 1460.25 | 264143 | 29-Dec-23 | 1707.51 |
| HDFCBANK | 01-Jan-23 | 31-Dec-23 | 1721.4 | 1702 | 1709.3 | 1705.25 | 1708.85 | 1703.3 | 22038235 | 37713047859 | 1757.5 | 1460.25 | 423062 | 28-Dec-23 | 1711.26 |
| IREDA | 01-Dec-23 | 31-Dec-23 | 114.2 | 98.3 | 102 | 110.75 | 111.15 | 108.3 | 167648627 | 18085063262 | 123.2 | 50 | 527506 | 18-Dec-23 | 107.87 |
| SBIN | 01-Jan-23 | 31-Dec-23 | 619.9 | 613.1 | 615 | 614.25 | 614.2 | 614.15 | 11706255 | 7210878841 | 629.55 | 499.35 | 285158 | 11-Dec-23 | 615.99 |
二、问题描述
你希望对比三只股票的每日环比涨幅(Day-on-Day Growth %),但现有DAX度量值无法正确计算,推测原因是所有股票数据在同一张表中,且用CH_SYMBOL作为图例区分时,代码没有按股票分组计算前一日数据。
你的现有DAX代码:
'StocksList'[Growth] = VAR currDate = SELECTEDVALUE('StocksList'[QuotePull.Column1.CH_TIMESTAMP]) VAR preDate = CALCULATE( MAX('StocksList'[QuotePull.Column1.CH_TIMESTAMP]), FILTER( 'StocksList', 'StocksList'[QuotePull.Column1.CH_TIMESTAMP] < currDate ) ) VAR DoDchange = DIVIDE( CALCULATE( MAX('StocksList'[QuotePull.Column1.CH_LAST_TRADED_PRICE]), 'StocksList'[QuotePull.Column1.CH_TIMESTAMP] = currDate ) - CALCULATE( MAX('StocksList'[QuotePull.Column1.CH_LAST_TRADED_PRICE]), 'StocksList'[QuotePull.Column1.CH_TIMESTAMP] = preDate ), CALCULATE( MAX('StocksList'[QuotePull.Column1.CH_LAST_TRADED_PRICE]), 'StocksList'[QuotePull.Column1.CH_TIMESTAMP] = preDate ), 0 ) RETURN DoDchange
补充需求(编辑后):希望实现对比每只股票相对于其最早交易日基准值的涨跌幅,消除价格绝对值差异,直观对比走势。
三、解决方案
1. 修正每日环比涨幅(Day-on-Day)
问题核心:现有代码找preDate时没有限定同一股票,导致取到其他股票的日期。需要在FILTER中添加股票代码的过滤条件:
'StocksList'[每日环比涨幅] = VAR currStock = SELECTEDVALUE('StocksList'[QuotePull.Column1.CH_SYMBOL]) VAR currDate = SELECTEDVALUE('StocksList'[QuotePull.Column1.CH_TIMESTAMP]) -- 找到当前股票的前一个交易日 VAR preDate = CALCULATE( MAX('StocksList'[QuotePull.Column1.CH_TIMESTAMP]), FILTER( ALL('StocksList'), 'StocksList'[QuotePull.Column1.CH_SYMBOL] = currStock && 'StocksList'[QuotePull.Column1.CH_TIMESTAMP] < currDate ) ) -- 获取当前日期和前一交易日的最后成交价 VAR currPrice = CALCULATE( MAX('StocksList'[QuotePull.Column1.CH_LAST_TRADED_PRICE]), 'StocksList'[QuotePull.Column1.CH_TIMESTAMP] = currDate ) VAR prePrice = CALCULATE( MAX('StocksList'[QuotePull.Column1.CH_LAST_TRADED_PRICE]), 'StocksList'[QuotePull.Column1.CH_SYMBOL] = currStock && 'StocksList'[QuotePull.Column1.CH_TIMESTAMP] = preDate ) -- 计算环比涨幅,处理除数为0的情况 VAR DoDchange = DIVIDE(currPrice - prePrice, prePrice, 0) RETURN DoDchange
2. 相对于最早交易日的累计涨幅(满足编辑后需求)
如果需要对比每只股票从其第一个交易日开始的累计涨跌幅(以首日价格为基准),可以用这个度量值:
'StocksList'[累计涨幅(相对首日)] = VAR currStock = SELECTEDVALUE('StocksList'[QuotePull.Column1.CH_SYMBOL]) VAR currPrice = MAX('StocksList'[QuotePull.Column1.CH_LAST_TRADED_PRICE]) -- 找到当前股票的最早交易日价格 VAR firstPrice = CALCULATE( MAX('StocksList'[QuotePull.Column1.CH_LAST_TRADED_PRICE]), FILTER( ALL('StocksList'), 'StocksList'[QuotePull.Column1.CH_SYMBOL] = currStock && 'StocksList'[QuotePull.Column1.CH_TIMESTAMP] = MIN('StocksList'[QuotePull.Column1.CH_TIMESTAMP]) ) ) -- 计算累计涨幅,转换为百分比格式(可选) VAR growthPercent = DIVIDE(currPrice - firstPrice, firstPrice, 0) RETURN growthPercent -- 若要显示百分比,可写成 growthPercent * 100
四、可视化使用建议
- 折线图设置:
- X轴:
QuotePull.Column1.CH_TIMESTAMP(交易日期) - Y轴:选择上面的任一涨幅度量值
- 图例:
QuotePull.Column1.CH_SYMBOL(股票代码)
- X轴:
- 这样就能直观对比不同股票的涨幅趋势,不受价格绝对值差异影响。
备注:内容来源于stack exchange,提问作者Joker
相关产品推荐
相关产品推荐

