Cómo Comenzar con Numerai
Código Completo →
Introducción
Numerai is a crowdsourced AI hedge fund that operates on predictions made by data scientists worldwide (like you)! Numerai was founded by Richard Craib in 2015. Some very experienced people in quantitative finance, like Howard Morgan (Co-Founder of Renaissance Technologies) and Marcos López de Prado (Professor at Cornell University and scientific advisor to Numerai), are involved with the project.
By combining the predictions of thousands of data scientists, they can gain a competitive edge against other quantitative hedge funds. In contrast, data scientists can financially benefit by contributing their predictions to the platform.
¡Numerai es un fondo de cobertura de IA de colaboración abierta que opera sobre las predicciones realizadas por los científicos de datos de todo el mundo (como tú)! Numerai fue fundado por Richard Craib en 2015. Algunas personas muy experimentadas en la finanza cuantitativa, como Howard Morgan(cofundador de Renaissance Technologies) y Marcos López de Prado (profesor en la Universidad de Cornell y asesor científico de Numerai), están involucrados en el proyecto. Al combinar las predicciones de miles de científicos de datos, pueden obtener una ventaja competitiva contra otros fondos de cobertura cuantitativos. En contraste, los científicos de datos pueden beneficiarse financieramente al contribuir con sus predicciones al problema. Para hacerte una idea de qué es precisamente Numerai, revisa este video corto:
Prácticamente, la primera cosa que ves en la página de inicio de Numerai es la frase en negrita “La competencia de ciencia de datos más difícil del planeta”. ¿Por qué (no) es tan difícil competir en Numerai?
¿Por qué Numerai no es Tan Difícil?
- Los datos ofuscados hacen que sea imposible integrar el conocimiento del dominio y te fuerzan a enfocarte en la ingeniería y el modelado de características.
- No hay muchas señales en el conjunto de datos, así que es difícil extraer características con valor predictivo.
- Evaluar tu modelo no es sencillo. Tu modelo puede ser bueno en algunas situaciones de mercado, pero puede fallar en otras.
Why is Numerai not That Hard?
- Al contrario de otras competiciones de ciencia de datos, no tienes que estar en lo alto de la tabla de clasificaciones para beneficiarte de Numerai.
- No es requerido ningún conocimiento en el dominio de las finanzas.
- Todas las características en los conjuntos de datos están regularizadas, y no hay características categóricas (a excepción de la columna era).
- El modelo no tiene que ser interpretable. Tú solamente provees las predicciones.
¿Así Que, Cómo Funciona Esto en la Práctica?
La base de todas las transacciones en la plataforma de Numerai es el token Numeraire (NMR).. Este token opera sobre la plataforma Ethereum, y permite que Numerai posibilite fácilmente las transacciones a sus científicos de datos.
Cada semana, los científicos de datos entregan predicciones utilizando conjuntos de datos de Numerai, y estas predicciones van a ser utilizadas para las inversiones en acciones en su meta modelo. Entonces, cada usuario puede invertir tanto NMR en su modelo como desee. Dependiendo de la calidad de tu modelo, tu inversión en NMR se va a incrementar o se va a decrementar. La inversión asegura que el usuario entregue modelos sensatos e impide los ataques Sybil. Al entregar predicciones regulares cada semana, tu reputación se va a incrementar conjuntamente con tu posición en la tabla de clasificaciones. Ten en cuenta que no tienes que compartir ningún detalle acerca de tu modelo, y esto hace que sea casi imposible que Numerai haga ingeniería reversa de tu modelo. Numerai y sus usuarios, consecuentemente, son dependientes entre sí y comparten los riesgos de forma balanceada.
Procesamiento de Datos
Numerai tiene su propia API (NumerAPI) que provee una interfaz conveniente para descargar los conjuntos de datos, para obtener información acerca de la competencia y para cargar tus predicciones. Podemos descargar los últimos datos, descomprimirlos y cargarlos con sólo algunas pocas líneas de código.
import numerapi
NAPI = numerapi.NumerAPI(verbosity="info")
# Download new data
DIR = "my_data_directory"
NAPI.download_current_dataset(dest_path=DIR, unzip=True)
# Load data
full_path = f'{DIR}/numerai_dataset_{NAPI.get_current_round()}/'
train = pd.read_csv(full_path + 'numerai_training_data.csv')
test_df = pd.read_csv(full_path + 'numerai_tournament_data.csv')
# Split validation and test
val = test_df[test_df['data_type'] == 'validation']
test = test_df[test_df['data_type'] != 'validation']
Código Completo →
El Conjunto de Datos de Numerai
Métricas
Correlación de Spearman
Scipy provides an excellent implementation to calculate the Spearman correlation: Cuando compites en Numerai, tu modelo va a ser evaluado sobre la métrica de la “Correlación de Spearman”. He construido un Kernel de Kaggle dedicado a esta métrica que puedes revisar aquí. Scipy provee una excelente implementación para calcular la correlación de Spearman:
from scipy.stats import spearmanr
def spearman(y_true, y_pred, axis=0):
""" Calculate Spearman correlation """
return spearmanr(y_true, y_pred, axis=axis)
Código Completo →
Índice de Sharpe
Inclusive aunque la Correlación de Spearman sea la métrica principal, ésta no tiene en cuenta lo estable que es tu modelo a través de las múltiples eras. En consecuencia, por lo general es más útil monitorear el “índice de Sharpe”. Esta métrica es muy utilizada en las finanzas cuantitativas. El índice de Sharpe básico para las predicciones de Numerai puede ser calculado al tomar la correlación promedio por era y dividir por la desviación estándar de las correlaciones por era.
En el código Python, el cálculo se ve algo así:
import numpy as np
import pandas as pd
from scipy.stats import spearmanr
def sharpe(df: pd.DataFrame) -> np.float32:
"""
Calculate the Sharpe ratio by using grouped per-era data
:param df: A Pandas DataFrame containing the columns "era", "target" and "prediction"
:return: The Sharpe ratio for your predictions.
"""
def _score(sub_df: pd.DataFrame) -> np.float32:
""" Calculate Spearman correlation for Pandas' apply method """
return spearmanr(sub_df["target"], sub_df["prediction"])[0, 1]
corrs = df.groupby("era").apply(_score)
return corrs.mean() / corrs.std()
# Get Sharpe Ratio for validation data
sharpe(val)
Código Completo →
Para este reporte, vamos a monitorear las métricas de la correlación de Spearman, el Índice de Sharpe, la Tasa de Pagos de Numerai, y el Error Absoluto Medio (MAE). Adicionalmente, calculamos la exposición de las características, de las cuales voy a hablar en la próxima sección.
Ingeniería de Características y Selección
Las características tienen una correlación remarcablemente baja con la variable objetivo. Incluso las características más correlacionadas sólo tienen alrededor del 1,5% de correlación con el objetivo. Diseñar características útiles a partir de los agrupamientos entre las características y las eras es clave para crear buenos modelos en Numerai. También, la importancia de las características puede cambiar a través del tiempo. Al seleccionar un número limitado de características nos arriesgamos a tener una alta “exposición de características”. La exposición de las características puede ser cuantificada como la desviación estándar de todas las correlaciones de tus predicciones con cada característica. Puedes mitigar este riesgo al utilizar técnicas de reducción de dimensiones, como el Análisis del Componente Principal (PCA), para integrar a casi todas las características en tu modelo. En este ejemplo para principiantes, tomamos las 150 características que están más correlacionadas con la variable objetivo.
# Calculate correlations with target
full_corr = train.corr()
corr_with_target = full_corr["target"].T.apply(abs).sort_values(ascending=False)
# Select features with highest correlation to the target variable
features = corr_with_target[:150]
features.drop("target", inplace=True)
feature_list = features.index.tolist()
Modeling / Hyperparameter Optimization
Para obtener un buen modelo inicial para Numerai, vamos a entrenar un modelo de LightGBM, y a utilizar Weights and Biases para hacer un barrido de hiperparámetros. En este ejemplo, vamos a hacer una búsqueda en rejilla sobre algunos de los hiperparámetros más importantes para LightGBM. Primero, definimos las configuración del barrido. Para obtener un buen modelo inicial para Numerai, vamos a entrenar un modelo de LightGBM, y a utilizar Weights and Biases para hacer un barrido de hiperparámetros. En este ejemplo, vamos a hacer una búsqueda en rejilla sobre algunos de los hiperparámetros más importantes para LightGBM. Primero, definimos las configuración del barrido.
sweep_config = {
'method': 'grid',
'metric': {
'name': 'mse',
'goal': 'minimize'
},
'parameters': {
"num_leaves": {'values': [30, 40, 50]},
"max_depth": {'values': [4, 5, 6]},
"learning_rate": {'values': [0.05, 0.01, 0.005]},
"bagging_freq": {'values': [7]},
"bagging_fraction": {'values': [0.6, 0.7, 0.8]},
"feature_fraction": {'values': [0.85, 0.75, 0.65]},
}
}
sweep_id = wandb.sweep(sweep_config, project="numerai_tutorial")
Después de eso, definimos una función (_train) utilizando los atributos de wandb.config , así Weights and Biases puede ejecutar la búsqueda en rejilla. ¡Nos aseguramos de registrar todas las métricas y entonces podemos iniciar el agente!
# Prepare data for LightGBM
dtrain = lgb.Dataset(train[feature_list], label=train["target"])
dvalid = lgb.Dataset(val[feature_list], label=val["target"])
watchlist = [dtrain, dvalid]
def _train():
# Configure and train model
wandb.init(project="numerai_tutorial", name="LightGBM_sweep")
lgbm_config = {"num_leaves": wandb.config.num_leaves,
"max_depth": wandb.config.max_depth,
"learning_rate": wandb.config.learning_rate,
"bagging_freq": wandb.config.bagging_freq,
"bagging_fraction": wandb.config.bagging_fraction,
"feature_fraction": wandb.config.feature_fraction,
"metric": 'mse',
"random_state": seed}
lgbm_model = lgb.train(lgbm_config,
train_set=dtrain,
num_boost_round=500,
valid_sets=watchlist,
callbacks=[wandb_callback()],
verbose_eval=100,
early_stopping_rounds=50)
# Create predictions for evaluation
val_preds = lgbm_model.predict(val[feature_list], num_iteration=lgbm_model.best_iteration)
val.loc[:, "prediction"] = val_preds
# W&b log metrics
spearman, payout, feature_exposure, numerai_sharpe, mae = evaluate(val)
wandb.log({"Spearman": spearman, "Payout": payout, "Feature Exposure": feature_exposure,
"Numerai Sharpe Ratio": numerai_sharpe, "Mean Absolute Error": mae})
# Run sweep
wandb.agent(sweep_id, function=_train)
Código Completo →
Los resultados revelan que la tasa de aprendizaje y max_depth son los hiperparámetros más importantes para nuestro modelo de LightGBM. El diagrama de coordenadas paralelas de abajo, muestra que el modelo con la correlación de Spearman más alta no nos va a conducir necesariamente al índice de Sharpe más alto. Asegúrate de comparar múltiples métricas cuando evalúes tus modelos de Numerai.
Emisión
Es posible subir directamente un archivo CSV con tus predicciones a la página de la competencia de Numerai. Sin embargo, se vuelve tedioso hacerlo cada semana, y NumerAPI facilita la carga de tus predicciones. Esto requiere que agregues tus claves de la API cuando estés inicializando NumerAPI.
Una vez que hayas obtenido tus claves de la API, puedes emitir fácilmente tus predicciones con algunas pocas líneas de código.
PUBLIC_ID = "MY_ID"
SECRET_KEY = "MY_SECRET_KEY"
SUB_PATH = "my_submission_directory/submission1.csv"
# Initialize API with API Keys
NAPI = numerapi.NumerAPI(public_id=PUBLIC_ID,
secret_key=SECRET_KEY,
verbosity="info")
# Upload predictions for current round
test[["id", "prediction"]].to_csv(SUB_PATH, index=False)
NAPI.upload_predictions(DIR, tournament=NAPI.get_current_round())
Código Completo →
Advertencia (Cosas que hay que Tener en Cuenta)
- Sé consciente de que al invertir en tu modelo a través de Numerai, estás tomando un riesgo tanto sobre tu modelo como sobre el token Numeraire mismo. Desde enero de 2020, Numeraire subió su valor significativamente (revisa CoinMarketCap para obtener el precio más actual). Sin embargo, las criptomonedas son conocidas por ser volátiles.
- Sé cuidadoso de no juzgar el desempeño de tu modelo demasiado rápidamente. Las buenas métricas de validación y el desempeño en vivo a corto plazo no son una garantía de que tu modelo vaya a funcionar bien a la larga. Tómate tu tiempo para establecer un buen esquema de validación (cruzada) y para evaluar tus modelos. Yo supervisé mi modelo durante dos meses antes de invertir Numeraire en él.
Consejos Finales
- Numerai está ofreciendo recompensas por error para la gente que pueda encontrar fallas en la plataforma. Esta es una forma magnífica de conseguir Numeraire si eres escéptico respecto a invertir tu propio dinero. Para más información, verifica la documentación de Numerai acerca de las recompensas.
- Numerai tiene una gran comunidad, en donde son compartidas ideas interesantes de forma continua. Asegúrate de revisar su plataforma de RocketChat y el foro de Numerai.
- ¿Estás confiado en que puedes construir modelos utilizando técnicas que pueden haber sido pasadas por alto por otros usuarios? Recientemente, Numerai introdujo la capacidad de invertir en la “Contribución al Meta Modelo” (MMC), que recompensa la unicidad de tu modelo.
- Puedes automatizar tu proceso de trabajo con Numerai Compute , una vez que tengas la confianza de que tienes un buen modelo.
- Numerai ofrece “soporte para Múltiples Modelos”, lo que te permite ejecutar y asignar Numeraire para hasta 10 modelos diferentes.
¡Espero que esta introducción te haya entusiasmado para empezar con Numerai! Si es así, asegúrate de echarle un vistazo al kernel de Kaggle que acompaña este reporte.
Código Completo →
Si tienes alguna pregunta o algún comentario, siéntete libre de dejarlos debajo. También puedes contactarme en Twitter @carlolepelaars.
