This exact source runs in TeaVM. Form changes update its Java literals and reset manual edits.
import com.nablatensor.engine.Nabla;
import com.nablatensor.quant.EquityMarket;
import com.nablatensor.quant.MonteCarlo;
import com.nablatensor.quant.Products;
public final class ClimateScenarioRiskStudio {
static final String[] PATH = {
"orderly", "disorderly", "hot-house-world"
};
static final double[] ST = {
-.15, -.30, -.35
}, VT = {
.03, .15, .10
}, RT = {
.01, .02, -.015
}, POWER = {
1, 2, 1.5
};
static final int[] YEARS = {
0, 5, 10, 15, 20, 25
};
public static void main(String[] a) {
double s = 100, k = 100, v = 20 / 100.0, r = 3 / 100.0, cu = 5000000 / s, pu = 3000000 / s;
long n = 80000L, seed = 42L;
EquityMarket base = market(s, k, v, r);
try (MonteCarlo<EquityMarket> call = MonteCarlo.of(Products.europeanCall())
.market(base)
.steps(1)
.fp64()
.priceOnly()
.on("cpu")
.build(); MonteCarlo<EquityMarket> put = MonteCarlo.of(Products.europeanPut())
.market(base)
.steps(1)
.fp64()
.priceOnly()
.on("cpu")
.build(); MonteCarlo<EquityMarket> greek = MonteCarlo.of(Products.europeanCall())
.market(base)
.steps(1)
.fp64()
.greeks()
.on("cpu")
.build()) {
double pv0 = cu * call.run(base, n, seed)
.price() - pu * put.run(base, n, seed)
.price(), worst = Double.POSITIVE_INFINITY, wd = 0;
int wp = 0, wy = 0;
for (int p = 0; p < 3; p++) for (int y : YEARS) {
EquityMarket m = shock(s, k, v, r, p, y);
double loss = cu * call.run(m, n, seed)
.price() - pu * put.run(m, n, seed)
.price() - pv0;
System.out.println("GRID|" + PATH[p] + "|" + (2025 + y) + "|" + loss);
if (loss < worst) {
worst = loss;
wp = p;
wy = y;
wd = greek.run(m, n, seed)
.greek(EquityMarket::spot);
}
}
System.out.println("WORST|" + PATH[wp] + "|" + (2025 + wy) + "|" + worst + "|" + wd);
}
}
static EquityMarket market(double s, double k, double v, double r) {
return EquityMarket.of()
.spot(s)
.strike(k)
.vol(v)
.rate(r)
.maturity(1)
.build();
}
static EquityMarket shock(double s, double k, double v, double r, int p, int years) {
double f = Math.pow(years / 25.0, POWER[p]);
return market(s * (1 + ST[p] * f), k, Math.max(.001, v + VT[p] * f), r + RT[p] * f);
}
}