v1.2 · Tier 2Live Generates entry, target, stop, R:R, expected hold per security.
Closes the gap between "we have a signal" and "what do I actually do." Every recommendation surface ships an actionable trade plan: entry zone, target, stop, risk:reward, expected hold, abort triggers, and explicit "when NOT to act" disqualifiers. Drives /security?ticker=X, /daily-edge, /strategies.
{
ticker: "AAPL",
action: "lean-buy", // 6 categories: see below
entry: { lo: 178.20, hi: 179.40, mid: 178.80 },
target: 192.00,
stop: 174.00,
rr: 2.4, // (target-price) / (price-stop)
expectedHold: {
min: 2, // 0.4 × halfLife
typical: 5, // halfLife
max: 20, // horizon
typicalLabel: '5 sessions'
},
abortTriggers: [
'price < stop',
'time > 20 sessions',
'regime flips to risk-off',
'F23_liquidity drops below 25',
'realized vol > 1.5σ'
],
whenNotToAct: [
'confidence < 40',
'|alpha| < 3 bps (below cost friction)',
'F23_liquidity < 25',
'halfLife < 5',
'extended-hours session',
'regime = transition'
],
size: {
suggested: 0.075, // quarter-Kelly × confScale × tierScale
capPct: 15.0, // hard cap per position
rationale: 'Quarter-Kelly: f* = (p·b - q)/b with b=1.5, p=0.62, scaled 0.25'
},
rationale: '…natural-language summary…'
}
| Action | Conditions |
|---|---|
| buy | tier='Strong Buy' AND alpha > 8 bps AND probUp > 0.55 AND confidence ≥ 0.7 |
| lean-buy | tier='Buy' AND alpha > 4 bps AND probUp > 0.50 |
| wait | tier='Hold' OR confidence < 0.5 OR alpha within ±3 bps (cost friction) |
| lean-sell | tier='Sell' AND alpha < -4 bps AND probUp < 0.50 |
| sell | tier='Strong Sell' AND alpha < -8 bps AND probUp < 0.45 AND confidence ≥ 0.7 |
| abort | any whenNotToAct triggered (overrides above categories) |
entry = price ± 0.4·σ·price — asymmetric per direction. Buys leave room above current price; sells leave room below.
target = price × (1 + |expectedMove| × tierScale)
Tier scale: Strong=1.2, Buy/Sell=1.0, Hold=0.6 (lower targets for hold-tier — smaller bets, smaller targets).
stop = price ∓ 1.5·σ·√horizon·price — 1.5σ vol-band. Wider for longer horizons (more noise to wait through).
R:R = |target − price| / |price − stop| — must be ≥ 1.5 for action signals; below that, downgrade to "wait."
Kelly fraction: f* = (p·b − q) / b where p=probUp, q=1-p, b=reward:risk ratio. Quarter-Kelly applied: f = f* × 0.25. Then:
confidence (0..1)Why quarter-Kelly? Full Kelly is theoretically optimal but assumes perfect probability calibration. Real estimation error → full Kelly over-bets. Quarter-Kelly gives ~75% of expected geometric growth at ~6% of full Kelly variance.
All signals pass 5 independent statistical tests before approval. Each gate enforces a distinct scientific principle. Only after all 5 pass do we evaluate tier + alpha thresholds for Buy/Sell decisions. See statistical basis document for academic references.
| Gate | Test | Threshold | Rationale |
|---|---|---|---|
| 1 | Net alpha sufficient | |α| > 3 bps | Trading friction (spread + fees + slippage) ≈ 3-5 bps. If edge < friction, expected return is negative. |
| 2 | Data quality + conviction | Confidence ≥ 60% | Equivalent to p < 0.05 statistical significance (Type I error threshold). Requires 2σ certainty in a Gaussian framework. |
| 3 | Signal-to-noise ratio | driftStrength ≥ 0.5 | GBM drift must dominate volatility. At SNR=0.5, drift contributes ~11% of near-term moves but ~50% at 1-day horizons. |
| 4 | Effect size | expectedMagnitudePct ≥ 0.1% | Moves < 0.1% are dominated by bid-ask spread (1-2 bps). 0.1% threshold acts as automatic horizon filter. |
| 5 | Directionality agreement | expectedMove sign + probUp align | Two independent indicators must point the same direction. Reduces false positives by 75%+ vs single test. |
Combined false positive rate: ~0.5% (under independence), far more rigorous than any single gate.
Six conditions where the engine refuses to produce an action signal — even if score + alpha + tier all align:
| Disqualifier | Reason |
|---|---|
| confidence < 40 | Engine doesn't know enough — wait for more data |
| |alpha| < 3 bps | Below cost friction — slippage + spread eats the edge |
| F23_liquidity < 25 | Wide spreads / thin book — bad fills likely |
| halfLife < 5 bars | Signal mean-reverts too fast for retail-speed execution |
| extended-hours session | Lower liquidity + thinner book + stale data feeds |
| regime = 'transition' | Whipsaw zone — wait for regime to settle |
| Version | Date | Change |
|---|---|---|
| v1.2 | 2026-04-26 | 14-class stop scaling + funding-aware perp stops |
| v1.1 | 2026-04-25 | quarter-Kelly + 15% hard cap + 6 disqualifiers |
| v1.0 | 2026-04-24 | Initial action / entry / target / stop generation |
engine/playbook.js (~280 lines), integrated by engine/orchestrator.js, surfaced by security.html + daily-edge.html.
Reviewed: 2026-04-26 · Next: 2026-07-26 · Per Bible §15.61