# 多货币

本章会介绍怎样配置&app;科目管理多种货币。

## 基本概念

GnuCash支持从安道尔法郎到津巴布韦元在内的100多种货币。例如，您可以使用欧元建立一个银行科目，而使用港元建立另一个银行科目。

管理多种货币时，你的脑海中或许会浮现出一些疑问：

- 怎样在使用不同货币的科目之间转账？

- 怎样计算使用不同货币的科目的总金额？

- 怎样浏览包含不同货币的报表？

你既可以按currency_manual所述，手动录入交易记录多种货币的兑汇损益；也可以按随后的章节所述，利用&app;在2.3.14版本中引入的外币贸易科目自动记录兑汇损益。&app;的贸易科目功能默认不启用，必须按currency_trading_accts手动启用。

## 手动记录外币交易

### 建立科目

本位币由 编辑首选项 (&mac;中为 &appname;首选项 )下的科目标签页设定。

类似地，&app;也提供选项设置用于展示报表的首选货币，称为默认报表货币，位于&appname;首选项窗口中的报表标签页下。建议开始使用&app;时就将这两个选项都设置好，例如假设科目均以港元记账，而生成的报表都显示为人民币，报表就会提示所选时段内没有交易数据或交易金额为零。

创建新科目时，可以选择用作科目记账单位的商品。可以为以货币为单位的科目指定任何&app;支持的货币，只需在货币商品列表中选择需要的货币。默认选中的货币为该新建科目的父科目使用的货币。

例如，现在创建一套银行科目，你大多使用人民币记账，但也拥有使用欧元的欧洲银行账户，以及使用港元的香港银行账户。因此需要建立 三个银行科目，一个科目单位为人民币，一个为欧元，而第三个为港元。一种适用此情况的科目结构可以是：

    -资产 (CNY)
       -流动资产 (CNY)
          -中国银行 (CNY)
          -欧洲银行 (EUR)
          -香港银行 (HKD)
    -所有者权益 (CNY)
       -期初余额 (CNY)
          -人民币 (CNY)
          -欧元 (EUR)
          -港元 (HKD)

每个科目使用的货币标注在括号里。

由于这个示例中大多使用人民币记账，所以父科目均设为人民币（CNY）。自然，你如果大多使用欧元记账，则可将这些父科目的货币更换为欧元。在科目树窗口中显示的总额都会换算为相应科目的货币。注意，这里也建立了三个期初余额所有者权益科目，用于向三个银行科目添加初始金额。

也可以只建立一个期初余额科目，再通过跨货币转账向使用不同货币的科目添加初始交易，然而这是更进阶的做法，后文currency_purchase2会详细介绍。

下面展示了按该示例得到的结果。你在三个银行科目中最初各有10,000元人民币、10,000欧元，以及10,000港元。注意，父科目总金额只包含与之货币相同的子科目金额。换句话说，资产总额和所有者权益总额只体现人民币金额，因为&app;目前还无法换算欧元或港元的金额。一旦设定了货币间的汇率，父科目就会换算出所有子科目的金额。具体操作方法见后文currency_howto1。

#### 最初建立的多货币银行科目

最初建立的三个银行科目，货币各不相同。

注意此处显示了合计(CNY)列，可以在表头点击下箭头并勾选合计(CNY)。

#### 自定义货币

我们谈到货币的时候，通常是指由政府提供信用担保的通货，或者更准确地说，是ISO 4217中定义的货币。&app;不允许你创建自己的货币。要记录非ISO货币，有两种变通方法可供使用，你可以选择更符合需求的一种。

#### 自定义货币的变通方法

假设你想跟踪在某一企业集团购物时获得的会员积点。记录会员积点的科目为资产:其它:会员积点

1. 将会员积分视为证券——就像股票或基金一样。

   在这种变通方法中，要定义一种新的证券，类型为基金，叫做会员积点。思路很简单：创建新的会员积点科目时，只需将科目类型设为股票或基金，点击证券/货币:输入框旁的选择...按钮，再点击新建，添加一种类型为基金的新证券。

   这其实不是股票和基金科目类型的本意，但&app;还是允许这样做。缺点是每项涉及该科目的交易都需要输入价格，因为&app;需要价格信息算出积点的货币价值，即将这些积点视为资产的一部分。

2. 使用一种伪货币记录会员积点。

   在这种变通方法中，你使用一种伪货币记录会员积点。这些货币是XTS (测试用代码)和XXX (无货币)。如果将其中一种用于会员积点科目，则当向科目录入交易时无需每次都输入份额价格。另外，可以一直使用这两种伪货币跟踪各种数量，目前本年已获得和已使用的的休假津贴、已获得和已使用的年假时长、已用和剩余的医疗保险额度，诸如此类。

   这种变通方法的缺点在于你无法定义伪货币的汇率，以将之换算为ISO货币。如果想实现这一功能，就应该使用第一种变通方法。

### 记录并更新货币汇率

你可以在&app;中更新货币汇率，手动或自动皆可，操作上与设定投资份额价格（详见invest-stockprice1）几乎相同。下面两小节会分别介绍两种方法。

开始前，先简单看一下科目表。

#### 最初建立的多货币银行科目

最初建立的三个银行科目，使用的货币各不相同。

如图所示，总余额没有反映目前持有的欧元或港元的价值。添加货币汇率会解决这个问题。

#### 手动更新汇率

点击 工具价格数据库 打开价格数据库。

##### 价格数据库窗口目前仍然为空

点击添加按钮添加一条新的货币汇率记录。可以在弹出的窗口中设定新汇率，如下图所示：

##### 设定欧元汇率

添加价格记录窗口

将命名空间设为货币，证券设为EUR (欧元)。然后设定选择的“证券”与选择的“货币”之间的汇率。在价格输入框设定购买一个单位的外币需花费多少个单位的本币。在这个情况下，就是指多少元人民币能够买入1欧元。在本例中，将汇率设为1欧元兑7.8元人民币。 Then set the exchange rate between the selected security and the selected currency. The Price box defines how many units of currency are required to purchase one unit of the security. In this case, how many dollars it will take to purchase on 1 Euro. In this example, you will set the exchange rate to 1 EUR for 1 USD.

##### 设定欧元与人民币汇率后的价格数据库窗口

##### 设定欧元与人民币汇率后的科目表

注意到由于没有录入港元汇率，&app;不会将港元科目余额换算为人民币。下一节会添加港元汇率。

#### 自动更新汇率

上一节介绍了怎样手动添加新的货币汇率，但&app;也具备自动更新报价的功能，下面进行介绍。

点击 工具价格数据库 打开价格数据库。

##### 获取在线报价前的价格数据库

点击获取报价按钮即可自动加载需要的多项汇率数据。

如果获取报价按钮不可用，则表明尚未安装 Perl模块 &app-fq;。 有关如何安装该模块的信息参见 invest-stockprice-auto2。

##### 获取在线报价后的价格数据库

每次点击获取报价或如invest-stockprice-auto2所述配置&app;按要求下载报价的时候，&app;就会下载各科目使用的所有货币的汇率数据。

现在查看主科目表，可以看到&app;已经自动将港元金额换算为人民币金额，并计入以人民币记账的父科目中，也就是总计(CNY)中给出的金额。欧元科目也已经同样按最新的汇率更新了金额。

##### 获取在线报价后的科目表

#### 禁用汇率获取

一旦创建了使用非本位币的科目，&app;就会自动开启该货币的汇率获取功能。然而，如果你之后删除那个科目，&app;不会自动停用该货币的汇率获取功能。 Whenever you create an account that uses a non-default currency, exchange rate retrieval will be automatically enabled for that currency. However, if you later delete that account, &app; will not automatically disable exchange rate retrieval for that currency.

你如果已经删除了最后一个使用某货币的科目，并且以后不想再获取该货币的汇率，则需进行如下操作：

1. 点击工具证券编辑器打开证券窗口。

2. 确定已勾选显示国家货币。

3. 展开货币行。

4. 双击希望停用汇率获取的货币。

5. 取消勾选获取在线报价并点击确定。

### 记录通过外币的购买

使用外币的购买交易可以通过两种不同的方式处理。

1. 使用&app;内置的货币兑换功能录入交易。这主要用于单次交易，不会定期产生其它交易。

2. 使用单独的科目跟踪交易，所有涉及到的科目使用同种货币。这样跟踪和追加起来简单得多，因此是推荐的做法。使用这种方式时，先进行一次货币兑换交易，然后再使用本位币录入正常的交易。

本节接下来将主要基于currency_purchase1.ol.2方式介绍操作流程。

#### 使用外币买入资产

你使用的本位币为人民币，但你决定在越南买一艘船。相应地，你需要打开越南的银行科目，从中国转进一些钱，然后买下你的船。

要在&app;中记录这项交易，可以使用如下基本科目结构：

    -资产 (CNY)
       -流动资产 (CNY)
          -中国银行 (CNY)
          -越南银行 (VND)
       -固定资产 (CNY)
          -船 (VND)
    -所有者权益 (CNY)
       -期初余额 (CNY)
          -人民币 (CNY)

每个科目使用的货币标在了括号中。

首先，你需要向越南转账10,000元，使用的是中国银行科目（余额100,000元人民币）。银行给出的汇率是1 CNY = 3505 JMD，但收取了150元人民币的兑汇手续费。

##### 外币转账至越南

选中兑换越南盾的交易行（9,850.00元），右击选择编辑汇率。

##### 编辑汇率

在这个对话框中指定外币交易的汇率。

你输入 1 CNY = 3505 VND 为汇率，因为这个汇率是银行给定的。在资金转账（编辑汇率）窗口中点击确定，保存分录交易。科目表中现在应当如下所示。

##### 购入船只前的科目表

你确定花509,000越南盾买船。要在&app;中记录这项交易，你需要在资产:流动资产:越南银行中将509,000越南盾转账至资产:固定资产:船只。

##### 购入船只后的科目表

现在科目表反映出你的银行科目已经减少了509,000越南盾，而固定资产船只科目增加了同样的数额。如果已在科目表的选择列中勾选了总计 (CNY)，则可以看到这些科目换算为人民币的金额。人民币金额总是根据自动或手动获取的最新货币汇率换算的。

#### 购买境外股票

此示例会展示怎样购买以外币计价的股票。

假定你住在上海，即本位币为人民币。你决定买入在香港交易的、以港元计价的股票。另外，你也想跟踪属于每支股票和每家经纪商的各种收入和费用数额。

你决定买入港铁公司的股票，编号为0694.HK。由于想要跟踪各种收入和费用金额，所以需要建立如下科目结构：

- 资产:投资:经纪账户:宝盛证券:0694.HK (0694.HK)

- 资产:投资:经纪账户:宝盛证券:资金账户 (HKD)

- 所有者权益:期初余额:港元 (HKD)

- 费用:佣金:宝盛证券:0694.HK (HKD)

- 收入:投资:分红:宝盛证券:0694.HK (HKD)

逐一创建所需科目后的科目表如下：

##### 适用跨境股票交易的科目表

各支股票可通过证券编辑器（ 工具证券编辑器 ）添加。

##### 境外证券

若尚未将资金（50,000港元）转入经纪商现金账户 （资产:投资:经纪账户:宝盛证券:资金账户），则现在就该转入这笔资金了，可以使用所有者权益（港元）科目，或某一已经存在的银行科目（现金转账）。

有两种录入买入交易的方式，可以在现金科目中录入交易（下文会介绍），也可以在股票科目中录入交易。

如果在股票科目中录入交易，会假定股票以父科目使用的货币计价。

假设股票价格为每股28港元。要录入买入交易，打开经纪商的港元现金科目（资产:投资:经纪账户:宝盛证券:资金账户），并按下表录入：

买入股票

资产:投资:经纪账户:宝盛证券:资金账户 | 取出 | 50,000
费用:佣金:宝盛证券:0694.HK | 存入 | 500
资产:投资:经纪账户:宝盛证券:0694.HK | 存入 | 49,500 (16,500 份)

如果汇率对话框没有自动弹出，右击股票交易行，选择编辑汇率。在转出份额中录入份额数量（16,500）。

##### 资金转账

在资金转账对话框中设定份额数量。

回到科目表后，可以看到买入的份额已经反映在了股票科目的总额中。

##### 买入的境外股票

科目表现已包含境外股票。

不过，可能你已经注意到了，如果&app;还没有记录人民币与港元间的汇率数据，则人民币总额仍为零。要解决这个问题，前往 工具价格数据库 点击获取报价按钮自动获取所需汇率数据。

需要重申，该示例展示了怎样在提供买入资金的现金科目账簿中录入交易，来以任意一种货币买入股票。也可以在股票科目账簿中录入买入交易，但要注意股票默认使用其父科目的货币记价。

在此示例中，股票科目的父科目（资产:投资:经纪账户:宝盛证券）以港元记价。由于父科目货币也就是股票的计价货币，因此可以放心地在股票科目账簿中录入买入交易。

### 跟踪外币投资

当你决定投资于其它国家的货币，并希望相对于本国货币升值时，你就是在进行外币投资。

向&app;录入这些交易时，需要考虑是记录得简单些，还是详细些。

如果你一点也不在意细节，下面这个相当简单的科目结构就足够了：

- 资产:投资:货币:银行 (CNY)

- 资产:投资:货币:XXX (XXX)

你只需录入两科目间的转账交易，并写明汇率。

但是，你如果想能跟踪资本损益，以及任何形式的手续费，则无疑需要使用更复杂的科目结构，例如：

- 资产:投资:货币:银行 (CNY)

- 资产:投资:货币:外币银行:XXX (XXX)

- 费用:投资:货币:银行 (CNY)

- 收入:投资:货币:外币银行:资本利得:XXX (XXX)

#### 买入外币

买入外币，就是以一定的汇率拿本币买入一定数量的外币，例如，你可以买入价值10,000元人民币的瑞士法郎，即 1 CNY = 5 THB，交易手续费150元人民币。

买入外币

资产:投资:货币:银行 (CNY) | 取出 | 10,000
费用:投资:货币:银行 (CNY) | 费用 | 150
资产:投资:货币:外币银行:THB (THB) | 存入 | 49,250

在离开上述分录外币交易的最后一行时，汇率窗口会自动弹出。如果没有弹出窗口，右击该交易行或选择功能，再选择编辑汇率。在汇率窗口中设定由银行给出的汇率。

#### 卖出外币投资

录入外币卖出的操作与外币买入相同，不过这里是将钱从外币科目转回本币银行科目（与invest-sell1很类似）。

外币卖出要录入得合理，就必须明确记录已实现损益，这可以通过分录交易实现。分录交易必须体现来自收入:投资:货币:外币银行:资本利得:XXX科目的损益。要平衡这项收入，需要录入外币资产两次，一次记录实际发生的卖出（使用实际金额和实际汇率），另一次用来平衡收入获利（份额设为0）。

简而言之，外币卖出交易应当如下所示，也可以在资产:投资:货币:外币银行:XXX科目中看到这项交易。

#### 使用分录交易方案卖出外币

科目 | 存款/费用 | 取款/收入
资产:投资:货币:银行 (CNY) | 卖出金额 - 兑汇手续费 |
费用:投资:货币:银行 (CNY) | 兑汇手续费 |
资产:投资:货币:外币银行:XXX (XXX) |  | 卖出金额 (= 余额 + 获利)
收入:投资:货币:外币银行:资本利得:XXX (XXX) | [亏损] | 获利
资产:投资:货币:外币银行:XXX (XXX) | 获利 (转出份额=0) | [亏损 (转出份额=0) ]

### 对账外币账单

对账外币账单的方法与对账当地银行账单的方法一样。如果你已经按照账单给出的条目，创建了相应的科目表结构，并将每个科目的货币设为该种外币，则对账操作与对账本币银行账单时几乎相同。

如果存在多种货币，那么可能需要在对账科目时手动将一种货币的金额换算至另一种货币。

## 使用贸易科目自动记录外币交易

贸易科目是在&app; 2.3.14 版本中引入的功能。其基本概念由Peter Selinger在&ulink-sel-tut;中提出，教程的第二部分&ulink-sel-gnc;则介绍了怎样在早于2.3.14的版本中手动创建并使用贸易科目。 Trading accounts were introduced as a feature from . The conceptual basis for trading accounts is described in by . A second tutorial describes the manual creation and use of trading accounts in &app; prior to version 2.3.14.

&app;默认不启用贸易科目。要启用贸易科目，前往 文件属性科目 标签页，勾选使用贸易科目复选框。

### 贸易科目的概念

在会计领域中，贸易科目是一种特殊的所有者权益科目，用于记录由两种或多种货币间交易导致的收入变动。&app;使用贸易这一顶级科目类型实现贸易科目的功能。启用贸易科目功能后，如果在创建两种或多种货币间的交易时，所需的贸易子科目还不存在，则会自动创建。

使用贸易科目拓展得到的会计等式如下： In the extended Accounting Equation, Trading accounts would appear as follows: 资产 ＝ 负债 ＋所有者权益 （＋收入 －费用） ＋贸易

&app;会阻止用户直接手动向贸易顶级科目类别下的科目账簿添加条目。这些科目下的所有条目均为当用户在&app;科目结构中的其它科目账簿下创建外币交易时自动生成的。

贸易科目组织在顶级科目贸易下，该顶级科目具有子科目货币，在此之下又为每种相互产生交易的货币分配了各自的子科目。如之前currency_manual中举的例子，启用贸易科目功能后，当录入不同货币间的交易时，会自动创建更多的贸易科目，具体为：

    贸易
        货币
            EUR
            HKD
            CNY

这些科目的名称也同样是自动指定的，如果不在&app;中关闭贸易科目功能，就无法由用户修改。

### 使用贸易科目记录外币交易

#### 建立适用于贸易科目功能的科目结构

仍然继续采用前一小节手动记录外币交易中使用的科目结构。资产和所有者权益科目的初始结构如下：

##### 多货币银行科目初始结构

多货币场景下银行科目的初始结构。

到2020年1月1日，价格数据库（ 工具价格数据库 ）中已录入了下列价格记录，并按此将外币科目余额换算为人民币：

##### 价格数据库初始记录

设定人民币、港元和欧元间初始汇率后的价格数据库窗口。

如图设定货币汇率后，现在科目标签页会在总计(CNY)列中以人民币显示外币科目的金额。

##### 录入人民币、港元和欧元间汇率后的初始多货币科目结构

设定各外币相对人民币汇率后的科目标签页。

#### 兑换资金为外币

假定我们想在2020年1月1日通过香港银行科目花20,000港元在香港当地买些东西。香港银行科目中的流动资金不够，需要再从中国内地银行科目额外兑换10,200港元。兑汇时的汇率为 1 CNY = 1.0753 HKD，即需要花9,486元人民币购汇，同时银行收取40元人民币的购汇手续费。相关交易由资金转账对话框创建，如下所示：

##### 创建从人民币到港元交易的转账对话框

从中国内地银行科目到香港银行科目的转账

借方金额已由港元指定，而交易金额以人民币进行转账。无法在对话框中录入手续费。关闭对话框后，新创建的交易在中国银行科目中显示如下：

在资金转账对话框中录入的金额就是将要从选择的贷方科目 转账到选择的借方科目的金额。如果选中借方金额单选框并输入外币金额，则记录的交易金额是精确的。然而如果选中汇率单选框并输入相应的汇率，则实际金额往往由于舍入误差而记录得不精确。

##### 转账后显示在中国银行科目账簿的交易

关闭转账对话框后，从中国银行科目转账至香港银行科目的交易。

在中国银行科目账簿中展开该交易后，可以向其中添加分录，用于记录手续费，如下所示：

##### 添加兑汇手续费分录后的交易

添加兑汇手续费分录后，从中国银行科目转账至香港银行科目的交易。

回到科目标签页，可以看到由科目间转账交易引起的金额变动：

##### 完成从人民币到港元转账后的科目标签页余额。

完成从中国银行科目到香港银行科目的资金转账后，科目标签页中各科目的余额。

资产和所有者权益科目显示的金额已经根据2020年2月1日资金转账交易中录入的汇率进行了换算。

&app;已经自动创建了贸易科目，转账金额也已录入到相应的贸易科目中。其中的交易条目与录入该交易之前已经存在的期初余额均无关联。也就是，贸易科目只反映在其本身创建之后产生的损益。

到现在，还没有产生贸易损益。人民币和港元的贸易科目余额换算为人民币后是相等的。港元贸易科目有一条借方交易（余额为负），而人民币贸易科目有一条贷方交易（余额为正）。货币子科目的净余额为，也即贸易父科目自身的余额，仍然为零，表明目前没有记录到由货币兑换导致的损益。

原本去香港的购物之行未能成真。一个月后，即2020年3月1日，因其它安排，又需向中国银行科目汇集资金。为此执行一次从香港银行转回到中国银行，总额10,200.00港元的转账。进行这次转账时的汇率为 1 CNY = 7.7933 HKD，兑汇手续费20.00元人民币。记录这次兑汇的交易如下：

##### 从香港银行到中国银行的资金转账交易

该交易从香港银行科目向中国银行科目转账10,200.00港元。

在资金转回中国银行科目后，价格数据库记录如下：

##### 资金转回中国银行科目后的价格数据库

价格数据库显示了将资金从港元转回人民币时使用的汇率。

转回资金后，科目标签页中各科目余额如下：

##### 转回资金后的科目标签页

转回资金后各科目的状态。

现在，资产和所有者权益余额反映了按将资金转回中国银行科目时的汇率换算得到的科目总额。贸易和货币占位符科目表明，货币兑换导致了些许已实现亏损，总计0.82元人民币。相关的兑汇手续费体现在费用总额中。在现实生活中，这并非有利可图的做法，但仍然可以通过这个例子理解贸易科目的实际用处。

由贸易科目汇总得到的损益为已实现损益。

最终，在上述一系列交易后，资产负债表指出产生了贸易亏损：

##### 进行上述交易后的资产负债表

经这些交易后，资产负债表反映产生了贸易亏损。 Balance Sheet after these transactions reflecting the trading loss incurred.