FEEREVO · 币安成本账本 数据来自 Binance 公共接口

隐性成本方法 · No.026

持仓成本到底怎么算:先进先出和加权平均差在哪

加权平均和先进先出,在同一组买卖上会给出不同的已实现盈亏和不同的剩余成本。这篇用一组标注为假设的交易把两种算法各走一遍,说清手续费该记在哪一栏,以及为什么选定一种之后就不该再换。

谭算 · FeeRevo 编辑部· 发布 2026-09-02· 更新 2026-09-02· 约 10 分钟 已核 · 2026-09
账页风格封面:No.026 · 隐性成本 · 持仓成本的两种算法,先进先出与加权平均

同一组买入和卖出,用加权平均算和用先进先出算,得出的「已实现盈亏」能差出一大截,剩下那部分持仓的成本也跟着不同。两种算法都不算错,真正出问题的是:很多人根本不知道自己在用哪一种,更有人这次这样算、下次那样算,最后自己的账和自己的账都对不上。

下面把两种算法拆开,用一组明确标注为假设的交易走一遍,再说手续费该塞进哪一栏。

两种算法各自在做什么

加权平均把所有买入摊成一个均价,卖出不改变这个均价;先进先出给每一批持仓排队,先买的先卖,每卖一笔都要对应回某一次具体的买入。区别就这一句,但它的后果会一路蔓延到你看见的每一个数字。

加权平均:只留一个数

每次买入之后重算一次:新均价 =(原有持仓成本合计 + 本次买入金额)÷(原有数量 + 本次数量)。卖出时按这个均价确认成本,均价本身不动,只是数量变少。

好处是省事,一个数概括全部持仓,定投尤其合适——你本来也不在乎哪一份是哪天买的。坏处是批次信息全丢了:你答不出「我三月买的那批赚没赚」,因为三月买的和上周买的已经混成同一份。

先进先出:排一条队

把每次买入记成一个批次,含数量、单价、时间。卖出时从最早的批次开始扣,扣完一批接着扣下一批,一笔卖出可能同时吃掉两三个批次。

好处是可追溯:每一笔已实现盈亏都指向具体的某次买入。坏处是要维护一张批次表,手工做很烦,尤其你还在不停地小额买入。不少报税口径默认或要求这一种,但具体取决于你所在地的规定,涉及申报请咨询当地的专业人士,别拿这篇当依据。

一组假设交易,两种算法各走一遍

下面这组数字全部是为了演示随手编的假设值,不对应任何真实币种、任何真实行情、任何真实账户。你要做的是把结构看懂,然后换成自己的成交记录重算一遍。

假设你分三次买进同一个东西,单位随便叫「个」,计价单位随便叫「元」:

批次数量单价本次投入
第 1 笔1 个100100
第 2 笔1 个200200
第 3 笔2 个150300
合计4 个600

四个,一共花了 600,加权平均价正好落在 150。而批次表这边记着三行:1 个 @100、1 个 @200、2 个 @150。

第一次卖出:卖 1 个,成交价 220

算法这笔卖出对应的成本已实现盈亏剩余 3 个的成本合计剩余均价
加权平均150+70450150
先进先出100+120500约 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+30150
先进先出350−90+30150

看最后两列:累计已实现盈亏两边都是 +30,剩余那 1 个的成本两边都是 150。这不是巧合——只要持仓最终全部卖完,两种算法的总账必然重合。它们分歧的是过程,不是终点。

所以真正被影响的是这种场景:你只卖了一部分,然后在这个时点去看「我赚了多少」。而绝大多数人看账的时候,恰好都处在这种卖了一半的中间状态。

手续费算进成本,还是单列成费用

两种记法都通行,但它们给出的成本价不同,所以这一项也得选一种然后固定。

计入成本的记法:买入成本 = 成交金额 + 这笔的手续费;卖出收入 = 成交金额 − 这笔的手续费。好处是你的成本价就是真实的盈亏平衡价,直接拿它和现价比,就知道这笔到底回没回本。

单列费用的记法:成本只记成交金额,手续费统一进一个「费用」科目。好处是你能一眼看见一段时间里究竟交了多少手续费——这个数单独看往往挺吓人,而它一旦混进成本价里就再也看不见了。

我自己偏好两边都记:成本价按含费的方式算,同时把手续费在费用科目里再登一遍(只做统计,不重复扣钱)。这样既有正确的平衡价,又有一张能看的费用汇总表。

有个坑在这:如果你开了用平台币抵扣手续费,那笔费用不是从这笔交易的币里扣的,成交明细的费用栏可能显示成 0 或者显示成另一个币种,你照着成交记录加总成本时很容易把它整个漏掉。抵扣这本账怎么单独记,见用平台币抵扣手续费这件事

什么时候两种算法差得最大

三个放大器:

  • 买入价之间差距大。如果你所有买入都在同一个价位,两种算法给出完全一样的结果,选哪个都无所谓。价差越大,分歧越大。
  • 你只卖了一小部分。卖得越少,「先卖掉的是哪一批」这个问题的权重越高。全部清仓则两者归一。
  • 你的买入横跨了一段大行情。早期的低价批次和近期的高价批次并存时,先进先出会先把最便宜的那批消耗掉,于是它在上涨行情里报出的已实现盈亏通常更高、剩余成本也更高;在下跌行情里则反过来。

还有个容易被忽略的情况:同一个币种散在不同产品或不同账户里。交易账户里一部分、理财里锁着一部分、钱包里还有一部分——合成一本账算一个成本,还是各算各的?这个也得定,定完写下来,不然过两个月你自己都想不起当初怎么算的。

选一种,然后别再换

结论不是「哪个更好」。这两种算法在不同场合各有各的优势,但换来换去的账没有任何比较价值——上个季度用加权平均、这个季度改先进先出,两个季度的盈亏数字放在一起就是两种单位。

真做起来就三步:

  1. 先把这三件事定死,写下来。成本计法用哪种、手续费计不计进成本、跨账户合不合并——三句话,记在你那张表的第一行。
  2. 补齐历史。之前没定过计法的话,挑个时间点当起点,该时点之前的持仓按当时余额和一个你说得清来源的成本入账,别去逆推查不到的老记录。
  3. 每次卖出都当场记。先进先出尤其怕拖:批次消耗顺序一旦断档,后面全对不上。

做完这些,你才有资格问下一个问题:我记的这本账,和平台给的数字对得上吗?那是另一件更麻烦的事。想先把手续费那一栏摊开看看,可以用成本对账单工具过一遍;成交价本身怎么被滑点推高,见市价单比限价单贵在哪

至于涉及申报与纳税的部分,这篇一个字都没给,也不该给:这件事由你所在地的规定决定,请咨询当地的专业人士。

本文只演示成本计法的算术,举例数字均为说明用的假设值,不涉及任何平台的具体费率。文中不构成投资建议;涉及申报与纳税的部分请咨询当地的专业人士。本站与 Binance(币安)没有隶属关系;通过本站邀请码注册不会让你多付费,详见商业披露