VA Surrogates — Sobolev-Trained Neural Networks for Variable Annuity Greeks
PyTorch surrogate models for variable annuity (VA) guarantee pricing and Greek estimation, trained with the Sobolev loss (derivative supervision via AAD). Companion to the dataset ivanzoccolan/va-riders and the paper "Risk Management of Variable Annuity Guarantees via Sobolev-Trained Neural Networks" (Zoccolan, 2026).
Source library: ActuaLib. Training script: scripts/sobolev_va_training.py.
Contents
prod_v2/bs06bir06_<RIDER>_<RULE>/
| File | Description |
|---|---|
sobolev_model.pt |
Sobolev-trained surrogate (βS=0.6, βIR=0.6, p_w=0.1) |
vanilla_model.pt |
Price-only baseline (βS=0, βIR=0) |
summary.json |
Out-of-sample metrics (rel-RMSE for price, delta, rho) |
summary_report.pdf |
Visual report: price, equity delta, IR Greeks |
Coverage: 9 riders × 3 benefit-base rules = 27 model pairs.
Riders: GMDB, GMMB, GMAB, GMWB, GMIB, GMDB_AB, GMDB_MB, GMDB_WB, GMDB_IB
Benefit-base rules: rop (return of premium), ratchet (annual step-up), rollup (annual roll-up)
Architecture
- Feedforward, 6 hidden layers, width 256, Softplus activation, no skip connections
- Input: outer market state (spot prices, discount factors, fund values) + policy contract features
- Output: fair market value (FMV); gradients give equity delta and IR rho via autodiff
- Optimizer: Adam, cosine annealing lr 1e-3 → 1e-5, 300 epochs, batch size 512
Training Data
| Split | Outer paths | Inner paths | Policies | RNG seed |
|---|---|---|---|---|
trainJ |
20,000 | 100 | 180 | 20260402 |
test |
100,000 | 1,000 | 180 | 20260401 |
20 policies per rider per rule, sampled by Latin Hypercube over age, maturity, policy age, AV/GB ratio, fees, withdrawal/annuity rates.
Loss Function
Sobolev loss with λ-normalisation per Greek component:
L = p_w · L_price + βS · L_delta + βIR · L_rho
Production configuration: βS=0.6, βIR=0.6, p_w=0.1. Vanilla baseline: βS=0, βIR=0, p_w=1.0.
Loading a Model
import torch
model = torch.load(
"prod_v2/bs06bir06_GMDB_WB_rollup/sobolev_model.pt",
map_location="cpu",
weights_only=False,
)
model.eval()
Companion Dataset
ivanzoccolan/va-riders