This document explains the core concepts behind the NTS household optimizer that powers the Allocator API.
The goal is to give advisors and advanced users enough intuition to:
n_sims, local_iters, grid_step, etc.).Note: All public examples are designed to use the Allocator API, not direct engine imports.
You interact with the optimizer by submitting jobs to/allocator/jobs.
The optimizer models a household with multiple asset locations, typically including:
Each job describes:
The engine then:
The result is a PPTX report that summarizes distributions of outcomes, trade‑offs, and policy recommendations.
The most important knobs exposed in AllocJobSpec are:
n_simsNumber of simulation paths.
n_sims ⇒ smoother distributions and more stable estimates.n_sims ⇒ faster runs, but noisier outcomes.Typical ranges:
local_itersNumber of local search iterations per grid point.
The optimizer usually has a coarse grid over top‑level policy parameters (e.g., CRT vs taxable allocation, payout tweaks).
At each grid point, it can run a local improvement loop:
local_iters times.Higher local_iters:
Lower local_iters:
grid_step).grid_stepStep size of the coarse grid over policy parameters.
Think of this as the resolution of the outer search:
grid_step (e.g., 0.10) ⇒ fewer grid points, coarser search.grid_step (e.g., 0.05 or 0.025) ⇒ more grid points, finer search.A common pattern:
grid_step = 0.10 and modest local_iters to get a feel for the landscape.0.05 if the results suggest a narrow band of “good” policies worth exploring more.objectiveHigh‑level goal of the optimization.
Supported values (initially):
"risk_parity" – Balance risk contributions across sleeves / policies."min_var" – Focus on minimizing variance of key outcome metrics."custom" – Use a custom objective that blends multiple metrics (e.g., expected wealth, downside risk, CRT remainder values).In all cases, the details of the objective function live inside allocator_engine.
The API contract remains stable even as you refine the internals.
Each job may carry additional parameters, either from defaults or explicit overrides:
start_crt – Initial CRT value (e.g., 8.5M).start_tax – Initial taxable value (e.g., 7.5M).years – Horizon in years (e.g., 30).payout_rate – CRT payout rate (e.g., 8.5% as 0.085).These values influence:
The PPTX report surfaces these assumptions clearly so an advisor can validate them with the client.
Conceptually, a single job proceeds through:
Configure simulation engine with economic assumptions and policy knobs.
Simulation
n_sims independent paths of returns and relevant risk factors.Track sleeve balances, payouts, and taxes over years.
Optimization
grid_step), evaluate the objective across all sims.local_iters times to refine promising policies.Track the best‑performing policies and their metrics.
Reporting
Save to a temporary path, then upload to S3.
Status update
/allocator/artifacts/{job_id}/report.While the exact template may evolve, common report sections include:
Key assumptions (horizon, payout rate, start balances).
Outcome distributions
Percentile bands (e.g., 5th, 25th, median, 75th, 95th).
Policy comparison
Objective scores and trade‑offs (e.g., expected wealth vs downside risk).
Scenario paths
Advisors can use this report to:
Recommended workflow for power users and beta partners:
n_sims = 3000local_iters = 4grid_step = 0.10
Run a baseline job via the Allocator API.
Adjust one knob at a time:
n_sims if results feel too noisy.grid_step if the “best” policy feels like it’s at the edge of your grid.Increase local_iters if there are clear local improvements to be exploited.
Compare reports:
All of this should be done by calling the Allocator API, not by importing the engine directly.
That way, your notebooks and examples remain aligned with the production surface and remain stable even as internals improve.