> ## Content Index
> Fetch the complete content index at: https://blog.numer.ai/llms.txt
> Use this file to discover other available public pages before exploring further.

# Introducing Alpha: A Risk-Aware Scoring System for Signals
- URL: https://blog.numer.ai/signals-alpha-and-mpc/
- Published: 2025-07-31T17:18:52.000Z
- Updated: 2026-02-19T21:27:47.000Z
- Description: Numerai introduces important Signals updates including new 60-day scores Alpha and Meta-Portfolio Contribution, a new "chili" target, a new Turnover threshold, and changes to payouts starting September 2nd. Join us on August 6th for a fireside chat.
- Author: Noah Harasz

On [Numerai](https://numer.ai/?ref=blog.numer.ai), data scientists use Numerai's data to build machine learning models which produce predictive signals on global equities.

On [*Numerai Signals*](https://signals.numer.ai/?ref=blog.numer.ai), data scientists who already have their own stock market data submit their signals to Numerai. A signal uploaded to Numerai Signals could look like the below:

![](https://storage.ghost.io/c/4e/7e/4e7e879a-2a82-421c-bf17-f319f40a01a4/content/images/2025/07/Screenshot-2025-07-28-at-12.12.49---PM.png)

Example signal uploaded to [Numerai Signals](https://signals.numer.ai/?ref=blog.numer.ai)

### **The Importance Of Scoring**

Because Numerai Signals users can submit any signal built from any dataset, Numerai has to be extremely careful how we score signals.

For example, some signals submitted have strong correlation with subsequent residual returns. But if all of the performance comes from low liquidity small cap stocks, this signal may not be very valuable in live trading for a fund as large as Numerai's.

Ignoring important details such as this in scoring is harmful in two ways:

1. **Data scientists with problematic signals earn more NMR than they should.**
2. **Data scientists with great signals may be incentivized to make them *worse* for Numerai but better at the incomplete scoring metric.**

The more the scoring system captures the important features of live trading a signal, the better the incentives and the better the rewards to the truly helpful signals.

### **What makes a signal monetizable?**

The answer is that it depends on the optimizer used to trade the signal and the assumed fund assets. But here is what matters to Numerai's optimizer:

1. Neutrality to all factors
2. The liquidity of the stock (high average daily volume is better)
3. The residual volatility of the stock (low idiosyncratic volatility is better)

The problem is: Numerai Signals users don't necessarily have residual volatility or liquidity estimates and don't have Numerai's factor model either. This means Numerai Signals users are building signals somewhat blind to this important information which really influences the value of the signal to Numerai.

### **Alpha**

Today, we have released a new scoring metric called **Alpha**. Alpha is the biggest improvement to Numerai Signals scoring since its launch. Not only does it handle every issue above, but it is also **entirely computable locally**. Data scientists building signals can explicitly train their machine learning models to maximize Alpha and align their models with the Numerai hedge fund.

To do this, Numerai created and released three new pieces of data:

- **Neutralizers Matrix**: a 200-column matrix used to neutralize a signal to every factor Numerai has
- **Sample Weights Vector**: a weight vector used to adjust the weights of stocks based on the liquidity & residual volatility of the stock
- **Chili Target**: a new 60D2L target residual to every factor Numerai has

We can create a set of **neutralized weights** from a signal before scoring given the following data:

- signal ***s*** (NaNs filled w/ 0.5)
- neutralization matrix ***N***
- weight vector ***v***

We first we create **s'** by ranking, normalizing, and exponentiating:

```
s' = normalize(rank(s))^1.5
```

Next, generate neutralize predictions using the sample weights and neutralization matrix. The neutralization matrix was created to be aware of the weight vector - this is the true power of the new data - so, we weight **s',** project it into the neutralization space, then adjusting the original to get the neutralized signal:

```
neutral_signal = s' - (N @ (N.T @ (v * s')))
```

Then, we apply the sample weights:

```
neutral_weights = neutral_signal * v
```

Finally, we use the 60D2L target `chili` to derive the final `alpha` value:

```
alpha = neutral_weights @ target_chili_60
```

Since, Alpha integrates every important aspect of Numerai's optimizer, it aligns the signal scoring system with what is realistically tradable by Numerai's optimizer.

Alpha is currently live and backfilled on [Numerai Signals](https://signals.numer.ai/leaderboard?ref=blog.numer.ai) for all users. Users may find that signals which were previously performing badly in the previous scoring system may be doing better on Alpha. Because, Alpha is calculated after neutralization, many users may find Alpha is far less risky / has far lower drawdowns than our previous scoring system. If your performance looks significantly worse on Alpha, you may be able to diagnose the problem and repair it: for example, if you signal was earning too much from small caps or factor exposures it might be easy to fix by retraining.

![](https://storage.ghost.io/c/4e/7e/4e7e879a-2a82-421c-bf17-f319f40a01a4/content/images/2025/07/Screenshot-2025-07-30-at-10.17.24---AM.png)

exceptional users on previous metrics tend to be exceptional on Alpha and MPC as well

### **Meta Portfolio Contribution (MPC)**

In all of Numerai's tournaments, we use [Meta Model Contribution (MMC)](https://docs.numer.ai/numerai-tournament/scoring/meta-model-contribution-mmc?ref=blog.numer.ai) to incentivize data scientists to produce orthogonal alpha vs the existing signals on the platform. With the invention of Alpha, Numerai Signals also needs a metric that accomplishes the same goal: incentivize models that ensemble well with others after neutralization and sample weighting.

An analog to the Meta Model signal used in MMC is the Stake-Weighted Portfolio (**SWP**). In this case, **Meta Portfolio Contribution evaluates the extent to which a signal enhances the Alpha of the SWP**. To find an individual model’s contribution, we could then increase their stake in the SWP slightly and measure the change in Alpha of the SWP. This is just a gradient of SWP Alpha with respect to a model's stake.

Given the following data:

- signals matrix ***S*** (NaNs filled w/ 0.5)
- stake-weights ***p***
- neutralization matrix ***N***
- weight vector ***v***

We generate neutral weights per signal the same way as before:

```
s` = normalize(rank(s))^1.5
neutral_preds = s` - (N @ (N.T @ (v * s`)))
neutral_weights = neutral_preds * v
```

Next, we compute the Stake Weighted Average of all of them to construct the **SWP**and normalize the total weight to ensure it resembles a real-world portfolio:

```
SWP = (p * user_stakes).sum()
SWP = SWP - SWP.mean()
SWP = SWP / sum(abs(SWP))
```

Then, we can calculate the Alpha of the SWP:

```
SWP_Alpha = SWP * target
```

Finally, MPC is the gradient of SWP Alpha with respect to stakes (the `gradient(s, w)` function is trying to maximize **s** by adjusting **w**):

```
MPC = gradient(SWP_Alpha, p)
```

When paid on MPC, data scientists will be incentivized to stake on signals that push the Numerai Signals tournament to be valuable to Numerai's hedge fund. [Visit the numerai-tools repository](https://github.com/numerai/numerai-tools/blob/eb4252237b92f379fcd8c4dc2e0b546fae218f10/numerai%5Ftools/scoring.py?ref=blog.numer.ai#L577-L620) if you're interested in reading the code for MPC.

### **Turnover**

There's one other thing our optimizer likes and that is slow moving signals. As Signals users already know, [we require signals to stay under 15% week-over-week churn](https://forum.numer.ai/t/signals-churn-threshold/7648?ref=blog.numer.ai). The churn filter has lead to a drastic improvement in the tradability of signals on Numerai Signals.

Churn, however, only considers the raw signal's predictions, not the related neutral weights, so we need a new concept. **Turnover** is the difference in weights between two neutral weights vectors. It is a simple calculation:

```
turnover(t0, t1) = (w(t0) - w(t1)).abs().sum() / 2
```

Where **w(t)** is the neutral weights vector at time **t**.

We plan to set the turnover threshold at 25%, which we have seen internally is a reasonable level of turnover for individual models and reduces overall turnover of the SWP to a tradable range. While turnover and churn can be different for some signals, signals already below 15% churn are likely to be below 25% turnover already.

### **Payouts**

We want the Numerai community to have some time to think about Alpha, MPC, and turnover so we have not implemented any changes to the way payouts work on Signals just yet. However, rounds starting on or after September 2nd will include these changes:

- Payouts will be based on Alpha and MPC - we are considering 0.3xAlpha + 0.8xMPC as the payout multipliers
- Stakes will be locked up for 12 weeks, not 4.
- Churn threshold will be deactivated
- Turnover threshold will be activated

### **Next Fireside**

We'd like to hear what you think in our [#signals](https://discord.gg/QVGXt4wsk9?ref=blog.numer.ai) Discord channel, so join today to stay in the loop. We will also hold a fireside chat with our founder and CEO Richard, Chief Tournament Officer Noah, and Research Engineer Andres on Wednesday, August 6th 2025 to talk more about these changes - follow [this zoom link](https://us02web.zoom.us/webinar/register/WN%5FQ5x95AIbS3O4C-kJEZWHaw?ref=blog.numer.ai) to join the webinar on Wednesday.

If you'd like to continue reading about these updates, [check out our forum](https://forum.numer.ai/c/announcements/8?ref=blog.numer.ai) for a more detailed post by one of our engineers.