Price Exotic & Multi-Asset Trades

Price a Quanto and Its Convexity Adjustment

Every displayed adjustment is computed by Java from the form inputs: futures convexity, LIBOR in arrears, payment timing, CMS convexity, and the quanto forward and option.

Eurodollar futures (Hull-White)
LIBOR in arrears / timing
CMS
Quanto
Java source
QuantoConvexityRiskStudio.java

This exact source runs in TeaVM. Form changes update its Java literals and reset manual edits.

import com.nablatensor.quant.OptionTypeEnum;
import com.nablatensor.quant.QuantoMarket;
import com.nablatensor.quant.adjust.Adjustment;
import com.nablatensor.quant.adjust.ConvexityAdjustment;
import com.nablatensor.quant.adjust.QuantoAdjustment;
import com.nablatensor.quant.adjust.TimingAdjustment;

public final class QuantoConvexityRiskStudio {
  private QuantoConvexityRiskStudio() {}

  public static void main(String[] args) {
    var ed = ConvexityAdjustment.eurodollarFutures(3 / 100.0, 90 / 10000.0, 2.0, 2.25);
    Adjustment arr = ConvexityAdjustment.inArrears(3 / 100.0, 20 / 100.0, 0.5, 3.0);
    Adjustment early = TimingAdjustment.liborPaymentShift(3 / 100.0, 20 / 100.0, 0.5, 3.0, 3.0);
    Adjustment late = TimingAdjustment.liborPaymentShift(3 / 100.0, 20 / 100.0, 0.5, 3.0, 4.0);
    Adjustment cms = ConvexityAdjustment.cms(3.2 / 100.0, 25 / 100.0, 5.0, 2, 20);
    QuantoMarket m = QuantoMarket.of()
        .assetSpot(100)
        .strike(100.0)
        .volAsset(22 / 100.0)
        .volFx(9 / 100.0)
        .corr(-0.35)
        .rateDom(0.03)
        .rateForeign(0.012)
        .build();
    double drift = QuantoAdjustment.driftAdjustment(m.corr(), m.volAsset(), m.volFx());
    double noQuanto = m.assetSpot() * Math.exp(m.rateForeign());
    double quanto = QuantoAdjustment.quantoForward(m, 1.0);
    var option = QuantoAdjustment.quantoOption(OptionTypeEnum.CALL, m, 1.0, 1.25);
    System.out.println("RESULT|" + (ed.rateAdjustment() * 10000.0) + "|" + ed.dSigma() + "|" + ed.dMeanReversion()
        + "|" + arr.adjustmentBp() + "|" + (100.0 * arr.adjustedRate()) + "|" + (early.adjustmentBp())
        + "|" + late.adjustmentBp() + "|" + cms.adjustmentBp() + "|" + (100.0 * cms.adjustedRate())
        + "|" + drift + "|" + noQuanto + "|" + quanto + "|" + option.price() + "|" + option.delta()
        + "|" + option.vega());
  }
}
TeaVM compiles and runs the Java source above in this browser.
Implementation guide

Measure changes create adjustments

Quanto and convexity adjustments arise when the payoff currency, discounting currency and underlying dynamics do not share the same natural measure.

Core mechanism

The adjustment depends on volatility and correlation terms that modify the effective drift or forward. The page makes those inputs visible rather than hiding the result behind a single price.

Practical workflow

Specify payoff and collateral currencies, identify the relevant correlations and volatility sources, validate sign conventions, and compare against a consistent cross-currency valuation framework.

Key details

*Keywords: convexity adjustment java, eurodollar futures convexity java, libor in arrears java, cms convexity adjustment java, quanto adjustment java, timing adjustment java*

Feature F8. A rate observed or quoted in one measure but paid in another needs a correction. This packages the five standard closed forms.

A quanto payoff fixes the conversion rate between an underlying measured in one currency and a settlement currency. Under the pricing measure appropriate to settlement, the drift of the foreign underlying contains a correction involving FX volatility, underlying volatility and their correlation.

The sign and size of the adjustment depend on conventions: which currency is domestic, which factor is quoted directly, and the correlation definition. Making those assumptions explicit is more useful than presenting a closed-form price without its measure-change inputs.

Scope and review point

The closed-form example simplifies smile, stochastic rates and collateral effects. These are often material for real cross-currency products.