Black-Scholes Option Pricing Calculator

Calculate European call and put option prices with the Black-Scholes model. Ideal for finance professionals and students.

Model Inputs

How to Use This Calculator

Enter the current stock price, strike price, time to maturity in years, the prevailing risk-free rate, and expected volatility. Click Calculate and the call and put prices will populate instantly. Reset restores the default scenario.

Methodology

The calculator implements the Black-Scholes closed-form solution for European options. It derives the normal distribution of log-returns, discounts the strike using the risk-free rate, and returns the theoretical call and put premiums assuming continuous trading and no dividends.

Glossary of Terms

Frequently Asked Questions

What is the Black-Scholes model?

The Black-Scholes model is a mathematical framework for pricing European options by assuming log-normally distributed returns.

How do I interpret the results?

The call and put prices represent the fair theoretical premiums for each option at expiration.

Why is volatility important?

Higher volatility increases the value of both calls and puts, reflecting greater uncertainty in future prices.

Can I use this for American options?

No. The Black-Scholes model assumes European-style exercise only.

What are the limitations?

The model assumes constant volatility and interest rates, which may not hold in real markets.

Full original guide (expanded)

The earlier version of this page included the complete audit spine, formulas extracted in LaTeX, and verification notes. Those details remain preserved here through the formulas, citations, and changelog below along with this note for reference.

Formulas

Black-Scholes call and put

Call: C = S0N(d1) - X e-rTN(d2)

Put: P = X e-rTN(-d2) - S0N(-d1)

where d1 = (ln(S0/X) + (r + σ²/2)T) / (σ√T) and d2 = d1 - σ√T

All variables are defined in the glossary above.

Citations
Changelog
  • v0.1.0-draft — Initial audit draft captured on 2026-01-19.
  • Documented formula derivation, glossary, and FAQ for the Black-Scholes model.
Verified by Ugo Candido Last Updated: 2026-01-19 Version 0.1.0-draft
Version 1.5.0
+ round2(safeVal).toFixed(2); } }; const erf = (x) => { const sign = x >= 0 ? 1 : -1; x = Math.abs(x); const a1 = 0.254829592; const a2 = -0.284496736; const a3 = 1.421413741; const a4 = -1.453152027; const a5 = 1.061405429; const p = 0.3275911; const t = 1 / (1 + p * x); const y = 1 - ((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t * Math.exp(-x * x); return sign * y; }; const normCdf = (x) => (1 + erf(x / Math.sqrt(2))) / 2; const els = { stockPrice: document.getElementById('stockPrice'), strikePrice: document.getElementById('strikePrice'), timeToMaturity: document.getElementById('timeToMaturity'), riskFreeRate: document.getElementById('riskFreeRate'), volatility: document.getElementById('volatility'), callPrice: document.getElementById('callPrice'), putPrice: document.getElementById('putPrice'), validationStatus: document.getElementById('validationStatus'), errorBox: document.getElementById('errorBox'), calcBtn: document.getElementById('calcBtn'), resetBtn: document.getElementById('resetBtn') }; const defaults = { stockPrice: 100, strikePrice: 100, timeToMaturity: 1, riskFreeRate: 5, volatility: 20 }; function parseInputs() { return { stockPrice: parseFloat(els.stockPrice.value), strikePrice: parseFloat(els.strikePrice.value), timeToMaturity: parseFloat(els.timeToMaturity.value), riskFreeRatePct: parseFloat(els.riskFreeRate.value), volatilityPct: parseFloat(els.volatility.value) }; } function validate(inputs) { const errors = []; if (!Number.isFinite(inputs.stockPrice) || inputs.stockPrice <= 0) { errors.push('Stock price must be greater than 0.'); } if (!Number.isFinite(inputs.strikePrice) || inputs.strikePrice <= 0) { errors.push('Strike price must be greater than 0.'); } if (!Number.isFinite(inputs.timeToMaturity) || inputs.timeToMaturity <= 0) { errors.push('Time to maturity must be greater than 0.'); } if (!Number.isFinite(inputs.riskFreeRatePct)) { errors.push('Risk-free rate must be a valid number.'); } if (!Number.isFinite(inputs.volatilityPct) || inputs.volatilityPct <= 0) { errors.push('Volatility must be greater than 0.'); } return { ok: errors.length === 0, errors }; } function compute(inputs) { const S = inputs.stockPrice; const X = inputs.strikePrice; const T = inputs.timeToMaturity; const r = inputs.riskFreeRatePct / 100; const sigma = inputs.volatilityPct / 100; if (!Number.isFinite(S) || !Number.isFinite(X) || !Number.isFinite(T) || !Number.isFinite(r) || !Number.isFinite(sigma)) { return null; } if (sigma <= 0 || T <= 0) { return null; } const sqrtT = Math.sqrt(T); const d1 = (Math.log(S / X) + (r + 0.5 * sigma * sigma) * T) / (sigma * sqrtT); const d2 = d1 - sigma * sqrtT; const call = S * normCdf(d1) - X * Math.exp(-r * T) * normCdf(d2); const put = X * Math.exp(-r * T) * normCdf(-d2) - S * normCdf(-d1); if (!Number.isFinite(call) || !Number.isFinite(put)) { return null; } return { callPrice: round2(call), putPrice: round2(put), term: T }; } function format(outputs) { if (!outputs) return null; return { callPrice: fmtCurrency(outputs.callPrice), putPrice: fmtCurrency(outputs.putPrice), status: `Calculated for ${outputs.term.toFixed(2)} yr term` }; } function renderError(errors) { if (!errors || errors.length === 0) { els.errorBox.style.display = 'none'; els.errorBox.textContent = ''; return; } els.errorBox.style.display = 'block'; els.errorBox.textContent = errors.join(' '); } function render(formatted, errors) { renderError(errors); if (!formatted) { els.callPrice.textContent = '$0.00'; els.putPrice.textContent = '$0.00'; els.validationStatus.textContent = 'Fix inputs'; return; } els.callPrice.textContent = formatted.callPrice; els.putPrice.textContent = formatted.putPrice; els.validationStatus.textContent = formatted.status; } function update() { const inputs = parseInputs(); const validation = validate(inputs); if (!validation.ok) { render(null, validation.errors); return; } const result = compute(inputs); if (!result) { render(null, ['Calculation failed for the current inputs.']); return; } const formatted = format(result); render(formatted, []); } function reset() { els.stockPrice.value = defaults.stockPrice; els.strikePrice.value = defaults.strikePrice; els.timeToMaturity.value = defaults.timeToMaturity; els.riskFreeRate.value = defaults.riskFreeRate; els.volatility.value = defaults.volatility; const debouncedUpdate = debounce(update, 100); document.querySelectorAll('#inputsCard input, #inputsCard select, #inputsCard textarea') .forEach((el) => { el.addEventListener('input', debouncedUpdate); el.addEventListener('change', debouncedUpdate); }); update(); } element.addEventListener('change', debouncedUpdate); }); els.calcBtn.addEventListener('click', update); els.resetBtn.addEventListener('click', (event) => { event.preventDefault(); reset(); }); reset(); })();