El extremo del procesamiento de datos de factores comerciales cuantitativos

Visión general

Antes de construir la estrategia, primero debemos preprocesar los datos obtenidos. Eliminar el valor extremo es eliminar la interferencia de algunos valores extremos. Como se muestra en la figura:
Inserte la descripción de la imagen aquí

Análisis de la estructura del panel de factores

La estructura de datos del panel en Pandas es una estructura tridimensional que consta de datos transversales y datos de secuencia.
Inserte la descripción de la imagen aquí

Código:

get_price("000001.XSHE", start_date="2020-01-01", end_date="2020-01-06")

Resultado de salida:
Inserte la descripción de la imagen aquí

price = get_price(["000024.XSHE","000001.XSHE","000002.XSHE"], start_date="2015-04-01",end_date="2015-04-12")
price

Resultado de salida:
Inserte la descripción de la imagen aquí

Datos de sección transversal

Datos transversales: Al mismo tiempo, una columna de datos compuesta por los mismos indicadores estadísticos en diferentes unidades estadísticas.

# 获取个别财务数据
q = query(
    fundamentals.income_statement.revenue,
    fundamentals.income_statement.cost_of_goods_sold
).filter(
    fundamentals.stockcode.in_(["000024.XSHE","000001.XSHE"])
)

fund = get_fundamentals(q, entry_date="2020-01-03")

# 换成截面
fund.iloc[:,0,:]

Resultado de salida:
Inserte la descripción de la imagen aquí

# 获取所有财务数据
q = query(
    fundamentals.income_statement.revenue,
    fundamentals.income_statement.cost_of_goods_sold
)

fund = get_fundamentals(q, entry_date="2020-01-03")

# 换成截面
fund.iloc[:,0,:]

Resultado de salida:
Inserte la descripción de la imagen aquí

Datos de secuencia

Datos de secuencia: datos recopilados en diferentes momentos. Este tipo de datos refleja el estado o grado de cambio en el tiempo de una determinada cosa, fenómeno, etc.
Inserte la descripción de la imagen aquí
Nota: El análisis multifactor utiliza datos transversales en lugar de datos de secuencia.

Reducción de factor

En primer lugar, debemos entender que eliminar los valores extremos no es eliminar "datos anormales", sino "devolver" estos datos a los valores normales.

Hay tres métodos para eliminar valores extremos:

  • Quantile de-extreme
  • Desviación absoluta media a valor extremo
  • Distribución normal a valor extremo

Quantile de-extreme

Primero, entendamos algunos conceptos:

  1. Mediana
  2. Cuartilla
  3. Percentil

Mediana

La mediana es para organizar los datos en orden de tamaño para formar una serie de números. La mediana es el número que se encuentra en el medio de la serie. La mediana está representada por Me (abreviatura de la mediana).
Inserte la descripción de la imagen aquí
En la figura anterior podemos ver la mediana En comparación con la media, se ve menos afectada por el valor máximo / mínimo, por lo que elegimos la mediana en lugar de la media.

Cuartilla

El cuartil consiste en ordenar todos los valores de pequeño a grande y dividirlos en cuartos El valor en la posición de los tres puntos de división es el cuartil.
Inserte la descripción de la imagen aquí

  • El primer cuartil (Q1), también conocido como el "cuartil más pequeño", es igual al percentil 25 de todos los valores de la muestra en orden descendente.
  • El segundo cuartil (Q2), también conocido como la "mediana", es igual al percentil 50 de todos los valores de la muestra ordenados de menor a mayor.
  • El tercer cuartil (Q3), también conocido como el "cuartil más grande", es igual al percentil 75 de todos los valores de la muestra ordenados de pequeño a grande.

Percentil

El percentil se refiere a un cierto dígito de porcentaje donde se encuentran los datos. Hay dos nombres para los percentiles, cuantil y percentil.

principio

El principio de eliminación de cuantiles es reemplazar los valores extremos fuera del intervalo de cuantiles especificado con el valor del punto de cuantiles.

análisis

  • Obtenga los datos transversales de pe_ratio de una fecha o intervalo específico
  • Quantile de-extreme
  • Compare el resultado de eliminar el valor extremo con el resultado antes del valor extremo

Código

función:

import numpy as np

# 求出两个分位数的点的值
def quantile(factor, up, down):
    """分位数去极值"""
    up_scale = np.percentile(factor, up)
    down_scale = np.percentile(factor, down)
    
    factor = np.where(factor > up_scale, up_scale, factor)
    factor = np.where(factor < down_scale, down_scale, factor)
    return factor

Código:

# 筛选条件
q = query(
    fundamentals.eod_derivative_indicator.pe_ratio
)

# 获取数据
fund = get_fundamentals(q, entry_date="20200102").iloc[:, 0, :]

# 上下 2.5% 处理
fund["pe_ratio_fixed"] = quantile(fund["pe_ratio"], 97.5, 2.5)

# 画图
plt.figure(figsize=(15, 10))
plt.bar(fund.index[:500],fund['pe_ratio'][:500])
plt.bar(fund.index[:500],fund['pe_ratio_fixed'][:500])
plt.xticks(fund.index[:501:50])
plt.title("pe_ratio vs pe_ratio_fixed")
plt.show()

Resultado de salida:
Inserte la descripción de la imagen aquí

Desviación absoluta media a valor extremo

El método de desviación absoluta (MAD: Desviación absoluta media) es un método que primero necesita calcular la distancia entre todos los factores y la mediana para detectar valores atípicos.

Método de cálculo

  1. Encuentra la mediana del factor
  2. Obtenga la desviación absoluta de cada valor de factor de la mediana | x-mediana |
  3. Obtenga la mediana del valor de desviación absoluta, MAD, mediana (| x-mediana |)
  4. Calcule MAD_e = 1.4826 * MAD. Luego determine el parámetro ny realice los ajustes

Juicio extremo:
Inserte la descripción de la imagen aquí
Nota: Por lo general, la mediana de la compensación es tres veces mayor que MAD_e. Si la muestra satisface la distribución normal y es lo suficientemente grande, podemos probar que el valor que excede los límites superior e inferior es un valor atípico.

Código

función:

def mad(factor):
    """3倍中位数去极值"""
    
    # 求出因子值的中位数
    median = np.median(factor)
    
    # 求出因子值与中位数的差值, 进行绝对值
    mad = np.median(abs(factor - median))
    
    # 定义几倍的中位数上下限
    high = median + (3 * 1.4826 * mad)
    low = median - (3 * 1.4826 * mad)
    
    # 替换上下限
    factor = np.where(factor > high, high, factor)
    factor = np.where(factor < low, low, factor)
    return factor

Código:

# 筛选条件
q = query(
    fundamentals.eod_derivative_indicator.pe_ratio
)
# 获取数据
fund = get_fundamentals(q, entry_date="20200102").iloc[:, 0, :]

# 中位数绝对偏差法
fund["pe_ratio_fixed"] = mad(fund["pe_ratio"])

# 画图
plt.figure(figsize=(15, 10))
plt.bar(fund.index[:500],fund['pe_ratio'][:500], color="green")
plt.bar(fund.index[:500],fund['pe_ratio_fixed'][:500])
plt.xticks(fund.index[:501:50])
plt.title("pe_ratio vs pe_ratio_fixed")
plt.show()

Resultado de salida:
Inserte la descripción de la imagen aquí

Distribución normal a valor extremo

Distribución normal:
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

  • 1σ: 68,27% de los datos caen dentro de una desviación estándar
  • 2σ: el 95,45% de los datos se encuentran dentro de dos desviaciones estándar
  • 3σ: el 99,73% de los datos se encuentran dentro de tres desviaciones estándar
  • 4σ: el 99,99% de los datos se encuentra dentro de cuatro desviaciones estándar

Código

def three_sigma(factor):
    """3 sigma 去极值"""
    
    # 求出因子数据的平均数和标准差
    mean = factor.mean()
    std = factor.std()
    
    # 左右的数据加减 3 个标准差
    high = mean + (3 * std)
    low = mean - (3 * std)
    
    # 替换极值数据
    factor = np.where(factor > high, high, factor)
    factor = np.where(factor <low, low, factor)
    
    return factor
# 筛选条件
q = query(
    fundamentals.eod_derivative_indicator.pe_ratio
)
# 获取数据
fund = get_fundamentals(q, entry_date="20200102").iloc[:, 0, :]

# 3 sigma 去极值
fund["pe_ratio_fixed"] = three_sigma(fund["pe_ratio"])

# 画图
plt.figure(figsize=(15, 10))
plt.bar(fund.index[:500],fund['pe_ratio'][:500], color="orange")
plt.bar(fund.index[:500],fund['pe_ratio_fixed'][:500], color= "red")
plt.xticks(fund.index[:501:50])
plt.title("pe_ratio vs pe_ratio_fixed")
plt.show()

Resultado de salida:
Inserte la descripción de la imagen aquí

para resumir

Al realizar la eliminación de valores extremos, es mejor no utilizar el método de distribución normal a valor extremo, se recomienda utilizar la desviación absoluta de cuantil y mediana a valor extremo.

Supongo que te gusta

Origin blog.csdn.net/weixin_46274168/article/details/114964710
Recomendado
Clasificación