隐性成本方法 · No.026
持仓成本到底怎么算:先进先出和加权平均差在哪
加权平均和先进先出,在同一组买卖上会给出不同的已实现盈亏和不同的剩余成本。这篇用一组标注为假设的交易把两种算法各走一遍,说清手续费该记在哪一栏,以及为什么选定一种之后就不该再换。
同一组买入和卖出,用加权平均算和用先进先出算,得出的「已实现盈亏」能差出一大截,剩下那部分持仓的成本也跟着不同。两种算法都不算错,真正出问题的是:很多人根本不知道自己在用哪一种,更有人这次这样算、下次那样算,最后自己的账和自己的账都对不上。
下面把两种算法拆开,用一组明确标注为假设的交易走一遍,再说手续费该塞进哪一栏。
两种算法各自在做什么
加权平均把所有买入摊成一个均价,卖出不改变这个均价;先进先出给每一批持仓排队,先买的先卖,每卖一笔都要对应回某一次具体的买入。区别就这一句,但它的后果会一路蔓延到你看见的每一个数字。
加权平均:只留一个数
每次买入之后重算一次:新均价 =(原有持仓成本合计 + 本次买入金额)÷(原有数量 + 本次数量)。卖出时按这个均价确认成本,均价本身不动,只是数量变少。
好处是省事,一个数概括全部持仓,定投尤其合适——你本来也不在乎哪一份是哪天买的。坏处是批次信息全丢了:你答不出「我三月买的那批赚没赚」,因为三月买的和上周买的已经混成同一份。
先进先出:排一条队
把每次买入记成一个批次,含数量、单价、时间。卖出时从最早的批次开始扣,扣完一批接着扣下一批,一笔卖出可能同时吃掉两三个批次。
好处是可追溯:每一笔已实现盈亏都指向具体的某次买入。坏处是要维护一张批次表,手工做很烦,尤其你还在不停地小额买入。不少报税口径默认或要求这一种,但具体取决于你所在地的规定,涉及申报请咨询当地的专业人士,别拿这篇当依据。
一组假设交易,两种算法各走一遍
下面这组数字全部是为了演示随手编的假设值,不对应任何真实币种、任何真实行情、任何真实账户。你要做的是把结构看懂,然后换成自己的成交记录重算一遍。
假设你分三次买进同一个东西,单位随便叫「个」,计价单位随便叫「元」:
| 批次 | 数量 | 单价 | 本次投入 |
|---|---|---|---|
| 第 1 笔 | 1 个 | 100 | 100 |
| 第 2 笔 | 1 个 | 200 | 200 |
| 第 3 笔 | 2 个 | 150 | 300 |
| 合计 | 4 个 | — | 600 |
四个,一共花了 600,加权平均价正好落在 150。而批次表这边记着三行:1 个 @100、1 个 @200、2 个 @150。
第一次卖出:卖 1 个,成交价 220
| 算法 | 这笔卖出对应的成本 | 已实现盈亏 | 剩余 3 个的成本合计 | 剩余均价 |
|---|---|---|---|---|
| 加权平均 | 150 | +70 | 450 | 150 |
| 先进先出 | 100 | +120 | 500 | 约 166.7 |
同一笔卖出,一个算出 +70,另一个算出 +120,差了 50。这 50 没有凭空消失,它跑到了剩余成本里:加权平均剩 450,先进先出剩 500,同样差 50。算法既不创造也不消灭钱,它只决定这笔钱什么时候出现在「已实现」那一栏。
接着再卖 2 个,成交价 130
加权平均这边简单:成本还是一个 150,两个就是 300,卖得 260,本次 −40。先进先出这边要按队列扣:最早那批已经用完,接下来轮到 1 个 @200,再往下取 1 个 @150,本次成本合计 350,卖得 260,本次 −90。
| 算法 | 本次成本 | 本次盈亏 | 累计已实现 | 剩余 1 个的成本 |
|---|---|---|---|---|
| 加权平均 | 300 | −40 | +30 | 150 |
| 先进先出 | 350 | −90 | +30 | 150 |
看最后两列:累计已实现盈亏两边都是 +30,剩余那 1 个的成本两边都是 150。这不是巧合——只要持仓最终全部卖完,两种算法的总账必然重合。它们分歧的是过程,不是终点。
所以真正被影响的是这种场景:你只卖了一部分,然后在这个时点去看「我赚了多少」。而绝大多数人看账的时候,恰好都处在这种卖了一半的中间状态。
手续费算进成本,还是单列成费用
两种记法都通行,但它们给出的成本价不同,所以这一项也得选一种然后固定。
计入成本的记法:买入成本 = 成交金额 + 这笔的手续费;卖出收入 = 成交金额 − 这笔的手续费。好处是你的成本价就是真实的盈亏平衡价,直接拿它和现价比,就知道这笔到底回没回本。
单列费用的记法:成本只记成交金额,手续费统一进一个「费用」科目。好处是你能一眼看见一段时间里究竟交了多少手续费——这个数单独看往往挺吓人,而它一旦混进成本价里就再也看不见了。
我自己偏好两边都记:成本价按含费的方式算,同时把手续费在费用科目里再登一遍(只做统计,不重复扣钱)。这样既有正确的平衡价,又有一张能看的费用汇总表。
有个坑在这:如果你开了用平台币抵扣手续费,那笔费用不是从这笔交易的币里扣的,成交明细的费用栏可能显示成 0 或者显示成另一个币种,你照着成交记录加总成本时很容易把它整个漏掉。抵扣这本账怎么单独记,见用平台币抵扣手续费这件事。
什么时候两种算法差得最大
三个放大器:
- 买入价之间差距大。如果你所有买入都在同一个价位,两种算法给出完全一样的结果,选哪个都无所谓。价差越大,分歧越大。
- 你只卖了一小部分。卖得越少,「先卖掉的是哪一批」这个问题的权重越高。全部清仓则两者归一。
- 你的买入横跨了一段大行情。早期的低价批次和近期的高价批次并存时,先进先出会先把最便宜的那批消耗掉,于是它在上涨行情里报出的已实现盈亏通常更高、剩余成本也更高;在下跌行情里则反过来。
还有个容易被忽略的情况:同一个币种散在不同产品或不同账户里。交易账户里一部分、理财里锁着一部分、钱包里还有一部分——合成一本账算一个成本,还是各算各的?这个也得定,定完写下来,不然过两个月你自己都想不起当初怎么算的。
选一种,然后别再换
结论不是「哪个更好」。这两种算法在不同场合各有各的优势,但换来换去的账没有任何比较价值——上个季度用加权平均、这个季度改先进先出,两个季度的盈亏数字放在一起就是两种单位。
真做起来就三步:
- 先把这三件事定死,写下来。成本计法用哪种、手续费计不计进成本、跨账户合不合并——三句话,记在你那张表的第一行。
- 补齐历史。之前没定过计法的话,挑个时间点当起点,该时点之前的持仓按当时余额和一个你说得清来源的成本入账,别去逆推查不到的老记录。
- 每次卖出都当场记。先进先出尤其怕拖:批次消耗顺序一旦断档,后面全对不上。
做完这些,你才有资格问下一个问题:我记的这本账,和平台给的数字对得上吗?那是另一件更麻烦的事。想先把手续费那一栏摊开看看,可以用成本对账单工具过一遍;成交价本身怎么被滑点推高,见市价单比限价单贵在哪。
至于涉及申报与纳税的部分,这篇一个字都没给,也不该给:这件事由你所在地的规定决定,请咨询当地的专业人士。
本文只演示成本计法的算术,举例数字均为说明用的假设值,不涉及任何平台的具体费率。文中不构成投资建议;涉及申报与纳税的部分请咨询当地的专业人士。本站与 Binance(币安)没有隶属关系;通过本站邀请码注册不会让你多付费,详见商业披露。