我导入了一个 Excel 表格,其中包含数千笔股票的买卖交易。
导入的数据:交易代码、交易日期、交易股票数量、交易类型(买入或卖出)以及交易股价。
然后,我计算了一个度量,该度量能够在每行数据下发生每次购买/销售交易后计算运行的股票余额。
其他 3 项措施也很容易计算:
然后我需要计算最后一个衡量标准是平均成本,这就是我陷入循环依赖问题...
的地方此计算背后的基本原理如下:
下面的屏幕截图试图说明上述所有内容(我希望它最终不会提供令人困惑的图片......):
由于实际代码相当冗长,我将其分为 4 部分,以便于理解。
1) 从同一列中选取的先前平均成本通过以下代码计算:
Average cost =
VAR Avg_Cost_Tbl =
CALCULATETABLE(
ADDCOLUMNS(
SUMMARIZE(
fTrans,
fTrans[Ticker],
fTrans[Date]
),
"@AvgCost", [Average cost]
),
fTrans[Ticker] = fTrans[Ticker],
fTrans[Date] <= fTrans[Date]
)
VAR Prior_Avg_Cost =
FILTER(
Avg_Cost_Tbl,
SELECTCOLUMNS(
OFFSET(
-1,
Avg_Cost_Tbl,
ORDERBY( fTrans[Ticker], ASC, fTrans[Date], ASC )
),
[@AvgCost]
)
)
2) 截至相应日期的所有购买总额 相应代码通过以下代码计算:
VAR Purch_Total_Tbl =
CALCULATETABLE(
ADDCOLUMNS(
SUMMARIZE(
fTrans,
fTrans[Ticker],
fTrans[Date],
fTrans[Transaction]
),
"@PurchTotal", [Purchase total]
),
fTrans[Ticker] = fTrans[Ticker],
fTrans[Date] <= fTrans[Date],
fTrans[Transaction] = "Purchase"
)
VAR Purch_Total_Sum =
IF(
HASONEVALUE( fTrans[Ticker] ),
SUMX(
WINDOW(
1,
ABS,
0,
REL,
Purch_Total_Tbl,
ORDERBY( fTrans[Date], ASC ),
,
PARTITIONBY( fTrans[Ticker] )
),
[@PurchTotal]
)
)
3) 相应日期之前的所有总成本 相应代码通过以下代码计算:
VAR Total_Cost_Tbl =
CALCULATETABLE(
ADDCOLUMNS(
SUMMARIZE(
fTrans,
fTrans[Ticker],
fTrans[Date],
fTrans[Transaction]
),
"@Total_Cost", [Total cost]
),
fTrans[Ticker] = fTrans[Ticker],
fTrans[Date] <= fTrans[Date],
fTrans[Transaction] = "Sale"
)
VAR Total_Cost_Sum =
IF(
HASONEVALUE( fTrans[Ticker] ),
SUMX(
WINDOW(
1,
ABS,
-1,
REL,
Total_Cost_Tbl,
ORDERBY( fTrans[Date], ASC ),
,
PARTITIONBY( fTrans[Ticker] )
),
[@Total_Cost]
)
)
4) 最后,将上述 3 段代码通过以下代码组合在一起:
RETURN
SUMX(
fTrans,
IF(
fTrans[Transaction] = "Sale",
Purch_Total_Sum,
DIVIDE(
Purch_Total_Sum + Total_Cost_Sum,
[Saldo de cotas]
)
)
)
但是后来我不断收到循环依赖错误消息,我试图通过确保代码从先前的行中获取依赖数据来避免这种情况,尽管我尝试这样做失败了。
如何修复此代码以实现此目的?还是应该采取完全不同的计算方法?
我认为计算列可能是实现这一目标的一种方法,但我想避免这种途径,因为我们正在讨论一个包含数万行数据的表。
预先感谢您的帮助!
VAR Total_Cost_Tbl = 计算表( 添加列( 总结( fTrans, fTrans[股票代码], fTrans[日期], fTrans[交易] ), "@Total_Cost", [总成本] ), fTrans[股票代码] = fTrans[股票代码], fTrans[日期] <= fTrans[Date], fTrans[Transaction] = "Sale" ) VAR Total_Cost_Sum = IF( HASONEVALUE( fTrans[Ticker] ), SUMX( WINDOW( 1, ABS, -1, REL, Total_Cost_Tbl, ORDERBY( fTrans[Date], ASC ), , PARTITIONBY( fTrans[Ticker] ) ), [@Total_Cost] ) )