Forward premium calculator
A spot rate of 1.20 and a 90-day forward of 1.23 differ by 0.025, which annualizes to a forward premium of 0.10, or 10% a year on a 360-day basis. A forward below spot shows as a discount. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Spot rate
- 1.2
- Forward rate
- 1.23
- Days
- 90
- Year basis
- 360
- Raw premium
- 0.025
- Premium
- 0.1
- Premium percent
- 10
The annualized forward premium (or discount) measures how far a forward foreign-exchange rate sits above or below the matching spot rate, scaled to a 360-day money-market year so tenors of different length can be compared. Treasurers, FX desks, and exam candidates need that figure as a decimal they can drop into a model, not a percent they have to remember to divide by one hundred. This forward premium calculator accepts a finite spot rate, a finite forward rate, and a positive contract tenor in days, then returns p equals (F minus S) over S times 360 over days. When the spot rate is zero the identity is undefined; when days is not positive there is no tenor to annualize.
What the annualized forward premium means and how the 360-day formula works
The annualized forward premium is the money-market way to quote how much a forward foreign-exchange rate differs from the spot rate on a comparable yearly basis. A ninety-day forward that sits two and a half percent above spot is not a two-and-a-half percent annual premium: it is a ten percent annualized premium because that two-and-a-half percent would accrue four times in a 360-day year.
The identity this calculator evaluates is p equals (F minus S) divided by S, times 360 divided by days, where F is the outright forward, S is the spot, and days is the remaining contract tenor. The 360-day year is the FX and money-market convention used in CFA-style forward-premium questions and on most dealer blotters; it is not a 365-day calendar year and it is not an actual-over-actual day-count.
A positive p means the forward is above spot (a forward premium); a negative p means the forward is below spot (a forward discount); a zero p means the two rates are equal (par). The result is a decimal, so 0.10 is ten percent per year, matching how interest rates enter a spreadsheet. This page does not imply covered-interest parity, does not interpolate a forward curve, and does not convert pips into an outright; it only annualizes the simple relative gap (F minus S) over S.
Where a forward premium calculator earns its keep
FX desks and corporate treasuries use a forward premium calculator when they need a single annualized number to compare a one-month outright with a three-month outright, or to explain why a quoted forward is at a premium or a discount versus spot. Exam-prep generators and CFA-style homework need a deterministic oracle that rejects a zero spot and a non-positive tenor instead of silently showing Infinity that a buggy grader might treat as success.
Keep requests small, pin rounded premium in tests, and you get reproducible forward-premium figures for worksheets, LMS plugins, and edge workers without standing up a spreadsheet service of your own. When you later need a discount rate from present and future value, switch to that identity rather than stretching this three-field FX contract.
What you can do with it
Compare outrights of different tenor on one annualized scale
Turn a spot, a forward, and remaining days into a signed decimal premium so a 30-day outright and a 90-day outright can be ranked on the same 360-day year.
Classroom and CFA-style answer keys
Generate reproducible p = ((F − S) / S) × (360 / days) keys that reject a zero spot and a non-positive tenor instead of printing Infinity.
FAQ
How is the annualized forward premium calculated?
The identity is p = ((F − S) / S) × (360 / days), where F is the outright forward, S is the spot, and days is the contract tenor.
Why does it use a 360-day year?
It is the money-market convention used for FX forwards on most dealer blotters and in CFA-style questions. It is not a 365-day calendar year or an actual-over-actual day count, so results match how desks quote.
What does a negative result mean?
The forward is below spot, so it trades at a forward discount. A positive result is a forward premium, and zero means the two rates are equal, which is called par.
Do I enter the contract length in days or years?
In calendar days left to settlement. A 90-day forward is entered as 90, not as 0.25 years. The tenor must be greater than zero, otherwise there is nothing to annualize.
Does it apply interest rate parity?
No. It only annualizes the simple relative gap between forward and spot. It does not imply covered interest parity, build a forward curve or convert pips into an outright rate.
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/forward-premium \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"spot_rate":1.2,"forward_rate":1.23,"days":90}'const res = await fetch("https://api.kit.forhosting.com/fin/forward-premium", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"spot_rate": 1.2,
"forward_rate": 1.23,
"days": 90
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/forward-premium",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"spot_rate": 1.2,
"forward_rate": 1.23,
"days": 90
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/forward-premium", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"spot_rate":1.2,"forward_rate":1.23,"days":90}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"spot_rate":1.2,"forward_rate":1.23,"days":90}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/forward-premium", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"spot_rate": 1.2,
"forward_rate": 1.23,
"days": 90
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.forward_premium",
"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
Those cases fail with invalid_input and are not billed.
Input contract, zero spot, non-positive days, and the response shape
The two contracted domain errors are a spot rate of zero and a tenor that is not positive. Finite negative forwards are allowed: the formula is a relative gap, and a negative premium is a discount, not an error. Failed validation does not consume balance. POST a JSON body with three required finite numbers. spot_rate is the current outright spot (aliases spot, S, and spot_price). forward_rate is the outright forward for the contract tenor (aliases forward, F, fwd, and forward_price). days is the contract tenor in calendar days remaining to settlement (aliases contract_days, tenor_days, n, and days_to_maturity) and must be strictly greater than zero; a ninety-day forward uses 90, not 0.25 years. Each field may arrive as a JSON number or a numeric string; missing fields, empty strings, infinities, and non-numeric values fail with invalid_input naming the field and are not billed. On success the body echoes the three inputs, reports year_basis as 360, returns raw_premium as the unannualized (F minus S) over S, premium as the annualized decimal, premium_percent as that decimal times one hundred, kind as premium, discount, or par, and a formula string restating the identity. Example: spot 1.20, forward 1.23, days 90 yields raw_premium 0.025 and premium 0.10.
Where a forward premium calculator earns its keep
Product teams wire the same contract into onboarding demos so a user who types 1.20, 1.23, and 90 sees the identical premium the API will later return in production tests.
Integration use cases
Product demos and CI fixtures
Seed comparison widgets and automated tests with deterministic premium values that match the free browser widget byte-for-byte.
Technical questions
Is the result a percent or a decimal?
A decimal. A premium of 0.10 means a ten percent annualized forward premium, not ten percent written as the integer ten. premium_percent is the same figure times one hundred for display.
What happens if the spot rate is zero?
The task fails with invalid_input. When the spot rate is zero, (F − S) / S is undefined, so the identity cannot be evaluated and the call is not billed.
What if the contract days are zero or negative?
The task fails with invalid_input. days must be a finite number greater than zero; a zero or negative tenor cannot be annualized onto a 360-day year and is not billed.
What does the forward premium calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.