Scoring
Overview#
AGDEL uses an R-multiple scoring model that measures reward relative to risk. Each signal specifies four values at creation time:
- entry_price — current market price (set server-side from Hyperliquid mid)
- target_price — where the maker expects price to be at expiry
- stop_price — where the maker's thesis is invalidated (the risk boundary)
- horizon — time until expiry (1m through 24h)
After expiry, the keeper resolves the signal and determines hit/miss. Makers are evaluated by Profit Factor, not hit rate.
Hit / Miss#
A signal is a hit when two conditions are met:
- Direction correct beyond noise floor — the price moved meaningfully in the predicted direction
- Non-trivial target spread — the target was far enough from entry to represent a real prediction
signedMove = (resolution_price - entry_price) / entry_price
LONG (target > entry): hit requires signedMove > noiseFloor
SHORT (target < entry): hit requires signedMove < -noiseFloor
Target spread (|target - entry| / entry) must also exceed the noise floor.Noise Floor by Horizon#
Moves smaller than the noise floor are indistinguishable from random fluctuation. Calibrated from production data (~p10 of realized absolute moves):
| Horizon | Noise Floor |
|---|---|
| 1m | 0.0049% |
| 5m | 0.0049% |
| 15m | 0.0097% |
| 30m | 0.015% |
| 1h | 0.0244% |
| 4h | 0.06% |
| 12h | 0.12% |
| 24h | 0.24% |
R-Multiple#
R = |target_price - entry_price| / |stop_price - entry_price|
R is capped at 20.R measures reward relative to risk using the maker's own target and stop prices. A tight stop with a distant target = high R. A wide stop with a close target = low R.
Quality Score#
quality_score = R (on hit)
quality_score = 0 (on miss)The quality score is the R-multiple earned. A maker who wins less often but with high R-multiples can be more profitable than a maker who wins frequently with low R.
Profit Factor#
Profit Factor = sum(R on wins) / count(losses)
> 1.0 = profitable maker
= 1.0 = breakeven
< 1.0 = unprofitableProfit Factor is the primary maker metric on the dashboard. It replaces hit rate because it accounts for the magnitude of wins, not just their frequency. A maker with 30% hit rate but average R of 5.0 has a Profit Factor of 1.5 — profitable despite losing most signals.
Worked Examples#
Example 1 — Hit with R = 3.0:
Entry: $2,000 | Target: $2,060 (LONG) | Stop: $1,980 | Horizon: 1h
Resolution: $2,055
spread = |2060 - 2000| / 2000 = 3.0% > noise floor (0.0244%) ✓
signedMove = +2.75% > noise floor ✓ → direction correct
R = |2060 - 2000| / |1980 - 2000| = 60 / 20 = 3.0
Result: HIT → quality_score = 3.0
Example 2 — Miss (wrong direction):
Entry: $2,000 | Target: $2,060 (LONG) | Stop: $1,980 | Horizon: 1h
Resolution: $1,970
signedMove = -1.5% → direction wrong
Result: MISS → quality_score = 0
Example 3 — Miss (trivial target):
Entry: $2,000 | Target: $2,000.08 (LONG) | Stop: $1,999.95 | Horizon: 1m
Resolution: $2,000.05
spread = 0.004% < noise floor (0.0049%) → trivial target
Result: MISS → quality_score = 0
Example 4 — Profit Factor over 10 signals:
3 hits (R = 3.0, 2.5, 4.0), 7 misses
sum(R on wins) = 9.5, losses = 7
Profit Factor = 9.5 / 7 = 1.36 → profitable (despite 30% hit rate)Default Penalties#
- No delivery by leg deadline -> purchase-leg default, refund outcome
- No reveal by expiry + 30m -> signal default, refund outcomes
Both defaults result in quality_score = 0 and impact Profit Factor.
Legacy Scoring#
Signals without a stop_price use the legacy points-based model for backward compatibility:
score = ambition × (direction + precision + breakout)
Range: 0–5, hit = score >= 1.0Legacy signals do not participate in Profit Factor calculations.
Optimization Guidance#
- Set a meaningful stop price at a genuine invalidation level — your stop defines the risk side of R.
- Aim for R >= 2.0 — you can be wrong more than half the time and still be profitable.
- Get direction right beyond the noise floor — direction is binary (hit or miss).
- Don't set trivial targets — if the target spread is below the noise floor, the signal always misses.
- Choose horizons that match your edge — shorter horizons have tighter noise floors but less time for the move to develop.
- Always reveal on time — defaults earn quality_score = 0 and damage your Profit Factor.
- Deliver encrypted payloads promptly — missed deliveries result in refunds.
Profit Factor is the metric that matters. A 30% hit rate with R = 3.0 average beats a 70% hit rate with R = 0.3 average. Optimize for favorable risk/reward setups, not win rate.
Aggregation Hierarchy#
maker x signal_type x horizon_bucketmaker x signal_typemakeraggregate (context)
Reliability Adjustment#
Sample size is first-class. A slice with 10 trades should not outrank a stable slice with 1000 trades on raw Profit Factor alone.
reliability_weight = sample_count / (sample_count + k)
adjusted_quality = prior_quality + reliability_weight * (raw_quality - prior_quality)UI defaults should sort by adjusted metrics and always display raw metrics + sample count for transparency.