cswork / libraryOpen practice workspace

Articles

Black-Scholes Interview Questions: Derive the Model and Explain Its Limits

Prepare Black-Scholes interview answers with self-financing derivation, risk-neutral interpretation, tested pricing boundaries, Greeks, and model limits.

Black-Scholes interview questions test whether you can explain the model behind the formula. Memorizing d1 and d2 is useful, but it does not explain why the stock's expected return disappears, why a hedge needs a cash account, or why an implementation fails at expiry.

Connect every derivation step to an assumption, then check the code with independent invariants. This guide covers European calls and puts on a non-dividend-paying stock, an original pricing function, and numerical checks for boundaries and Greeks. The scope is interview preparation, not a recommendation to trade an option.

Primary educational references support the theory. The fixtures below were executed offline; they are original checks rather than reported employer questions.

Which assumptions should you state first?

Define the contract: a European call pays max(S_T - K, 0) at expiry; a European put pays max(K - S_T, 0). Here S is spot price, K is strike, and tau = T - t is time remaining in years.

The MIT option-valuation notes give the basic European formula. For this exercise, assume constant volatility and interest rate, no dividends, continuous diffusion paths, frictionless trading, and the ability to fund and rebalance the hedge. These assumptions define the calculation; they are not claims about a real market.

Use one unit convention throughout: sigma = 0.20 means annualized volatility of 20%, and r = 0.05 is a continuously compounded annual rate. Confusing 20 with 0.20 or days with years can produce plausible-looking output that prices a different model.

Our preparation recommendation is to ask which assumption the interviewer wants relaxed. Dividends, early exercise, transaction costs, and jumps require different treatment. Do not silently insert one into a derivation written for the basic contract.

Why does Itô's formula contain a gamma term?

Under the physical measure, write dS = mu*S*dt + sigma*S*dW. The diffusion's quadratic variation means the second-order term contributes at the same time order as dt. Dropping it would turn the derivation into ordinary calculus and remove the volatility effect incorrectly.

For a sufficiently smooth option value V(S,t), the useful expansion is:

dV = (V_t + mu*S*V_S + 0.5*sigma^2*S^2*V_SS)*dt
     + sigma*S*V_S*dW

The University of Chicago Black-Scholes lecture derives the pricing equation and hedge. In our notation, V_S is delta and V_SS is gamma. Their meaning comes from derivatives of value with respect to spot, not from the letters themselves.

A useful interview check sets gamma to zero for a locally linear payoff. Explain why the curvature contribution then vanishes while the cash funding term can remain. You have tested the role of the term instead of merely reciting Itô's lemma.

How does a self-financing hedge remove mu?

Use a replicating portfolio whose value is V = Delta*S + b*B, where B is a money-market account with dB = r*B*dt. Self-financing means changes in holdings are paid for by reallocating within the portfolio; no extra external cash is injected.

Its gains satisfy dV = Delta*dS + b*dB. Choose Delta = V_S to match the diffusion coefficient. The cash value is then b*B = V - S*V_S. Comparing the drift terms in the two expressions for dV gives:

V_t + mu*S*V_S + 0.5*sigma^2*S^2*V_SS
    = mu*S*V_S + r*(V - S*V_S)

V_t + 0.5*sigma^2*S^2*V_SS + r*S*V_S - r*V = 0

The two mu terms cancel. The replication argument does not need your forecast of the stock's physical expected return. It still needs the model's volatility, financing, and trading assumptions.

The Columbia Black-Scholes notes explicitly discuss self-financing trading. Avoid a common shortcut: treating the changing-holdings portfolio V - Delta*S as though its differential were automatically dV - Delta*dS. Holdings changes and their funding matter. Starting from the gains equation makes that accounting visible.

Our suggested follow-up is “Where did the cash for an increased delta come from?” Answer that it is financed through the cash account under the self-financing contract. Choosing delta alone does not prove the strategy satisfies that contract.

What do the formula and its probabilities mean?

The call and put formulas for this scope are:

d1 = [ln(S/K) + (r + sigma^2/2)*tau] / [sigma*sqrt(tau)]
d2 = d1 - sigma*sqrt(tau)
C  = S*N(d1) - K*exp(-r*tau)*N(d2)
P  = K*exp(-r*tau)*N(-d2) - S*N(-d1)

Here N is the standard normal cumulative distribution function. Under the stated model, call delta is N(d1), while N(d2) is the risk-neutral probability of expiring above the strike. They answer different questions.

MIT's risk-neutral valuation lecture connects replication to discounted payoff expectation under the pricing measure. Risk-neutral pricing is not an assertion that real investors have no risk aversion or that the pricing probability is a physical forecast.

In our numerical fixture, S=K=100, tau=1, r=0.05, and sigma=0.20. Then d1=0.35 and d2=0.15. The call value is approximately 10.450584, the put value 5.573526, and call delta 0.636831. Explain the units: delta is sensitivity to a unit change in spot, not a 63.7% promised chance of profit.

Implement the price without dividing by zero

The following original Python function prices both contracts under the declared scope. It handles expiry and zero volatility before computing a logarithm-based normal formula. Positive spot and strike are required by this exercise's interface.

import math

def european_prices(s, k, tau, r, sigma):
    if not all(math.isfinite(x) for x in (s, k, tau, r, sigma)):
        raise ValueError("finite inputs required")
    if s <= 0 or k <= 0 or tau < 0 or sigma < 0:
        raise ValueError("invalid pricing domain")
    if tau == 0:
        return max(s - k, 0.0), max(k - s, 0.0)
    discount_k = k * math.exp(-r * tau)
    if sigma == 0:
        return max(s - discount_k, 0.0), max(discount_k - s, 0.0)
    width = sigma * math.sqrt(tau)
    d1 = (math.log(s / k) + (r + sigma * sigma / 2) * tau) / width
    d2 = d1 - width
    def normal_cdf(x):
        return (1 + math.erf(x / math.sqrt(2))) / 2
    call = s * normal_cdf(d1) - discount_k * normal_cdf(d2)
    put = discount_k * normal_cdf(-d2) - s * normal_cdf(-d1)
    return call, put

This exact function was executed locally. It uses math.erf and is intended for moderate numerical fixtures, not a production-grade extreme-tail pricing library. Large magnitudes, overflow handling, calendars, market conventions, and dividends need additional design.

At expiry, return the payoff directly. With zero volatility and positive remaining time, the risk-neutral terminal path is deterministic; discounting gives max(S-K*exp(-r*tau),0) for the call. Replacing sigma with an arbitrary tiny number is unnecessary and obscures the intended branch.

Our testing recommendation is to reject invalid domain inputs explicitly. A negative remaining lifetime should not silently mean an expired contract unless the interface defines that behavior. A NaN volatility should not propagate into a plausible-looking report.

Which tests catch a believable but wrong implementation?

One reference price is insufficient: a wrong implementation can accidentally match one example. Our fixture checks relationships whose reasons are independent of any single remembered decimal.

Original checkExpected property
Expiry with spot 90 and strike 100Call 0; put 10
Zero volatility with spot and strike 100, rate 0.05, one yearCall approximately 4.877058; put 0
Call minus putEquals S-K*exp(-r*tau) under the same contract inputs
Price boundsCall between max(S-discounted K,0) and S; put between max(discounted K-S,0) and discounted K
A small symmetric spot bumpNumerical call delta agrees with N(d1)

The bounds and parity checks passed on 108 combinations of spot, strike, lifetime, rate, and volatility, including a negative rate. Put was computed independently from its normal formula, rather than manufactured from call parity and then “tested” against that same construction.

The original central-difference delta with a spot bump of 0.001 agrees with the analytic fixture within 1e-8. Gamma and vega checks also pass at the stated moderate inputs. This verifies consistency of this implementation; it does not validate the model against market data.

For a stronger follow-up, approximate calendar-time decay, gamma, and delta and insert them into the PDE. Our fixture's residual is below 1e-5. Remember that calendar time increases as tau decreases: substituting a derivative with respect to time remaining without changing the sign creates a false failure.

How do Greeks and implied volatility expose model limits?

In the fixture, vega is approximately 37.524 per one unit of volatility. A one-percentage-point volatility change is 0.01 units, giving a first-order price change of about 0.37524. State that scaling before interpreting a numeric sensitivity.

Implied volatility solves a pricing equation for sigma given an observed price and the other contract inputs. It is a model-implied parameter, not proof that future realized volatility will equal it. Check the applicable price bounds before trying to solve for a value.

Our proposed solver explanation uses a bracketed method as a safe baseline. A Newton step uses vega in the denominator, so very small vega can create unstable updates. Explain how you keep sigma in its valid domain, detect an unbracketed or unattainable target, and report a tolerance-based result.

The MIT lecture transcript on volatility smiles discusses why different strikes can imply different volatilities. A smile challenges the single-constant-volatility description; it does not automatically identify one uniquely correct replacement model.

Likewise, a delta hedge cancels the diffusion exposure in the continuous idealization. Discrete rebalancing, jumps, transaction costs, and a mismatched volatility model leave risk. MIT's simulation notes explicitly consider discretely rebalanced hedges and stochastic-volatility dynamics.

Our interview recommendation is to identify the failed assumption and the evidence you would inspect. A hedge error after a price jump is different from a code sign error or a volatility-unit error. Calling all three “Black-Scholes is wrong” loses the diagnostic information.

Practise the derivation and the follow-up reasoning

QuestionWhat to demonstrate
Explain left-skewed returns and Black–Scholes termsSeparate a model assumption from an observed return distribution
Analyze Newton-Raphson Convergence, Choose Sigma, and Derive VegaExplain solver convergence and vega units
Estimate Greeks and hedging PnLConnect Greek sensitivities to remaining hedge risk
Explain and compute option deltaDefine delta and verify it with a spot bump
Price options and bonds via binomial no-arbitrageUse replication before introducing a closed-form price

Rehearse the derivation from the self-financing gains equation, then have a partner change one assumption. If dividends appear, say that the stock holding receives an additional cash flow and the basic derivation must change. If early exercise appears, state why the terminal-payoff-only pricing problem no longer describes the full contract.

A strong Black-Scholes answer explains the cancellation, verifies the calculation, and preserves the boundary between internally consistent model mathematics and evidence about a real market.

Sources and Further Reading

References checked October 4, 2026. Original Python checks were executed offline. No market calibration, employer frequency or real trading performance is claimed.