Construindo um poderoso portfólio de criptoativos com estratégias multifatoriais: pré-processamento de dados

Preâmbulo

Na última parte do livro, publicamos o primeiro artigo da série “Building a Strong Crypto Asset Portfolio with Multi-Factor Strategies” - Fundamentos Teóricos, e este é o segundo artigo - Pré-processamento de Dados.

Os dados devem ser tratados antes/depois do cálculo dos dados dos fatores e antes de se testar a validade do fator único. O pré-processamento de dados específicos envolve o processamento de valores duplicados, valores atípicos/ausentes/valores extremos, normalização e frequência de dados.

I. Valores duplicados

Definições relacionadas a dados:

  • Chave: Indica um índice exclusivo. por exemplo. Para um dado com todas as datas de todos os tokens, a chave é “token_id/contract_address - date”
  • Valor: O objeto que é indexado pela chave é chamado de “valor”.

O diagnóstico de valores duplicados começa com a compreensão de como os dados “devem” parecer. Normalmente, os dados assumem a forma de:

  1. Dados de séries temporais. A chave é “Tempo”. Por exemplo, 5 anos de dados de preço para um único token
  2. Dados da secção transversal. A chave é “individual”. Por exemplo, dados de preço de 2023.11.01 de todos os tokens no mercado cripto naquele dia
  3. Painel. A chave é uma combinação de “tempo individual”. Por exemplo, dados de preço de todos os tokens de 2019.01.01 - 2023.11.01 por quatro anos.

Princípio: Depois de determinar o índice (chave) dos dados, você pode saber em que nível os dados não devem ter valores duplicados.

Método de verificação:

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

    1. Verifique o número de valores duplicados: pd. DataFrame.duplicated(subset=[key1, key2, …]). soma()
    2. Amostra para ver amostras duplicadas: df[df.duplicated(subset=[…])]. sample() e, em seguida, use df.loc para selecionar todas as amostras duplicadas correspondentes ao índice
  2. pd.merge(df1, df2, on=[key1, key2, …], indicator=True, validate=‘1:1’)

    1. Adicione o parâmetro indicador à função de fusão horizontal, e um campo _merge será gerado, e você pode usar dfm[‘_merge’].value_counts() para verificar o número de amostras de diferentes fontes após a fusão
    2. Adicione o parâmetro validate para verificar se os índices no conjunto de dados mesclado estão conforme o esperado (1 a 1, 1 a muitos, ou muitos a muitos, o último caso não é realmente validado). Se os resultados não forem os esperados, um erro será relatado e a execução será anulada.

2. Outliers/Valores em Falta/Valores Extremos

Causas comuns de valores anómalos:

  1. Casos extremos. Por exemplo, se o preço do token for 0,000001$ ou um token com um valor de mercado de apenas $500.000, uma pequena alteração terá uma taxa de retorno de dezenas de vezes.
  2. Características dos dados. Por exemplo, se os dados de preço do token forem baixados a partir de 1º de janeiro de 2020, é naturalmente impossível calcular os dados de retorno em 1º de janeiro de 2020, porque não há preço de fechamento do dia anterior.
  3. Erro de dados. Os provedores de dados inevitavelmente cometerão erros, como registrar 12 yuan por token como 1,2 yuan por token.

Princípios de tratamento para valores anómalos e em falta:

  1. Suprimir. Os valores anómalos que não possam ser razoavelmente corrigidos ou corrigidos podem ser considerados para eliminação.
  2. Substituir. É frequentemente usado para lidar com valores extremos, como Winsorizing ou logaritmos (que não são comumente usados).
  3. Enchimento. Para valores ausentes, você também pode considerar o preenchimento de forma razoável, os métodos comuns incluem valores médios (ou médias móveis), interpolação, preenchimento de 0 df.fillna(0), forward df.fillna(‘ffill’)/backward filling df.fillna(‘bfill’), etc., para considerar se as suposições das quais o preenchimento depende estão corretas.

O aprendizado de máquina deve ser usado com cautela para preencher e arriscar um viés de antecipação

Manipulação de valores extremos:

  1. Método do percentil.

Ao organizar a ordem do menor para o maior, substitua os dados que excedem as proporções mínima e máxima por dados críticos. Para dados com dados históricos abundantes, este método é relativamente aproximado e não aplicável, e a eliminação forçada de uma proporção fixa de dados pode causar uma certa percentagem de perdas.

2,3σ / método do desvio padrão triplo

O desvio padrão σfactor reflete o grau de dispersão da distribuição dos dados do fator, ou seja, volatilidade. O intervalo de μ±3×σ foi usado para identificar e substituir outliers no conjunto de dados, e cerca de 99,73% dos dados caíram no intervalo. A premissa deste método é que os dados fatoriais devem obedecer a uma distribuição normal, ou seja, X∼N(μ,σ2).

onde μ=∑ⁿi₌₁⋅Xi/N, σ²=∑ⁿi₌₁=(xi-μ)²/n, o intervalo razoável de valores de fatores é [μ−3×σ, μ+3×σ].

Faça os seguintes ajustes em todos os fatores no intervalo de dados:

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

A desvantagem deste método é que os dados comumente usados no campo quantitativo, como preços de ações e preços de tokens, muitas vezes mostram uma distribuição spike e thick-tail, que não está de acordo com a suposição de distribuição normal, e neste caso, uma grande quantidade de dados será identificada incorretamente como outliers usando o método 3σ.

3.绝对值差中位数法(Desvio Absoluto Mediano, MAD)

O método baseia-se em enviesamentos medianos e absolutos, tornando os dados processados menos sensíveis a extremos ou valores anómalos. Mais robusto do que métodos baseados em média e desvio padrão.

Mediana do desvio absoluto MAD=mediana ( ∑ⁿi₌₁(Xi - Xmedian) )

Um intervalo razoável de valores de fatores é [Xmedian-n×MAD, Xmedian + n×MAD]. Faça os seguintes ajustes em todos os fatores no intervalo de dados:

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

Tratamento de casos de valor extremo de dados de fatores

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

def three_sigma(s,n=3):
    média = s.ini_data.mean()
    std = s.ini_data.std()
    baixo = média - n*std
    alta = média + n*std
    retornar np.clip(s.ini_data,baixo,alto)

def mad(s, n=3):
    mediana = s.ini_data.mediana()
    mad_median = abs(s.ini_data - mediana).median()
    alta = mediana + n * mad_median
    baixo = mediana - n * mad_median
    retornar np.clip(s.ini_data, baixo, alto)

Quantil def (s,l = 0,025, h = 0,975):
    baixo = s.ini_data.quantile(l)
    alto = s.ini_data.quantile(h)
    retornar np.clip(s.ini_data, baixo, alto)

III. Padronização

  1. Padronização do Z-score
  • Pré-requisito: X N (μ, σ)
  • Devido ao uso de desvio padrão, este método é sensível a valores atípicos nos dados

x’i=(x−μ)/σ=(X−média(X)))/std(X)2.Escala Min-Max

A conversão de cada fator em dados no intervalo (0,1) permite a comparação de dados de diferentes tamanhos ou intervalos, mas não altera a distribuição dentro dos dados e não faz a soma 1.

  • Sensível a valores anómalos devido à consideração de mínimos máximos Dimensão Unificada, que é propícia à comparação de dados de diferentes dimensões.

x’i=(xi−min(x))/max(x)-min(x)3.排序百分位(Escalonamento de classificação)

Converta recursos de dados em suas classificações e converta essas classificações em pontuações entre 0 e 1, normalmente seus percentis no conjunto de dados. *

Uma vez que as classificações não são afetadas por valores anómalos, este método não é sensível a valores anómalos. **

  • Em vez de manter a distância absoluta entre pontos nos dados, é convertido para uma classificação relativa.

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

min(Rankₓ)=0, onde N é o número total de pontos de dados no intervalo.

Normalizar dados de fatores

classe Scale(object): def init(s, ini_data, data): s.ini_data = ini_data s.date = data

def zscore(s):
    média = s.ini_data.mean()
    std = s.ini_data.std()
    retorna s.ini_data.sub(mean).div(std)
  
def maxmin(s):
    min = s.ini_data.min()
    max = s.ini_dados.max()
    retornar s.ini_data.sub(min).div(max - min)

def normRank(s):
    # Classificar as colunas especificadas, method='min' significa que o mesmo valor terá a mesma classificação, não a classificação média
    ranks = s.ini_data.rank(method='min') 
    retornar ranks.div(ranks.max())

Quarto, frequência dos dados

Por vezes, os dados obtidos não são tão frequentes como necessitamos para a nossa análise. Por exemplo, se o nível de análise é mensal e a frequência dos dados brutos é diária, você precisa usar “downsampling”, ou seja, os dados agregados são mensais.

REDUÇÃO DA AMOSTRAGEM

Refere-se à agregação de dados em uma coleção em uma linha de dados, como agregar dados diários em dados mensais. Neste caso, é necessário considerar as características de cada indicador agregado, e as operações usuais são:

  • Primeiro valor/último valor
  • Média/mediana *desvio padrão

Upsample

Refere-se à divisão de uma linha de dados em várias linhas de dados, como dados anuais para análise mensal. Esta é geralmente uma simples repetição e, por vezes, é necessário agregar os dados anuais proporcionalmente a cada mês.

Falcon ( /) é uma nova geração de infraestrutura de investimento Web3 que é baseada em um modelo multifator que ajuda os usuários a “selecionar”, “comprar”, “gerenciar” e “vender” criptoativos. Falcon foi incubado por Lucida em junho de 2022.

Mais conteúdo está disponível para visitar

Ver original
Esta página pode conter conteúdos de terceiros, que são fornecidos apenas para fins informativos (sem representações/garantias) e não devem ser considerados como uma aprovação dos seus pontos de vista pela Gate, nem como aconselhamento financeiro ou profissional. Consulte a Declaração de exoneração de responsabilidade para obter mais informações.
  • Recompensa
  • Comentar
  • Republicar
  • Partilhar
Comentar
Adicionar um comentário
Adicionar um comentário
Nenhum comentário
  • Fixar