Data AnalyticsIndustry analytics playbooks

Bank CASA ratio: daily averages, not month-end snapshots

PK
Pankit Kumar
Sr. Data Scientist at Parexel (a Goldman Sachs–backed company) · 27 September 2026 · 5 min read
In this article (7 sections)

Related programme: the Data Analytics with Generative AI course (3–4 months; ₹90,000 (inclusive of GST) · EMI from ₹4,000/month).

The short answer

The CASA ratio is current account plus savings account balances divided by total deposits (current, savings and term). The number only means something if you say which balances you used: a month-end snapshot can be flattered by one client parking funds for two days, so branch performance should be judged on daily-average balances. In the synthetic month below, the same branch reports 54.7% at month-end and 46.2% on daily averages.

Why deposit mix gets so much attention

For a bank, current and savings balances are usually cheaper funding than term deposits, so a higher CASA share tends to lower the cost of funds. That is why branch scorecards, zonal reviews and investor presentations all carry the ratio. It is also why it gets managed around reporting dates. An analyst supporting a regional head is asked some version of: "Which branches have genuinely improved their deposit mix, and which just had a good last day of the month?"

Balance data as it arrives

TableColumnsMeaning
daily_balanceas_of, branch_code, account_id, product_code, balanceEnd-of-day ledger balance per account
product_mapproduct_code, product_groupMaps dozens of scheme codes to CA, SA, TD
account_masteraccount_id, customer_id, segment, opened_on, sweep_linkedNeeded to find sweep deposits and large depositors

Most of the analysis effort goes into product_map. Banks run many savings and term schemes, and a mapping maintained by someone who left two years ago is a frequent source of wrong CASA numbers. Get it signed off by the finance or MIS team before you compute anything.

CASA ratio and its daily-average cousin

  • Point-in-time CASA % = (CA + SA balances on date d) ÷ (CA + SA + TD balances on date d) × 100
  • Daily-average CASA % = (average daily CA + average daily SA) ÷ average daily total deposits × 100

Take the ratio of averages, not the average of daily ratios. The average of ratios gives a quiet day the same weight as a heavy one.

Overdrawn current accounts have debit balances. Those are advances, not negative deposits, so keep them out of both numerator and denominator.

One branch, one month, four answers

The data is synthetic, in ₹ lakh: current balances cycle through the week and jump by ₹600 lakh on the last three days when a corporate client parks funds; savings drift upward; some current accounts are overdrawn mid-month; ₹150 lakh sits in auto-sweep term deposits linked to savings accounts.

python
import pandas as pd

# Synthetic branch deposit balances for August 2026, in ₹ lakh (hypothetical)
rows = []
for d in pd.date_range("2026-08-01", "2026-08-31", freq="D"):
    ca = 400 + (d.day % 7) * 10            # current accounts swing through the week
    if d.day >= 29:                         # a corporate client parks funds over month-end
        ca += 600
    sa = 900 + d.day * 2                    # savings drift up with salary credits
    od = -120 if 10 <= d.day <= 20 else 0   # overdrawn current accounts (really advances)
    rows += [(d, "CA", ca), (d, "CA_OVERDRAWN", od), (d, "SA", sa),
             (d, "TD", 1500), (d, "TD_SWEEP", 150)]

bal = pd.DataFrame(rows, columns=["as_of", "product", "balance_lakh"])
w = bal.pivot_table(index="as_of", columns="product", values="balance_lakh", aggfunc="sum")

deposits = w["CA"] + w["SA"] + w["TD"] + w["TD_SWEEP"]   # overdrawn balances excluded
casa = w["CA"] + w["SA"]

print("Month-end CASA %:      ", round(100 * casa.iloc[-1] / deposits.iloc[-1], 1))
print("Daily-average CASA %:  ", round(100 * casa.mean() / deposits.mean(), 1))

netted_casa = casa + w["CA_OVERDRAWN"]
netted_dep = deposits + w["CA_OVERDRAWN"]
print("Netting overdrawn CA %:", round(100 * netted_casa.mean() / netted_dep.mean(), 1))

sweep_casa = casa + w["TD_SWEEP"]
print("Sweep counted as SA %: ", round(100 * sweep_casa.mean() / deposits.mean(), 1))
print(w.mean().round(1).to_string())

Output:

text
Month-end CASA %:       54.7
Daily-average CASA %:   46.2
Netting overdrawn CA %: 45.5
Sweep counted as SA %:  51.1
product
CA               487.1
CA_OVERDRAWN     -42.6
SA               932.0
TD              1500.0
TD_SWEEP         150.0

The honest figure for this branch is 46.2%. The month-end snapshot adds 8.5 points from one client's two-day parking. Netting overdrawn accounts against deposits takes 0.7 points off for no business reason. Counting sweep deposits as savings adds almost 5 points; whether that is right is a classification decision, covered next.

Classification decisions to settle with finance first

Sweep deposits. Auto-sweep products move savings balances above a threshold into a term deposit and break it back when needed. Some internal reports show them with savings; regulatory returns may classify them differently. Use the classification your bank applies in its official reporting, state it on the slide, and never switch it between months.

Government and institutional current accounts. A few very large balances can dominate a branch's CASA. Show the ratio with and without the top ten depositors so the regional head can see whether the mix is broad or concentrated.

Inoperative and dormant accounts. They remain deposits, but a savings book growing through accounts nobody uses is not a relationship win. A count of active savings accounts belongs next to the balance.

Branch transfers. When accounts migrate between branches, one branch's CASA jumps and the other's falls with no change in customers. Flag the migration month.

Unmapped product codes. Any balance whose code is not in product_map should appear in an "unmapped" line, not be silently dropped. Dropping it changes the denominator.

What to tell the regional head

Keep the message to three sentences and a table. For example: "On daily averages, Branch 0412's CASA was 46.2% in August, not the 54.7% in the month-end MIS. The gap comes from one corporate current account that parked ₹600 lakh for the last three days. Excluding that account, the branch's mix was broadly flat versus July."

The table should list, for each branch: average daily total deposits, daily-average CASA %, month-end CASA %, the gap between them, and the share of CASA held by the top ten depositors. Sort by the gap. Branches with large gaps are where a conversation about genuine deposit mobilisation is due, and where incentive schemes tied to month-end balances may be paying for the wrong behaviour.

Practising the pattern

Point-in-time versus period-average is a distinction that appears across finance analytics, from loan books to microfinance portfolio at risk. Pivoting daily ledgers in pandas and defending a denominator are both taught in the Data Analyst programme, with live online classes and optional in-person labs at our Noida centre. If you are unsure whether analytics or data science suits the work you want, compare them in data analytics vs data science.

PK
Pankit Kumar
Lead Instructor, NeuraPath Academy

Pankit Kumar has 10 years in Data Science & AI, building and shipping production systems in regulated pharma and clinical environments. He is a freelance trainer at Boston Institute of Analytics, AnalytixLabs and Scaler, and has taught this material to thousands of working professionals.

This article is part of our Data Analytics with Generative AI programme — 3–4 months. The full analyst stack — Excel, SQL, Power BI and Python pipelines — then a generative-AI layer you can prove is right.

Explore Data Analytics with Generative AI
Counselling is free · no obligation

Not sure which programme fits?

Tell us your background and we will map it to the right entry point — including saying so when a cheaper programme is the better fit. A counsellor replies within one working day.