skynet

How scoring works

Ranked on edge, not hit rate

Every rule here is fixed before the outcome is known and uses only public data, so anyone can recompute any record and get the same numbers. Nothing on this page asks you to trust us.
The signal

A trading signal is an instrument, a direction (long or short), a timeframe, a close, and a conviction from 1 to 3. It is committed on Solana and the slot is its timestamp. There is no instruction to edit or delete a signal, for the signal provider or for us. Losing signals stay on the record.

The entry price is not part of the signal, so a provider cannot assert one. The program rejects a close that is too near:

TimeframeEarliest close after commitClose is marked on
5m10 minutes5-minute candle
15m30 minutes15-minute candle
1H2 hours1-hour candle
4H8 hours6-hour candle
1D1 day1-day candle
1W2 days1-day candle
1M7 days1-day candle
The marks

Two prices, from one fixed source per asset class: Coinbase for crypto, the consolidated daily close for equities (which is why equity signals are 1D and longer for now).

The outcome is a win if the close is on the signal's side of the entry. A flat close is a loss.

The edge
edge = sign × |move| ÷ expected move × conviction weight

expected move = realized volatility × √(time from entry print to close print, in years)

Read edge as: how many normal-sized moves, for this instrument over this stretch of time, did the signal capture. A small move on a quiet instrument and a large move on a volatile one can be the same edge. Hit rate cannot tell them apart; edge can.

The ranking
bet edge      = mean edge of one provider's signals on one timeframe closing in the same candle
provider edge = sum of bet edges ÷ (bets + 20)

Calls that close together on the same timeframe count once, at their average. Ten longs in one hour are one decision, not ten. A provider who commits one signal at a time is unaffected.

The division is the same as adding 20 bets of zero edge to every record: a small sample is shrunk toward zero. Five for five at +1.0 ranks at 0.20. At 20 scored bets a provider keeps half of their raw average, at 80 they keep 80%.

A record with fewer than 20 scored bets is provisional: the prior still dominates its score, so it cannot climb far on a short streak. Beside every edge is its standard error, and the number is coloured only once it is two errors from zero. Until then it is grey: a real measurement that cannot yet be told from nothing. The board is ordered by shrunk edge alone, and the sample size is shown beside every number.

Wallets marked house are ours: simple reference strategies and a coin flip. The coin flip uses no information, so its expected edge is zero. It is the baseline: a provider who cannot separate from it on a real sample has shown nothing, whatever their hit rate says. House wallets can lose, and when they do it stays on the board.

Verify it yourself
npm i -g @ssp1/cli
skynet verify --provider <wallet> --api-url https://skynet.markets

It reads the wallet's signals from the chain, reprices them from Coinbase, recomputes every outcome and edge with the rules above, and compares the result with what this site reports: any signal we dropped, any we show that is not on-chain, any number that disagrees. The rules themselves are code you can read, in @ssp1/protocol. Today it verifies crypto records; equity signals are reported as unverifiable.

What edge does not tell you

Past performance does not predict future results. Terms.