Creación de una potente cartera de criptoactivos con estrategias multifactoriales: preprocesamiento de datos

Preámbulo

En la última parte del libro, publicamos el primer artículo de la serie “Construyendo una cartera sólida de criptoactivos con estrategias multifactoriales” - Fundamentos teóricos, y este es el segundo artículo - Preprocesamiento de datos.

Los datos deben procesarse antes o después del cálculo de los datos factoriales y antes de probar la validez del factor único. El preprocesamiento de datos específicos implica el procesamiento de valores duplicados, valores atípicos/valores faltantes/valores extremos, normalización y frecuencia de datos.

I. Valores duplicados

Definiciones relacionadas con los datos:

  • Clave: Indica un índice único. Eg. Para un dato con todas las fechas de todos los tokens, la clave es “token_id/contract_address - date”
  • Valor: El objeto que es indexado por la clave se denomina “valor”.

El diagnóstico de valores duplicados comienza con la comprensión de cómo “deberían” verse los datos. Por lo general, los datos se presentan en forma de:

  1. Datos de series temporales. La clave es “Tiempo”. por ejemplo, 5 años de datos de precios para un solo token
  2. Datos de la sección transversal. La clave es “individual”. Por ejemplo.2023.11.01 Datos de precios de todos los tokens en el mercado de criptomonedas ese día
  3. Panel. La clave es una combinación de “tiempo individual”. por ejemplo, datos de precios de todos los tokens desde 2019.01.01 hasta 2023.11.01 durante cuatro años.

Principio: Una vez que haya determinado el índice (clave) de los datos, puede saber en qué nivel los datos no deben tener valores duplicados.

Método de comprobación:

  1. PD. DataFrame.duplicated(subset=[key1, key2, …])

    1. Compruebe el número de valores duplicados: pd. DataFrame.duplicated(subset=[clave1, clave2, …]). sum()
    2. Muestra para ver muestras duplicadas: df[df.duplicated(subset=[…])]. sample() y, a continuación, utilice df.loc para seleccionar todas las muestras duplicadas correspondientes al índice
  2. pd.merge(df1, df2, on=[key1, key2, …], indicator=True, validate=‘1:1’)

    1. Agregue el parámetro del indicador a la función de fusión horizontal y se generará un campo _merge, y puede usar dfm[‘_merge’].value_counts() para verificar el número de muestras de diferentes fuentes después de la fusión
    2. Agregue el parámetro validate para comprobar si los índices del conjunto de datos combinado son los esperados (1 a 1, 1 a muchos o muchos a muchos, el último caso en realidad no está validado). Si los resultados no son los esperados, se notificará un error y se anulará la ejecución.

2. Valores atípicos/Valores faltantes/Valores extremos

Causas comunes de valores atípicos:

  1. Casos extremos. Por ejemplo, si el precio del token es de 0,000001$ o un token con un valor de mercado de sólo 500.000 dólares, un pequeño cambio tendrá una tasa de retorno de decenas de veces.
  2. Características de los datos. Por ejemplo, si los datos del precio del token se descargan a partir del 1 de enero de 2020, entonces es naturalmente imposible calcular los datos de retorno del 1 de enero de 2020, porque no hay un precio de cierre del día anterior.
  3. Error de datos. Los proveedores de datos inevitablemente cometerán errores, como registrar 12 yuanes por token como 1,2 yuanes por token.

Principios de manejo de valores atípicos y valores faltantes:

  1. Eliminar. Los valores atípicos que no se pueden corregir o corregir razonablemente se pueden considerar para su eliminación.
  2. Reemplazar. A menudo se usa para manejar valores extremos, como Winsorizing o logaritmos (que no se usan comúnmente).
  3. Relleno. Para los valores que faltan, también puede considerar el llenado de una manera razonable, los métodos comunes incluyen valores medios (o medias móviles), interpolación, llenado de 0 df.fillna(0), df.fillna(‘ffill’)/relleno hacia atrás df.fillna(‘bfill’), etc., para considerar si los supuestos de los que depende el relleno son correctos.

El aprendizaje automático debe usarse con precaución para reponer y arriesgarse a un sesgo de anticipación

Manejo de valores extremos:

  1. Método percentil.

Al organizar el orden de menor a mayor, reemplace los datos que superen las proporciones mínima y máxima con datos críticos. En el caso de los datos con abundantes datos históricos, este método es relativamente aproximado y no es aplicable, y la eliminación forzada de una proporción fija de datos puede causar un cierto porcentaje de pérdidas.

2.3σ / método de triple desviación estándar

La desviación estándar σfactor refleja el grado de dispersión de la distribución de datos del factor, es decir, la volatilidad. El rango de μ±3×σ se utilizó para identificar y reemplazar valores atípicos en el conjunto de datos, y aproximadamente el 99,73 % de los datos se encontraban en el rango. La premisa de este método es que los datos factoriales deben obedecer a una distribución normal, es decir, X∼N(μ,σ2).

donde μ=∑ⁿi₌₁⋅Xi/N, σ²=∑ⁿi₌₁=(xi-μ)²/n, el rango razonable de valores de los factores es [μ−3×σ, μ+3×σ].

Realice los siguientes ajustes en todos los factores del rango de datos:

用多因子策略构建强大的加密资产投资组合 :数据预处理篇

La desventaja de este método es que los datos comúnmente utilizados en el campo cuantitativo, como los precios de las acciones y los precios de los tokens, a menudo muestran una distribución de picos y colas gruesas, que no se ajusta a la suposición de la distribución normal y, en este caso, una gran cantidad de datos se identificarán incorrectamente como valores atípicos utilizando el método 3σ.

3.绝对值差中位数法(Desviación Absoluta Mediana, MAD)

El método se basa en el sesgo mediano y absoluto, lo que hace que los datos procesados sean menos sensibles a los extremos o valores atípicos. Más robusto que los métodos basados en la media y la desviación estándar.

Mediana de la desviación absoluta MAD=mediana ( ∑ⁿi₌₁(Xi - Xmediana) )

Un rango razonable de valores factoriales es [Xmedian-n×MAD, Xmediana + n×MAD]. Realice los siguientes ajustes en todos los factores del rango de datos:

用多因子策略构建强大的加密资产投资组合 :数据预处理篇

Manejo de casos de valores extremos de datos factoriales

class Extreme(object): def init(s, ini_data): s.ini_datos = ini_data

def three_sigma(s,n=3):
    mean = s.ini_data.mean()
    std = s.ini_data.std()
    Baja = Media - N*Std
    Alto = media + n*std
    return np.clip(s.ini_data,low,high)

def mad(s, n=3):
    mediana = s.ini_data.median()
    mad_median = abs(s.ini_data - mediana).median()
    alto = mediana + n * mad_median
    bajo = mediana - n * mad_median
    return np.clip(s.ini_data, low, high)

Def cuantil (s,l = 0,025, h = 0,975):
    bajo = s.ini_data.quantile(l)
    high = s.ini_data.quantile(h)
    return np.clip(s.ini_data, low, high)

III. Estandarización

  1. Estandarización de la puntuación Z
  • Prerrequisito: X N (μ, σ)
  • Debido al uso de la desviación estándar, este método es sensible a los valores atípicos en los datos

x’i=(x−μ)/σ=(X−mean(X)))/std(X)2.Escala mínima-máxima

La conversión de cada factor en datos en el intervalo (0,1) permite la comparación de datos de diferentes tamaños o rangos, pero no cambia la distribución dentro de los datos y no hace que la suma sea 1.

  • Sensible a valores atípicos debido a la consideración de mínimos máximos Dimensión unificada, que permite comparar datos de diferentes dimensiones.

x’i=(xi−min(x))/max(x)-min(x)3.排序百分位(Escala de rangos)

Convierta las entidades de datos en sus clasificaciones y convierta esas clasificaciones en puntuaciones entre 0 y 1, normalmente sus percentiles en el dataset. *

Dado que las clasificaciones no se ven afectadas por los valores atípicos, este método no es sensible a los valores atípicos. **

  • En lugar de mantener la distancia absoluta entre los puntos de los datos, se convierte en una clasificación relativa.

NormRanki=(Rangoₓi−min(Rangoₓi))/max(Rangoₓ)−min(Rangoₓ)=Rangoₓi/N

min(Rankₓ)=0, donde N es el número total de puntos de datos en el intervalo.

Normalizar los datos de los factores

class Scale(object): def init(s, ini_data, fecha): s.ini_datos = ini_data s.fecha = fecha

def zscore(s):
    mean = s.ini_data.mean()
    std = s.ini_data.std()
    return s.ini_data.sub(mean).div(std)
  
def maxmin(s):
    min = s.ini_data.min()
    max = s.ini_data.max()
    return s.ini_data.sub(min).div(max - min)

def normRank(s):
    # Clasifica las columnas especificadas, method='min' significa que el mismo valor tendrá el mismo rango, no el rango promedio
    ranks = s.ini_data.rank(method='min') 
    return ranks.div(ranks.max())

Cuarto, frecuencia de datos

A veces los datos obtenidos no son tan frecuentes como necesitamos para nuestro análisis. Por ejemplo, si el nivel de análisis es mensual y la frecuencia de los datos sin procesar es diaria, debe utilizar el “downsampling”, es decir, los datos agregados son mensuales.

REDUCCIÓN DE MUESTREO

Se refiere a la agregación de datos de una colección en una fila de datos, como la agregación de datos diarios en datos mensuales. En este caso, es necesario considerar las características de cada indicador agregado, y las operaciones habituales son:

  • Primer valor/último valor
  • Media/mediana *desviación estándar

Muestra superior

Se refiere a dividir una fila de datos en varias filas de datos, como datos anuales para análisis mensuales. Esto suele ser una simple repetición, y a veces es necesario agregar los datos anuales en proporción a cada mes.

Falcon ( /) es una nueva generación de infraestructura de inversión Web3 que se basa en un modelo multifactor que ayuda a los usuarios a “seleccionar”, “comprar”, “gestionar” y “vender” criptoactivos. Falcon fue incubado por Lucida en junio de 2022.

Hay más contenido disponible para visitar

Ver originales
Esta página puede contener contenido de terceros, que se proporciona únicamente con fines informativos (sin garantías ni declaraciones) y no debe considerarse como un respaldo por parte de Gate a las opiniones expresadas ni como asesoramiento financiero o profesional. Consulte el Descargo de responsabilidad para obtener más detalles.
  • Recompensa
  • Comentar
  • Republicar
  • Compartir
Comentar
Añadir un comentario
Añadir un comentario
Sin comentarios
  • Anclado