Skip to content

Path-Dependent Options: Asian, Barrier, Lookback

Pricing once the terminal payoff stops being enough: moment matching and control variates for Asians, reflection formulas and continuity corrections for barriers, extreme-value laws for lookbacks, and how closed forms, PDEs, and Monte Carlo divide the work.

8 of 12 ~16 min

Vanilla options look only at the destination: the payoff is a function of STS_T and nothing else. Path-dependent options look at the whole journey — the average, whether a level was touched, the running high or low. Put differently: the single state variable STS_T is no longer enough, and each family of path-dependent options forces you to add one variable to the state space. Which variable you add, and how tractable its law is, decides whether the family has closed forms, admits a PDE, or is Monte Carlo territory. That thread runs through this whole article.

The three main families, sorted by the added variable: Asians add a running average, barriers add a “has the level been touched” indicator, lookbacks add a running extreme. In FX exotics and commodities these products are a large share of the flow, and pricing them accurately is the practical test of a derivatives library’s quality.

Asian Options: Add a Running Average

An Asian option’s payoff depends on the arithmetic average of the underlying over a period:

AT=1n∑i=1nStiA_T = \frac{1}{n}\sum_{i=1}^n S_{t_i}

with call payoff max⁡(AT−K,0)\max(A_T - K, 0). Why would anyone trade an average rather than a terminal value? Two thoroughly practical reasons. First, the average is smoother than spot, payoff variance is lower, and the option is cheaper per unit of delta. Second, in thin markets — oil cargoes, power, emerging-market FX forwards — the Asian matches the real economic exposure: a refiner buying crude in batches over a quarter is naturally hedged by an option on that quarter’s average price, not on one day’s close.

The geometric average is the tractable one. Start with the easy special case:

GT=exp⁡(1n∑i=1nln⁡Sti)G_T = \exp\left(\frac{1}{n}\sum_{i=1}^n \ln S_{t_i}\right)

The geometric mean of lognormals is again lognormal — a sum of normals is normal. So max⁡(GT−K,0)\max(G_T - K, 0) has a closed form (Kemna & Vorst, 1990): a Black-Scholes call with a reduced volatility and adjusted drift, where

σgeo2=σ2⋅(n+1)(2n+1)6n2\sigma_{\text{geo}}^2 = \sigma^2 \cdot \frac{(n+1)(2n+1)}{6n^2}

(the continuous-monitoring limit as n→∞n \to \infty is σ2/3\sigma^2/3 — averaging cuts the variance to a third, which is the quantitative reason Asians are cheap). The arithmetic and geometric versions are ordered pathwise by the AM-GM inequality, and taking expectations:

Arithmetic Asian≥Geometric Asian\text{Arithmetic Asian} \geq \text{Geometric Asian}

So the geometric closed form is a lower bound on the arithmetic price, empirically often within 1-2% — and this cheap cousin has another job coming shortly.

The arithmetic average has no closed form, but its moments are exact. A sum of lognormals is not lognormal and its law cannot be written down; its first two moments can. The first moment, term by term:

E[AT]=1n∑i=1nE[Sti]=S0⋅1n∑i=1nerti\mathbb{E}[A_T] = \frac{1}{n}\sum_{i=1}^n \mathbb{E}[S_{t_i}] = S_0 \cdot \frac{1}{n}\sum_{i=1}^n e^{r t_i}

The second moment takes one more step of algebra because the cross terms are not independent:

Var(AT)=1n2∑i,jCov(Sti,Stj)\text{Var}(A_T) = \frac{1}{n^2} \sum_{i, j} \text{Cov}(S_{t_i}, S_{t_j})

with Cov(Sti,Stj)=S02 er(ti+tj)(eσ2min⁡(ti,tj)−1)\text{Cov}(S_{t_i}, S_{t_j}) = S_0^2\, e^{r(t_i + t_j)}\big(e^{\sigma^2 \min(t_i, t_j)} - 1\big) — the shared history only runs to min⁡(ti,tj)\min(t_i, t_j). In the continuous-monitoring limit the double sum collapses to a tidy closed form:

E[AT2]=2S02T2[e(2r+σ2)T−1(r+σ2)(2r+σ2)−erT−1r (r+σ2)]\mathbb{E}[A_T^2] = \frac{2 S_0^2}{T^2}\left[\frac{e^{(2r+\sigma^2)T} - 1}{(r+\sigma^2)(2r+\sigma^2)} - \frac{e^{rT} - 1}{r\,(r+\sigma^2)}\right]

The standard lognormal moment-matching approximation is now in reach: fit a lognormal to these two moments and price as a Black-Scholes call. For low r/σr/\sigma it is typically within 1% of the true price:

import numpy as np
from scipy.stats import norm

def asian_moment_match_call(S0, K, r, sigma, T):
    """Continuously monitored arithmetic Asian: two-moment lognormal match."""
    if sigma <= 0 or T <= 0:
        return max(S0 - K, 0)
    M1 = S0 * (np.exp(r * T) - 1) / (r * T)
    M2 = (2 * S0**2 / T**2) * (
        (np.exp((2*r + sigma**2) * T) - 1) / ((r + sigma**2) * (2*r + sigma**2))
        - (np.exp(r * T) - 1) / (r * (r + sigma**2)))
    v2 = M2 - M1**2
    sigma_a = np.sqrt(np.log(1 + v2 / M1**2) / T)
    d1 = (np.log(M1 / K) + 0.5 * sigma_a**2 * T) / (sigma_a * np.sqrt(T))
    d2 = d1 - sigma_a * np.sqrt(T)
    return np.exp(-r * T) * (M1 * norm.cdf(d1) - K * norm.cdf(d2))

(Numerical check: with S0=K=100S_0 = K = 100, r=5%r = 5\%, σ=20%\sigma = 20\%, T=1T = 1 this gives 5.78 against a 400k-path MC value of 5.76±0.01.) For more accuracy, Curran’s (1994) conditioning method typically reaches 0.5%; its idea appears in the discrete-monitoring section below.

For exact pricing there are two routes. One is a PDE: add the running average AA to the state vector and solve on (S,A,t)(S, A, t):

∂V∂t+12σ2S2∂2V∂S2+rS∂V∂S+S−AT−t∂V∂A−rV=0\frac{\partial V}{\partial t} + \frac{1}{2}\sigma^2 S^2 \frac{\partial^2 V}{\partial S^2} + rS \frac{\partial V}{\partial S} + \frac{S - A}{T-t}\frac{\partial V}{\partial A} - rV = 0

with terminal condition V(S,A,T)=max⁡(A−K,0)V(S, A, T) = \max(A - K, 0), marched backward with Crank-Nicolson. Note there is no second derivative in AA: the average carries no noise of its own, it is dragged along by SS — this is the cheap kind of added state variable. The other route is Monte Carlo, which covers the entire path-dependent world:

def mc_asian_call(S0, K, r, sigma, T, n_paths, n_steps=200, antithetic=True):
    dt = T / n_steps
    drift = (r - 0.5 * sigma**2) * dt
    vol = sigma * np.sqrt(dt)
    if antithetic:
        Z = np.random.standard_normal((n_paths // 2, n_steps))
        Z = np.concatenate([Z, -Z], axis=0)
    else:
        Z = np.random.standard_normal((n_paths, n_steps))
    log_paths = np.cumsum(drift + vol * Z, axis=1)
    paths = S0 * np.exp(log_paths)
    A = paths.mean(axis=1)
    payoffs = np.maximum(A - K, 0)
    return np.exp(-r * T) * payoffs.mean()

Here the geometric Asian’s second job arrives: highly correlated with the arithmetic one and exactly priced, it is the textbook control variate — simulate both, use the geometric’s known error to correct the arithmetic estimate, and variance drops by one or two orders of magnitude. For Greeks, use likelihood-ratio or pathwise adjoint methods.

Barrier Options: Add a Touch Indicator

Barrier options activate or die when the underlying crosses a level. Four combinations: up-and-out (dies above HH), up-and-in (born above HH), down-and-out, down-and-in. For an up-and-out call with H>KH > K the payoff is:

V(S,H,T)=1max⁡S<Hmax⁡(ST−K,0)V(S, H, T) = \mathbb{1}_{\max S < H} \max(S_T - K, 0)

The variable added to the state space is that indicator, and it removes a slab of the pricing domain: the PDE treatment restricts the domain to S∈[0,H]S \in [0, H] and pins V=0V = 0 at S=HS = H. Knock-ins come free from in-out parity:

Up-and-in call=Vanilla call−Up-and-out call\text{Up-and-in call} = \text{Vanilla call} - \text{Up-and-out call}

Along any path, either the level is touched or it is not; the two options together are the vanilla.

Closed forms come from the reflection principle. The symmetry of Brownian motion reflected at the barrier makes the law of touching paths explicit, and Rubinstein and Reiner (1991) used it to derive formulas for the whole barrier family. For a down-and-out call with barrier L≤KL \leq K and current S>LS > L, write λ=(r+σ2/2)/σ2\lambda = (r + \sigma^2/2)/\sigma^2, x1=ln⁡(S/K)/(σT)+λσTx_1 = \ln(S/K)/(\sigma\sqrt{T}) + \lambda\sigma\sqrt{T}, y1=ln⁡ ⁣(L2/(SK))/(σT)+λσTy_1 = \ln\!\big(L^2/(SK)\big)/(\sigma\sqrt{T}) + \lambda\sigma\sqrt{T}:

Cdo=SN(x1)−Ke−rTN(x1−σT)−S(LS)2λN(y1)+Ke−rT(LS)2λ−2N(y1−σT)C_{\text{do}} = S N(x_1) - K e^{-rT} N(x_1 - \sigma\sqrt{T}) - S\left(\frac{L}{S}\right)^{2\lambda} N(y_1) + K e^{-rT} \left(\frac{L}{S}\right)^{2\lambda - 2} N(y_1 - \sigma\sqrt{T})

The first two terms are the vanilla; the last two are the “mirror correction” — subtracting the contribution of paths reflected off LL, with (L/S)2λ(L/S)^{2\lambda} as the weight of the reflected measure change. The other seven variants assemble from symmetry and in-out parity.

The continuous-vs-discrete monitoring gap is real money. The formulas assume the level is watched continuously; real contracts check daily or weekly. Discrete paths “miss” crossings between observations, so a discretely monitored barrier is touched less often — knock-outs are worth more, knock-ins less. The fix is the continuity correction of Broadie, Glasserman and Kou (1997): apply the continuous formula at a shifted effective barrier; the details are collected in the discrete-monitoring section below.

Hedging is where barriers actually hurt. The value function is continuous at the barrier, but delta does not fade gently — it flips steeply near the level, and gamma blows up locally. Reverse knock-outs (barrier on the in-the-money side) are the fierce case: the option dies exactly where it is most valuable. Near the barrier, market makers either accept slippage and rebalance less, or explicitly hedge the discontinuity with “the digital at the barrier.” Some contracts are designed hedging-friendly from the start — window barriers only check on discrete dates, soft barriers phase out smoothly over a range — pricing gets harder in exchange for a hedge book that sleeps at night.

Lookback Options: Add a Running Extreme

A lookback call pays max⁡(max⁡t≤TSt−K,0)\max(\max_{t \leq T} S_t - K, 0); a lookback put pays max⁡(K−min⁡t≤TSt,0)\max(K - \min_{t \leq T} S_t, 0): the payoff depends on the path supremum or infimum. The added state variable is the running extreme, and its law — courtesy of the reflection principle again — is explicitly known jointly with the terminal value. That is what gives the floating-strike lookback (payoff ST−min⁡tStS_T - \min_t S_t, “buy at the low”) an exact closed form (Goldman, Sosin & Gatto, 1979). At issuance (S=Smin⁡=S0S = S_{\min} = S_0), write a1=(r+σ2/2)T/σa_1 = (r + \sigma^2/2)\sqrt{T}/\sigma, a2=a1−σTa_2 = a_1 - \sigma\sqrt{T}, a3=a1−2rT/σa_3 = a_1 - 2r\sqrt{T}/\sigma:

C=S0N(a1)−S0e−rTN(a2)−S0σ22r[N(−a1)−e−rTN(−a3)]C = S_0 N(a_1) - S_0 e^{-rT} N(a_2) - S_0 \frac{\sigma^2}{2r} \left[N(-a_1) - e^{-rT} N(-a_3)\right]

The first two terms resemble an ATM call; the third is the “extreme-value premium” — what you pay for the privilege of always buying at the low, with magnitude governed by σ2/2r\sigma^2/2r. This is exact, not an approximation. The fixed-strike lookback also has a closed form, messier; under discrete monitoring everyone goes straight to Monte Carlo:

def mc_lookback_call(S0, K, r, sigma, T, n_paths, n_steps=500, seed=42):
    np.random.seed(seed)
    dt = T / n_steps
    drift = (r - 0.5 * sigma**2) * dt
    vol = sigma * np.sqrt(dt)
    Z = np.random.standard_normal((n_paths, n_steps))
    log_paths = np.cumsum(drift + vol * Z, axis=1)
    paths = S0 * np.exp(log_paths)
    maxes = paths.max(axis=1)
    payoffs = np.maximum(maxes - K, 0)
    return np.exp(-r * T) * payoffs.mean()

Two warnings. Convergence is slow: max⁡tSt\max_t S_t has fatter tails than STS_T, and a discrete path systematically underestimates the continuous extreme (the extreme mostly falls between observations), so with too few steps the bias exceeds the variance — antithetics and Brownian-bridge corrections both help. And hedging: the running extreme follows the actual path, and when the current extreme approaches the strike, standard delta hedging becomes less reliable; dealers typically carry extra inventory as a buffer.

Forward-Starting Options: Not Strictly Path-Dependent, But They Belong Here

A forward-starting call sets its strike at ST1S_{T_1} and matures at T2>T1T_2 > T_1:

Payoff=max⁡(ST2−ST1,0)\text{Payoff} = \max(S_{T_2} - S_{T_1}, 0)

Under Black-Scholes there is a slick homogeneity argument: standing at T1T_1, this is an ATM call whose value is proportional to ST1S_{T_1}; taking today’s expectation of ST1S_{T_1} and discounting passes the proportionality constant straight through:

C=S0[N(d1)−e−r(T2−T1)N(d2)],d1,2=(r±σ2/2)(T2−T1)σT2−T1C = S_0\left[N(d_1) - e^{-r(T_2 - T_1)} N(d_2)\right], \qquad d_{1,2} = \frac{(r \pm \sigma^2/2)(T_2 - T_1)}{\sigma\sqrt{T_2 - T_1}}

Only the volatility between T1T_1 and T2T_2 enters — the path before T1T_1 is absorbed entirely by homogeneity. That is exactly what makes the product precious: a forward-start is a pure bet on the future smile, decoupled from today’s spot skew, and therefore the cleanest test bench for smile-dynamics models (this is where local vol stumbles, as the local volatility article showed). Under Heston it stays tractable: the characteristic function of ST2/ST1S_{T_2}/S_{T_1} preserves the affine structure and semi-analytical pricing goes through.

The Hierarchy of Methods

Condense the experience above into a decision order. Closed forms first, scarce as they are: geometric Asians, floating-strike lookbacks, Rubinstein-Reiner barriers, the characteristic functions of Heston and Merton — use them wherever they apply, if only as validation benchmarks and control variates. Next, state-augmented PDEs: reliable when the added variable is low-dimensional with simple dynamics (the Asian’s AA, the barrier’s domain truncation). Trees are the PDE’s close relative, particularly convenient for discrete monitoring. Everything else belongs to Monte Carlo with variance reduction, with quasi-Monte Carlo and Brownian bridges layered on top. Production libraries run the mix: each product takes its cheapest road, Monte Carlo backstops all of them.

Variance Reduction: The Economics of Monte Carlo

Path-dependent pricing lives on MC, and variance reduction is not a garnish — it is the budget. Four standard weapons. Antithetic variates: pair each path with its mirror −Z-\mathbf{Z}; 30-50% variance reduction on smooth payoffs. Control variates: price a closed-form cousin alongside (geometric Asian for arithmetic, vanilla for barriers, floating-strike for fixed-strike lookbacks) and feed its known error back; 10-100x reductions are routine. Importance sampling: tilt the drift or vol towards where the payoff mass lives (near the barrier, deep OTM); spectacular when aimed well, variance-amplifying when aimed badly. Conditional Monte Carlo: never simulate a dimension you can integrate analytically — for barriers, sample the extreme first (its law is known), then fill in the rest of the path.

def mc_barrier_call(S0, K, H, r, sigma, T, n_paths):
    """Discretely monitored (daily) up-and-out call, barrier H > K."""
    n_steps = 252
    dt = T / n_steps
    drift = (r - 0.5*sigma**2) * dt
    vol = sigma * np.sqrt(dt)
    Z = np.random.standard_normal((n_paths, n_steps))
    log_paths = np.cumsum(drift + vol * Z, axis=1)
    paths = S0 * np.exp(log_paths)
    # knocked out if any observation exceeds the barrier
    alive = (paths.max(axis=1) < H)
    payoffs = np.where(alive, np.maximum(paths[:, -1] - K, 0), 0)
    return np.exp(-r*T) * payoffs.mean()

Unassisted, a near-ATM barrier option needs on the order of a million paths for a 1% standard error; with antithetics plus a control variate, fifty thousand often suffice — same accuracy, twentyfold budget difference.

One level up sits quasi-Monte Carlo. Sobol or Halton sequences replace pseudo-random numbers with low-discrepancy point sets; single-factor Asians commonly see 5-10x effective speedups, decaying to 2-3x for high-dimensional baskets. The workflow: generate Sobol points in [0,1]d[0,1]^d, map to standard normals by inverse CDF, build Brownian paths, sample payoffs:

from scipy.stats import norm, qmc

def sobol_normals(n_paths, dim, seed=42):
    """Sobol low-discrepancy sequence -> standard normals (scrambled)."""
    sampler = qmc.Sobol(d=dim, scramble=True, seed=seed)
    return norm.ppf(sampler.random(n_paths))

The companion Brownian-bridge construction lets you generate the path in any order — endpoint and a few anchors first, details filled in level by level. For QMC this is essential: it assigns the path’s large-scale structure to the first, highest-quality dimensions of the Sobol sequence; for barriers there is a bonus, since most of the extreme’s uncertainty is captured by those first dimensions. Do not write your own Sobol generator; use a tested implementation (scipy’s qmc, Owen-scrambled variants).

Discrete Monitoring: One Correction, Two Faces

Contracts observe at discrete times, so continuous-time formulas need adjusting. For Asians, the discrete average’s deviation from the continuous one is smooth, and prices converge at rate 1/n1/n:

Vdiscrete(n)=Vcontinuous+c1n+O(n−2)V_{\text{discrete}}(n) = V_{\text{continuous}} + \frac{c_1}{n} + O(n^{-2})

The coefficient c1c_1 depends on the payoff; the practical use of this expansion is Richardson extrapolation — run MC at two values of nn and extrapolate to the continuous limit, or the reverse.

For barriers, the correction is larger and more famous, because discrete paths miss crossings between observations. The Broadie-Glasserman-Kou (1997) continuity correction says: the discretely monitored barrier option approximately equals a continuously monitored one at a shifted barrier —

VdiscreteH(n)≈VcontinuousHeff,Heff=H e±βσT/nV^{H}_{\text{discrete}}(n) \approx V^{H_{\text{eff}}}_{\text{continuous}}, \qquad H_{\text{eff}} = H\, e^{\pm \beta \sigma \sqrt{T/n}}

with ++ for an upper barrier (moved outward), −- for a lower one, and β=−ζ(1/2)/2π≈0.5826\beta = -\zeta(1/2)/\sqrt{2\pi} \approx 0.5826. The intuition: observing discretely, you see fewer touches, which is as if the barrier stood half a step further away — and the size of that half-step is one “vol-observation-interval.” At daily monitoring the shift is not negligible; using the continuous formula uncorrected is the most common systematic error in barrier pricing. The correction itself is only approximate; for more accuracy, use Brownian-bridge corrections or conditional MC.

The discrete Asian also admits an elegant exact device — the Curran (1994) method promised earlier. The discrete arithmetic average

Adiscrete=1n∑iStiA_{\text{discrete}} = \frac{1}{n}\sum_{i} S_{t_i}

is conditioned on the geometric mean GG: GG is lognormal (closed form known), and on {G≥K}\{G \geq K\} we have A≥G≥KA \geq G \geq K almost surely — the inner expectation there reduces to closed-form conditional moments, leaving only the {G<K}\{G < K\} region to a one-dimensional numerical integral:

def asian_curran_sketch(S0, K, r, sigma, T, n):
    """Skeleton of Curran's (1994) conditioning method.
    1) The geometric mean G is lognormal; its moments are closed-form.
    2) E[(A-K)^+] = E[ E[(A-K)^+ | G] ]: split by G.
    3) On {G >= K}: A >= G >= K, and the inner expectation reduces to
       closed-form conditional moments.
    4) On {G < K}: one-dimensional numerical integral over G's lognormal density.
    Full coefficient derivations are in the paper; only the structure is shown here.
    """
    ...

A one-dimensional integral replaces the entire path simulation, with accuracy commonly within 0.5% — the principle “never simulate what you can integrate” cashing in once more.

The Hedger’s Ledger

Switch the viewpoint from pricing to holding. The core monitoring quantity for a barrier book is the distance to the barrier:

Dist(S,H)=ln⁡(S/H)\text{Dist}(S, H) = \ln(S / H)

or divided by σΔt\sigma\sqrt{\Delta t} to convert into “standard deviations away.” As the distance narrows, delta magnifies and flips, and the book switches from calm to unstable. The common operating discipline is tiered rebalancing frequency: hedge every KK minutes far from the barrier, every K/10K/10 minutes close to it — balancing tracking error against transaction costs, instead of pretending continuous hedging is available.

The seller’s realized P&L, in its plainest bookkeeping:

P&L=premium−∑iΔti (Sti+1−Sti)−payoffT\text{P\&L} = \text{premium} - \sum_i \Delta_{t_i}\,\big(S_{t_{i+1}} - S_{t_i}\big) - \text{payoff}_T

Premium in, rebalancing costs along the way, payoff out at expiry. The typical script for selling a down-and-out put: most of the time the option is alive and you collect gamma-scalping income like a vanilla seller; the underlying breaks the lower barrier, the option dies, the premium is banked. The bad script hides in the final stretch before the knock-out: you have been delta-long all the way down, and if the market snaps back just before touching, your book is simultaneously short volatility and short the rally — hit from both sides. Soft barriers and step barriers are product design taking out insurance against exactly this script.

Under Stochastic Volatility

Everything above ran under Black-Scholes; switch to Heston or SABR and the framework survives — still add a state variable, still choose among closed form, PDE, and MC — but the smile is baked into the paths. Directional experience: Asians are sensitive to the vol term structure and to variance clustering along the path, and can price above or below the constant-vol BS value depending on ρ\rho and tenor; barriers are sensitive to the realized vol-of-vol path, which directly raises or lowers touch probabilities; lookback extremes get more extreme under stochastic vol, and the extreme-value premium moves with them. The tools are the same pair: a two-dimensional PDE in (S,v)(S, v), or Monte Carlo with a QE scheme — the latter more flexible, the former faster for low-dimensional payoffs.

Who Uses These, and For What

The real demand comes in three streams. Hedging actual exposure: refiners buying in tranches, power consumers settling monthly — Asian options track the delivery schedule and minimize basis risk. Structured products: retail capital-protected notes routinely use Asian or barrier components to cut the option budget — averaging and knock-outs both cheapen the payoff, and the savings fund the capital protection. Expressing volatility views: barriers and Asians buy conditional exposure for less premium, at the cost of more complex payoffs and harder hedging. These products are increasingly common in retail channels; understanding their pricing is less a research skill than consumer protection.

Implementation Notes

A few practical points for the production engineer. The simulator must be vectorized — pure Python loops over a hundred thousand paths and hundreds of steps are a disaster; numpy vectorization (as in the code above) is two orders of magnitude. Control variates should be the default habit, not an option: geometric for Asians, vanilla for barriers, floating-strike for lookbacks. Cache characteristic-function evaluations across same-parameter pricings. And validate every pricer against a known benchmark: BS ATM Asians against the moment match, barriers against Rubinstein-Reiner, lookbacks against Goldman-Sosin-Gatto — the greatest value of the closed forms is their role as referee.

The active directions in this area right now: neural networks learning pricing functions from MC samples (expensive to train, instant to evaluate, still adopted cautiously on desks), polynomial chaos expansions for low-dimensional payoffs, and GPUs for whole-book valuation. All point the same way: making complex-payoff pricing faster — the theoretical framework settled long ago, and the competition is engineering.


Reading list. Hull, Options, Futures, and Other Derivatives, 10th ed. (2018), chapters on exotic options. Wilmott, Paul Wilmott on Quantitative Finance, 2nd ed. (2007), for PDE methods on path dependence. Kemna & Vorst, “A Pricing Method for Options Based on Average Asset Values,” Journal of Banking & Finance (1990). Goldman, Sosin & Gatto, “Path-Dependent Options” (1979). Broadie, Glasserman & Kou, “A Continuity Correction for Discrete Barrier Options,” Mathematical Finance (1997).