Framework vs User Control¶
This document is the canonical strategy contract for StackSats.
Framework Owns (Non-Negotiable)¶
- Fixed budget.
- Fixed allocation span (global config) between 90 and 1460 days (inclusive).
- Uniform initialization of all daily weights.
- Day-by-day iterative execution loop.
- Daily reinitialization of all future days with the remaining uniform weight.
- Locked historical weights (past days are immutable).
- Feasibility projection/clipping at the daily handoff boundary.
- Remaining-budget and allocation-range enforcement:
- Total budget must be used by the end of the allocation span.
- All daily weights must sum to 1.
- Minimum daily weight is
1e-5. - Maximum daily weight is
0.1. - Validation guards (
NaN/inf/range checks) and final invariants.
User Owns (Flexible)¶
- Feature engineering from lagged/base data
- Signal definitions/formulas
- Signal weights and hyperparameters
- Daily intent output:
propose_weight(state)for per-day proposals, orbuild_target_profile(...)for a full-window intent series
Handoff Boundary¶
The user never writes the framework iteration loop.
User output (proposed_weight_today or daily profile intent) is handed to the framework allocation kernel, which computes final_weight_today by applying:
- feasibility clipping
- remaining-budget rules
- historical lock rules
- final invariant checks
Required Behavior¶
- Users can strongly influence allocation each day through features/signals/intent.
- Users cannot alter iteration mechanics or rewrite past allocations.
- Local, backtest, and production run the same sealed allocation kernel.
Production Daily Lifecycle¶
- Load locked historical weights for the active allocation span.
- Build lagged features/signals using information available up to
current_date. - Collect user daily intent (
proposed_weight_todayor profile-derived intent). - Project to feasible
final_weight_todaywith remaining-budget constraints. - Persist today as locked.
- Advance to next day; past values remain immutable.