Effective annual yield
A 2% return over one quarter compounds to about 8.24% a year, not 8%, because each quarter's gain keeps earning in the next. Enter the yield for one holding period and how many such periods fit in a year. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Holding period yield
- 2
- Periods per year
- 4
- Holding period yield decimal
- 0.02
- Effective annual yield
- 0.08243216
- Effective annual yield percent
- 8.243216
Quoted yields on bills, notes, and other short-term instruments are often holding-period yields: the return earned over one coupon window, one quarter, or the remaining life of a money-market claim. Comparing those figures to a bond yield, a savings APY, or another product that compounds on a different calendar is misleading until you restate them on a common annual scale. Effective annual yield does that restatement with compounding: EAY equals one plus the holding-period yield, raised to the number of such periods in a year, minus one. A two-percent quarterly holding-period yield is not eight percent a year; four compounded periods produce about 8.24 percent.
What effective annual yield means and how the formula compounds
Holding-period yield is the percentage or decimal change in value over one discrete interval: the three months until a Treasury bill matures, the six months between coupon dates, or any other restated period the product actually uses. It answers how much you earned in that window, not how that window compares with a year. Nominal shortcuts such as multiplying a quarterly yield by four ignore intra-year compounding and understate the true annual rate whenever the periodic yield is positive.
Effective annual yield restores compounding. Write HPY for the holding-period yield as a decimal ratio and m for how many of those periods fit in one year. Then EAY equals one plus HPY, raised to m, minus one.
If a three-month instrument returns two percent, HPY is 0.02 and m is 4, so EAY is 1.02 to the fourth minus one, which is 0.08243216 or 8.243216 percent, not the eight percent a linear annualization would quote. When m equals one, EAY equals HPY because the holding period is already a year. When HPY is zero, EAY is zero.
When HPY is negative but still greater than minus one hundred percent, EAY is negative and describes a compounded annual decline. A holding-period yield of minus one hundred percent or worse would make one plus HPY zero or negative, which this identity cannot compound, so the calculator rejects that case instead of returning a non-finite result. Periods per year must be strictly positive: zero is not a frequency, and a negative m would invert the growth factor into a calendar that does not exist.
Where an effective annual yield calculator earns its keep
CFA candidates and fixed-income desks use an effective annual yield calculator when a money-market quote, a T-bill holding-period return, or a coupon-period yield must be restated to a yearly compounded rate that can sit beside a bond YTM or a savings APY. Product and treasury teams compare quarterly, monthly, and daily instruments on one screen without multiplying by m and pretending that is compounding.
Educators teaching the difference between holding-period yield, bank-discount yield, nominal APR, and effective annual yield can seed classroom examples that show two percent a quarter compounding to 8.24 percent a year, then show the hard fail when someone types a zero frequency. Failed validation does not consume balance. Keep requests small, pin the rounded yields in tests, and you get a reproducible EAY for homework, LMS plugins, and edge workers without standing up a spreadsheet Goal Seek or a full fixed-income library of your own.
What you can do with it
Restate a money-market holding-period yield
Turn a T-bill or commercial-paper holding-period return and the periods in a year into a compounded effective annual yield you can compare with a bond or a savings APY.
Classroom and CFA-style checks
Verify EAY = (1 + HPY)^m − 1 for quarterly, semiannual, and monthly examples, including the required fail when periods per year is zero or negative.
Product and treasury comparisons
Normalize coupon-period or payment-period yields from different calendars onto one annual compounded scale in reports and APIs.
FAQ
How is effective annual yield calculated from a holding-period yield?
EAY = (1 + HPY)^m − 1, where HPY is the holding-period yield as a decimal and m is the number of those periods in a year. The calculator also returns the same rate as a percent.
Why is a quarterly 2% yield not 8% a year?
Linear annualization multiplies 2% by four and ignores compounding. (1.02)^4 − 1 is 0.08243216, or about 8.24%, which is the effective annual yield.
What is a holding-period yield?
It is what an investment earns over one specific interval: the three months until a Treasury bill matures, the six months between coupon dates, or another period the product uses. It tells you the gain in that window, not its yearly equivalent.
How many periods per year should I enter?
The number of holding periods that fit in one year: 1 for annual, 2 for semiannual, 4 for quarterly, 12 for monthly, 52 for weekly and 365 for daily. It must be greater than zero; fractions are allowed if your period needs them.
Can the holding-period yield be negative?
Yes, as long as it stays above minus 100%. A negative yield gives a negative effective annual yield, a compounded yearly decline. A loss of 100% or more cannot be compounded and is rejected.
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/effective-annual-yield \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"holding_period_yield":2,"periods_per_year":4}'const res = await fetch("https://api.kit.forhosting.com/fin/effective-annual-yield", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"holding_period_yield": 2,
"periods_per_year": 4
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/effective-annual-yield",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"holding_period_yield": 2,
"periods_per_year": 4
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/effective-annual-yield", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"holding_period_yield":2,"periods_per_year":4}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"holding_period_yield":2,"periods_per_year":4}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/effective-annual-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
{
"holding_period_yield": 2,
"periods_per_year": 4
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.effective_annual_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
This calculator accepts the periodic yield and the number of periods per year, returns the annualized yield as a decimal and as a percent, and rejects a zero or negative period count with invalid_input so a bad calendar never silently becomes an infinite rate.
Input contract, response shape, and error behaviour
If one plus the decimal holding-period yield is not strictly positive, compounding is undefined and the task fails. POST a JSON body with two required finite numbers: holding_period_yield and periods_per_year. By default holding_period_yield is a percent—two means a two percent holding-period yield. Set as_percent to false to pass a decimal ratio instead (0.02 for the same two percent). periods_per_year is how many such holding periods fit in one year: 1 for annual, 2 for semiannual, 4 for quarterly, 12 for monthly, 52 for weekly, 365 for daily. It must be a finite number strictly greater than zero; fractional frequencies are allowed if your restatement uses them. An optional decimals integer from 0 through 12 (default 8) controls half-up rounding applied once to holding_period_yield_decimal, effective_annual_yield, and effective_annual_yield_percent. Aliases accepted for the yield are hpy and periodic_yield; aliases for the frequency are m and frequency. Each numeric field may arrive as a JSON number or as a numeric string. Missing fields, empty strings, booleans, and non-finite values fail with invalid_input naming the field and are not billed. On success the body echoes holding_period_yield, periods_per_year, and as_percent; returns holding_period_yield_decimal (the HPY used in the power); effective_annual_yield as a decimal ratio; effective_annual_yield_percent as that rate times one hundred; and a formula string restating eay = (1 + hpy)^m - 1. Example: holding_period_yield 2 with periods_per_year 4 yields an effective annual yield of 0.08243216, or 8.243216 percent.
Where an effective annual yield calculator earns its keep
Automation that already stores a periodic return and a payment calendar can POST those two numbers and pin effective_annual_yield in tests instead of re-deriving the power in every service.
Technical questions
What happens if periods per year is zero or negative?
The task fails with invalid_input. A non-positive periods_per_year is not a compounding frequency, so the request is rejected and is not billed.
Should I enter the holding-period yield as a percent or a decimal?
By default as_percent is true, so 2 means 2%. Set as_percent to false to pass a decimal ratio such as 0.02 for the same yield.
What does the effective annual 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.