Concepts – Household Optimizer

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:

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.


1. Problem Framing

The optimizer models a household with multiple asset locations, typically including:

Each job describes:

The engine then:

  1. Simulates many possible future return paths across sleeves.
  2. Evaluates household outcomes under various policy / allocation choices.
  3. Searches over those choices to find policies that best satisfy the objective function (risk/parity, min variance, custom).

The result is a PPTX report that summarizes distributions of outcomes, trade‑offs, and policy recommendations.


2. Key Parameters

The most important knobs exposed in AllocJobSpec are:

2.1 n_sims

Number of simulation paths.

Typical ranges:

2.2 local_iters

Number 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:

Higher local_iters:

Lower local_iters:

2.3 grid_step

Step size of the coarse grid over policy parameters.

Think of this as the resolution of the outer search:

A common pattern:

2.4 objective

High‑level goal of the optimization.

Supported values (initially):

In all cases, the details of the objective function live inside allocator_engine.
The API contract remains stable even as you refine the internals.


3. Default Economic Assumptions

Each job may carry additional parameters, either from defaults or explicit overrides:

These values influence:

The PPTX report surfaces these assumptions clearly so an advisor can validate them with the client.


4. Job Flow

Conceptually, a single job proceeds through:

  1. Setup
  2. Read job spec and household inputs.
  3. Configure simulation engine with economic assumptions and policy knobs.

  4. Simulation

  5. Generate n_sims independent paths of returns and relevant risk factors.
  6. Track sleeve balances, payouts, and taxes over years.

  7. Optimization

  8. For each grid point (driven by grid_step), evaluate the objective across all sims.
  9. Run local search up to local_iters times to refine promising policies.
  10. Track the best‑performing policies and their metrics.

  11. Reporting

  12. Populate a PPTX template with:
    • Summary metrics and charts.
    • Distributions (histograms, quantiles).
    • Scenario visualizations.
  13. Save to a temporary path, then upload to S3.

  14. Status update

  15. Write final status and artifact key into Redis.
  16. The report is then fetchable via /allocator/artifacts/{job_id}/report.

5. Interpreting the PPTX

While the exact template may evolve, common report sections include:

Advisors can use this report to:


6. How to Experiment Safely

Recommended workflow for power users and beta partners:

  1. Start with moderate settings:
  2. n_sims = 3000
  3. local_iters = 4
  4. grid_step = 0.10

  5. Run a baseline job via the Allocator API.

  6. Adjust one knob at a time:

  7. Increase n_sims if results feel too noisy.
  8. Decrease grid_step if the “best” policy feels like it’s at the edge of your grid.
  9. Increase local_iters if there are clear local improvements to be exploited.

  10. Compare reports:

  11. Look for stability: do the recommended policies and conclusions stay consistent?
  12. Use differences as a signal about where the optimizer is most sensitive.

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.