Spring Creek Advisory Spring Creek Advisory BANK CREDIT RISK
Tools / Loan Pricing Calculator / Methodology & Audit

Loan Pricing Calculator — Methodology & Audit

Complete derivation of every formula the Loan Pricing Calculator uses, published so that a reviewer, auditor, or examiner can independently reproduce any figure the tool reports. Every calculation below can be rebuilt in Excel given the same forward curve.

Checking live curve…

Contents
  1. Scope, sources, and data vintages
  2. The forward curve — what it is and how monthly rates are read from it
  3. Accrual conventions and the payment schedule
  4. The fixed-rate equivalent — present-value matching
  5. Reproducing the numbers in Excel — two worked examples
  6. Rate scenarios, the collar, and breakeven
  7. Bank funding analysis — cost of funds and funding betas
  8. The loan income statement and return on equity
  9. Limitations — what this tool does not do
1 Scope, Sources, and Data Vintages

The Loan Pricing Calculator answers one question: given today’s market expectations for interest rates, what fixed rate is economically equivalent to a given floating rate — or, run in reverse, what floating spread is equivalent to a given fixed rate — and what either option earns the bank. It is a pricing and analysis tool. It is not a note, a rate lock, an amortization disclosure, or a payoff statement, and it does not price credit risk.

Data sources

InputSourceRefreshPublic
Forward curve — 1M Term SOFR, Daily SOFR, WSJ Prime Published forward-curve projections derived from SOFR futures and interest-rate swap pricing Each business dayFreely published
Bank quarterly financials — interest expense, earning assets, efficiency ratio FDIC BankFind Suite API (Call Report data, by certificate number) Quarterly, on Call Report releasePublic domain
Historical SOFR Federal Reserve Bank of New York, SOFR reference rates DailyPublic domain

The curve date used for a given quote is printed beside the Price Loan button and again on the results. Quotes produced on different days differ because the curve moves; reproducing a past quote requires the curve as of that date.

Reproducibility and the curve vintage. The tool fetches the curve once per day and serves that snapshot for the rest of the day. The published source may revise a curve intraday, so two quotes carrying the same curve date can differ by a fraction of a basis point if one was priced before a revision and one after. The effect is immaterial to a pricing decision — on a $2.5 million five-year loan it moves total projected interest by tens of dollars — but it means exact reproduction of a prior quote requires the curve snapshot as it stood at that moment, not merely the same calendar date. Print or save the results page when a quote needs to be preserved for a file.

Rounding and precision

All internal arithmetic is carried in full double precision. Rounding occurs only at display: rates to three decimals, dollars to the cent (whole dollars in the income statement). A hand-built Excel model will therefore agree with the tool to within a cent or a tenth of a basis point — not necessarily to the last displayed digit.

2 The Forward Curve — What It Is and How Monthly Rates Are Read From It

A forward curve is the path of future short-term interest rates implied by today’s trading in SOFR futures and interest-rate swaps. It is not a forecast by this tool or by anyone else. It is the rate at which the market will presently contract to lend or borrow at each future date, which makes it the one rate path on which a fixed and a floating loan can be exchanged without either side giving up value. That property is what the entire tool rests on.

The source publishes a projected reset rate for each index on every future business day, roughly twenty years out. The tool needs one rate per loan month:

For loan month m (m = 1, 2, 3, … term): target date = curve date + (m - 1) calendar months forward(m) = the published reset on the date NEAREST the target (an exact tie takes the later date) Beyond the last published date, the final published rate is carried flat.

So forward(1) is today’s rate, forward(2) is the projected reset one month out, and so on. The curve is sampled, never interpolated — every monthly figure is an actual published reset, which keeps the audit trail to a single lookup per month.

Discount factors

Present values are discounted on the index forwards themselves, not on the all-in loan rate. This is the single most important detail when rebuilding the model: discounting at the loan rate would embed the credit spread in the discount factor and distort the comparison the tool exists to make.

DF(0) = 1 DF(m) = DF(m-1) / (1 + forward(m)/1200)

DF(m) discounts a cashflow received at the end of loan month m. The divisor uses 1200 because the rate is an annual percentage and the period is one month (percent ÷ 100 ÷ 12).

Which index

1M Term SOFR and Daily SOFR are read directly from the published curve. WSJ Prime has no futures market — it is an administered rate that banks set, and since the mid-1990s it has moved in lockstep at the fed funds target plus 300 basis points. Its forward path is constructed by the source from the fed funds forward curve plus that administered spread, which is the standard dealer construction.

3 Accrual Conventions and the Payment Schedule

All-in rate

all-in(m) = forward(m) + spread/100 [spread entered in basis points] then, if a collar is set: all-in(m) = MIN( MAX( all-in(m), floor ), ceiling )

Floor and ceiling apply to the all-in rate, not to the index alone. A negative spread is permitted, which is how Prime-minus pricing is entered.

Interest accrual

Actual/360 (default): interest(m) = balance(m) × all-in(m)/100 × days(m)/360 30/360: interest(m) = balance(m) × all-in(m)/100 × 1/12

Under Actual/360, days(m) is the actual number of calendar days in loan month m counted from the curve date (month-ends roll to the last valid day; leap days count). Actual/360 accrues about 365/360 = 1.39% more interest per year than 30/360, which is why it is the default — it is how most commercial notes are written.

Scheduled payment

r = all-in(m) / 1200 n = remaining amortization months PMT = balance × r / ( 1 - (1 + r)^-n ) [Excel: =PMT(r, n, -balance) ] principal(m) = MAX( MIN( PMT - interest(m), balance ), 0 ) payment(m) = interest(m) + principal(m)
Convention worth knowing. The payment formula uses rate/12 even when accrual is Actual/360. That is deliberate and matches bank practice: the note sets a level payment from the monthly-equivalent rate, while interest accrues on actual days. The consequence is that under Actual/360 the interest share of each payment varies with the length of the month, so principal reduction is slightly uneven. The MAX(…, 0) guard prevents negative amortization in a long month.

Phase order: draw, then interest-only, then amortization

Months 1 … D (draw period, D = draw months) balance(m) = amount × m / D [straight-line draw] interest only; no principal Months D+1 … D+IO (interest-only period) balance = full commitment; interest only; no principal Months D+IO+1 … term (amortization) remaining amortization n = amort_months - (m - 1 - IO - D) payment per the PMT formula above If amortization = 0 the loan never amortizes: every month after the draw is interest-only and the full balance is the balloon.

The amortization clock starts at the first amortizing payment, not at origination. A 60-month loan on a 300-month amortization with 24 interest-only months amortizes over a full 300 months beginning in month 25 — it does not compress into the remaining 276 months. Some banks paper it the other way; if yours does, the payment and balloon will differ from this tool and the difference is the convention, not an error.

The balloon is the balance remaining after the final scheduled payment. Floating loans re-amortize every month: each month’s payment is recomputed on the then-current balance, remaining amortization, and that month’s rate, which is standard for monthly-reset commercial loans.

4 The Fixed-Rate Equivalent — Present-Value Matching

The fixed quote is not a markup, a survey, or a judgment call. It is solved: the tool finds the single fixed rate whose cashflows have the same present value, on the same curve, as the projected floating cashflows.

PV(schedule) = Σ( payment(m) × DF(m) ) + balloon × DF(term) m = 1 … term Find R such that: PV( fixed loan at rate R ) = PV( floating loan )

Both legs use the same loan amount, term, amortization, interest-only period, draw schedule, accrual basis, and discount factors. Only the rate differs. Because both structures share the same disbursement schedule, the funding legs cancel and the comparison stays apples-to-apples.

PV is monotone in the rate (a higher fixed rate always means a higher present value), so the solution is unique. The tool finds it by secant iteration — starting from the average forward plus the spread and converging in a handful of steps, to a tolerance of 1×10-7 of the loan amount. In Excel the same answer comes from Goal Seek or Solver, setting the PV difference to zero by changing the fixed rate cell.

Built-in sanity check. On a flat curve the fixed equivalent must equal the curve rate plus the spread exactly. A flat 4.00% curve with a 250 bp spread returns exactly 6.500%. This identity is asserted in the tool’s automated test suite and is the quickest way to confirm a rebuilt model is wired correctly before trusting it on a real curve.

What the fixed-equivalent rate means — and does not mean

The result is the risk-neutral indifference rate: a party who is fully hedged, or indifferent to rate risk, would be equally content with either option at inception. It is not a utility-based or preference-based price. It contains no risk-aversion parameter, so every user who accepts the same curve gets the same answer — which is precisely what makes it auditable.

A genuinely risk-averse borrower may rationally pay above this rate for the certainty a fixed rate provides, and dealers typically charge option value on top of a floor or ceiling beyond the intrinsic effect this tool captures. Those premiums are pricing decisions layered on top of the neutral base computed here; the tool deliberately does not assume them.

Solving in reverse — entering a fixed rate

The same equation can be solved for the other unknown. Selecting “I know the fixed rate” takes the all-in note rate as the input and solves for the spread over the selected index:

Find S such that: PV( floating loan at index + S ) = PV( fixed loan at the entered rate )

Present value rises monotonically with the spread — every month’s payment increases — so the solution is unique, and the relationship is very close to one-for-one: adding 100 bp to the spread raises the implied fixed rate by almost exactly 100 bp. The same secant iteration is used, and the two directions are exact inverses of one another. Entering a fixed rate below the projected index produces a negative spread, which is displayed as index minus the margin.

Why a collar cannot be reversed. A floor or ceiling makes the implied fixed rate saturate. With a 5.00%–7.00% collar on a typical curve, every spread at or above roughly 300 bp produces exactly 7.000%, and every spread at or below roughly zero produces exactly 5.000%. Asked to reverse that, the tool would face fixed rates with no solution at all (anything above 7.000%) and one rate with infinitely many (7.000% itself). Rather than return an arbitrary answer, the floor and ceiling fields are disabled when solving in reverse.

Reported averages

carry(m) = the balance interest actually accrues on in month m average projected floating rate = Σ( all-in(m) × carry(m) ) / Σ carry(m) average index rate = Σ( forward(m) × carry(m) ) / Σ carry(m)

These are balance-weighted, not simple averages, so a draw period or an amortizing balance is properly reflected — months carrying more money count for more. The average index rate is reused in section 8 as the marginal (wholesale) funding proxy.

5 Reproducing the Numbers in Excel — Two Worked Examples

Example A is small enough to check on paper and demonstrates the entire present-value mechanism. Example B is a conventional commercial loan and confirms the flat-curve identity. Both were computed by hand and then verified against the live tool; the agreement is noted beneath each.

Example A — $100,000, 3 months, interest-only, balloon at maturity

Index forwards of 4.00%, 5.00%, 6.00% for months 1–3; spread 200 bp; 30/360 accrual. All-in rates are therefore 6.00%, 7.00%, 8.00%.

MonthIndex forwardAll-in rateInterest BalloonDiscount factorPV of cashflow
14.000%6.000%500.0000— 0.99667774498.3389
25.000%7.000%583.3333— 0.99254215578.9829
36.000%8.000%666.6667100,000.00 0.9876041399,418.8155
Total1,750.0000 2.97682402100,496.1373

Interest is 100,000 × rate/100 × 1/12. Discount factors chain the index forwards: DF(1) = 1/(1+0.04/12), DF(2) = DF(1)/(1+0.05/12), DF(3) = DF(2)/(1+0.06/12).

Because this loan is interest-only, the fixed equivalent has a closed form — no Goal Seek needed:

R = 1200 × [ PV(floating) - balance × DF(3) ] / [ balance × (DF1 + DF2 + DF3) ] = 1200 × [ 100,496.1373 - 98,760.4130 ] / [ 100,000 × 2.97682402 ] = 1200 × 1,735.7243 / 297,682.402 = 6.99695%
Verified. The tool returns 6.997% for these inputs, and total floating interest of $1,750.00 against the hand figure of $1,750.0000 — agreement to the penny and to the displayed precision of the rate.

Example B — $1,000,000, 60-month term, 300-month amortization, flat 4.00% curve, 250 bp spread, 30/360

All-in rate = 4.00 + 2.50 = 6.50% Monthly rate r = 6.50 / 1200 = 0.00541666667 Payment = 1,000,000 × r / (1 - (1+r)^-300) = $6,752.07 [Excel: =PMT(0.065/12, 300, -1000000) ] Month 1 interest = 1,000,000 × 6.50/100 / 12 = $5,416.67 Month 1 principal= 6,752.07 - 5,416.67 = $1,335.40 Balloon (mo. 60) = $905,621.63 Fixed equivalent = 6.500% (flat curve, so exactly index + spread)
Verified. The tool returns a fixed equivalent of 6.5000% and a payment of $6,752.07 — matching the closed-form PMT exactly and confirming the flat-curve identity.

Building the general case in Excel

  1. Column A: loan month, 1 to term.
  2. Column B: index forward for that month, read from the curve per section 2.
  3. Column C: all-in rate — =MIN(MAX(B2+spread,floor),ceiling), or simply =B2+spread with no collar.
  4. Column D: days in the month for Actual/360 — =EOMONTH(start,A2)-EOMONTH(start,A2-1) adjusted to your payment dates; use 30 for 30/360.
  5. Column E: opening balance — the prior row’s closing balance.
  6. Column F: interest — =E2*C2/100*D2/360 (or *1/12 for 30/360).
  7. Column G: payment — =PMT(C2/1200, remaining_amort, -E2), or =F2 during a draw or interest-only month.
  8. Column H: principal — =MAX(MIN(G2-F2,E2),0); closing balance =E2-H2.
  9. Column I: discount factor — =I1/(1+B2/1200), seeded at 1.
  10. Column J: PV — =G2*I2, plus the balloon times the final discount factor.
  11. Solve for the fixed rate with Goal Seek: set (PV of the fixed column minus PV of the floating column) to zero by changing the fixed-rate cell.
Four traps when rebuilding this. (1) Discount on the index forwards, not the all-in rate. (2) The PMT rate is rate/12 even under Actual/360 — only the interest accrual uses actual days. (3) Floating loans re-amortize monthly; do not hold the first payment constant. (4) The amortization clock starts after the draw and interest-only months, not at origination.
6 Rate Scenarios, the Collar, and Breakeven

The scenario table asks what the floating option would cost in total interest if rates ran a stated amount above or below the forward curve, holding the fixed option fixed.

For each shift in { -200, -100, 0, +100, +200 } basis points: shifted forward(m) = MAX( forward(m) + shift/100 , 0 ) rebuild the whole floating schedule on the shifted curve report total interest and the simple average all-in rate The fixed option does not move: it was locked at inception.

The shifted index is floored at zero, and the collar is re-applied after the shift — which is why a collared loan shows scenario averages that stop at the floor and ceiling rather than continuing to move. The 0 bp row is the base case and will differ from the fixed option only by rounding, since that is precisely what the PV match sets equal.

Breakeven

Find the parallel shift S (bisection over -500 … +500 bp) such that: total floating interest on the curve shifted by S = total fixed interest

Reported to the nearest basis point. If no crossing exists within ±500 bp — which happens when a tight collar caps the outcome — the breakeven line is omitted rather than reported inaccurately.

Reading the sign. Scenario results are expressed from the borrower’s perspective: green means the borrower would be better off floating, red means the fixed rate would have been the better choice. A bank holding the loan unhedged experiences the mirror image. A bank that match-funds the loan earns its credit spread either way, which is the whole point of the construction in section 4.
7 Bank Funding Analysis — Cost of Funds and Funding Betas

Entering an FDIC certificate number pulls that institution’s quarterly Call Report data and measures how its cost of funds has historically responded to SOFR. Nothing is stored; the data is public.

Quarterly cost of funds

Call Report interest expense (EINTEXP) is year-to-date, so: Q1: quarterly expense = YTD as reported Q2, Q3, Q4: quarterly expense = YTD(this quarter) - YTD(prior quarter) average earning assets = [ ERNAST(t) + ERNAST(t-1) ] / 2 cost of funds % = 4 × quarterly expense / average earning assets × 100

This is cost of funding earning assets — total interest expense spread over earning assets — annualized by multiplying the quarterly figure by four. Quarters with missing or negative derived expense (which occurs around restatements and mergers) are skipped rather than estimated.

Funding betas

SOFR is averaged over each calendar quarter, aligned to the bank’s quarters, and the changes are regressed — levels would be spurious:

ΔCoF(t) = a + b₀ × ΔSOFR(t) + b₁ × ΔSOFR(t-1) [ordinary least squares] combined beta = b₀ + b₁ repricing lag = b₁ / (b₀ + b₁) clamped to 0 … 1

The combined beta is the share of a SOFR move that eventually reaches the bank’s cost of funds; the repricing lag is the portion of it that arrives the following quarter rather than immediately. The same regression is then run separately on rising and falling quarters:

rising regime: quarters where ΔSOFR(t) + ΔSOFR(t-1) > +0.01 falling regime: quarters where ΔSOFR(t) + ΔSOFR(t-1) < -0.01 Each regime needs at least 8 observations, or it falls back to the combined beta. The overall analysis needs at least 14 overlapping quarters, or it reports nothing.

Separating the regimes matters because deposits famously reprice asymmetrically — slowly on the way up, and often more slowly still on the way down. SOFR history begins in April 2018, so the usable window covers the 2022–23 hiking cycle and the subsequent easing, which is exactly the variation the regression needs.

Projecting cost of funds

For each future quarter, with Δ = SOFR(q) - SOFR(q-1): effective Δ = (1 - lag) × Δ(q) + lag × Δ(q-1) beta = rising beta if effective Δ ≥ 0, else falling beta (clamped to 0 … 1.2 — values outside that range are noise at small institutions) CoF(q) = MAX( CoF(q-1) + beta × effective Δ , 0 ) The forward SOFR path is the quarterly average of the monthly forwards from section 2, projected 20 quarters out.

The projection starts from the bank’s most recently reported cost of funds and walks it forward along the forward curve. Both the projected cost of funds and the forward SOFR path are plotted as dashed lines continuing their historical series, with a divider marking where reported history ends.

What betas can and cannot tell you. These are historical relationships estimated from at most a few dozen quarters, and they assume the bank’s funding mix and pricing behavior stay broadly as they were. A deliberate change in deposit strategy, a large acquisition, or a liquidity event will break the relationship. Treat the projection as a reasoned baseline, not a forecast.
8 The Loan Income Statement and Return on Equity

The income statement expresses the loan as a miniature bank: it earns interest and fees, pays for its funding, absorbs a share of overhead, pays tax, and returns what is left on the equity allocated to it. Every figure is an annual average over the loan term.

average balance = Σ carry(m) / term months interest income = total projected interest / term in years fee income = loan amount × origination fee% / term in years total revenue = interest income + fee income interest expense = (1 - capital ratio) × average balance × funding cost / 100 net revenue = total revenue - interest expense overhead = net revenue × efficiency ratio / 100 pre-tax income = net revenue - overhead income tax = pre-tax income × tax rate / 100 after-tax income = pre-tax income - income tax equity allocated = capital ratio × average balance pre-tax ROE = pre-tax income / equity allocated after-tax ROE = after-tax income / equity allocated

The two funding views

Every column appears twice because the answer depends entirely on which funding cost you charge the loan:

Match funding — why the two options are charged different costs

A bank funding a floating loan rolls short-term money and reprices alongside the loan, so its cost is the balance-weighted average of the index forwards from section 4. A bank funding a fixed loan buys term money to lock the margin and avoid taking rate risk against the loan, so its cost is the par swap rate for that loan’s own amortization schedule — the section 4 solve run at a zero spread.

floating option, marginal cost = Σ( forward(m) × carry(m) ) / Σ carry(m) fixed option, marginal cost = R such that PV( loan at R ) = PV( loan at the index forwards ) i.e. the fixed-equivalent solve with spread = 0

Funding is matched to the loan’s whole cashflow profile rather than to a single point on the curve: every month’s outstanding balance is funded at that month’s rate, so amortization, interest-only periods, draws and the balloon are all reflected without choosing a maturity to look up. On a flat curve the two costs are identical. On an upward-sloping curve term funding prices below rolled short money; on an inverted curve it prices above. Any floor or ceiling on the loan is excluded from both figures — a rate cap on the asset does not change what the bank’s own liabilities cost.

No prepayment assumption. Funding is matched to the contractual schedule. Assuming a prepayment rate would shorten the funding profile and move the answer materially — and not always favourably: on an inverted curve a 20% CPR raises the match-funded cost by roughly 22 bp rather than lowering it. More importantly, prepayment is an option the borrower holds, and this tool does not price options; shortening the funding profile would book the benefit of prepayment while ignoring the reinvestment risk the bank carries when rates fall. Banks that need that protection normally obtain it through yield maintenance or step-down penalties, priced as separate terms rather than assumed here.
Why the marginal view is the honest one for pricing. Blended cost of funds is dominated by existing cheap core deposits that are already deployed in the bank’s current balance sheet. A new loan is funded at the margin — a CD special, an FHLB advance, brokered deposits — which prices near the curve. Pricing against the blended figure makes every loan look rich, wins too many deals in a rising-rate environment, and compresses margin as the deposit base reprices. The gap between the two columns is the economic value of the deposit franchise; it is a real thing, but it is not created by the loan.

Assumptions and their limits

9 Limitations — What This Tool Does Not Do
Every calculation in this tool is deterministic and reproducible. Given the same forward curve and the same inputs, the tool will return the same numbers, and so will a spreadsheet built from section 5. There are no hidden adjustments, no proprietary factors, and no undisclosed assumptions anywhere in the calculation chain.