High-level summary

One score, updated each time a signal is verified.

Every time one of your signals is verified, we compute a performance score \(S \in [0, 1]\) for that signal and update your PolyScore using an ELO-like rule:

Rnew = Rold + K × (S - E)

If a signal does better than expected (S > E), your PolyScore goes up. If it underperforms (S < E), your PolyScore goes down. The higher your score already is, the harder it becomes to move it further up.

Per-signal performance score S

We blend direction and % move into a single score.

For each verified signal, we currently use two components:

Direction component:

D = 1 if the prediction was correct (the signal is verified as is_correct = true), otherwise D = 0.

Magnitude component (based on the verified accuracy percentage):

From the verification step we have accuracy_percentage, which measures how far the outcome moved in the predicted direction. We normalise its magnitude as:

P = 0 if the signal was incorrect or the move was non-positive in the predicted direction.

Otherwise:

P = min(|accuracy\_percentage| / 100, 1.0)

This means:

Blended performance score:

We combine direction and magnitude as:

S = 0.7 × D + 0.3 × P

Direction correctness drives most of the score, while larger profitable moves add extra credit.

Example A – Small but correct

LONG prediction, verified as correct with accuracy_percentage = +8%.

  • D = 1 (direction is correct)
  • P = min(0.08, 1.0) = 0.08
  • S = 0.7 × 1 + 0.3 × 0.08 ≈ 0.724
Solid win Modest move, solid signal
Example B – Big home-run

SHORT prediction, verified as correct with accuracy_percentage = +60%.

  • D = 1
  • P = min(0.60, 1.0) = 0.60
  • S = 0.7 × 1 + 0.3 × 0.60 = 0.88
High-impact win Large move, strongly rewarded

ELO-style update and score bounds

Higher PolyScore means we expect you to produce strong signals.

PolyScore is bounded between 0 and 100 and starts at 50 for every user. For each verified signal, we compute:

E = 1 / (1 + 10^{(BASE - R) / 400})

If your PolyScore is above 50, we expect you to perform better than average (E moves closer to 1). If it’s below 50, expectations are lower (E moves closer to 0).

The final update is:

Rnew = clamp( Rold + K × (S - E), 0, 100 )

Case PolyScore (R) S E ΔR = K·(S − E)
New user, solid win 50 0.72 ≈ 0.50 +2.2
High-rated user, small win 80 0.65 ≈ 0.88 −2.3
Mid-rated user, big loss 60 0.05 ≈ 0.65 −6.0

As scores get higher, expectations increase and each additional “good” signal moves the score less. Conversely, a large, incorrect call from a highly-rated user can move the score down more sharply.

Design rationale & future extensions

Why we chose this structure, and what might evolve.

In the future, we may add an explicit entry-price-based profit component once we record entry prices for all signals. That would allow us to distinguish between:

The current design already moves in this direction by using the magnitude of the verified percentage move, while keeping the system simple, bounded, and robust enough for live use.