使用 Beancount 进行交易

Martin Blais,2014 年 7 月

http://furius.ca/beancount/doc/trading

引言

什么是利润与亏损?

已实现与未实现的利润与亏损

交易批次

记账方法

带日期的批次

报告未实现的利润与亏损

佣金

股票分割

成本基础调整

股息

平均成本记账法

未来主题

引言

本文是命令行会计手册的配套文档,专门讨论 Beancount 中的交易与投资。在阅读本文之前,建议您先阅读复式记账法入门

股票交易的主题必须以对“利润与亏损”(简称 P/L,发音为“P 和 L”)的讨论为前提,它也被称为资本利得或损失。对于初学者而言,理解多次交易中的 P/L 概念可能较为困难,甚至我见过一些专业交易员对不同时段的 P/L 理解也不够深入。因此,花一些时间解释这一点是值得的,也是理解如何在复式记账系统中记录交易的必要前提。

在可能的情况下,本讨论将结合 Beancount 中如何记录这些交易的详细示例展开。您可能也会对 Beancount 中一项正在积极讨论的改进记账方法的提案感兴趣。关于免税账户的成本基础讨论不会在此处展开,而将在更通用的手册中另行说明。

什么是利润与亏损?

假设您在 E*Trade 佣金券商开设了一个账户,并购买了某家公司的股票,例如 IBM。如果您以每股 160 美元的价格购买了 10 股 IBM 股票,总成本为 1600 美元。这个金额我们称之为“账面价值”,或等价地称为“成本”。这是您为获得这些股票(也称为“持仓”)所支出的金额。您在 Beancount 中记录这笔交易的方式如下:

2014-02-16 * "Buying some IBM"
  Assets:US:ETrade:IBM                 10 IBM {160.00 USD}
  Assets:US:ETrade:Cash          -1600.00 USD

实际上,您可能需要为此服务向 E*Trade 支付一些佣金,为完整起见,我们将其加入:

2014-02-16 * "Buying some IBM"
  Assets:US:ETrade:IBM                 10 IBM {160.00 USD}
  Assets:US:ETrade:Cash          -1609.95 USD
  Expenses:Financial:Commissions     9.95 USD

这告诉 Beancount 以“成本”方式存入若干单位,在本例中是“每股 160 美元的 IBM 股票”。这笔交易是平衡的,因为其各分录之和为零:10 × 160 + (-1609.95) + 9.95 = 0。此外,我们选择使用一个专门用于 IBM 股票的子账户;这并非绝对必要,但便于在资产负债表等报表中进行汇总,因为它会自然地将您每项持仓的全部股票单独列示。同时,拥有一个“现金”子账户也能强调您存放在那里的未投资资金并未产生任何收益。

第二天,市场开盘,IBM 股票价格涨至每股 170 美元。在此语境下,我们称此为“市价”。1 您持仓的“市场价值”是持股数量乘以市价,即 10 股 × 170 美元/股 = 1700 美元。

这两个金额之间的差额即为我们所说的利润与亏损(P/L):

市场价值 - 账面价值 = 利润与亏损

10 × 170 美元 - 10 × 160 美元 = 1700 美元 - 1600 美元 = 100 美元(盈利)

我们将正数金额称为“盈利”,负数金额称为“亏损”。

已实现与未实现盈亏

上一节提到的利润称为“未实现利润”。这是因为股票尚未实际售出——这只是一个假设性的利润:如果我能够以市价卖出这些股票,那么我将获得这么多收益。我在上一节提到的 100 美元实际上就是“未实现盈亏”。

假设你喜欢这种未实现利润,但认为 IBM 股价上涨只是暂时的运气,于是你决定以每股 170 美元的价格向市场卖出这 10 股中的 3 股。这部分股票的利润现在将变为“已实现”:

市场价值 - 账面价值 = 利润与亏损

3 × 170 美元 - 3 × 160 美元 = 3 × (170 - 160) = 30 美元(利润)

这 30 美元是“已实现盈亏”。你持仓的剩余部分仍显示为未实现利润,也就是说,在你卖出之前,价格还可能继续波动:

市场价值 - 账面价值 = 利润与亏损

7 × 170 美元 - 7 × 160 美元 = 70 美元

以下是您在 Beancount 中记录此次部分持仓卖出的方式(同样包含佣金):

2014-02-17 * "Selling some IBM"
  Assets:US:ETrade:IBM                 -3 IBM {160.00 USD}
  Assets:US:ETrade:Cash            500.05 USD
  Expenses:Financial:Commissions     9.95 USD

你有没有发现这里有点奇怪?-3 × 160 = -480,-480 + 500.05 + 9.95 = 30……这笔交易并未平衡为零!问题在于,我们因卖出这 3 股股票而收到了 510 美元现金。这是因为实际卖出价格是 170 美元:3 × 170 = 510 美元。我们需要增加一个分录来记录这笔利润,而幸运的是,Beancount 会自动帮我们计算并追踪盈亏:

2014-02-17 * "Selling some IBM"
  Assets:US:ETrade:IBM                 -3 IBM {160.00 USD}
  Assets:US:ETrade:Cash            500.05 USD
  Expenses:Financial:Commissions     9.95 USD
  Income:US:ETrade:PnL

最后一个分录将由 Beancount 自动填入-30 USD,因为我们允许一个分录不指定金额(请记住,在复式记账系统中,没有贷方和借方之分,对于“收入”账户而言,利润是负数)。这正是政府在征税时关注的数字。

总结一下,你现在拥有:

7 股“按账面价值 160 美元计”的股票 = 1120 美元(其账面价值)

已实现盈亏 30 美元

未实现盈亏 70 美元

此时,有些人可能会跳起来说:“等等,等等!我卖出的价格是每股 170 美元,不是 160 美元,为什么这里写的是 160 美元?”答案是:你并没有持有以 170 美元购入的股票可供卖出。为了解释这一点,我需要稍作延伸,说明我们是如何在账户中追踪这些股票的……

那么,我们是如何追踪这些股票的呢?

其实很简单:当 Beancount 在账户中存储数据时,我们使用一种称为“库存”的机制。想象一下,“库存”是一个贴有账户名称的袋子。每个账户都有这样一个袋子,用于存放该账户在某一特定时间点的所有资产,即该账户在该时点的“余额”。想象袋子里的每一件物品都贴着一个小标签,标明其成本——也就是购入时的价格。每当你往袋子里放入一件物品,就为它贴上一个新的标签。为了确保系统正常运作,所有物品都必须贴上标签2。在我们的例子中,袋子里有 10 个“以每股 160 美元购入的 IBM 股票”。我们之前用来将 IBM 股票记入账户的语法可能有点误导性;我们写的是:

  Assets:US:ETrade:IBM                 10 IBM {160.00 USD}

但实际上,Beancount 将其理解为更接近以下语法:

  Assets:US:ETrade:IBM                 10 {IBM 160.00 USD}

但……这样写太繁琐了,所以我们采用了一种更符合人类直觉的语法。

关键是,你不能减去{IBM at 170.00 USD}的单位……因为袋子里根本没有这样的股票。你袋子里只有{IBM at 160.00 USD}的单位,你只能取出这些。

话虽如此,你是否注意到,真正帮助我们追踪盈亏的是我们为这些股票所收到的金额?我们实际上从未需要标明卖出股票的价格。关键在于,我们收到的现金金额与所售持仓的成本不同,这才触发了不平衡,从而记入资本利得。

嗯……Beancount 维护着一个价格数据库,难道不最好至少记录并附上这笔交易的价格以供存档吗?确实如此。Beancount 允许你为这笔交易附上价格,但在平衡交易时,它会完全忽略该价格。它的主要作用是用于文档记录,你可以在编写脚本时使用它。如果你使用 beancount.plugins.implicit_prices 插件,它会自动合成一个 price 条目,以丰富我们的历史价格数据库,该数据库可用于报告账户内容的市场价值(更多细节将在后文说明)。

因此,出售这些股票的完整且最终交易应为:

2014-02-17 * "Selling some IBM"
  Assets:US:ETrade:IBM          -3 IBM {160.00 USD} @ 170.00 USD
  Assets:US:ETrade:Cash          500.05 USD
  Expenses:Financial:Commissions   9.95 USD
  Income:US:ETrade:PnL

交易批次

实际上,交易的现实情况比这稍微复杂一点。你可能会多次购买 IBM 股票,而每次购买的价格很可能都不同。让我们通过另一个交易示例来看看这是如何运作的。假设你之前持有 7 股成本价为 160 美元/股的 IBM 股票,第二天你发现价格又上涨了,于是改变主意决定“做多”,再买入 5 股,这次的成交价为 180 美元/股:

2014-02-18 * "I put my chips on big blue!"
  Assets:US:ETrade:IBM                 5 IBM {180.00 USD}
  Assets:US:ETrade:Cash           -909.95 USD
  Expenses:Financial:Commissions     9.95 USD

现在,Assets:US:ETrade:IBM 账户里有什么呢?我们有两种不同的持仓:

  • 7 股“成本价为 160 美元/股的 IBM 股票”,来自第一次交易

  • 5 股“成本价为 180 美元/股的 IBM 股票”,来自本次交易

我们将这些称为“批次”或“交易批次”。

事实上,如果你一个月后决定出售全部持仓,合法地在 Beancount 中进行这笔交易(即不报错)的方式是明确指定两个分录。假设此时股价为 172 美元/股:

2014-03-18 * "Selling all my blue chips."
  Assets:US:ETrade:IBM          -7 IBM {160.00 USD} @ 172.00 USD
  Assets:US:ETrade:IBM          -5 IBM {180.00 USD} 
  Assets:US:ETrade:Cash         2054.05 USD
  Expenses:Financial:Commissions   9.95 USD
  Income:US:ETrade:PnL

此时,你的 IBM 最终持仓将为 0 股。

或者,由于你出售的是全部持仓,Beancount 应能明确地将所有批次与未指定的成本匹配。这等价于:

2014-03-18 * "Selling all my blue chips."
  Assets:US:ETrade:IBM          -12 IBM {} @ 172.00 USD
  Assets:US:ETrade:Cash         2054.05 USD
  Expenses:Financial:Commissions   9.95 USD
  Income:US:ETrade:PnL

请注意,如果股票总数与所有批次不匹配,则此方法将无效(这会造成歧义……应选择哪个批次子集并不明确)。

记账方法

但如果你只想出售部分股票呢?比如你需要一些现金给心爱的人买礼物,这次想卖出 4 股。假设当前股价为 175 美元/股。

现在你有了一个选择:你可以选择卖出较早买入的股票,从而实现更大的利润:

2014-03-18 * "Selling my older blue chips."
  Assets:US:ETrade:IBM          -4 IBM {160.00 USD} @ 175.00 USD
  Assets:US:ETrade:Cash          690.05 USD
  Expenses:Financial:Commissions   9.95 USD
  Income:US:ETrade:PnL        ;; -60.00 USD (profit)

或者你可以选择卖出最近购入的股票,从而实现亏损:

2014-03-18 * "Selling my most recent blue chips."
  Assets:US:ETrade:IBM          -4 IBM {180.00 USD} @ 175.00 USD
  Assets:US:ETrade:Cash          690.05 USD
  Expenses:Financial:Commissions   9.95 USD
  Income:US:ETrade:PnL        ;;  20.00 USD (loss)

或者你可以选择混合卖出:只需使用两个分录即可。

请注意,实际操作中这一选择取决于多种因素:

  • 你交易股票所在司法管辖区的税法可能已规定了记账方法,你可能实际上没有选择余地。例如,法律可能要求你必须出售最早购入的批次,这种方法称为“先进先出”(FIFO)。

  • 如果你有选择权,你所持有的不同批次可能因持有时间不同而具有不同的税务特征。例如,在美国,持有超过一年的头寸可享受较低的税率(即“长期”资本利得税率)。

  • 你可能还有其他收益或亏损,希望通过抵消来减少税务负债所需的现金流。这有时被称为“亏损实现 策略。”

还有更多……但我在这里不会详细展开。我的目标是向你展示如何使用复式记账法记录这些事项。

注明日期的批次

我们几乎已经完整呈现了其运作方式。还有一项较为技术性的细节需要补充,它始于一个问题:如果我以相同价格购买了多批股票怎么办?

正如我们在上一节中提到的,即使盈亏总额相同,你持有头寸的时间长短也可能影响税务处理。我们如何区分这些批次呢?

其实,我之前为了便于理解做了一点简化。当我们把头寸录入库存时,除了在标签上标注物品,还会记录该批次的购入日期(如果你提供了该信息)。这样记录买入头寸的方式如下:

2014-05-20 * "First trade"
  Assets:US:ETrade:IBM          5 IBM {180.00 USD, 2014-05-20}
  Assets:US:ETrade:Cash           -909.95 USD
  Expenses:Financial:Commissions     9.95 USD

2014-05-21 * "Second trade"
  Assets:US:ETrade:IBM          3 IBM {180.00 USD, 2014-05-21}
  Assets:US:ETrade:Cash           -549.95 USD
  Expenses:Financial:Commissions     9.95 USD

当你卖出时,也可以用同样的方式明确你要减少的是哪一批次的头寸:

2014-08-04 * "Selling off first trade"
  Assets:US:ETrade:IBM         -5 IBM {180.00 USD, 2014-05-20}
  Assets:US:ETrade:Cash            815.05 USD
  Expenses:Financial:Commissions     9.95 USD
  Income:US:ETrade:PnL

请注意,你的经纪商通常不会在网站提供的可下载 CSV 或 OFX 文件中包含这些批次信息……你很可能无法自动化处理这笔交易的批次细节,可能需要手动查阅经纪商提供的 PDF 交易确认书来录入这些信息(如果确实发生的话)。但你多久会遇到两次以相同价格买入的情况呢?我交易频率相对较高——大约每两周一次——但在八年数据中,我从未遇到过这种情况。实际上,除非你每天交易数千笔——而 Beancount 并非为高效处理此类活动而设计——否则这种情况几乎不会发生。

(技术细节:我们正在改进批次选择机制,使你无需手动输入批次日期,而是可以通过指定名称来区分批次。请关注即将发布的更新。)

报告未实现盈亏

好的,我们的账户余额现在记录了每单位的成本,这为我们提供了这些头寸的账面价值。很好。但如何查看市场价值呢?

头寸的市场价值就是这些工具的单位数量乘以我们关注时点的市场价格。这个价格是波动的,因此我们需要获取价格数据。

Beancount 支持一种名为price的条目类型,允许你指定某项工具在特定时间点的价格,例如:

2014-05-25 price IBM   182.27 USD

为了保持 Beancount 的简洁性并减少依赖,该软件不会自动获取这些价格(你可以使用 LedgerHub,或编写自己的脚本将最新价格插入输入文件——网上有许多库可用于从互联网获取价格)。它仅通过这些 price 条目了解市场价格,并基于这些条目构建一个内存中的历史价格数据库,从而可查询获取最新的价格值。

与其通过选项支持不同的报告模式,您可以通过启用插件来触发未实现收益的录入:

plugin "beancount.plugins.unrealized" "Unrealized"

这将在最后一个指令的日期创建一笔合成交易,以反映未实现的盈亏。其中一方记为收入,另一方记为资产变动:

2014-05-25 U "Unrealized gain for 7 units of IBM (price:
              182.2700 USD as of 2014-05-25, 
              average cost: 160.0000 USD)"
  Assets:US:ETrade:IBM:Unrealized          155.89 USD
  Income:US:ETrade:IBM:Unrealized         -155.89 USD

请注意,本例中我使用了一个选项来指定将未实现收益记入的子账户。未实现盈亏会在资产负债表中单独列出一行,而父账户的余额应显示其市场价值(包含其子账户的价值)。

佣金

到目前为止,我们尚未讨论交易佣金。根据适用于您的税法,交易相关的成本可能可以从我们之前示例中计算出的原始资本利得中扣除。政府将这些视为费用,通常允许您扣除这些交易佣金(这完全合理,毕竟您并未实际获得这笔资金)。

在上述示例中,资本利得和佣金支出分别记入两个不同的账户。例如,您最终可能得到如下所示的报告余额:

Income:US:ETrade:PnL                -645.02 USD
Expenses:Financial:Commissions        39.80 USD

(为明确起见,这表示盈利为 $645.02,支出为 $39.80。) 您可以将这两个数字相减,以近似计算不含成本的盈亏:645.02 - 39.80 = $605.22。然而,这仅是对正确盈亏值的近似。要理解原因,我们需要考察一个在报告期间部分卖出股份的示例。

假设我们有一个账户,每笔交易佣金为 $10。2013 年购入 100 股 ITOT,同年晚些时候卖出其中 40 股,剩余 60 股在次年卖出,情况如下:

2013-09-01 购入 100 股 ITOT,单价 $80,佣金 = 10$

2013-11-01 卖出 40 股 ITOT,单价 $82,佣金 = 10$

2014-02-01 卖出 60 股 ITOT,单价 $84,佣金 = 10$

如果您在 2013 年底计算已支付的佣金总额,将为 $20。按照前述近似方法,您在 2013 年和 2014 年申报的盈亏为:

2013 年:盈亏 = 40 × ($82 - $80) - ($10 + $10) = $60

2014 年:盈亏 = 60 × ($84 - $80) - $10 = $230

然而,严格来说,这是不正确的。购买 100 股时支付的 $10 佣金必须按卖出股数比例分摊。这意味着在首次卖出 40 股时,仅可扣除 $4 的佣金:$10 × (40 股 / 100 股),因此我们得到:

2013 年:盈亏 = 40 × ($82 - $80) - ($4 + $10) = $66

2014 年:盈亏 = 60 × ($84 - $80) - ($6 + $10) = $224

如您所见,各年度申报的盈亏金额不同,尽管两年盈亏总和相同($290)。

一种便捷的方法是将购入交易成本加到持仓的总账面价值中,从而自动按卖出股数比例分摊成本。在本例中,您可将 100 股的账面价值视为 $8010 而非 $8000:100 股 × $80/股 + $10,或等价地,认为每股账面价值为 $80.10。这将产生以下计算结果:

2013 年:盈亏 = 40 × ($82 - $80.10) - $10 = $66

2014 年:盈亏 = 60 × ($84 - $80.10) - $10 = $224

你甚至可以更进一步,将销售佣金直接计入每份股票的售价中:

2013 年:利润为 40 × ($81.75 - $80.10) = $66

2014 年:利润为 60 × ($83.8333 - $80.10) = $224

这可能看起来有些过度,但请想象这些成本要高得多,就像大型商业交易中的情况一样;这些细节对税务人员而言确实变得重要。准确的会计记录至关重要,我们需要开发一种更精确的方法来实现这一点。

我们目前的输入语法尚无良好的方法来处理这种情况。一个合适的方案正在开发中,相关提案已提出。详情请参阅邮件列表。[2014 年 6 月]

股票分割

目前,股票分割通过清空账户头寸并以不同价格重新创建头寸来处理:

2004-12-21 * "Autodesk stock splits"
  Assets:US:MSSB:ADSK          -100 ADSK {66.30 USD}
  Assets:US:MSSB:ADSK           200 ADSK {33.15 USD}

这些分录相互抵消,因此规则得以遵守。如你所见,这无需特殊的语法功能。它还能处理更通用的场景,例如 2014 年 4 月纳斯达克交易所发生的谷歌公司特殊分割,将其股票分为两类(投票股和非投票股,占比分别为 50.08%和 49.92%):

2014-04-07 * "Stock splits into voting and non-voting shares"
  Assets:US:MSSB:GOOG        -25 GOOG {1212.51   USD} ; Old GOOG
  Assets:US:MSSB:GOOG         25 GOOG { 605.2850 USD} ; New GOOG
  Assets:US:MSSB:GOOGL        25 GOOG { 607.2250 USD}

最终,或许应提供一个插件模块,以便更轻松地生成此类股票分割交易,因为当前方法存在一定的冗余。我们需要找出最通用的实现方式。但上述方法目前足以应对。

这种方法的一个问题是,交易批次的连续性被破坏了,即由于上述交易,每个批次的购买日期已被重置,从而无法自动确定交易的持续时间及其对税收的影响(即长期交易与短期交易)。即使不考虑这一点,利润仍能正确计算,但这仍是一个令人困扰的细节。

处理这一问题的一种方法是使用日期批次(参见本文档的相关章节)。这样,新批次仍可保留原始交易日期。这不仅能提供准确的时间信息,还能基于价格准确计算资本利得或损失。

另一种解决此问题并轻松传递批次交易日期的方法已被提出,未来将在 Beancount 中实现。

当前实现中一个更重要的问题是,ADSK 股票在分割前后的单位含义发生了变化。该商品单位的价格图将出现剧烈的不连续性!这是 Beancount 和 Ledger 均尚未解决的更普遍问题。商品定义变更文档中对此有相关讨论。

成本基础调整与资本返还

在管理型基金中,由于基金内部的交易活动,可能会发生成本基础的重新调整。这通常发生在免税账户中,因为此类调整产生的收益不影响税收,且成本基础按每项头寸中所有股票的平均成本计算。

如果我们需要调整特定批次的价格,可以采用与处理股票分割相同的方式进行记账:

2014-04-07 * "Cost basis adjustment for XSP"
  Assets:CA:RRSP:XSP           -100 ADSK {21.10 CAD}
  Assets:CA:RRSP:XSP            100 ADSK {23.40 CAD}
  Income:CA:RRSP:Gains      -230.00 CAD

然而,这种情况非常罕见。更常见的情况是账户使用平均成本记账法,而我们目前尚无处理此类情况的方法。目前已有一项活跃提案旨在实现这一功能。

成本基础调整通常出现在资本返还事件中。例如,当基金将资本返还给股东时,就会发生这种情况,这可能是由于业务清算所致。从税务角度来看,这些是非应税事件,会影响基金中股权的成本基础。持股数量可能保持不变,但其成本基础需要调整,以便在未来出售时计算潜在的收益/损失。

股息

股息本身并不构成特别的问题。它们只是收入。可以以现金形式接收:

2014-02-01 * "Cash dividends received from mutual fund RBF1005"
  Assets:Investments:Cash            171.02 CAD
  Income:Investments:Dividends

也可以以股票形式接收:

2014-02-01 * "Stock dividends received in shares"
  Assets:Investments:RBF1005          7.234 RBF1005 {23.64 CAD}
  Income:Investments:Dividends

在以股票形式接收股息的情况下,与股票购买一样,您需提供收到股息时的成本基础(此信息应在您的对账单中提供)。如果账户采用平均成本法,此记录将在需要执行平均成本记账时与其他条目合并。

平均成本记账

目前,以平均成本记账的唯一方法非常繁琐:您必须使用股票分割部分中所述的方法来重新评估您的库存。但这并不实用。目前有一个正在推进的提案,并附带了相应的语法,可彻底解决这一问题。

一旦该提案被实施,其效果将如下所示:

2014-02-01 * "Selling 5 shares at market price 550 USD"
  Assets:Investments:Stock               -5 GOOG {*}
  Assets:Investments:Cash           2740.05 USD
  Expenses:Commissions                 9.95 USD
  Income:Investments:CapitalGains

任何成本为“*”的记账操作作用于库存时,将选择该货币(GOOG)的所有股份,将其合并为一股,并以平均成本重新计价,然后按此新的平均成本减少该头寸。

未来主题

我将在后续处理以下主题:

  • 市值重估:通过重新评估成本基础,处理第 1256 条工具(即期货和期权)的年末市值重估。这类似于每年末对所有此类工具进行的成本基础调整。

  • 卖空:这只需要少量改动。我们只需允许以成本计价的持仓数量为负数。目前,当以成本计价的持仓变为负数时,系统会发出警告以检测数据输入错误,但扩展 Open 指令语法以允许在特定可进行卖空的账户中出现负数持仓是很容易的,这将仅显示为负股数。其他所有算术运算应能自然进行。保证金利息将以独立交易形式体现。此外,当您卖空股票时,您不会收到这些头寸的股息,反而需要支付股息。为此应设置一个费用账户,例如:Expenses:StockLoans:Dividends

  • 交易期权:目前我还不知道如何处理,但我认为这些期权可以像股票一样持有,无需区分。我预计不会遇到任何困难。
  • 货币交易:目前,我仅记录了我的外汇账户的盈亏和利息支付,而未核算其持仓情况。这带来了一些有趣的问题:

    • 外汇账户中的头寸并非像股票那样仅分为多头或空头:实际上,它们同时是对两种商品的对冲。例如,做多 USD/CAD 意味着同时增加美元的敞口并减少加元的敞口,可以理解为同时持有一个美元的多头资产和一个加元的空头资产。虽然可以将这些头寸视为独立的工具(例如,将“USDCAD”视为一个整体单位,忽略其组成部分),但对于大额头寸,尤其是长期持有以对冲为目的的情况,必须处理这一问题,并以某种方式让用户反映其多个货币头寸相对于其他资产和负债的净货币敞口。

    • 我们还需要处理这些头寸平仓所产生的收益:这些收益在兑换为账户货币后,会以账户货币形式体现。例如,如果你持有以美元计价的货币账户,并做多 EUR/JPY,当你平仓时,你将获得欧元收益,随后通过 EUR/USD 汇率将盈亏从欧元兑换为等值美元,该美元收益将存入你的账户。这意味着,估算任何头寸当前市场价值时使用了两个汇率:当前汇率与买入时汇率之间的差额,以及账户货币(如美元)中基础货币(如欧元)的汇率。

其中一些涉及 Beancount 的新功能,另一些则不涉及。欢迎提出建议。


  1. 然而,这是一种误导性的观念。事实上,并不存在一个确切的价格,只有市场能给你一个“暗示”,告诉你别人可能愿意以何种价格与你交换你的股票(针对不同买入或卖出数量,且仅限于有限数量,我们称之为“市场”)。但在你实际完成卖出股票之前,你无法确切知道交易能以什么价格执行,只能获得一个估算值。如果你对交易不熟悉,这一点应引起你的深思,并可能让你恍然大悟——世界上其实并不存在任何事物的“固定价格”。不过,为便于本讨论,我们暂且忽略这一点,假设你可以随时在市场中以中间价(例如Google FinanceYahoo Finance或你的经纪商所报告的价格)即时买入或卖出任意数量的股票。我们称这种假设“每股 170 美元可卖出”的过程为“估值”(marking),即在合理假设下,我们认为确实能以该价格实际卖出这些股票(专业术语“按市价估值”指我们使用市场价格作为我们所能实现交易的最佳参考依据)。对于个人投资者而言,若交易规模较小、不影响市场,且经纪商诚实可靠,这一假设在实践中基本成立。

  2. 顺便一提,将普通货币存入账户只是带有空标签事物的特例。这是一种在实践中运行良好的实现细节。