Floating Rate Bond Price Calculator

Floating Rate Bond Price Calculator body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; line-height: 1.6; color: #333; max-width: 800px; margin: 0 auto; padding: 20px; background-color: #f9fafb; } .calculator-container { background: #fff; padding: 30px; border-radius: 12px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); margin-bottom: 40px; border: 1px solid #e5e7eb; } h1 { text-align: center; color: #111827; margin-bottom: 30px; font-size: 2.2rem; } h2 { color: #374151; margin-top: 30px; border-bottom: 2px solid #e5e7eb; padding-bottom: 10px; } h3 { color: #4b5563; margin-top: 20px; } .input-group { margin-bottom: 20px; } label { display: block; margin-bottom: 8px; font-weight: 600; color: #374151; } input, select { width: 100%; padding: 12px; border: 1px solid #d1d5db; border-radius: 6px; font-size: 16px; box-sizing: border-box; transition: border-color 0.2s; } input:focus, select:focus { outline: none; border-color: #2563eb; box-shadow: 0 0 0 3px rgba(37,99,235,0.1); } .btn-calc { width: 100%; padding: 14px; background-color: #2563eb; color: white; border: none; border-radius: 6px; font-size: 18px; font-weight: 600; cursor: pointer; transition: background-color 0.2s; margin-top: 10px; } .btn-calc:hover { background-color: #1d4ed8; } .result-box { background-color: #f3f4f6; padding: 20px; border-radius: 8px; margin-top: 25px; display: none; border-left: 5px solid #2563eb; } .result-item { display: flex; justify-content: space-between; margin-bottom: 10px; font-size: 16px; } .result-item.total { font-weight: 700; font-size: 20px; color: #111827; border-top: 1px solid #d1d5db; padding-top: 10px; margin-top: 10px; } .article-content { background: #fff; padding: 30px; border-radius: 12px; box-shadow: 0 2px 4px rgba(0,0,0,0.05); } .info-box { background-color: #e0f2fe; border-left: 4px solid #0284c7; padding: 15px; margin: 20px 0; color: #0c4a6e; } @media (max-width: 600px) { .calculator-container, .article-content { padding: 20px; } }

Floating Rate Bond Price Calculator

The benchmark rate (e.g., SOFR, LIBOR, Euribor)
The spread fixed in the bond contract (e.g., +50 bps = 0.50%)
The spread currently demanded by the market
Annual (1/year) Semi-Annual (2/year) Quarterly (4/year) Monthly (12/year)
Estimated Bond Price:
Price (% of Par):
Next Coupon Payment:
Valuation Status:

Understanding Floating Rate Bond Pricing

A Floating Rate Note (FRN) is a debt instrument with a variable interest rate that resets periodically based on a benchmark index. Unlike fixed-rate bonds, the price of a floating rate bond typically exhibits lower volatility because the coupon payments adjust to changing market interest rates.

Core Concept: If the market's required spread (Discount Margin) equals the bond's fixed spread (Quoted Margin), the bond should theoretically trade at Par (100).

Key Components of Valuation

To accurately calculate the price of a floating rate bond, we must look at the relationship between the coupon the bond pays and the discount rate the market applies.

  • Face Value (Par): The principal amount returned at maturity.
  • Reference Rate: The underlying index (e.g., SOFR, LIBOR) that fluctuates with the market.
  • Quoted Margin (QM): The fixed spread added to the reference rate to determine the coupon payment. This is set when the bond is issued.
  • Discount Margin (DM): The spread investors currently demand over the reference rate to hold the bond. This reflects the issuer's current credit risk.

The Pricing Logic

This calculator uses the Discount Margin method. The pricing logic follows these steps:

  1. Determine Cash Flows: Future coupons are estimated by adding the Quoted Margin to the current Reference Rate. (Note: In sophisticated modeling, forward rates are used, but for spot valuation, the current reference rate is often held constant).
  2. Determine Discount Rate: The cash flows are discounted using the Reference Rate plus the Discount Margin (the market's required yield).
  3. Sum of Present Values: The price is the sum of the present value of all future coupon payments plus the present value of the face value repayment.

Example Calculation

Imagine a bond with a $1,000 Face Value maturing in 2 years.

  • Reference Rate: 5.00%
  • Quoted Margin: 0.50% (Bond pays Ref + 0.50% = 5.50%)
  • Discount Margin: 1.00% (Market demands Ref + 1.00% = 6.00%)

Since the market demands a higher return (6.00%) than the bond is contractually obligated to pay (5.50%), the bond will trade at a discount (below $1,000) to compensate the investor for the lower coupon payments.

Interpretation of Results

  • Trading at Par: When Quoted Margin = Discount Margin.
  • Trading at Discount: When Discount Margin > Quoted Margin (Credit risk has likely increased).
  • Trading at Premium: When Discount Margin < Quoted Margin (Credit risk has likely decreased).
function calculateBondPrice() { // Get input values var faceValue = parseFloat(document.getElementById('faceValue').value); var refRate = parseFloat(document.getElementById('referenceRate').value); var quotedMargin = parseFloat(document.getElementById('quotedMargin').value); var discountMargin = parseFloat(document.getElementById('discountMargin').value); var years = parseFloat(document.getElementById('yearsToMaturity').value); var freq = parseInt(document.getElementById('resetFrequency').value); // Validation if (isNaN(faceValue) || isNaN(refRate) || isNaN(quotedMargin) || isNaN(discountMargin) || isNaN(years)) { alert("Please enter valid numbers for all fields."); return; } // Logic Preparation // Convert percentages to decimals var rRateDecimal = refRate / 100; var qmDecimal = quotedMargin / 100; var dmDecimal = discountMargin / 100; // Total number of periods var totalPeriods = years * freq; // Periodic Rates // Coupon Rate per period = (Ref + QM) / Frequency var periodicCouponRate = (rRateDecimal + qmDecimal) / freq; // Discount Rate per period = (Ref + DM) / Frequency var periodicDiscountRate = (rRateDecimal + dmDecimal) / freq; // Cash Flow Calculation (Payment per period) var couponPayment = faceValue * periodicCouponRate; // Present Value Calculation var pvCoupons = 0; // Loop through all periods to discount the coupons for (var i = 1; i <= totalPeriods; i++) { pvCoupons += couponPayment / Math.pow(1 + periodicDiscountRate, i); } // Discount the Face Value (Principal) var pvFaceValue = faceValue / Math.pow(1 + periodicDiscountRate, totalPeriods); // Total Price var totalPrice = pvCoupons + pvFaceValue; // Price as Percent of Par var percentOfPar = (totalPrice / faceValue) * 100; // Determine Status var status = ""; if (Math.abs(percentOfPar – 100) < 0.01) { status = "Trading at Par"; } else if (percentOfPar < 100) { status = "Trading at Discount"; } else { status = "Trading at Premium"; } // Display Results var resultBox = document.getElementById('result'); resultBox.style.display = 'block'; // Format numbers document.getElementById('displayPrice').innerHTML = "$" + totalPrice.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); document.getElementById('displayPercentPar').innerHTML = percentOfPar.toFixed(3) + "%"; document.getElementById('displayCoupon').innerHTML = "$" + couponPayment.toFixed(2); document.getElementById('displayStatus').innerHTML = status; // Color coding status var statusEl = document.getElementById('displayStatus'); if (status === "Trading at Discount") { statusEl.style.color = "#dc2626"; // Red } else if (status === "Trading at Premium") { statusEl.style.color = "#16a34a"; // Green } else { statusEl.style.color = "#111827"; // Black } }

Leave a Comment