准备工作

  • 一部装有 beancountfava 以及 double-entry-generator 的 Mac 或 PC。
  • 一部 iPhone 或 Android 手机。
  • 本地存储个人 my-bookkeepings 账本最新内容。

开始工作!

Balance CheatSheet
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
; wechat pay balance
0000-00-00 document Assets:Digital:Wechat:Cash "./path/to/your_wechat_bills.csv"
0000-00-01 balance  Assets:Digital:Wechat:Cash    <balance_value> ~ 0.00 CNY

; alipay balance
0000-00-00 document Assets:Digital:Alipay:Cash "./path/to/your_alipay_bills.csv"
0000-00-01 balance  Assets:Digital:Alipay:Cash    <balance_value> ~ 0.00 CNY

; bank balance
0000-00-01 balance Assets:Bank:CN:ICBC:Savings          <balance_value> ~ 0.00 CNY
0000-00-01 balance Assets:Bank:CN:ICBC:SocialSecurity   <balance_value> ~ 0.00 CNY
0000-00-01 balance Assets:Bank:CN:BOCOM:Savings         <balance_value> ~ 0.00 CNY
0000-00-01 balance Assets:Bank:CN:BOC:Savings           <balance_value> ~ 0.00 CNY
0000-00-01 balance Liabilities:CreditCard:CN:ICBC       <balance_value> ~ 0.00 CNY
1111-11-19 balance Liabilities:CreditCard:CN:CMB        <balance_value> ~ 0.00 CNY
1111-11-20 balance Liabilities:CreditCard:CN:BOCOM      <balance_value> ~ 0.00 CNY

导入微信支付账单

先查看上月微信 beancount 账单,确定最后导入日。

「微信」中导出从最后导入日至今日的微信支付账单。

使用如下命令生成账单:

1
2
3
4
5
double-entry-generator translate \
  --config ./config/double-entry-generator/wechat.yaml \
  --provider wechat \
  --output tmp-wechat.beancount \
  your_wechat_bills.csv

修改相关 FIXME 账户交易(posting)。

在当月 index.beancount 中添加微信支付的相关 balancedocument 语句,例:

1
2
0000-00-00 document Assets:Digital:Wechat:Cash "./path/to/your_wechat_bills.csv"
0000-00-01 balance  Assets:Digital:Wechat:Cash    <balance_value> ~ 0.00 CNY

balance 日期必须为 T+1,否则语句会忽略今日交易,导致对账失败。

若对账失败,特别是小额差异,极有可能是「零钱通」发放利息所致。值得注意的是,微信「零钱通」的利息发放并不包括在微信导出的账单当中。

值得注意的是,从「理财通」转入至「银行卡」的交易,微信支付是没有记录的,见这里

导入支付宝账单

先查看上月支付宝 beancount 账单,确定最后导入日。

「支付宝」导出从最后导入日至今日的支付宝账单。

使用如下命令生成账单:

1
2
3
4
5
double-entry-generator translate \
  --config ./config/double-entry-generator/alipay.yaml \
  --provider alipay \
  --output tmp-alipay.beancount \
  your_alipay_bills.csv

修改相关 FIXME 账户交易(posting)。

在当月 index.beancount 中添加支付宝的相关 balancedocument 语句,例:

1
2
0000-00-00 document Assets:Digital:Alipay:Cash "./path/to/your_alipay_bills.csv"
0000-00-01 balance  Assets:Digital:Alipay:Cash    <balance_value> ~ 0.00 CNY

balance 日期必须为 T+1,否则语句会忽略今日交易,导致对账失败。

导入火币账单

(可选,依据月度是否有火币交易)

先查看上月火币 beancount 账单,确定最后导入日。

「火币」导出从最后导入日至今日的火币账单。

使用如下命令生成账单:

1
2
3
4
5
double-entry-generator translate \
  --config ./config/double-entry-generator/huobi.yaml \
  --provider huobi \
  --output tmp-huobi.beancount \
  your_huobi_bills.csv

修改相关 FIXME 账户交易(posting)。

导入中国工商银行账单

先查看上月工商银行 beancount 账单,确定最后导入日。

「中国工商银行」导出从最后导入日至今日中国工商银行的借记卡和信用卡账单。

使用如下命令生成账单:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 生成贷记卡账单
double-entry-generator translate \
  --config ./config/double-entry-generator/icbc-1120-5595.yaml \
  --provider icbc \
  --output tmp-icbc-1120-5595.beancount \
  your_icbc_1120_5595_bills.csv
# 生成借记卡账单
double-entry-generator translate \
  --config ./config/double-entry-generator/icbc-9855.yaml \
  --provider icbc \
  --output tmp-icbc-9855.beancount \
  your_icbc_9855_bills.csv
double-entry-generator translate \
  --config ./config/double-entry-generator/icbc-5868.yaml \
  --provider icbc \
  --output tmp-icbc-5868.beancount \
  your_icbc_5868_bills.csv

修改相关 FIXME 账户交易(posting)。

在当月 index.beancount 中添加中国工商银行的相关 balancedocument 语句,例:

1
2
3
4
0000-00-00 document Assets:Bank:CN:ICBC:Savings "./path/to/your_icbc_debit_bills.csv"
0000-00-00 document Liabilities:CreditCard:CN:ICBC "./path/to/your_icbc_credit_bills.csv"
0000-00-01 balance Assets:Bank:CN:ICBC:Savings          <balance_value> ~ 0.00 CNY
0000-00-01 balance Liabilities:CreditCard:CN:ICBC       <balance_value> ~ 0.00 CNY

导入其他银行卡账单

double-entry-generator 目前仅支持中国工商银行账单的转换,鉴于个人使用银行卡的交易较少(<10 笔/月),可以直接使用手动记账。

打开:

  • 中国工商银行
  • 招商银行
  • 中国银行
  • 交通银行

先写一个 T+1balance 对账语句,对相关的账户进行断言。

1
2
3
4
5
6
7
0000-00-01 balance Assets:Bank:CN:ICBC:Savings          <balance_value> ~ 0.00 CNY
0000-00-01 balance Assets:Bank:CN:ICBC:SocialSecurity   <balance_value> ~ 0.00 CNY
0000-00-01 balance Assets:Bank:CN:BOCOM:Savings         <balance_value> ~ 0.00 CNY
0000-00-01 balance Assets:Bank:CN:BOC:Savings           <balance_value> ~ 0.00 CNY
0000-00-01 balance Liabilities:CreditCard:CN:ICBC       <balance_value> ~ 0.00 CNY
1111-11-19 balance Liabilities:CreditCard:CN:CMB        <balance_value> ~ 0.00 CNY
1111-11-20 balance Liabilities:CreditCard:CN:BOCOM      <balance_value> ~ 0.00 CNY

笔者的信用卡账单分别是每月 1 日和 19 日出账,故将信用卡断言的日期设为当月 1 日以及 19 日。

工商银行信用卡可以看到实时余额,而招行和交行的只能在出账当天才可获得余额。因此工行信用卡可以直接断言当日余额,而招行、交行银行卡需要断言出账日与余额。

一般 0000-00-01 为记账当日 T+1 ,而 1111-11 一般为记账当月的月份。
🌰:若记账时间为 2023-01-25 ,则 0000-00-01 应改为 2023-01-261111-11 应改为 2023-01

查找当月相关银行卡账单,手动记录在当月的 index.beancount 中。

总结

以月为粒度,微信、支付宝账单基本都能够正常转换,整个工作流下来需要花费的时间成本在二十分钟以内。

使用 double-entry-generator 能够基本实现个人记账期望,可以考虑固化该工作流,以长期使用。

相关链接

  1. beancount/beancount
    https://github.com/beancount/beancount
  2. beancount/fava
    https://github.com/beancount/fava
  3. deb-sig/double-entry-generator
    https://github.com/deb-sig/double-entry-generator
  4. 多种支付账户的账单导出及查看方法汇总
    https://blog.triplez.cn/posts/bills-export-methods/

知识共享许可协议
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。