How I calculate my effective CPF interest rate
My CPF statement does not arrive with one tidy return figure, and that is a good thing. I want to know how much my combined balances actually earned while sitting in account classes with different rates. A plain average of the advertised rates would hide too much, especially when a top-up or withdrawal changes the balance during the statement period.
I use “effective CPF interest rate” to mean my realized annualized yield after weighting each account’s actual time and money in the CPF. That is stricter than taking a nominal weighted average from the current advertised rates. It also separates predictable interest from CPF Investment Scheme (CPFIS) market gains, which can rise or fall and should not be blended into a guaranteed rate as though they were ordinary-account credits. This is a personal calculation, not a forecast or recommendation.
My routine is deliberately plain: I export the statement, enter dated balances and cash movements, match interest to the correct period, and compare the result with a snapshot projection. I keep Singapore dollars separate from Australian dollars because converting the balance would add exchange-rate movement to an interest calculation. The method works for an Australian audience, but CPF rules and tax treatment still belong to Singapore.
Why the headline rate misleads
CPF Ordinary Account, Special Account, Retirement Account and Medisave balances do not earn the same rate. Some also have age bands, minimum-balance rules or once-a-year bonus conditions. Rates can be revised, so I use the rate in force for each sub-period rather than today’s number for the entire year. A rate shown on the CPF Board site now may not match the rate credited twelve months ago.
A quick snapshot is still useful. Its weighted rate is the sum of each balance multiplied by its rate, divided by the total CPF balance. For illustration only, S$10,000 in an OA at 2.5%, S$20,000 in an SA at 4.0% and S$5,000 in Medisave at 3.0% produce S$1,200 of expected annual interest. These inputs are not a quote of today’s rates. Dividing S$1,200 by S$35,000 gives 3.43%, before any bonus credit or later rate adjustment.
That 3.43% answers the current earning power of those balances. It does not prove that my money earned 3.43% last year. Cash-flow timing and rate changes can alter the outcome, while rounding at account level may leave a small difference from the projection. I compare this figure with liquid Singapore options too. A Singapore Savings Bond behaves differently from a bank account when price, redemption timing and applicable rules enter the picture, which is why I have reviewed it as an emergency fund alternative.
Choosing the right balance base
I include only CPF balances that participated in the interest run for the period. OA, SA, RA and Medisave go into the interest calculation; CPFIS goes into a separate investment-return line. That separation keeps volatile prices and distributions visible instead of letting them flatter the blended CPF rate. I also flag restricted balances because their access rules matter even when their interest rate looks attractive.
A month-end balance alone is usually too blunt. I prefer opening and closing balances plus dated deposits and withdrawals; daily snapshots are even better. A S$5,000 top-up on day five carries more weight than one made on day twenty-eight, but treating both as if they existed for the full month distorts average capital. Weekly checks are sufficient for my tracker, while an unusually large transfer gets its exact transaction date.
Household cash still competes for that balance. In Sydney, rent or a mortgage instalment can make an attractive CPF rate irrelevant if bills are paid with expensive credit. That is why my utility bill tracker sits beside the household budget. Australians often talk about needing a “top-up” and watching cash-flow, so I use the same plain language while assessing whether CPF capital is genuinely available to me.
Separating timing from account returns
The cleanest performance measure is time-weighted: split the period whenever a contribution, withdrawal or rate change occurs, calculate the return between those points, and chain the pieces. If the sub-period returns are 0.8% and 0.9%, the combined result is (1 + 0.008)(1 + 0.009) - 1, or 1.707%, rather than 1.7%. Cash movements then affect future balances without being mistaken for investment gains.
When exact sub-period returns are unavailable, I divide interest by time-weighted average capital. For a monthly approximation, each deposit is exposed for the number of days remaining in the month, while each withdrawal reduces exposure for those days. This is less elegant than daily data, but it is much better than averaging only opening and closing balances when the cash movement was large.
I keep four views side by side in my sheet:
| Calculation view | Core calculation | What it shows | Main limitation |
|---|---|---|---|
| Balance-weighted snapshot | Sum of balance × rate, divided by total balance | Current earning power if rates remain unchanged | Ignores past deposits and withdrawals |
| Statement yield | Matched interest divided by time-weighted average balance | What CPF paid over a fixed period | Sensitive to short periods and rounding |
| Time-weighted return | Linked sub-period returns, less one | Performance without cash-flow distortion | Requires accurate sub-period boundaries |
| XIRR | Dated balance, top-up, withdrawal and interest cash flows | Return experienced with actual cash timing | Can be unstable around large, recent flows |
Each view serves a different purpose. I use XIRR mainly as a reality check on my personal experience: the opening balance and top-ups are negative cash flows, withdrawals are positive ones, and interest is a gain. Large contributions close to the statement date can make XIRR jump around, so it does not replace the time-weighted series.
Building the monthly calculation
My sheet has one row per account and date, with opening balance, deposits, withdrawals, closing balance, applicable rate, expected interest and actual credit. The expected-interest field is average balance × rate × days ÷ 365. The actual-credit field uses the amount in the CPF statement rather than a back-calculated estimate. If a credit covers several months, I carry it into the matching monthly rows instead of dumping the whole amount into the month it was displayed.
A ninety-day example makes the result concrete. Suppose my average daily balances were S$12,000 in OA, S$18,000 in SA and S$4,000 in Medisave, giving S$34,000 of capital at risk. If matched interest was S$291.20, the period yield is 0.8565%. Annualizing with (1 + 0.008565)^(365 ÷ 90) - 1 gives an effective annual yield of roughly 3.5%, not the raw 0.8565%. Using the actual credited amount means rounding and any rate change during the period are already represented.
At month-end, I check whether the adjusted balance reconciles to the statement, expected and actual interest have a sensible difference, and no CPFIS value has slipped into ordinary-account interest. I copy the formula across, but I do not hide exceptions. A manual adjustment line with a date and reason is more useful than a clever formula that nobody can explain three months later.
The same structure handles a mid-year rate revision. I close the old-rate sub-period on the effective date, open a new one, and multiply the linked returns. If I lack daily balances, I lower the precision of the estimate rather than pretending it is exact. That discipline matters more than producing another decimal place.
Checking the result against reality
Before keeping a final number, I reconcile the dates, units and rate history against my CPF statement and official CPF Board publications. I also test whether a minimum-balance bonus or OA higher-rate threshold was active for enough of the period. A high calculated yield caused by a short balance, a temporary bonus or a timing quirk is not the same as a durable improvement in my financial position.
The comparison should match the purpose of the money. CPF balances have retirement and medical-access restrictions, whereas Australian superannuation, bank term deposits and cash accounts have different access and tax settings. The Reserve Bank of Australia’s cash target moves as policy changes, and major Australian banks can reprice term deposits quickly. An Australian tax resident should check ATO treatment separately rather than importing superannuation deductions into a CPF estimate. I compare yields in their own currencies and consider liquidity, inflation and concentration; a locked CPF balance is not equivalent to cash in Melbourne just because the percentage looks similar.
I use the same spreadsheet discipline elsewhere, as explained in my tracking setup, so one attractive rate never dominates the whole household picture. A blended yield may be excellent, but a S$12,000 annual gain on S$140,000 is not worth chasing if it complicates a planned housing deposit or emergency reserve. The number is useful because it informs those choices, not because it ranks every dollar identically.
Open your latest CPF statement, create one row for each account, and record the opening balance, dated cash movements and matched interest. Run the snapshot and realized-return checks side by side, keep CPFIS separate, and repeat the routine whenever rates or balances change. Track the cash-flow, and the percentage will tell you whether the balance is serving its job.