Bond yield calculator
A bond with a face of 1,000, a 5% coupon and 10 years left, bought at 1,000, yields exactly 5% to maturity: at par, yield equals the coupon. Enter your own price to see how a discount or premium moves it. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Face value
- 1,000
- Coupon rate
- 5
- Current price
- 1,000
- Years to maturity
- 10
- Coupon payment
- 50
- Yield percent
- 5
- Yield decimal
- 0.05
- Current yield percent
- 5
Bond yield to maturity is the single annualized rate that sets the present value of a bond's remaining coupons and its face payment equal to the price you would pay today. Students, advisors, and product teams need that rate from four numbers — face value, coupon rate, current price, and years to maturity — without opening a spreadsheet or a full fixed-income library. This bond yield calculator solves the classic annual-coupon identity for y, returns the annualized yield as a percent and as a decimal, and also reports the annual coupon amount and the current yield (coupon over price).
What bond yield to maturity means
Yield to maturity is the single constant annual rate that makes the present value of a coupon bond's remaining cash flows equal to the market price you would pay today. Those cash flows are the annual coupon — face value times the coupon rate as a percent, divided by one hundred — paid once per year for the remaining life, plus the face (par) amount repaid at maturity.
If you hold the bond to maturity, reinvest coupons at that same rate, and receive face on schedule, the realized annualized return equals the yield this calculator reports. When the bond trades at par, current price equals face and yield equals the coupon rate. When it trades at a discount, price is below face and yield is higher than the coupon, because the holder also earns the pull to par.
When it trades at a premium, price is above face and yield is lower than the coupon, because part of each coupon is offset by the write-down toward par. A zero-coupon bond is the special case of a zero coupon rate: the only cash flow is face at maturity, so yield is the annualized discount from price to face. The model uses annual compounding and an annual coupon annuity; it does not apply day-count conventions, semi-annual municipal quoting, dirty versus clean price, or credit-spread decomposition.
What you enter and what you get back
When the coupon is zero the identity collapses to the closed form y equals face over price to the one over n, minus one. When price equals face, y equals the coupon rate as a decimal. The solver uses Newton iteration from the standard average-coupon-plus-amortization guess, then a bounded bisection on y greater than minus one if needed, so the result is deterministic and independent of clocks or randomness.
Example: face one thousand, coupon five, price one thousand, years ten yields five percent to maturity and a current yield of five percent — the par identity.
What you can do with it
Classroom and exam checks
Verify textbook yield-to-maturity answers for par, discount, premium, and zero-coupon bonds from face, coupon, price, and years.
Product and portfolio widgets
Show investors the annualized yield to maturity next to a quoted screen price on calculator pages and onboarding flows.
FAQ
How is the bond yield to maturity calculated?
A zero coupon uses y = (F/P)^(1/n) − 1. A par bond (price equals face) yields the coupon rate.
What happens if the current price is zero or negative?
Yield to maturity is not defined for a non-positive market price, and failed validation is not billed.
Why is the yield higher than the coupon when a bond trades below face value?
Because on top of the coupons you also gain the difference between the lower price and the face value repaid at maturity. Above face the opposite happens: part of each coupon is offset by that loss, so the yield is lower than the coupon.
What is the difference between yield to maturity and current yield?
Current yield is simply the annual coupon divided by today's price. It ignores the gain or loss as the price moves to face value by maturity, which yield to maturity includes. You get both, so you can see the gap.
Can I work out the yield of a zero-coupon bond?
Yes. Enter a coupon rate of zero. The only payment is then the face value at maturity, so the yield is the annual growth rate that turns today's price into that face value over the years left.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/fin/bond-yield \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"face_value":1000,"coupon_rate":5,"current_price":950,"years_to_maturity":10}'const res = await fetch("https://api.kit.forhosting.com/fin/bond-yield", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"face_value": 1000,
"coupon_rate": 5,
"current_price": 950,
"years_to_maturity": 10
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/bond-yield",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"face_value": 1000,
"coupon_rate": 5,
"current_price": 950,
"years_to_maturity": 10
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/bond-yield", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"face_value":1000,"coupon_rate":5,"current_price":950,"years_to_maturity":10}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"face_value":1000,"coupon_rate":5,"current_price":950,"years_to_maturity":10}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/bond-yield", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"face_value": 1000,
"coupon_rate": 5,
"current_price": 950,
"years_to_maturity": 10
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.bond_yield",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
A current price that is not positive is rejected with invalid_input and is not billed.
What bond yield to maturity means
Current yield is a different, simpler ratio — the annual coupon divided by the current price — and does not account for the gain or loss to par; this endpoint returns both so you can see the gap. It answers the core question students, advisors, and product pages search for as bond yield or yield to maturity: given face, coupon, price, and years, what is the annualized yield.
Input contract, formula, and response fields
POST a JSON body with four required finite numbers. face_value is the par amount repaid at maturity and must be greater than zero (aliases: face, par, par_value). coupon_rate is the annual coupon as a percent — five means five percent per year, not a decimal fraction — and must be greater than or equal to zero (aliases: coupon, coupon_percent). current_price is the present market price in the same currency units as face and must be strictly positive; zero or a negative price is rejected with invalid_input naming current_price and is not billed (aliases: price, market_price). years_to_maturity is the remaining life in years, greater than zero and at most two hundred; fractional years are allowed so a six-month remainder can be entered as zero point five (aliases: years, maturity, n). The engine forms the annual coupon C as face_value times coupon_rate over one hundred, then solves the identity price equals C times one minus one plus y to the minus n, all over y, plus face over one plus y to the n, for the unknown annualized yield y. The response echoes the four inputs, coupon_payment, yield_percent (y times one hundred, half-up to six decimals), yield_decimal (y half-up to eight decimals), current_yield_percent (coupon over price times one hundred), and a short formula string. Missing fields, empty strings, non-finite values, a non-positive current price, a negative coupon rate, or years outside the accepted range fail with invalid_input.
Where a bond yield calculator earns its keep
Wealth, treasury, and brokerage tooling often quotes a simple annualized yield next to a screen price when the full schedule is not yet loaded, or when a product landing only has face, coupon, price, and remaining years. Interview and homework generators require a deterministic oracle that marks a wrong yield and rejects a non-positive current price instead of returning NaN or a silent empty object. Use it when the question is the simple annualized bond yield, and layer richer analytics in your own service when you need them. Sweep current_price or years_to_maturity in a loop from your own code to build a price-yield curve for a fixed coupon; pin yield_percent in tests; keep requests small. This tool does not produce Macaulay duration, modified duration, convexity, semi-annual bond-equivalent yield, or multi-curve discounting — only the annual-compounding yield that sets the coupon-bond present value equal to the price you entered.
Integration use cases
Price-yield scenario sweeps
Loop current_price or years_to_maturity to build a simple annual yield curve for a fixed coupon without a full bond library.
Technical questions
What units should I use for coupon rate, price, and maturity?
coupon_rate is a percent per year (5 means 5%, not 0.05). current_price and face_value share the same currency units. years_to_maturity is in years and may be fractional (0.5 for six months).
Is current yield the same as yield to maturity?
No. current_yield_percent is the annual coupon divided by the current price. yield_percent is the internal rate of return that also accounts for the gain or loss from today's price back to face at maturity.
What does the bond yield calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.