一、Numerai 平台介绍
Numerai 是一家坐标美国的对冲基金。据团队2025年2月向美国证券交易委员会(SEC) 披露的信息显示:截至20241231:
持仓规模为3.6亿美元(现金部分未披露)
基金持仓头寸数为389支
为什么要关注它,是因为它的噱头集成实在是太多了:机器学习+加密货币+对冲基金。它有自己的量化比赛平台,并且有自己发币:NMR。在比赛平台上,参赛者需要构建模型预测金融市场走势,并提交自己的预测结果/模型。平台再根据参赛者的质押金额,对模型预测结果做集成,以此来指导投资。
在该平台上,截至20250312:平台上的活跃参与者(有提交并且质押本金)用户有490位,模型数为3851个。质押55万枚NMR,约合440万美元。平均每位用户质押约9千美元,质押中位数为8百美元。年回报率约为46%。
由于增加了质押和回报计算部分,相较于一般量化比赛会稍显复杂。本文将在评价指标和回报计算方面,做着重介绍。此外还将给出一个初步的执行流程,以及作者的实盘线上反馈。
- 评价指标:如何评判和分配收益
- 数据情况:数据分布&数据生成机制
- 模型构建:如何构建基本模型
- 线上反馈:提交后的数据情况和可能的改进方向
如果读者对于量化的基本知识还不甚了解,可参考作者的思维导图:谷粒的博客 思维导图|《量化交易》
二、评估指标参考
核心指标与回报计算
一句话概括:既关注模型的预测效果,也关注模型的额外信息增益。预测效果:关注的是模型对于特定标的未来20天的预测相关性,使用相关系数计算。额外信息增益:关注单个模型对于最后的加权模型预测的贡献度,越独特越准确越好。
另外,平台增加了本金的概念:你需要对自己的模型下注,下注的标的物便是NMR,平台发行的加密货币。
最后的收益计算如下:payout = stake * clip(payout_factor * (corr * 0.5 + mmc * 2), -0.05, 0.05)
其中:payout指平台支付给你的回报,stake是下注的本金。clip的作用是限制最大最小范围到0.05上下。其中corr和mmc是需要重点关注的指标。平台希望提交的模型关注相关性,更关心模型的额外贡献情况。
相关系数 (CORR)
相关系数衡量预测值与实际目标值之间的相关性。
import numpy as np
from scipy import stats
def numerai_corr(preds, target):
"""
计算转换后的预测值和目标值之间的皮尔逊相关系数
Args:
preds: 预测值
target: 目标值
Returns:
float: 相关系数
"""
# 对预测值进行排名和高斯化
ranked_preds = (preds.rank(method="average").values - 0.5) / preds.count()
gauss_ranked_preds = stats.norm.ppf(ranked_preds)
# 目标值中心化
centered_target = target - target.mean()
# 将预测值和目标值都提高到1.5次方,加强尾部
preds_p15 = np.sign(gauss_ranked_preds) * np.abs(gauss_ranked_preds) ** 1.5
target_p15 = np.sign(centered_target) * np.abs(centered_target) ** 1.5
# 计算相关系数
return np.corrcoef(preds_p15, target_p15)[0, 1]
相关系数是一个比较常见的评估指标。如果是个人量化或者公司量化,也会关心该指标。而MMC是一个不怎么常用的指标。
模型贡献(MMC)
如果你的模型既预测相关度高,又和其他人的模型预测结果不同,那么你们MMC就高。但如果你的模型和别人的模型一样,那么MMC就会很低。
算法原理:
- 先计算 Meta Model(一个汇总所有预测者的加权平均模型)。
- 假设你的模型
predictions
与 Meta Model 非常相似,那么你的模型实际上 没有贡献新的信息,MMC 会很低。 - 如果你的模型贡献了新的信息(即,预测与 Meta Model 不同,但仍然与目标相关),MMC 会更高。
计算方式:
-
中性化你的预测:去掉你预测与 Meta Model 的相似性(消除与 Meta Model 高度相关的部分,即正交化)。
-
计算消除 Meta Model 成分后的预测与真实值的协方差
def contribution(
predictions: pd.DataFrame,
meta_model: pd.Series,
live_targets: pd.Series,
) -> pd.Series:
"""Calculate the contributive correlation of the given predictions
wrt the given meta model.
Then calculate contributive correlation by:
1. tie-kept ranking each prediction and the meta model
2. gaussianizing each prediction and the meta model
3. orthogonalizing each prediction wrt the meta model
4. multiplying the orthogonalized predictions and the targets
Arguments:
predictions: pd.DataFrame - the predictions to evaluate
meta_model: pd.Series - the meta model to evaluate against
live_targets: pd.Series - the live targets to evaluate against
Returns:
pd.Series - the resulting contributive correlation
scores for each column in predictions
"""
# filter and sort preds, mm, and targets wrt each other
meta_model, predictions = filter_sort_index(meta_model, predictions)
live_targets, predictions = filter_sort_index(live_targets, predictions)
live_targets, meta_model = filter_sort_index(live_targets, meta_model)
# rank and normalize meta model and predictions so mean=0 and std=1
p = gaussian(tie_kept_rank(predictions)).values
m = gaussian(tie_kept_rank(meta_model.to_frame()))[meta_model.name].values
# orthogonalize predictions wrt meta model
neutral_preds = orthogonalize(p, m)
# center the target
live_targets -= live_targets.mean()
# multiply target and neutralized predictions
# this is equivalent to covariance b/c mean = 0
mmc = (live_targets @ neutral_preds) / len(live_targets)
return pd.Series(mmc, index=predictions.columns)
指标汇总
CORR和MMC是直接参与计算收益的指标,除了他俩平台还推荐关注FNC特征中性化指标。
指标类型 | 重要性 | 收益影响 | 关注度 | 优化建议 |
---|---|---|---|---|
Correlation (CORR20v2) | 最基础指标 | 直接影响基础收益 | 高 | 保持稳定性,避免过拟合 |
Meta Model Contribution (MMC) | 最重要指标 | 额外收益主要来源 | 最高 | 开发独特策略,避免与其他模型高度相关 |
Feature Neutral Correlation (FNC) | 风控指标 | 影响长期收益 | 高 | 降低特征依赖,提高模型鲁棒性 |
-
相关系数(CORR):衡量预测准确性
-
元模型贡献(MMC):衡量模型独特性,与其他模型的差异性,对整体预测的贡献
-
特征中性(FNC):避免过度依赖单一特征,寻求Alpha收益而非Beta
其他重要指标
- 夏普比率 (sharpe)
- 最大回撤 (max_drawdown)
除了相关性,在实盘中我们还会关心夏普值和最大回撤。但该指标为后验指标,在该平台为参考指标。
三、数据说明
id其实就是对应的股票市场上的标的物;era代表时间单位,一个era表示一周,预测目标是4周后的市场表现。target是人为构造,有多种构造方式已实现。
数据集说明
数据集包含以下文件:
train_int8.parquet
: 训练数据validation_int8.parquet
: 验证数据live_int8.parquet
: 实时预测数据meta_model.parquet
: 元模型数据features.json
: 特征说明_example_preds.{csv,parquet}
: 示例预测文件
实际上他们的接口会有变动,命名大致如上。数据已经清洗干净。
实测说明
预测目标可以进行融合,特征在训练集做了全局处理,构建交叉验证时需注意过拟合风险。
验证集和训练集都是过去的数据,是官方人为切割的结果。这样做只是为了和官网上的评估参数一致。
个人开发而言,将验证集和训练集合并,也是OK的。不过根据线上指标的反馈,合并后会负向影响MMC指标。
四、开发建模
根据官方的文档,建模其实代码很少,几行就可以跑起来,因为数据已经被清洗、归一化过了。
详情可参考:hello_numerai.ipynb
# https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.LGBMRegressor.html
import lightgbm as lgb
# https://lightgbm.readthedocs.io/en/latest/Parameters-Tuning.html
model = lgb.LGBMRegressor(
n_estimators=2000,
learning_rate=0.01,
max_depth=5,
num_leaves=2**5-1,
colsample_bytree=0.1
)
# This will take a few minutes 🍵
model.fit(
train[feature_set],
train["target"]
)
核心部分相当直接,毕竟特征和label都已经帮你构造好了,不像公司业务需要自己组织生产。训练完成后,可以选择模型上传,在线上预测。也可以考虑数据拉取,然后上传结果。
就参考脚本来说,官方给出的建议是增加n_estimators可提升模型效果,这也符合机器学习的直觉。不过这样做的潜在风险是MMC会降低,因为官方自己大概率用的这种方式。
对于参赛者来说,在增大参数前,更多的数据探索和模型构造是更建议的做法。
五、总结
该社区内的活跃度不算高,近期3个月少有用户发言。平台的拉新工作一般,NMR货币的获取对于大部份人来说并非易事,新手引导的NMR货币发放也存在bug难以到账。有用户认为NMR代币的方式,会带来价格波动上的风险。
平台提供的数据是清洗匿名化的数据。希望通过众包的形式,借助不同的数据科学家,生成预测能力强、偏向Alpha的量化模型。对于个人来说,是一个不错的练手之地。不同于实际业务中的数据清洗占大头的情况,这里需要的是模型能力。除此之外,平台的模型思想还是值得学习的:特别是label融合和特征中性化的技巧。
参考资料
- 指标说明文档
- 官方提交说明
- NMR 价格走势
- Numerai GP 投资组合持仓
- 工具推荐:
- 集成工具: numerblox
- THOR工具: thor-public
评分指标总览
指标名称 | 缩写 | 计算周期 | 说明 | 计算方法 |
---|---|---|---|---|
Correlation | CORR20v2 | 20D2L (+2天数据延迟) | 预测值与target_cyrus_20的相关系数 | numerai_corr |
Meta Model Contribution | MMC | 20D2L (+2天数据延迟) | 预测值对SWMM和target_cyrus_20的贡献 | correlation_contribution |
Feature Neutral Correlation | FNCV3 | 20D2L (+2天数据延迟) | 特征中性化后的相关系数 | feature_neutral_corr |
Correlation Jerome | CORJ60 | 60D2L (+2天数据延迟) | 预测值与target_jerome_60的相关系数 | numerai_corr |
Benchmark Model Contribution | BMC | 20D2L (+2天数据延迟) | 预测值对BMM的贡献 | correlation_contribution |
Correlation with Meta Model | CWMM | 4天数据延迟 | 与SWMM的相关系数 | pearson correlation |
Max Correlation with Numerai Models | MCWNM | 4天数据延迟 | 与其他提交模型的最大相关系数 | pearson correlation |
Average Pairwise Correlation with Numerai Models | APCWNM | 4天数据延迟 | 与其他提交模型的平均相关系数 | pearson correlation |
注:
- 20D2L (20 Days 2 Lag): 20个交易日(4周),2天延迟
- 60D2L (60 Days 2 Lag): 60个交易日,2天延迟
- SWMM (Stake-Weighted Meta Model): 加权元模型
- BMM (Benchmark Meta Model): 基准元模型