Discussão do artigo "Reamostragem avançada e seleção de modelos CatBoost pelo método de força bruta" - página 10

[Excluído]  
elibrarius:

Quais?

F1, MCC parece melhor.

Aqui está a lista completa

https://catboost.ai/docs/concepts/loss-functions-classification.html

Classification: objectives and metrics - CatBoost. Documentation
  • catboost.ai
If the target type is not binary, then every object with target value and weight is replaced with two objects for the metric calculation: Target values must be in the range [0; 1]. If the target type is not binary...
 
Maxim Dmitrievsky:

F1, MCC parece ser melhor

Aqui está a lista completa

https://catboost.ai/docs/concepts/loss-functions-classification.html

É difícil especular por que eles são melhores.
 
Maxim Dmitrievsky:

Mais uma vez.

Bem, sim, às vezes faz sentido.

Um pouco mais de staking. Sim, faz sentido empilhar. Ainda é uma questão em aberto quanto à quantidade.

Ótimo artigo e trabalho titânico!

Retirei os rótulos de pé após a mudança de direção no conjunto de dados antes de alimentá-los no modelo de misturas.

X['labels'].loc[X['labels'].diff(2)!=0] = np.nan
X = X.dropna().reset_index(drop=True)

Pela observação, mais modelos dão resultados positivos.

Iteration:  0 R^2:  0.5260017837414628
Iteration:  1 R^2:  0.6331497253790681
Iteration:  2 R^2:  0.029844101542724655
Iteration:  3 R^2:  0.792134192720112
Iteration:  4 R^2:  -0.5575595243513453
Iteration:  5 R^2:  0.6266442030501214
Iteration:  6 R^2:  0.22435035980633944
Iteration:  7 R^2:  0.38384379495564724
Iteration:  8 R^2:  0.028795249767878173
Iteration:  9 R^2:  0.4976165963899961
Iteration:  10 R^2:  0.38091909530246537
Iteration:  11 R^2:  0.6668471456765452
Iteration:  12 R^2:  0.9173487144971179
Iteration:  13 R^2:  0.31007344321289365
Iteration:  14 R^2:  0.4391449002278133
Iteration:  15 R^2:  0.8643834389201246
Iteration:  16 R^2:  0.1609614914253078
Iteration:  17 R^2:  -0.593998636390909
Iteration:  18 R^2:  0.7253019217609338
Iteration:  19 R^2:  0.11872614816490491
Iteration:  20 R^2:  0.0023909994463473527
Iteration:  21 R^2:  0.6486563192357756
Iteration:  22 R^2:  0.011546691763490213
Iteration:  23 R^2:  0.8085201529889603
Iteration:  24 R^2:  0.9233877589157101
Iteration:  25 R^2:  -0.08743681307491602
Iteration:  26 R^2:  0.6132492793114834
Iteration:  27 R^2:  0.0016322532208268292
Iteration:  28 R^2:  -0.2241780583190326
Iteration:  29 R^2:  0.6739577294046565
Iteration:  30 R^2:  0.43270922254052624
Iteration:  31 R^2:  -0.40571688327667377
Iteration:  32 R^2:  0.8558895655918841
Iteration:  33 R^2:  0.22222950417101828
Iteration:  34 R^2:  0.8718519436072187
Iteration:  35 R^2:  0.3103828388939166
Iteration:  36 R^2:  -0.3274785257455094
Iteration:  37 R^2:  -0.056797883380174774
Iteration:  38 R^2:  0.7372428685425149
Iteration:  39 R^2:  0.46650446544282376
Iteration:  40 R^2:  0.7158974618001703
Iteration:  41 R^2:  -0.08982821839565835
Iteration:  42 R^2:  -0.004541876992860683
Iteration:  43 R^2:  0.39737057218337546
Iteration:  44 R^2:  -0.35131421135378293
Iteration:  45 R^2:  -0.003237278102928842
Iteration:  46 R^2:  0.37272998002935753
Iteration:  47 R^2:  -0.5554473442698793
Iteration:  48 R^2:  0.38766288235168855
Iteration:  49 R^2:  0.8582912360226171

resultados do melhor teste no testador e no terminal:


Em geral, um belo trabalho. Usei-o para testar todos os meus alvos e joguei-os no lixo)))

[Excluído]  
welimorn:

Ótimo artigo e um esforço hercúleo!

Retirei os rótulos que estavam de pé após a mudança de direção no conjunto de dados antes de alimentá-los no modelo de misturas.

A partir da observação, mais modelos têm um resultado positivo.

resultados do melhor teste no testador e no terminal:


Em geral, um belo trabalho. Com sua ajuda, verifiquei todos os meus alvos e os joguei no lixo)))

sim, você pode descartar antes do agrupamento

Obrigado pelo feedback :)

Z.Ы para que você possa testar todos os modelos de uma só vez, em média. Jogar. O analisador para todos os modelos ainda não foi criado, ainda está em dúvida. Mas, às vezes, um conjunto de vários modelos realmente melhora.

def test_models(result):
    pr_tst = get_prices(FULL_DATE, STOP_DATE)
    X = pr_tst[pr_tst.columns[1:]]
    X.columns = [''] * len(X.columns)

    #test the learned model
    p = 0
    for i in range(len(result)):
        p += result[i][2].predict_proba(X)

    p = p/len(result)
    p2 = [x[0]<0.5 for x in p]
    pr2 = pr_tst.iloc[:len(p2)].copy()
    pr2['labels'] = p2
    R2 = tester(pr2, MARKUP, plot=True)

test_models(res)
ZYZY. você pode fazer uma enumeração de diferentes combinações de modelos treinados pela mesma métrica R2, como um desenvolvimento do tema. Em seguida, mantenha o melhor conjunto. Isso é possível até mesmo por meio da genética, se houver muitos modelos.
 
Oi Maxim,

Obrigado por mais um bom artigo! :)

Peguei os dados do EURUSD, H1 de 2015 a 2020 e os dividi em três conjuntos:

1. Conjunto de treinamento: de 2015.01.01 a 2018.01.01
Esse conjunto será usado apenas para treinar o GMM.

2. Conjunto de validação: de 01.01.2018 a 01.01.2019
Esse conjunto, juntamente com o conjunto de treinamento, será usado na função de força bruta para encontrar o melhor modelo

3. Conjunto de teste: de 01.01.2019 a 01.01.2020
Esse conjunto será usado apenas para testar o melhor modelo obtido com o algoritmo de força bruta

Abaixo está o resultado de um backtest em todo o conjunto de dados,


Verifiquei meu código duas vezes, mas talvez eu tenha feito algo errado. De qualquer forma, você pode ter alguma ideia sobre os resultados. Atenciosamente, Rasoul


Документация по MQL5: Константы, перечисления и структуры / Именованные константы / Предопределенные макроподстановки
Документация по MQL5: Константы, перечисления и структуры / Именованные константы / Предопределенные макроподстановки
  • www.mql5.com
//| Expert initialization function                                   | //| Expert deinitialization function                                 | //| Expert tick function                                             | //| test1                                                            |...
[Excluído]  
Rasoul Mojtahedzadeh:
Oi Maxim,

Obrigado por mais um bom artigo! :)

Peguei os dados do EURUSD, H1 de 2015 a 2020 e os dividi em três conjuntos:

1. Conjunto de treinamento: de 2015.01.01 a 2018.01.01
Esse conjunto será usado apenas para treinar o GMM.

2. Conjunto de validação: de 2018/01/01 a 2019/01/01
Esse conjunto, juntamente com o conjunto de treinamento, será usado na função de força bruta para encontrar o melhor modelo

3. Conjunto de teste: de 2019/01/01 a 2020/01/01
Esse conjunto será usado apenas para testar o melhor modelo obtido com o algoritmo de força bruta

Abaixo está o resultado de um backtest em todo o conjunto de dados,


Verifiquei meu código duas vezes, mas talvez eu tenha feito algo errado. De qualquer forma, você pode ter alguma ideia sobre os resultados. Atenciosamente, Rasoul


Olá, Rasoul. Tente reduzir o tamanho do conjunto de treinamento. Isso pode depender de diferentes configurações, mas o truque principal é que quanto menor o tamanho do treinamento, melhor a generalização em novos dados. No próximo artigo, tentarei explicar esse efeito.
 
Maxim Dmitrievsky

Você pode me dizer como posso carregar meus dados por meio de um arquivo csv?


Tentei dessa forma, mas não carregou.


O formato do arquivo é:

time,close

2020,11,15,1.3587

2020,11,16,1.3472


def get_prices(START, STOP):
    prices = pd.read_csv('file.csv', columns=['time', 'close']).set_index('time')
    prices.index = pd.to_datetime(prices.index, unit='s')
    prices = prices.dropna()
    pr = prices.copy()
    count = 0
    for i in MA_PERIODS:
        returns = pr - pr.rolling(i).mean()
        for l in range(LOOK_BACK):
            prices[str(count)] = returns.shift(l)
            count += 1
    return prices.dropna()
[Excluído]  
Evgeni Gavrilovi:

Você pode me dizer como posso carregar meus dados por meio de um arquivo csv?

def get_prices(look_back = 15):
    prices = pd.DataFrame(mt5.copy_rates_range(SYMBOL, TIMEFRAME, START_DATE, STOP_DATE), 
                            columns=['time', 'close']).set_index('time')
    prices.index = pd.to_datetime(prices.index, unit='s')
    prices = prices.dropna()
    pr = prices.copy()
    count = 0
    for i in MA_PERIODS:
        returns = pr - pr.rolling(i).mean()
        for l in range(look_back):
            prices[str(count)] = returns.shift(l)
            count += 1
    
    prices = prices.dropna()
    prices.to_csv('pr.csv', sep=';')
pr = pd.read_csv('pr.csv', sep=';')

Ou seja, esse é um exemplo de carregamento de dados do terminal, salvando-os em um arquivo. E, em seguida, você pode usá-los em um colab

 
Maxim Dmitrievsky:
Olá, Rasoul. Tente reduzir o tamanho do conjunto de treinamento. Isso pode depender de diferentes configurações, mas o truque principal é que, quanto menor o tamanho do treinamento, melhor a generalização em novos dados. No próximo artigo, tentarei explicar esse efeito.

Isso é bom. Seria bom ver no artigo uma observação sobre o escopo de aplicabilidade dessa tese - em particular, para diferentes métodos de IO. Por algum motivo, eles recomendam 70/30 para NS. E, logicamente, na minha opinião, 50/50 deve fornecer resultados mais estáveis.

[Excluído]  
Stanislav Korotky:

Isso é bom. Seria bom ver uma observação no artigo sobre o escopo de aplicabilidade dessa tese - em particular, para diferentes métodos de MO. Por algum motivo, recomenda-se 70/30 para NS. E, logicamente, na minha opinião, 50/50 deve fornecer resultados mais estáveis.

Há aprendizado ativo e passivo. O aprendizado passivo consiste na marcação manual de dados e no treinamento com eles. Nesse caso, deve haver muitos dados, mas há um problema de marcação correta. Ou seja, o "professor" precisa marcar os dados de modo que eles sejam, convencionalmente, da mesma distribuição e generalizem bem. A esse respeito, não faz quase nenhuma diferença a proporção do trainee\teste. Isso não lhe dá quase nada, é apenas uma verificação de modelo, uma verificação de quão bem você rotulou os dados manualmente.

Na aprendizagem ativa, o modelo aprende a marcar os dados de forma otimizada. O artigo é apenas um caso de particionamento por meio do GMM. Ou seja, tanto o aprendizado com quanto sem um professor é usado. Nesse caso, o modelo aprende a aprender com pequenos dados particionados e deve particionar os dados restantes de forma otimizada. Essa é uma abordagem relativamente nova (de cerca de 2017). E quero analisá-la mais detalhadamente em um artigo posterior.

Há muitos "dados" nas frases, peço desculpas pela tautologia)