Lenders of FHA Adjustable Rate Mortgages (ARMs) must calculate rate adjustments using a specific formula: Index + Margin. This sum is known as the "Fully Indexed Rate." However, the final interest rate applied to the borrower is subject to contractual caps that prevent the rate from jumping too high in a single period or over the life of the loan.
Most modern FHA ARMs use the 30-day Average SOFR (Secured Overnight Financing Rate) as the index. Previously, the London Interbank Offered Rate (LIBOR) was used, but it has been phased out in favor of SOFR for all new FHA loan originations.
The Components of the Calculation
Index: The variable market rate. For FHA, this is usually the weekly average yield on U.S. Treasury securities (CMT) or SOFR.
Margin: A fixed percentage point amount added to the index by the lender. This remains constant for the life of the loan (commonly 2.25%).
Initial Cap: The maximum the rate can change during the very first adjustment period.
Periodic Cap: The maximum the rate can change during subsequent adjustment periods (usually annually).
Lifetime Cap: The maximum total interest rate increase allowed over the original starting rate.
Example Calculation
Imagine an FHA 5/1 ARM with the following terms:
Current Rate: 4.00%
Index (SOFR): 5.00%
Margin: 2.25%
Periodic Cap: 1.00%
1. Fully Indexed Rate: 5.00% (Index) + 2.25% (Margin) = 7.25%.
2. Proposed Increase: 7.25% – 4.00% = 3.25%.
3. Applying Caps: Since the periodic cap is 1.00%, the rate can only rise to 5.00% (4.00% + 1.00%), even though the market index suggests a higher rate.
FHA Specific Rules
FHA offers several ARM products, including 1, 3, 5, 7, and 10-year versions. For 1 and 3-year ARMs, the annual cap is typically 1%. For 5, 7, and 10-year ARMs, the initial adjustment cap may be higher (often 2%), providing borrowers with a period of stability before the first adjustment occurs.
function calculateFhaAdjustment() {
var currentRate = parseFloat(document.getElementById("currentRate").value);
var indexValue = parseFloat(document.getElementById("indexValue").value);
var margin = parseFloat(document.getElementById("margin").value);
var adjustmentType = document.getElementById("adjustmentType").value;
var periodicCap = parseFloat(document.getElementById("periodicCap").value);
var lifetimeCap = parseFloat(document.getElementById("lifetimeCap").value);
var initialRate = parseFloat(document.getElementById("initialRate").value);
if (isNaN(currentRate) || isNaN(indexValue) || isNaN(margin) || isNaN(periodicCap) || isNaN(lifetimeCap) || isNaN(initialRate)) {
alert("Please enter valid numerical values for all fields.");
return;
}
// 1. Calculate Fully Indexed Rate
var fullyIndexedRate = indexValue + margin;
// 2. Calculate Lifetime Maximum and Minimum
var lifetimeMax = initialRate + lifetimeCap;
// FHA ARMs usually have a floor equal to the margin
var lifetimeMin = margin;
// 3. Determine potential rate based on periodic cap
var maxPossibleAdjustment = currentRate + periodicCap;
var minPossibleAdjustment = currentRate – periodicCap;
var cappedRate = fullyIndexedRate;
// Apply Periodic Cap
if (cappedRate > maxPossibleAdjustment) {
cappedRate = maxPossibleAdjustment;
} else if (cappedRate lifetimeMax) {
cappedRate = lifetimeMax;
}
// Apply Floor (Margin)
if (cappedRate = 0 ? "+" : "";
// Display results
document.getElementById("fullyIndexedResult").innerText = fullyIndexedRate.toFixed(3);
document.getElementById("cappedRateResult").innerText = cappedRate.toFixed(3);
document.getElementById("changeResult").innerText = changeSign + change.toFixed(3);
var note = "";
if (fullyIndexedRate > cappedRate) {
note = "The new rate was limited by the " + (cappedRate === lifetimeMax ? "Lifetime Cap" : "Periodic Cap") + ".";
} else if (fullyIndexedRate < cappedRate) {
note = "The rate decrease was limited by the Periodic Cap or Lender Margin.";
} else {
note = "The new rate is the full Index + Margin.";
}
document.getElementById("logicNote").innerText = note;
document.getElementById("fhaResults").style.display = "block";
}