【发布时间】:2021-07-04 08:54:57
【问题描述】:
这篇文章真的值得一读。这个主题的另一个更好的版本是here。
如果您查看下表,我会尝试在不添加辅助列的情况下查找每笔交易的平均价格。当边是 Buy 但在 Sell 边显示不正确的平均价格时,平均价格是正确的,我正在为其寻找平均价格的公式、数组公式或 UDF列。
| Date | Side | Qty | Price | Value | Holding | Avg Price |
|---|---|---|---|---|---|---|
| 1-Jul | Buy | 225 | 10000 | 2250000 | 225 | 10000 |
| 2-Jul | Buy | 75 | 10200 | 765000 | 300 | 10050 |
| 3-Jul | Sell | -150 | 9950 | -1492500 | 150 | 10150 |
价值的公式是=E3*D3,持有的公式是=SUM($D$3:D3),平均价格的公式是=SUMPRODUCT($D$3:D3,$E$3:E3)/SUM($D$3:$D3)我往下拖。除了最后一个值 10150 之外,一切似乎都是正确的。根据下面给出的 FIFO 逻辑,理想情况下它应该有 10,100。
第一个订单:数量 = 225 |价格 = 卢比。 10,000.00
二阶:数量 = 75 |价格 = 卢比。 10,200.00
要计算平均价格,首先要计算价值(数量 x 价格)。因此:
第一笔交易:卢比。 22,50,000.00
第二笔交易:卢比。 7,65,000.00
总数量 = 300
前两个订单的总价值:卢比。 30,15,000.00
总值除以总量:
卢比。 30,15,000.00 ÷ 300 = Rs.10,050.00(使用=sumproduct 公式计算)
7 月 3 日,我们下了 150 个卖单(共 300 个)。价格:卢比。 9,950.00
现在这里将应用 FIFO(先进先出)方法。该方法将检查第一笔交易(在买方)。在这种情况下,它是 225。150 卖出的股票将从 225 中扣除(第一次持有)。第一次持有的余额是 225,现在是 225 - 150 = 75
先进先出后,表格扣除卖出数量后变成这样转换。看到第一个 Qty 从 225 更改为 75,因为 150 个库存已售出。
| Date | Side | Qty | Price | Value | Holding | Avg Price |
|---|---|---|---|---|---|---|
| 1-Jul | Buy | 75 | 10000 | 750000 | 75 | 10000 |
| 2-Jul | Buy | 75 | 10200 | 765000 | 150 | 10100 |
请注意: 如果卖出数量超过225,则将转移到下一笔交易以扣除剩余数量。
现在要获得解决方案,需要额外的辅助列或辅助表,我希望消除它们并找到公式或数组公式或 UDF 来计算平均价格。我请求 excel 专家帮助我解决这个问题。
下面给出了我正在尝试的另一个示例,其中投资价格显示不正确:
| Date | Side | Qty | Price | Value | Holding | Avg Price |
|---|---|---|---|---|---|---|
| 1-Jul | Buy | 5 | 10 | 50 | 5 | 10 |
| 2-Jul | Sell | -3 | 17 | -51 | 2 | -0.5 |
| 3-Jul | Buy | 17 | 3 | 51 | 19 | 2.63 |
| 4-Jul | Sell | -15 | 7.8 | -117 | 4 | -16.75 |
编辑
从@Tom Sharpe 获得解决方案后完成
为了获得平均价格,我将两个变量 avgRate 和 sumRate 声明为 double 并稍微修改了 For Each 代码。请告知是否有有效的方法来做到这一点。感谢这是否可以转换为 UDF,这样我就不必一次又一次地运行代码。非常感谢您提供的出色解决方案。
For Each bs In queue
Debug.Print ("qty=" & bs.qty)
Debug.Print ("rate=" & bs.rate)
avgRate = avgRate + (bs.qty * bs.rate)
sumRate = sumRate + bs.qty
Debug.Print avgRate / sumRate
Next
【问题讨论】:
-
正确答案是什么?如何回答?
-
我认为投资价格是 3,因为在第二次交易中,第一次购买时卖出了 3 股,后来在第四次交易中卖出了 15 股,其中 2 股以 10 的价格被卖出,其余的以 3 的价格购买。因此,剩下的任何数量都以 3 的价格购买。我可能没有很好地解释它,FIFO(先进先出)方法的解释在我发布的链接中给出。感谢您的回复
-
请参考我在原帖中写的小编辑。谢谢
-
"我尝试了几个公式,例如 sumif、sumproduct、sumif 和 sumproduct 的组合,但没有得到正确的答案。"分享您的尝试并解释您遇到困难的地方。
-
这是预期的结果吗?
=SUMPRODUCT(A2:A5,C2:C5)/SUM(C2:C5)或=SUM(D2:D5)/SUM(C2:C5)
标签: excel vba user-defined-functions stock fifo