简介

本文档是《命令行会计食谱》的配套文档,专门介绍了 Beancount 中的交易和投资主题。在阅读本文档之前,你可能应该先读过复式记账法的介绍。

说到股票交易这个话题,需要先讨论一下“盈亏”,也叫资本收益或损失,简称 P/L。对于新手来说,P/L 这个概念对多次交易的盈亏的概念是很难理解的,我甚至看到过专业的交易员在不同的时间段内对 P/L 的理解有所不同。这一点是值得花时间来解释的,而且有必要了解如何在复式记账系统中对交易进行预定。

本讨论将结合如何在 Beancount 中预订这些交易的详细示例进行讨论。有一个相关的、积极的改进 Beancount 预订方法的建议,您可能也会感兴趣。这里不讨论递延税项的基础,而是在更一般的食谱中讨论。

什么是盈亏?

假设你在 E*Trade 折扣经纪公司有一个账户,你买了一些公司的股票,比如说 IBM。如果你买入 10 股 IBM 公司的股票,当它的价格是每股 160 美元时,你将花费 1600 美元。这个价值就是我们所说的 “账面价值”,或者说是 “成本”。这就是你得花多少钱才能买到的股票,也叫 “仓位”。这就是你在 Beancount 中输入这个交易的方式。

  1. #+BEGIN_SRC beancount
  2. 2014-02-16 * "Buying some IBM"
  3. Assets:US:ETrade:IBM 10 IBM {160.00 USD}
  4. Assets:US:ETrade:Cash -1600.00 USD
  5. #+END_SRC

在实际操作中,你可能会向 E*Trade 支付一定的佣金来做这项服务,所以为了完整,我们把这一点放进去。

  1. #+BEGIN_SRC beancount
  2. 2014-02-16 * "Buying some IBM"
  3. Assets:US:ETrade:IBM 10 IBM {160.00 USD}
  4. Assets:US:ETrade:Cash -1609.95 USD
  5. Expenses:Financial:Commissions 9.95 USD
  6. #+END_SRC

这样就可以告诉 Beancount “按成本价”存入一些单位,在本例中,”IBM 以每股 160 美元的成本价”存入单位。这笔交易之所以能够平衡,因为它的分支总和为 0。10 x 160 + -1609.95 + 9.95 = 0。另外要注意的是,我们选择使用一个专门用于 IBM 的股票的子账户;这并不是严格意义上的必要,但在资产负债表中报告时很方便,因为它将自然而然地将你的每一个仓位的所有股票汇总到自己的线上。拥有一个 “现金 “子账户也强调了你在那里的未投资资金不会提供任何回报。

第二天开盘,IBM 的股价为每股 170 美元。在这种情况下,我们将称之为”价格”,你的仓位的”市值”,也就是你的股票的数量 × 市价,即 10 股 × 每股 170 美元 = 1700 美元。

这两个数额之间的区别,就是我们所说的 P/L。

市值 - 账面价值 = P/L

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

我们将把正数称为 “利润”,如果是负数,则称为 “亏损”。

已实现和未实现的 P/L

前一节的利润称为”未实现利润”。那是因为这些股票还没有实际卖出——这是个假设的利润:如果我能按市值卖出这些股票,这就是我能拿到的钱。我在上一节提到的 100 美元实际上是 “未实现的 P/L”。

那么,假设你喜欢这种未实现的利润,你觉得 IBM 涨价是暂时的运气。你决定将这 10 股中的 3 股以每股 170 美元的价格卖给市场。这些股票的利润现在就可以”变现”了。

市值-账面价值=P/L

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

这30美元是一个”变现的P/L”。你的仓位的剩余部分仍显示为未实现利润,也就是说,在你卖出之前,价格可能会波动得更厉害。

市场价值-账面价值=P/L

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

这就是你将如何预订你在Beancount的仓位的销售(同样包括佣金)。

  1. #+BEGIN_SRC beancount
  2. 2014-02-17 * "Selling some IBM"
  3. Assets:US:ETrade:IBM -3 IBM {160.00 USD}
  4. Assets:US:ETrade:Cash 500.05 USD
  5. Expenses:Financial:Commissions 9.95 USD
  6. #+END_SRC

你注意到这里发生了什么有趣的事情吗? -3×160=-480,-480+500.05+9.95=30………..这笔交易并没有平衡到零!问题是我们卖出的3只股票换取了510美元现金。这是因为我们卖出时的实际价格是170美元:3×170=510美元。这就是我们需要核算利润的地方,通过增加另一段,将吸收这部分利润,并方便地自动计算和跟踪我们的利润。

  1. #+BEGIN_SRC beancount
  2. 2014-02-17 * "Selling some IBM"
  3. Assets:US:ETrade:IBM -3 IBM {160.00 USD}
  4. Assets:US:ETrade:Cash 500.05 USD
  5. Expenses:Financial:Commissions 9.95 USD
  6. Income:US:ETrade:PnL
  7. #+END_SRC

最后一个段会被Beancount自动填成-30美元,因为我们一次过帐而没有金额(记住,在没有信用卡和借方的复式记账系统中,”收入”账户的利润是负数)。这个数字是政府对你的税款的关注点。

综上所述,你现在有:

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

已实现的市盈率为30美元

未实现的市盈率为70美元

现在说到这里,有人会上蹿下跳地说:”但是,等等,等一下! 我卖每股170美元,不是每股160美元,为什么要把160美元放在这里?” 答案是你没有以每股170美元的价格出售股票。为了解释这个问题,我需要绕一点弯路来解释一下我们如何记账的事情……

那么,我们是如何记账的呢?

其实很简单:当Beancount在账户中存储东西的时候,我们会使用一种叫做 “库存 “的东西。想象一下,一个 “库存 “就是一个写着该账户名称的袋子。每个账户都有一个这样的袋子,用来装着这个账户在某一特定时间点上的东西,也就是这个账户当时的 “余额”。想象一下,它所装的东西上都贴着一个小标签,上面写着它们的成本,也就是购买这些东西所付出的代价。每当你把一个东西放进袋子里,就给这个东西贴上一个新的标签。要想让事情顺利进行,所有的东西都需要贴上标签。在我们的例子中,袋子里有10个东西”以每股160美元的价格买入了IBM的股票”。我们把IBM放在账户中的语法看起来有点误导;我们写道:

  1. #+BEGIN_SRC beancount
  2. Assets:US:ETrade:IBM 10 IBM {160.00 USD}
  3. #+END_SRC

但实际上,这一点被Beancount理解为更接近下面的语法:

  1. #+BEGIN_SRC beancount
  2. Assets:US:ETrade:IBM 10 {IBM 160.00 USD}
  3. #+END_SRC

但是……写这个会很烦人,所以我们用了一个对人类更直观的语法。

所以问题是,你不能减去{IBM的单位,170. 00美元}….. 因为那个袋子里根本就没有。袋子里有的是{IBM的单位,价格是160. 00美元}。你只能把这些拿出来。

现在说了这么多,你看出来了吧,我们换股票的金额是如何真正帮助我们跟踪P/L的?我们实际上没有任何地方需要说明我们卖出股票的价格。事实上,我们收到了一定数量的现金,而这些现金与我们卖出的头寸的成本不同,这才导致了不平衡,我们将其记为资本收益。

嗯…… Beancount维护着一个价格数据库,如果能把价格记录下来并附加到交易中,不是很好吗?的确是这样,Beancount允许你将价格附加到那个帖子中,但为了平衡交易,它完全忽略了它。它的存在主要是为了做文档,如果你写脚本的话,你可以用它。而如果你使用了beancount.plugins.implicit_prices插件,它就会自动合成一个价格条目,用来丰富我们的历史价格数据库,可以用来报告账户内容的市场价值(具体细节如下)。

因此,卖出这些股票的完整和最终交易应该是:

  1. #+BEGIN_SRC beancount
  2. 2014-02-17 * "Selling some IBM"
  3. Assets:US:ETrade:IBM -3 IBM {160.00 USD} @ 170.00 USD
  4. Assets:US:ETrade:Cash 500.05 USD
  5. Expenses:Financial:Commissions 9.95 USD
  6. Income:US:ETrade:PnL
  7. #+END_SRC

交易手数

实际上,交易的实际情况比这更复杂一点。你可能多次买入一些IBM,而每次你可能以不同的价格买入。让我们用另一个交易的例子来看看这是如何运作的。鉴于你之前以160 美元的成本价持有7股,第二天你看到价格又涨了一些,你改变了对IBM的看法,决定”做多”,再买入5股。这次你得到的价格是每股180 美元:

  1. #+BEGIN_SRC beancount
  2. 2014-02-18 * "I put my chips on big blue!"
  3. Assets:US:ETrade:IBM 5 IBM {180.00 USD}
  4. Assets:US:ETrade:Cash -909.95 USD
  5. Expenses:Financial:Commissions 9.95 USD
  6. #+END_SRC

现在 Assets:US:Etrade:IBM 都有哪些呢?我们有两样东西:

  • 从第一笔交易中我们持有 7 股 IBM,每股 160 美元
  • 从第二笔交易中我们持有 5 股 IBM,每股 180 美元 我们称这些为“手数”或“交易手数”。

事实上,如果你要卖出这整个仓位,比如说一个月后,在Beancount中合法卖出的方式(也就是不出错的情况下),是通过指定两次过帐的方式。比如说当时的价格是每股172美元。

  1. #+BEGIN_SRC beancount
  2. 2014-03-18 * "Selling all my blue chips."
  3. Assets:US:ETrade:IBM -7 IBM {160.00 USD} @ 172.00 USD
  4. Assets:US:ETrade:IBM -5 IBM {180.00 USD}
  5. Assets:US:ETrade:Cash 2054.05 USD
  6. Expenses:Financial:Commissions 9.95 USD
  7. Income:US:ETrade:PnL
  8. #+END_SRC

现在,你的IBM的最终仓位将是0股。

  1. #+BEGIN_SRC beancount
  2. 2014-03-18 * "Selling all my blue chips."
  3. Assets:US:ETrade:IBM -12 IBM {} @ 172.00 USD
  4. Assets:US:ETrade:Cash 2054.05 USD
  5. Expenses:Financial:Commissions 9.95 USD
  6. Income:US:ETrade:PnL
  7. #+END_SRC

需要注意的是,如果股份总数与所有的手数不匹配的话是不可行的(这将是模糊的………..应该选择哪个子集的手数并不明显)。

预订方法

但是,如果你决定只卖掉其中的一部分股票怎么办?假设你需要一些现金来买礼物送给你的爱人,你这次想卖出4股。假设现在的价格是每股175美元。

```dart现在你有一个选择。 你可以选择卖出老股,实现更大的利润:

+BEGIN_SRC beancount

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)

+END_SRC

  1. ```dart或者你可以选择卖掉最近收购的,实现亏损:
  2. #+BEGIN_SRC beancount
  3. 2014-03-18 * "Selling my most recent blue chips."
  4. Assets:US:ETrade:IBM -4 IBM {180.00 USD} @ 175.00 USD
  5. Assets:US:ETrade:Cash 690.05 USD
  6. Expenses:Financial:Commissions 9.95 USD
  7. Income:US:ETrade:PnL ;; 20.00 USD (loss)
  8. #+END_SRC

或者你可以选择混合销售:用两次过帐就可以了。

需要注意的是,在实践中,这种选择将取决于多种因素:

  • 你交易股票所在的司法管辖区的税法可能会对如何记账的方法有明确的规定,而你实际上可能没有选择的余地。例如,他们可能会规定,你必须交易你买的最老的那一批,这种方法叫做 “先进先出”。
  • 如果你可以选择,你所持有的不同地段可能因为持有时间不同而有不同的税收特点。例如,在美国持有一年以上的仓位可以享受较低的税率(”长期”资本利得税率)。
  • 你可能有其他的收益或损失,你可能想抵消,以尽量减少你的现金流对你的税负的要求。这有时被称为 “税收损失收割”。 还有更多………..但我在这里就不细说了。我的目的是告诉你如何用复式记账法来预订这些东西。

过期的手数

我们几乎已经完成了这一切的全貌。还有一个比较有技术含量的细节要补充,这要从一个问题说起:如果我以同样的价格买入多手股票怎么办?

正如我们在上一节中所提到的,你持仓的时间长短可能会对你的税收产生影响,即使最终的盈亏平衡点是一样的。那我们如何区分这些手数呢?

嗯………..我之前把事情简化了一下,只是为了让大家更容易理解。当我们把头寸放在库存中时,在我们把东西贴上的标签上,如果你提供的是库存,我们也会标注出该批货的购买日期,你就可以这样记入仓位:

  1. #+BEGIN_SRC beancount
  2. 2014-05-20 * "First trade"
  3. Assets:US:ETrade:IBM 5 IBM {180.00 USD, 2014-05-20}
  4. Assets:US:ETrade:Cash -909.95 USD
  5. Expenses:Financial:Commissions 9.95 USD
  6. 2014-05-21 * "Second trade"
  7. Assets:US:ETrade:IBM 3 IBM {180.00 USD, 2014-05-21}
  8. Assets:US:ETrade:Cash -549.95 USD
  9. Expenses:Financial:Commissions 9.95 USD
  10. #+END_SRC
  1. #+BEGIN_SRC beancount
  2. 2014-08-04 * "Selling off first trade"
  3. Assets:US:ETrade:IBM -5 IBM {180.00 USD, 2014-05-20}
  4. Assets:US:ETrade:Cash 815.05 USD
  5. Expenses:Financial:Commissions 9.95 USD
  6. Income:US:ETrade:PnL
  7. #+END_SRC

请注意,您的经纪商不太可能在他们的网站上提供可下载的CSV或OFX文件中的信息,您可能无法自动处理这个交易的手数细节。您可能需要在您的经纪商提供的PDF交易确认书中手动输入这些信息,如果你有的话。但是,多久你会以以相同的价格买入两手?我的交易比较频繁,大约每两周一次。在8年的数据中,我没有出现过一次这样的情况。实际上,除非您每天进行数千次交易,而Beancount并不是为处理这种活动而设计的,至少不是以最有效的方式,否则这种情况不会经常发生。 (技术细节:我们正在努力改进手数选择机制,这样你就不必自己插入手数日期,而且你可以通过提供一个名称来消除手数选择的歧义。请看将来的修改。)

报告未实现的 P/L

好吧,所以我们的账户余额持有的是每个单位的成本,这为我们提供了这些仓位的账面价值,很好。但是,如何看待市场价值呢? 仓位的市场价值就是这些持有的单位数量×我们感兴趣的时候的市场价格。这个价格是会波动的。所以我们需要的是价格。

  1. #+BEGIN_SRC beancount
  2. 2014-05-25 price IBM 182.27 USD
  3. #+END_SRC

为了保持Beancount的简单和减少依赖性,软件不会自动获取这些价格(你可以查看LedgerHub,或者自己编写脚本,如果需要的话,可以在输入文件中插入最新的价格………..网上有很多库可以从网上获取价格)。它只知道所有这些价格输入中的市场价格。使用这些,它可以建立一个内存中的历史价格数据库,并可以查询到最新的价格。

  1. #+BEGIN_SRC beancount
  2. plugin "beancount.plugins.unrealized" "Unrealized"
  3. #+END_SRC

```dart这将在最后一个指令的日期创建一个合成交易,反映未实现的 P/L。它将一方记为收入,另一方记为资产变动。

+BEGIN_SRC beancount

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

+END_SRC

  1. 请注意,我在这个例子中使用了一个选项来指定一个子账户,将未实现的收益记入子账户。未实现的损益在资产负债表中的单独一行显示,母账户应在其余额中显示市场价值(包括其子账户的市场价值)。
  2. # 佣金
  3. 到目前为止,我们还没有讨论过交易佣金。根据适用于你的税法,与交易相关的费用可以从原始资本收益中扣除,因为我们在前面的例子中已经计算过了。这些费用被政府认为是支出,通常情况下,你可以扣除这些交易佣金(从他们的方面来看完全合理,毕竟你没有把钱放在口袋里)。
  4. ```dart在上面的例子中,资本收益和佣金支出被追踪到两个独立的账户。举例来说,您最终可能会有这样的报告余额:
  5. #+BEGIN_SRC beancount
  6. Income:US:ETrade:PnL -645.02 USD
  7. Expenses:Financial:Commissions 39.80 USD
  8. #+END_SRC

(为了明确,这应理解为利润645.02美元,支出39.80美元)。你可以把这些数字减去,就可以得到一个不含成本的 P/L 的近似值。645.02 - 39.80 = $605.22. 然而,这只是正确的 P/L 的近似值。要了解原因,我们需要看一个例子,即在报告期内卖出部分股票。 设想一下,我们有一个账户,每笔交易的佣金为10美元,2013年买入100股ITOT股票,其中40股后来在同年卖出,剩下的60股在次年卖出,情况是这样的:

+BEGIN_EXAMPLE

2013-09-01 Buy 100 ITOT at $80, commission = 10$ 2013-11-01 Sell 40 ITOT at $82, commission = 10$ 2014-02-01 Sell 60 ITOT at $84, commission = 10$

+END_EXAMPLE

如果你计算出2013年年底支付的佣金总额,你将有20美元,用前面提到的近似方法,那么2013年和2014年你将申报:

+BEGIN_EXAMPLE

2013: P/L of 40 x ($82 - $80) - ($10 + $10) = $60 2014: P/L of 60 x ($84 - $80) - $10 = $230

+END_EXAMPLE

但是严格来说,这是不正确的。购买这100股股票时支付的10元佣金,必须根据出售股票的数量按比例计算。这意味着,在第一次卖出40股时,只有4美元的佣金可以扣除:10美元×(40股/100股),因此我们得到:

+BEGIN_EXAMPLE

2013: P/L of 40 x ($82 - $80) - $(4 + 10) = $66 2014: P/L of 60 x ($84 - $80) - $(6 + 10) = $224

+END_EXAMPLE

正如你所看到的那样,每年申报的 P/L 是不一样的,即使两个年度的 P/L 之和是一样的(290美元)。

一个方便的方法是将购入成本自动分配到卖出股票数量的比例价值中,将购入交易成本加到持仓的总账面价值中。在这个例子中,你会说100股的仓位的账面价值为8010美元,而不是8000美元:100股×80美元/股+10美元,或者等价地说,每只股票的账面价值为80.10美元。这将产生以下计算结果:

+BEGIN_EXAMPLE

2013: P/L of 40 x ($82 - $80.10) - $10 = $66 2014: P/L of 60 x ($84 - $80.10) - $10 = $224

+END_EXAMPLE

你甚至可以再往前走一步,将销售佣金折算成每份股票的价格。

+BEGIN_EXAMPLE

2013: P/L of 40 x ($81.75 - $80.10) = $66 2014: P/L of 60 x ($83.8333 - $80.10) = $224

+END_EXAMPLE

这似乎有些矫枉过正,但试想一下,这些费用要高得多,大型商业交易的情况就是如此;细节确实开始对税务人员来说很重要。准确的核算很重要,我们需要制定一种方法来更准确地进行核算。

+BEGIN_QUOTE

我们目前还没有一个好的方法,用我们的输入语法来做这件事。目前,我们正在开发一种合适的方法,并提出了一个建议。详情请参见邮件列表。[2014年6月]

+END_QUOTE

股票拆分

  1. #+BEGIN_SRC beancount
  2. 2004-12-21 * Autodesk stock splits
  3. Assets:US:MSSB:ADSK -100 ADSK {66.30 USD}
  4. Assets:US:MSSB:ADSK 200 ADSK {33.15 USD}
  5. #+END_SRC

过帐之间相互平衡,所以遵守了这个规则。可以看到,这不需要特殊的语法功能。它还可以处理更一般的情况,比如2014年4月在纳斯达克交易所发生的谷歌公司的奇数分裂,分成两类不同的股票(有投票权的和无投票权的股票,分别为50.0

  1. #+BEGIN_SRC beancount
  2. 2014-04-07 * Stock splits into voting and non-voting shares
  3. Assets:US:MSSB:GOOG -25 GOOG {1212.51 USD} ; Old GOOG
  4. Assets:US:MSSB:GOOG 25 GOOG { 605.2850 USD} ; New GOOG
  5. Assets:US:MSSB:GOOGL 25 GOOG { 607.2250 USD}
  6. #+END_SRC

最终,也许应该提供一个插件模块,以便更方便地创建这种股票拆分交易,因为涉及到一定程度的冗余。我们需要想出一个最通用的方法来做这件事。但以上的方法暂时还可以。

这种方法的一个问题是失去了交易手数的连续性,也就是说,由于上述交易的结果,每个手数的购买日期现在已经被重置了,因此无法自动计算出交易的持续时间及其对税收的影响,即长期交易与短期交易的相关影响。即使没有这一点,利润的计算仍然是正确的,但这是一个令人讨厌的细节。

处理这个问题的一个方法是使用 “日期批次”(见本文档的相应章节)。这样一来,原始交易日期可以在新的手数上保留下来。这样,除了根据价格提供准确的时间信息外,还可以提供准确的资本损益信息。

另一个解决这个问题的方法,也是很容易传播交易日期的方法,这个方法已经被提出来,并将在以后的Beancount中实现。

目前的实现还有一个更重要的问题,就是股票分割前后的ADSK单位的含义不同。这个商品单位的价格图会呈现出根本性的不连续! 这是一个比较普遍的问题,在Beancount和Ledger中都还没有解决。在商品定义修改文档中,有关于这个问题的讨论。

成本基数调整和资本回报率

由于基金的内部交易活动,管理型基金可能会对成本基础进行重新调整。这种情况通常发生在避税账户中,因为这种调整所产生的收益对税收没有影响,而且成本基础是按每个头寸中所有股票的平均成本持有。

  1. #+BEGIN_SRC beancount
  2. 2014-04-07 * Cost basis adjustment for XSP
  3. Assets:CA:RRSP:XSP -100 ADSK {21.10 CAD}
  4. Assets:CA:RRSP:XSP 100 ADSK {23.40 CAD}
  5. Income:CA:RRSP:Gains -230.00 CAD
  6. #+END_SRC

不过,这种情况确实不常见。比较常见的情况是使用平均成本预订法的账户,我们目前没有办法处理这种情况。目前有一个积极的建议,就是要把这种情况变成可能。 成本基数调整常见于资本回报事件中。比如说,在基金向股东返还资本时就会出现这种情况。这可能是由清盘造成的。从税收的角度来看,这些都是不征税的事件,会影响到基金股权的成本基础。股票的数量可能会保持不变,但其成本基础需要在未来的卖出时点进行调整,以应对潜在的收益/亏损计算。

红利

  1. #+BEGIN_SRC beancount
  2. 2014-02-01 * Cash dividends received from mutual fund RBF1005
  3. Assets:Investments:Cash 171.02 CAD
  4. Income:Investments:Dividends
  5. #+END_SRC
  1. #+BEGIN_SRC beancount
  2. 2014-02-01 * Stock dividends received in shares
  3. Assets:Investments:RBF1005 7.234 RBF1005 {23.64 CAD}
  4. Income:Investments:Dividends
  5. #+END_SRC

如果是以股票形式收到的股利,如同购买股票一样,你要提供收到股利的成本基础(在你的报表中应该可以找到)。如果该账户是按平均成本持有的,则在需要进行平均成本预订时,该账目将与其他账目合并。

平均预订成本

目前,以平均成本进行预订的唯一方法是痛苦的:你将不得不使用库存拆分部分概述的方法来重估你的库存。然而,这是不切实际的。现在有一个积极的提案和相关的语法来完全解决这个问题。

  1. #+BEGIN_SRC beancount
  2. 2014-02-01 * Selling 5 shares at market price 550 USD
  3. Assets:Investments:Stock -5 GOOG {*}
  4. Assets:Investments:Cash 2740.05 USD
  5. Expenses:Commissions 9.95 USD
  6. Income:Investments:CapitalGains
  7. #+END_SRC

任何以”*”的成本作用于库存的过账,都会选择该货币(GOOG)的所有股票,以平均成本将其合并为一个,然后以这个新的平均成本减仓。

未来的主题

下面的题目我稍后会处理。

  • 按价值计价。通过重新评估成本基础,处理第1256节工具(即期货和期权)的年终按市价计价。这类似于在每年年底对所有这些类型的工具进行成本基础的重新调整。
  • 卖空:这些需要的变化不大。我们只需要允许以成本价持有的单位为负数即可。目前,当以成本价持有的单位为负数时,我们会发出警告,以检测数据输入错误,但很容易扩展到Open指令语法,允许在特定账户上出现这种情况,这些账户可以持有卖空,而卖空的股票应该显示为负数。否则,所有的算术应该会自然而然地工作。保证金的利息支付将作为不同的交易显示出来。另外,当你做空股票时,你不会因为这些仓位而获得股息,而是必须支付给他们。你会为此建立一个支出账户,例如,Expenses:StockLoans:Dividends。
  • 交易期权。我目前不知道怎么做,但我想象这些可以像持有股票一样,不加区分地持有。我预计不会有什么困难。
  • 货币交易。目前,我的外汇账户中的头寸并没有核算,只是核算它们的盈亏和利息支付。这带来了一些有趣的问题。
    • 在外汇账户中持有的头寸并不像股票那样仅仅是多头或空头:它们实际上是同时对冲两种商品。例如,美元/加元的多头仓位应该增加美元的风险敞口,减少加元的风险敞口,可以看作是同时持有美元的多头资产和加元的空头资产。虽然可以把这些头寸当作不同的工具来持有(例如,以 “美元/加元 “为单位,不考虑其组成部分),但对于大额头寸,特别是长期持有的美元/加元,如果是为了套期保值的目的,必须处理好这一点,并以某种方式让用户能够反映出多种货币头寸的净货币风险与其他资产和负债的对比。
    • 我们还需要处理这些头寸平仓所产生的收益:这些头寸在转换为该货币后,会产生以账户货币为单位的收益。例如,如果你持有一个以美元计价的货币账户,你去做多欧元/日元,当你平仓时,你将获得欧元的收益,而在将欧元的P/L兑换成等值的美元后(通过欧元/美元),美元的收益将存入你的账户。这意味着,任何头寸的当前市场价值都是用两种汇率来估算的:一是当前汇率与买入时的汇率之间的差额,二是账户货币(如欧元)中基础货币(如美元)的汇率。

其中有些涉及Beancount的新功能,但有些不涉及。欢迎大家提出意见。