Workshop 1 - Understanding Bank Financial Statements I

AFIN8003 Workshop 1

Dr. Mingze Gao

Department of Applied Finance

2025-07-28

Why this workshop series?

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:

  • Gain practical insights into how banks record and report financial transactions.
  • Learn how various banking activities impact the balance sheet and financial health of a bank.
  • Develop hands-on skills using simulation tools to visualize and analyze real-world scenarios.
  • Build a strong foundation for more advanced topics in banking, regulation, and risk management.

By the end of these workshops, you will be better equipped to interpret bank financial statements and understand the implications of different banking operations.

Technology used: The BRMS Python package

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:

  • Simulate deposits, withdrawals, loans, and other banking activities.
  • Visualize changes in the bank’s financial position after each transaction.

BRMS is a work in progress. Its API is currently unstable.

Simple banking book accounting

A first look at bank’s balance sheet

To begin with, a simple bank has just been established with shareholders’ contribution of $10,000.

A new bank has just been established.
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

Customer deposit

Now some customers have made some deposits, for example:

  • Customer A deposits $60,000.
  • Customer B deposits $40,000.
  • Customer C deposits $20,000.

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.

Some customers have made deposits.
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

Deposit withdraw

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.

Customer C has withdrawn their 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

Loan disbursement

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.

The bank has made some loans.
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

Interest paid on deposits

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.

If the bank has only paid interest on deposits over the month…
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

Loan interest income

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.

… if it has also earned interest from loans over the month.
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

Real-world example

CBA’s balance sheet and income statement

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.

  • Visit AFIN8003 course page on iLearn.
  • Under Week 1, find and download the Excel spreadsheet 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.

Some questions

  1. When is the bank’s financial period ended?
  2. Does the financial period’s end align with Australia’s financial year’s end?
  3. What is the bank’s total assets? When answering this question, make sure you have also reported the currency and unit.
  4. What is the largest asset item for the bank? (Cash, investment securities, trading securities, gross loans, or other asset items?)
  5. What is the proportion of the bank’s gross loans relative to its total assets?
  6. What is the second largest asset item for the bank?
  7. What is the bank’s total liabilities?
  8. What is the largest liability item for the bank? (Interest-bearing deposits, non-interest-bearing deposits, short-term borrowings, or long-term borrowings?)
  9. What is the proportion of the bank’s total deposits relative to its total liabilities?
  10. What is the bank’s total equity?
  11. What is the bank’s total common equity?