Private beta · Alpaca paper trading

Portfolio rebalancing
that runs itself.

A continuous autonomous agent that monitors drift across every client portfolio, proposes corrective trades when thresholds are crossed, and executes — within the hard limits you define. No batches. No schedules. No manual workflows.

Live on Alpaca paper trading · Multi-portfolio · Multi-tenant architecture · Immutable audit trail

The problem

Most rebalancing is either manual or wrong by design.

📅

Calendar-based rebalancing

Executes on a fixed schedule regardless of actual drift. It sells into momentum, buys into drawdowns, and generates unnecessary transaction costs — on a timer, not on signal.

👁️

Manual threshold monitoring

One analyst can watch a handful of portfolios. As AUM grows, coverage gaps emerge. Drift compounds unnoticed. The operational cost scales linearly with book size.

🔒

Opaque incumbent tools

You see a recommendation. You don't see why. Black-box systems create audit risk, complicate client reporting, and make regulatory defence difficult.

How it works

Configure. Monitor. Execute.

The engine separates the mathematics of rebalancing from the mechanics of execution. A pure, stateless calculation core. A live autonomous agent wrapped around it.

01

Configure policies

Define target allocations, drift thresholds, and circuit breaker limits as configuration objects — not code. Update strategy for any portfolio without redeployment.

policy.strategyType · thresholds · targetAllocation
02

Monitor continuously

The agent runs in a live evaluation loop, pulling real-time price and position state from the broker API on every tick. Every portfolio, all the time.

LiveStateManager · cooldown · debounce
03

Execute safely

When drift crosses a threshold, the engine calculates corrective trades. Circuit breakers enforce hard limits on trade count and gross notional before anything touches the broker.

CircuitBreaker · AlpacaAdapter · audit-trail.jsonl

Architecture

Engine and orchestrator.
Strictly separated.

The calculation core is a pure function. It accepts inputs — prices, positions, cash, policy — and returns outputs: drift measurements and trade proposals. It makes no network calls, reads no clocks, mutates no state.

The orchestrator is the live agent. It connects to broker APIs, manages rate-limiting and cooldown timers, executes orders, and handles post-trade reconciliation. Every side effect lives here, not in the engine.

This separation means the engine is independently testable and auditable. The same calculation logic that runs live can be run offline against historical data. The output is deterministic. You can explain every trade.

Orchestrator (Live Agent)
Broker API connection Price feed ingestion Cooldown / rate limiting Order submission Reconciliation pause
↓ prices · positions · policy
Engine (Pure Function)
Portfolio valuation Drift calculation Trade proposal Audit record generation
↑ trade proposals · audit records

Capabilities

What's in the engine.

Three rebalancing strategies

Threshold (drift-triggered), calendar due-date, and manual forced-rebalance. Selectable per portfolio via policy configuration.

🎯

Two execution modes

Full-reset targeting and boundary-band targeting. Full-reset returns to exact target weights. Boundary-band stops at the drift threshold to minimise unnecessary trades.

🛡️

Circuit breaker limits

Hard stops on maximum trade count and gross notional value per execution cycle. Configurable per tenant. Global override for market stress events.

📋

Immutable audit trail

Every calculation emits a structured JSON record: inputs, outputs, drift measurements, and the exact rationale for each trade proposal. Immutable by design.

💰

Cash flow awareness

Settled deposits and withdrawals, pending cash flows, and scheduled recurring contributions are all factored into trade proposals. Incoming cash is used to reduce drift before trades.

🏢

Multi-tenant architecture

Each advisory firm is an isolated tenant. Portfolio state, broker credentials, and circuit breaker limits are scoped per tenant. Provisioned by the platform operator.

⚙️

Policy-as-configuration

Target allocations, threshold bands, and strategy types are configuration objects — not hardcoded logic. Update any portfolio's strategy without touching the engine.

🔄

Reconciliation pause

The agent pauses evaluation for a portfolio while broker orders are pending. Prevents double-execution on in-flight trades. Resumes automatically on confirmation.

📐

Mandate archetypes

Portfolios follow typed mandate archetypes — StaticWeights, EfficientFrontier, MinimumVariance — each bound to a specific quality evaluation function. The engine never trades if estimated transaction costs exceed the utility of the drift reduction.

📎

Model mandate system

Advisors define named model mandates with target allocations and rebalancing policy. Client portfolios subscribe as discretionary (cascade-on-update) or bespoke (independent). Mandate changes propagate automatically to all subscribed portfolios.

Status

Private beta. Built in the open.

The engine is live on Alpaca paper trading. Multi-tenant B2B architecture, broker routing, and API key infrastructure are live. The full source — including 51 architecture decision records documenting every design choice — is on GitHub.