本人年少輕狂時曾經寫過一篇〈對於個人記帳軟體的一些想法〉,當時我認為複式簿記用在個人記帳相當冗餘,就好比沒有人會把 5S 帶回家用一樣,但今天的我就要來打臉過去的我,來介紹一番「複式簿記」。

最近因為工作的關係,需要了解複式簿記,看了許多教材,大多著重在「借方」、「貸方」兩個不直覺的名詞,並且他們大多以會計的角度切入,這對於沒有會計基礎但又必須學習 domain knowledge 的我輩資訊人來說有點吃力,最後因緣際會下看到 Beancount 這篇〈The Double-Entry Counting Method〉,它以較生活化的角度切入,覺得相當淺顯易懂,讓我們能快速具備複式簿記的基礎知識,後面才能去思考系統面該如何設計,而不用膠著在會計專有名詞內。

本文是該文濃縮再濃縮、提煉再提煉後的華文版,並且加入一些個人觀點,理性勿戰,一鍵三連。

以下圖片皆來自原文,不再個別註明。


複式簿記基礎

從最基本的 account(帳)講起,一個 account 用於記錄它身上的交易,下面這張圖表示一個空白的 account,箭頭代表時間的推進:

最初該 account 之 balance(餘額)為零,我們在線上表示最初時間的位置上方寫下 0:

如果有交易發生,我們在線上畫圓並註記之,這個動作稱為 posting(過帳),下面此帳戶加了一百:

過帳之後,在旁邊寫下新的 balance:

隨著時間推進,不斷有新交易加入,balance 也不斷更新:

交易可以是負的,balance 也因此可能是負的。

Statement

如果以表格呈現交易紀錄,就會像是我們 statement(對帳單)常看到的那種格式:

DateDescriptionAmountBalance
2016-10-02100.001100.00
2016-10-05-25.001075.00
2016-10-06-200.00875.00
Final Balance875.00

上方表格把正負金額放在同一個欄位,還有另一種常見的格式是把正負金額分為兩欄:

DateDescriptionDebitCreditBalance
2016-10-02100.001100.00
2016-10-0525.001075.00
2016-10-06200.00875.00
Final Balance875.00

在此表格中,欄位「debit」(借)表示從 account 流出的金額、「credit」(貸)表示流入 account 的金額,有時也被稱為「withdrawals」(提)、「deposits」(存)。

對於一般的銀行存款帳戶,金額有出有進,看到的 statement 比較有可能是第二種,而像信用卡 statement,往往都只用一欄顯示刷卡消費的金額以及總額。

單式簿記

延續前面的概念,下面是某個 checking account(支票帳戶)的交易示意圖:

在某個期間,該 account 的 balance 為 1000,如果花了 79,那 balance 剩下 921:

如果想要註記這筆 79 是花在餐廳用餐上,那可以幫它打個標:

延續此一模式,後面的交易也都可以打上各自的標籤,我們也可以用電腦去計算每個標籤累計的金額,這種記帳方式就是「單式簿記」,也是大多數人的記帳模式。

複式簿記

假設 account 的主人除了 checking account 外,還有另一個 restaurant account,專門用來紀錄餐廳用餐消費,現在把 restaurant account 納入圖內:

之前在單式簿記模式中的 restaurant 標籤,在此改成在 restaurant account 添加一筆交易的形式記錄之,表示從 checking account 轉移了 79 元到 restaurant account:

現在我們將兩個 account 的交易關聯起來,表示他們是一對相關的交易(transaction):

另外也可以註記交易內容,例如「Dinner at Uncle Boons」,另外這筆交易的金額移轉應該是在同一時間發生的,並且一出一入之間,加總後正負互抵為零,這是複式簿記的重要概念:

The sum of all the postings of a transaction must equal zero.

一筆交易中的每則過帳加總應為零。

在台灣,會計人也有類似的教條:

有借必有貸,借貸必相等。

放大看加深此觀念的印象:

這圖表示 checking account 移出了 79 元(-79)、restaurant account 移入了 79(+79)元:

( +79 ) + ( -79 ) = 0

更多 Account

吃餐廳也有可能刷卡,所以我們再加入另一個 credit-card account,同樣的,錢錢從 credit-card account 流到 restaurant account 了:

這頓在 Eataly 的 35 塊午餐,讓 credit-card account 從原本的 -450 變成 -485。

除了 restaurant account,當然也可能有其他 account 用於歸納不同支出,可以是粗略的食衣住行育樂,也可以是細項的柴米油鹽醬醋茶,取決於個人選擇。

上方 credit-card account 的 balance 是負值,站在持卡人的觀點看,表示這些錢是我欠銀行、銀行借我的,出來借,總有一天要還,credit-card account 累積的負值 balance 也會在繳卡費那天從另一個 account 轉移到 credit-card account 繳清,下期 credit-card account 的 balance 也將從零開始。

多重 Posting

一筆交易(transaction)也可能由兩筆以上的 posting(過帳)構成,不論有幾筆 posting,他們的正負加總應依舊為零,例如一筆 salary(薪資)一部分轉移至 checking account、一部分轉移至 taxes:

上圖中,salary account 的 2905 中的 2000 被轉移至 checking account、另外的 905 被轉移至 taxes account,算式如下:

( -2905 ) + ( +2000 ) + ( -905 ) = 0

為何那 salary 是「負」2905,因為在複式簿記恆等式中,一筆交易的 posting 總計必須為零,而錢真正進入口袋的是名為 checking account 的戶頭,以及一部分的 taxes account,那 salary account 僅是為了滿足恆等式以及統計所需而設立的名目,其實更前面的 restaurant account 也是同樣的概念,真的有個 restaurant account 嗎?顯然沒有,他們都只是為了記帳所需而設立的名目 account。

Account 類型

對於 account,我們可以分為幾種類型。

對於某些 account,我們關心它的 balance(餘額),以及在某個時間點的 balance,例如支票帳戶、儲蓄帳戶、信用卡帳戶、房貸帳戶,我們都很關心這些帳戶的 balance。

另外一些 account,我們關心它的 delta(差額),也就是兩個時間點間的差距,例如前述的餐廳花費,我們往往只會想知道「上個月」吃掉多少錢,不會想知道我這一生中在餐廳所有花費的累計(balance),又或者是薪資,我們往往只關心特定期間的「月薪」或「年薪」,而非這輩子累計的 balance。

  • 對於注重 balance 的 account,他們皆屬於 「asset」(資產)「liability」(負債),他們的報表稱為資產負債表(balance sheet)

  • 對於注重 delta 的 account,他們皆屬於 「income」(收入)「expense」(費用),他們的報表稱為損益表(income statement)

這四類 account 慣用的正負號如下表:

Balance 為正值Balance 為負值
Asset(資產)liability(負債)
Expense(費用)Income(收入)

各類說明如下:

  • Asset (+):我們所擁有的「資產」,例如存款、現金、證券、不動產,他們的 balance 有可能增減,但始終為正值。

  • Liability (-):我們欠人家的,例如信用卡、貸款,例如我們貸款買房子,在獲得房產資產的同時,也多了筆房貸的負債,而每月的房貸還款相當於拿一部分存款轉移到貸款,負債也因此減少(例如從 -2,000,000 變成 -1,980,000,但始終負債還是負值)。

  • Expense (+):我們用錢錢換來的酷東西,也可能是無形的東西,例如吃喝玩樂,此外稅金也列為 expense,因為站在個人觀點,我們繳稅給政府換來公共建設以及公共服務。

  • Income (-):包括薪資收入、投資收入、存款利息、證券配息、現金回饋、紅利點數等等,典型的收入會被轉移到 asset(例如存款),也有一部分轉移成 expense(例如預扣所得稅)。Income 大概是四種 account 類型中最不直覺的,或許可以這樣想,income 轉移到 asset 才是真正落袋為安,而 asset 要增加,在複式簿記恆等式規則下,Income 自然就得減少了。

下面是一些各類 account 的範例:

讓 account 宇宙擴張:

再擴張:

在每個 account 名稱前綴那四種類型:

不論 account 有多少,萬變不離其宗的是複式簿記恆等式:一筆交易的 posting 總和應為零。

有了這些交易資料,就可以產生一些統計值及試算表。

Trial Balance

將前面的範例依照四種類型重新整理成下圖:

依序分別是 asset、liability、equity、income、expense,其中 equity 先暫時忽略,後面會再提到。

如果我們將每個 account 累計的 balance 算出來,並且省略中間的交易即 posting 細節,這份報表稱為「trial balance」(試算報表)。

Trial balance 呈現的是這段時間內每個 account 的 balance,因為每筆交易總和皆為零,因此所有的 account balance 總和也應該為零。

損益表(Income Statement)

損益表是一種常見的財務報表,用於表示某段期間內各項收入與花費的統計金額,而兩者相減即為 「net income」(淨收益),不論是公司或個人,正常應該都要賺的比花的多。

損益表的形式很簡單,就是把 income account balance 擺左邊,expense account balance 擺右邊:

但要注意他們的正負號,依照前面的表格,income account balance 應該為負值,expense account balance 應該為正值,正常情況下 net income 也應該為負值,表示還有錢可以轉移去增加資產或減少負債。

損益表所表示的期間通常是年、季、月,我們不太會關心出生以來所總累計的收入或花費。

資產負債表(Balance Sheet)

資產負債表示另一種常見的財務報表,用於表示「錢在哪裡?」,除了那些吃喝玩樂花掉的,剩下的錢要嘛變成存款(資產),要嘛用於償還貸款(負債),在資產負債表中,我們也只關心資產與負債:

此外,我們也關心資產與負債的總和,也就是淨值(net worth),在財務健康的狀況下,資產應該大於負債,也就是淨值應為正值。

資產負債表的形式如下:

其中 equity 那一部分,表示的意義是收入與花費,以負值表示,負值越大,收入越大,而收入會跑去哪呢?當然是變成正值的資產啦(或降低負債),因此這裡 equity 的負值越大表示的是資產越大,

Credit & Debit

在此之前,我們都只有談到正負號,對於那四類 account,資產與花費總是正值、收入與負債總是負值,並且負值的 posting 表示金錢的流出、正值的 posting 表示金錢的流入。

而在守舊的會計宇宙中,他們把資產與花費列為 debit(借方),負債與收入列為 credit(貸方),並且某筆 posting 中,一個 account 有金錢流出,稱為 debiting(借),另一筆 posting 中,另一個 account 有金錢流入,稱為 crediting(貸)。

會計宇宙的借貸概念有點像化學的氧化還原,氧化表示失去電子,還原表示得到電子,在現代的氧化還原定義中,已經和氧原子沒什麼關係,與其從古典氧化還原定義推導,更多人選擇硬背,借貸也是,我輩非會計人只能硬背,但借貸的定義較氧化還原更為複雜,對於不同種類的 account,有時候錢流出去叫借,錢流進來叫貸,有時候則相反。

站在系統面的角度,引入借貸也會使資料模型與邏輯變得複雜,可能需要開兩個欄位 debit_amountcredit_amount 才能模仿真實的複式簿記帳本,而且即便有兩個欄位,你還是要根據 account 種類去區分他們身上借貸與數字正負號的關係,而本文所提倡的正負號表示法只要開一個 amount 即可,邏輯上更單純,也不用去理會到底誰是借誰又是貸。

資料表設計

簡化再簡化的 schema 大概會長這樣:

DateAccountAmount
2016-12-04Liability:CreditCard-153.45
2016-12-04Expense:Gifts153.45
2016-12-06Liability:CreditCard-47.23
2016-12-06Expense:Restaurant47.23
2016-12-07Asset:Cash-25.00
2016-12-07Expense:Tips4.00
2016-12-07Expense:Alcohol21.00

每筆交易都至少有兩筆 posting,並且 posting 加總為零。

結語

是的,在區塊鏈出現以前,就已經有古老且純粹的技術確保帳務的正確性,並且也是分散式的,我的帳本和銀行的帳本應該要對得起來,銀行的帳本和所有往來客戶的帳本也應該要對得起來,銀行和銀行間的帳本也要對得起來,如此串連,就稱為「帳本鏈」吧!