.sofr-calculator-container {
max-width: 800px;
margin: 0 auto;
padding: 20px;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
color: #333;
background-color: #f9f9f9;
border: 1px solid #e0e0e0;
border-radius: 8px;
}
.sofr-header {
text-align: center;
margin-bottom: 25px;
}
.sofr-header h2 {
margin: 0;
color: #004085;
}
.calc-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
}
@media (max-width: 600px) {
.calc-grid {
grid-template-columns: 1fr;
}
}
.input-group {
margin-bottom: 15px;
}
.input-group label {
display: block;
margin-bottom: 5px;
font-weight: 600;
font-size: 0.95rem;
}
.input-group input, .input-group select {
width: 100%;
padding: 10px;
border: 1px solid #ccc;
border-radius: 4px;
font-size: 1rem;
box-sizing: border-box;
}
.input-group .help-text {
font-size: 0.8rem;
color: #666;
margin-top: 2px;
}
.calculate-btn {
grid-column: 1 / -1;
background-color: #0056b3;
color: white;
border: none;
padding: 15px;
font-size: 1.1rem;
font-weight: bold;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.3s;
width: 100%;
}
.calculate-btn:hover {
background-color: #004494;
}
.results-section {
grid-column: 1 / -1;
background-color: #fff;
border: 1px solid #ddd;
border-radius: 4px;
padding: 20px;
margin-top: 20px;
display: none;
}
.results-section.visible {
display: block;
}
.result-row {
display: flex;
justify-content: space-between;
padding: 10px 0;
border-bottom: 1px solid #eee;
}
.result-row:last-child {
border-bottom: none;
font-weight: bold;
font-size: 1.2rem;
color: #0056b3;
}
.result-label {
color: #555;
}
.result-value {
font-weight: 700;
}
.article-content {
max-width: 800px;
margin: 40px auto;
line-height: 1.6;
color: #444;
}
.article-content h2 {
color: #222;
margin-top: 30px;
}
.article-content h3 {
color: #444;
margin-top: 20px;
}
.article-content ul {
background: #f0f7ff;
padding: 20px 40px;
border-radius: 5px;
}
.article-content li {
margin-bottom: 10px;
}
Understanding SOFR Fallback Rates
The transition away from the London Interbank Offered Rate (LIBOR) has fundamentally changed how variable interest rates are calculated in financial contracts. When USD LIBOR ceased publication, legacy contracts containing "fallback language" automatically transitioned to the Secured Overnight Financing Rate (SOFR).
The Mathematical Challenge
LIBOR was an unsecured rate that included a credit risk premium of the lending bank. SOFR is a secured, risk-free overnight rate. Historically, LIBOR was higher than SOFR. To prevent a transfer of value from lenders to borrowers during the transition, a Spread Adjustment is added to the SOFR rate.
ISDA Fixed Spread Adjustments
On March 5, 2021, the FCA announced the cessation of LIBOR, which fixed the spread adjustments for USD LIBOR fallbacks based on the 5-year median difference between LIBOR and compounded SOFR. These values are static and do not change:
- 1-Month Tenor: 0.11448% (11.448 bps)
- 3-Month Tenor: 0.26161% (26.161 bps)
- 6-Month Tenor: 0.42826% (42.826 bps)
- 12-Month Tenor: 0.71513% (71.513 bps)
How to Calculate the All-In Rate
The calculation for the new fallback rate generally follows this formula:
Total Rate = Base SOFR (Term or Daily Simple) + ISDA Spread Adjustment + Contractual Credit Margin
For example, if the current 1-Month Term SOFR is 5.30%, the fallback for a legacy 1-Month LIBOR loan would be 5.30% + 0.11448% = 5.41448%, before adding your specific credit agreement margin (e.g., L+250 bps).
Using This Calculator
This tool allows corporate treasurers, controllers, and financial analysts to quickly verify interest rate resets. Enter the current base SOFR rate (available from the CME Group or NY Fed), select the tenor that matches your original LIBOR contract to apply the correct static spread adjustment, and input your credit margin to determine the final accrual rate.
// Handle Custom Spread Toggle
document.getElementById('tenorSelect').onchange = function() {
var val = document.getElementById('tenorSelect').value;
var customDiv = document.getElementById('customSpreadGroup');
if(val === 'custom') {
customDiv.style.display = 'block';
} else {
customDiv.style.display = 'none';
}
};
function calculateFallback() {
// 1. Get Inputs
var baseSofr = parseFloat(document.getElementById('baseSofr').value);
var tenor = document.getElementById('tenorSelect').value;
var margin = parseFloat(document.getElementById('creditSpread').value);
var notional = parseFloat(document.getElementById('notionalAmount').value);
// Validation check
if (isNaN(baseSofr)) {
alert("Please enter a valid Base SOFR rate.");
return;
}
if (isNaN(margin)) {
margin = 0; // Default to 0 if empty
}
// 2. Determine Spread Adjustment
var spreadAdj = 0;
if (tenor === '1M') spreadAdj = 0.11448;
else if (tenor === '3M') spreadAdj = 0.26161;
else if (tenor === '6M') spreadAdj = 0.42826;
else if (tenor === '12M') spreadAdj = 0.71513;
else if (tenor === 'custom') {
spreadAdj = parseFloat(document.getElementById('customSpread').value);
if (isNaN(spreadAdj)) spreadAdj = 0;
}
// 3. Calculate Total
var totalRate = baseSofr + spreadAdj + margin;
// 4. Calculate Interest (if Notional provided)
var interestAmount = 0;
var hasNotional = !isNaN(notional) && notional > 0;
if (hasNotional) {
// Simple interest calculation: Notional * (Rate/100)
interestAmount = notional * (totalRate / 100);
}
// 5. Display Results
document.getElementById('displayBase').innerText = baseSofr.toFixed(5) + "%";
document.getElementById('displaySpread').innerText = spreadAdj.toFixed(5) + "%";
document.getElementById('displayMargin').innerText = margin.toFixed(2) + "%";
document.getElementById('displayTotal').innerText = totalRate.toFixed(5) + "%";
var interestRow = document.getElementById('interestRow');
if (hasNotional) {
interestRow.style.display = 'flex';
// Format currency
var formatter = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
});
document.getElementById('displayInterest').innerText = formatter.format(interestAmount);
} else {
interestRow.style.display = 'none';
}
document.getElementById('results').className = "results-section visible";
}