AFIN8003 Workshop 1
Department of Applied Finance
2025-07-28
Understanding bank accounting is fundamental for anyone interested in finance, banking, or risk management. Banks play a unique role in the financial system, and their accounting practices differ significantly from those of non-financial firms. Through this workshop series, you will:
By the end of these workshops, you will be better equipped to interpret bank financial statements and understand the implications of different banking operations.
To make these workshops interactive, we use the BRMS (Bank Risk Management Simulation) Python package, which I developed for teaching and research in banking.
With BRMS, you can:
BRMS is a work in progress. Its API is currently unstable.
To begin with, a simple bank has just been established with shareholders’ contribution of $10,000.
import datetime
from brms.accounting.account import AccountBalances
from brms.accounting.report import Report
from brms.accounting.statement_viewer import HTMLStatementViewer
from brms.models.bank import Bank
bank = Bank()
balances = AccountBalances(
{
bank.chart_of_accounts.cash_account: 10_000,
bank.chart_of_accounts.equity_account: 10_000,
},
)
bank.initialize(balances)
viewer = HTMLStatementViewer(jupyter=True, hide_zero_balance_accounts=True)
today = datetime.date(2025, 7, 28)
report = Report(ledger=bank.ledger, viewer=viewer, date=today)
report.print_balance_sheet()
Balance Sheet ──────────────────────────────────────────── Assets Cash and Cash Equivalents $10,000.00 Total assets $10,000.00 ──────────────────────────────────────────── Liabilities Total liabilities $0.00 ──────────────────────────────────────────── Net assets $10,000.00 ──────────────────────────────────────────── Shareholders' equity Shareholders' Equity $10,000.00 Total shareholders' equity $10,000.00 ──────────────────────────────────────────── Date: 2025-07-28
Now some customers have made some deposits, for example:
Notably, customer deposits are the bank’s liability. We see an increase in both the bank’s total assets and total liabilities, while total shareholders’ equity remains unchanged.
from brms.instruments.factory import InstrumentFactory
from brms.models.transaction import TransactionFactory, TransactionType
customer_A_deposit = InstrumentFactory.create_deposit(value=60_000)
customer_B_deposit = InstrumentFactory.create_deposit(value=40_000)
customer_C_deposit = InstrumentFactory.create_deposit(value=20_000)
tx_deposit1 = TransactionFactory.create_transaction(
bank=bank,
transaction_type=TransactionType.DEPOSIT_RECEIVED,
instrument=customer_A_deposit,
transaction_date=today,
description="Customer A's Deposits",
)
tx_deposit2 = TransactionFactory.create_transaction(
bank=bank,
transaction_type=TransactionType.DEPOSIT_RECEIVED,
instrument=customer_B_deposit,
transaction_date=today,
description="Customer B's Deposits",
)
tx_deposit3 = TransactionFactory.create_transaction(
bank=bank,
transaction_type=TransactionType.DEPOSIT_RECEIVED,
instrument=customer_C_deposit,
transaction_date=today,
description="Customer C's Deposits",
)
bank.process_transaction(tx_deposit1)
bank.process_transaction(tx_deposit2)
bank.process_transaction(tx_deposit3)
report = Report(ledger=bank.ledger, viewer=viewer, date=today)
report.print_balance_sheet()
Balance Sheet ──────────────────────────────────────────────────────── Assets Cash and Cash Equivalents $130,000.00 Total assets $130,000.00 ──────────────────────────────────────────────────────── Liabilities Deposits and Other Public Borrowings $120,000.00 Deposits $120,000.00 Total liabilities $120,000.00 ──────────────────────────────────────────────────────── Net assets $10,000.00 ──────────────────────────────────────────────────────── Shareholders' equity Shareholders' Equity $10,000.00 Total shareholders' equity $10,000.00 ──────────────────────────────────────────────────────── Date: 2025-07-28
Depositors can also withdraw from the bank.
If Customer C has withdrawn all of their deposits ($20,000), we see a decrease of cash and deposits.
from brms.models.transaction import DepositWithdrawTransaction
tx_deposit_withdraw = TransactionFactory.create_transaction(
bank=bank,
transaction_type=TransactionType.DEPOSIT_WITHDRAWAL,
instrument=customer_C_deposit,
transaction_date=today,
description="Customer C withdraw",
)
bank.process_transaction(tx_deposit_withdraw)
report = Report(ledger=bank.ledger, viewer=viewer, date=today)
report.print_balance_sheet()
Balance Sheet ──────────────────────────────────────────────────────── Assets Cash and Cash Equivalents $110,000.00 Total assets $110,000.00 ──────────────────────────────────────────────────────── Liabilities Deposits and Other Public Borrowings $100,000.00 Deposits $100,000.00 Total liabilities $100,000.00 ──────────────────────────────────────────────────────── Net assets $10,000.00 ──────────────────────────────────────────────────────── Shareholders' equity Shareholders' Equity $10,000.00 Total shareholders' equity $10,000.00 ──────────────────────────────────────────────────────── Date: 2025-07-28
Of course, the typical business of a bank is to make loans. Let’s assume the bank has made an (interest-only) loan of $80,000 to some borrowers.
from brms.instruments.base import Instrument
from brms.instruments.mock import MockInstrument
from brms.models.transaction import LoanDisbursementTransaction
(loan := MockInstrument("A loan")).value = 80_000
# fmt: off
tx_loan = TransactionFactory.create_transaction(
bank=bank,
transaction_type=TransactionType.LOAN_DISBURSEMENT,
instrument=loan,
transaction_date=today,
description="Loan made to a borrower",
)
# fmt: on
bank.process_transaction(tx_loan)
report = Report(ledger=bank.ledger, viewer=viewer, date=today)
report.print_balance_sheet()
Balance Sheet ──────────────────────────────────────────────────────── Assets Cash and Cash Equivalents $30,000.00 Loans and Advances $80,000.00 Total assets $110,000.00 ──────────────────────────────────────────────────────── Liabilities Deposits and Other Public Borrowings $100,000.00 Deposits $100,000.00 Total liabilities $100,000.00 ──────────────────────────────────────────────────────── Net assets $10,000.00 ──────────────────────────────────────────────────────── Shareholders' equity Shareholders' Equity $10,000.00 Total shareholders' equity $10,000.00 ──────────────────────────────────────────────────────── Date: 2025-07-28
After some time (e.g., a month), the bank may need to pay interest on customers’ deposits, e.g., $100.
Income Statement is included given that we’d like to know the profit and loss (P&L) of the bank over the period.
from brms.instruments.cash import Cash
from brms.models.transaction import InterestPaidOnDepositTransaction
today = today + datetime.timedelta(days=31)
tx_interest_paid = TransactionFactory.create_transaction(
bank=bank,
transaction_type=TransactionType.INTEREST_PAID_ON_DEPOSIT,
instrument=Cash(value=100),
transaction_date=today,
description="Interest paid on deposits",
)
bank.process_transaction(tx_interest_paid)
report = Report(ledger=bank.ledger, viewer=viewer, date=today)
report.print_balance_sheet()
report.print_income_statement()
Balance Sheet ──────────────────────────────────────────────────────── Assets Cash and Cash Equivalents $29,900.00 Loans and Advances $80,000.00 Total assets $109,900.00 ──────────────────────────────────────────────────────── Liabilities Deposits and Other Public Borrowings $100,000.00 Deposits $100,000.00 Total liabilities $100,000.00 ──────────────────────────────────────────────────────── Net assets $9,900.00 ──────────────────────────────────────────────────────── Shareholders' equity Shareholders' Equity $10,000.00 Retained Earnings ($100.00) Total shareholders' equity $9,900.00 ──────────────────────────────────────────────────────── Date: 2025-08-28
Income Statement ────────────────────────────────── Income $0.00 ────────────────────────────────── Expense $100.00 Interest Expense $100.00 ────────────────────────────────── Profit ($100.00) ────────────────────────────────── Date: 2025-08-28
If the bank has only paid interest on deposits over this period, it surely has a net loss or negative profit as shown before.
However, it is more reasonable that the bank also has earned some profits during the same time, especially because it has made some loans.
Suppose that over the 1-month period, the bank has earned some interest income from the loans made earlier, e.g., for a total of $800.
Overall, the bank has a net profit of $700. We can observe that the bank’s Retained Earnings has increased by $700, too.
tx_interest_earned = TransactionFactory.create_transaction(
bank=bank,
transaction_type=TransactionType.LOAN_INTEREST_PAYMENT,
instrument=Cash(value=800),
transaction_date=today,
description="Interest earned from loans",
)
bank.process_transaction(tx_interest_earned)
report = Report(ledger=bank.ledger, viewer=viewer, date=today)
report.print_balance_sheet()
report.print_income_statement()
Balance Sheet ──────────────────────────────────────────────────────── Assets Cash and Cash Equivalents $30,700.00 Loans and Advances $80,000.00 Total assets $110,700.00 ──────────────────────────────────────────────────────── Liabilities Deposits and Other Public Borrowings $100,000.00 Deposits $100,000.00 Total liabilities $100,000.00 ──────────────────────────────────────────────────────── Net assets $10,700.00 ──────────────────────────────────────────────────────── Shareholders' equity Shareholders' Equity $10,000.00 Retained Earnings $700.00 Total shareholders' equity $10,700.00 ──────────────────────────────────────────────────────── Date: 2025-08-28
Income Statement ──────────────────────────────── Income $800.00 Interest Income $800.00 ──────────────────────────────── Expense $100.00 Interest Expense $100.00 ──────────────────────────────── Profit $700.00 ──────────────────────────────── Date: 2025-08-28
Let’s see the statements of an Australian bank, Commonwealth Bank of Australia (CBA), as an example. Its financial results are publicly available at its website. However, to make our lives a bit easier, pre-compiled data are available on iLearn.
SPGlobal_CBA_BalanceSheet.xlsx
and SPGlobal_CBA_IncomeStatement.xlsx
.Now, use the provided data and your own research, try to answer the following questions. Unless specified otherwise, use the bank’s latest data.
AFIN8003 Banking and Financial Intermediation