Aprendizado de máquina no trading: teoria, prática, negociação e não só - página 2974

 
mytarmailS #:
E vai estar vazio de qualquer maneira

Bem, sim, se você não quiser.

 
mytarmailS #:
É triste que o aprendizado de máquina com direcionamento não funcione e que o aprendizado único não funcione....

remover recursos simétricos para reduzir a tendência.

Por exemplo, substitua os incrementos por incrementos absolutos (volatilidade).

às vezes ajuda

 
Maxim Dmitrievsky #:

remover características simétricas para reduzir o viés

Por exemplo, substituir os incrementos por incrementos absolutos (volatilidade)

Às vezes, isso ajuda.

Não, é muito mais complicado do que isso.
 
Aleksey Vyazmikin #:

Minha ideia é obter um modelo que selecione segmentos quânticos estáveis por meio de vários recursos estatísticos. Todos são bem-vindos a participar desse projeto.

Por que você está tão obcecado com esses quanta?

Não há nada de intelectual neles. Simplesmente divida, por exemplo, 10.000 linhas em 100 partes, ou seja, classifique e conte 100 linhas de baixo para cima; se as seguintes coincidirem com a centésima linha (ou seja, se repetirem), então as remeteremos para a primeira parte. Se as duplicatas acabarem, comece a digitar as linhas no segundo quantum - as próximas 100 + duplicatas, se houver. E assim por diante, até ficarmos sem linhas.

Até mesmo uma árvore contém ordens de magnitude de informações mais úteis (porque é treinada em dados) do que esses segmentos quânticos (apenas 100 cadeias de caracteres classificadas com duplicatas).

 
Forester #:

Por que você está tão preocupado com esses analistas? ....

Não há nada de intelectual neles. Basta dividir, por exemplo, 10.000 linhas em 100 partes, ou seja, classificar e contar 100 linhas a partir da base; se as próximas coincidirem com a centésima linha (ou seja, repetições), então as remeteremos à primeira parte. Se as duplicatas acabarem, comece a digitar as linhas no segundo quantum - as próximas 100 + duplicatas, se houver. E assim por diante, até que as linhas se esgotem.

Até mesmo uma árvore contém ordens de magnitude de informações mais úteis (porque é treinada em dados) do que esses segmentos quânticos (apenas 100 linhas classificadas com duplicatas).

Os segmentos quânticos são os tijolos a partir dos quais o modelo CatBoost é construído. Inicialmente, pelo que entendi, dessa forma foi resolvida a questão da economia de memória e, em geral, da aceleração dos cálculos. Um ganho colateral é a redução das variantes de combinações de indicadores de previsão, um passo dado no sentido de reduzir a multicolinearidade, o que, em geral, contribui para a velocidade e a qualidade do treinamento. Além disso, em parte, o problema do desvio de dados é resolvido.

Também vejo um estímulo para outra coisa: explorar o potencial da estimativa probabilística em dados de segmentos quânticos. Se pegarmos seu método proposto de quantificação (na verdade, é melhor imaginar que o objetivo do processo é filtrar grupos homogêneos - análogo - agrupamento) e dividirmos os dados em 20 segmentos quânticos iguais de acordo com o número de exemplos, descobriremos que em cada segmento quântico restam apenas 5% dos dados. Por padrão, o CatBoost cria 254 separadores - 255 segmentos. Em seguida, são criadas árvores a partir desses segmentos. Supõe-se que todos os segmentos quânticos sejam igualmente úteis, e sua interposição deve ser determinada pelo particionamento do grupo em subgrupos, pelo método de construção de uma árvore de decisão. O particionamento é feito tanto pela raiz quanto por outros preditores. Mesmo se usarmos uma árvore, quantos dos exemplos originais da classe positiva "1" permanecerão na lista final após 6 divisões? Devemos levar em conta que a seleção da divisão é baseada na métrica do número cumulativo de divisões quânticas. Levando em conta o próprio método de construção da árvore, torna-se óbvio que, quanto mais qualitativo for o particionamento do preditor em segmentos quânticos, menos divisões serão necessárias para atingir a mesma precisão na folha. Observo que toda divisão é uma hipótese, e todas as hipóteses não podem ser verdadeiras. Portanto, se fizermos a divisão levando em conta o potencial de um segmento quântico de pertencer mais a uma das classes, reduziremos o número de divisões para obter precisão semelhante e, portanto, reduziremos o número de hipóteses potencialmente falsas (divisões). Além disso, se pudermos dividir imediatamente o preditor em três regiões globais - duas para associação de classe e uma para incerteza -, os modelos serão, em média, menores e com melhor desempenho estatístico - espero que também mais robustos.

Por exemplo, vamos imaginar que o preditor seja o oscilador RSI - ações significativas dos participantes ocorrem em torno dos níveis de 70, 50, 30 - tudo além disso - digamos, não afeta a tomada de decisão dos participantes do mercado. Então, é razoável construir uma tabela quântica de forma a separar esses três valores do restante da população. Caso contrário, uma das divisões terá aleatoriamente mais exemplos no segmento quântico de associação de classe e você obterá uma regra falsa em uma hipótese falsa.

Você pode desenhar um gráfico de barras com pontuações de preditores quantificados e desenhar uma curva de probabilidades de associação à classe "1" para cada coluna. Se for mais provável que a curva seja uma linha reta, então eu colocaria esse preditor em um banco. Um bom preditor, em minha opinião, terá uma linha inclinada ou picos em algumas colunas.

Podemos dizer que, por meio da quantificação, estou procurando eventos discretos que influenciam a probabilidade de movimentação do preço.

 
A regra é exatamente o que dividirá
rsi>69 & rsi<71....
Isso é tudo quantificação.
Você pega um AMO de madeira, divide-o em árvores e retira as corretas.

Que quantificação? Você é tão sem noção que chega a ser patético.

Tudo isso é resolvido em três linhas de código...
E você está trabalhando com essa quantificação há anos, como um professor maluco.
 
mytarmailS #:
A regra apenas dividirá
rsi>69 & rsi<71....
Essa é toda a quantificação...
Você pega um AMO de madeira, divide-o em árvores e retira as corretas...

Que quantificação? Você está falando tanta besteira que chega a ser patético.

Tudo isso é resolvido em três linhas de código...
E você está mexendo com esse meio de quantificação há anos, como um professor maluco.

Há diferentes maneiras de criar uma tabela de quantificação. Acho que, de fato, você pode fazer isso por meio de um pacote pronto para uso que cria árvores em um único preditor com determinadas restrições na planilha sobre a porcentagem de exemplos. Não sei qual é esse pacote e como obter os dados no formato de que preciso.

O importante não é apenas o particionamento, mas encontrar critérios para avaliar essa divisão quântica que aumentará a probabilidade de que a associação de classe seja preservada nos novos dados.

Por que estou fazendo isso - porque essa é a chave para a criação de um modelo qualitativo.

Por que isso leva muito tempo - muitos experimentos e scripts de teste. Tenho um pouco de conhecimento sobre OpenCL e o código agora está parcialmente contado em uma placa de vídeo - isso leva tempo - tenho que estudar muitas coisas.

 
Aleksey Vyazmikin #:

O importante não é apenas o particionamento, mas encontrar critérios para avaliar esse corte quântico que aumentará a probabilidade de que a associação de classe persista nos novos dados.

Você já olhou para o código no mesmo catbuster? Você o está usando. Ele não usa pacotes de terceiros. Mas essa é uma função tão pequena (é ainda mais simples do que a que descrevi, ela não muda o ponto de separação pelo número de duplicatas).
Escrevi comentários sobre o que aparece. A entrada é uma coluna classificada.

static THashSet<float> GenerateMedianBorders(
    const TVector<float>& featureValues, const TMaybe<TVector<float>>& initialBorders, int maxBordersCount) {
    THashSet<float> result;
    ui64 total = featureValues.size(); //число строк в столбце
    if (total == 0 || featureValues.front() == featureValues.back()) { // проверки
        return result;
    }

    for (int i = 0; i < maxBordersCount; ++i) { // цикл по числу квантов
        ui64 i1 = (i + 1) * total / (maxBordersCount + 1); // номер строки начала кванта номер i
        i1 = Min(i1, total - 1); // не больше числа строк 
        float val1 = featureValues[i1]; // значение в строке i1
        if (val1 != featureValues[0]) { // если != значению в 0-й строке, чтобы не было дубля с 0-й строкой
            result.insert(RegularBorder(val1, featureValues, initialBorders)); // сохранить значение в массив границ разделяющих кванты (не смотрел, но очевидно, что дубликаты пропустит и не создаст им квант)
        }
    }
    return result;
}

Como você pode ver, tudo é muito simples e não há nada de intelectual aqui - basta contar, por exemplo, 100 linhas e pronto.
Variantes um pouco mais complexas podem mudar para o número de duplicatas, e você também pode otimizar o tamanho dos quanta (por exemplo, se de 10.000 linhas 9.000 forem duplicadas, a função simples terá 11 quanta: 10 das primeiras 1.000 linhas e na 11ª as 9.000 duplicatas restantes, ou você pode dividir as primeiras 1.000 linhas em 99 quanta + 1 quantum com 9.000 duplicatas).
Mas eles também não têm nada de intelectual - a mesma contagem simples do número necessário de cadeias de caracteres é a base.

O original (há variantes mais complicadas) https://github.com/catboost/catboost/blob/3cde523d326e08b32caf1b8b138c2c5303dc52e5/library/cpp/grid_creator/binarization.cpp
Estude as funções desta página por uma semana e economize vários anos.

P.s. A principal razão pela qual o próximo quantum não tem exatamente 100 cadeias de caracteres, mas 315 ou 88 ou 4121 não está em alguma fórmula super complicada (em que as cadeias de caracteres são combinadas de acordo com o poder preditivo, que você deseja usar para pesquisar os critérios de avaliação desse segmento qu ântico), mas simplesmente no número de duplicatas.
catboost/binarization.cpp at 3cde523d326e08b32caf1b8b138c2c5303dc52e5 · catboost/catboost
catboost/binarization.cpp at 3cde523d326e08b32caf1b8b138c2c5303dc52e5 · catboost/catboost
  • catboost
  • github.com
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 
É necessário resgatar uma pessoa que está obviamente se afogando, mas que gosta de se suicidar?
Quando você lhe oferece ajuda, ele a rejeita, discute com você, não tenta fazer nada para sair dali e dita seus próprios termos, como:
"Ou você mesmo me resgata, me carrega para fora da água segurando-me sobre sua cabeça ao som da minha música favorita, ou não.
E então você não tem nenhum desejo de me salvar.


 
Forester #:

Você já deu uma olhada no código dos mesmos catbusters? Você o está usando. Ele não usa pacotes de terceiros. Mas essa é uma função tão pequena (é ainda mais simples do que a que descrevi, ela não muda o ponto de separação pelo número de duplicatas).
Escrevi comentários sobre o que aparece. A entrada é uma coluna ordenada.

É claro que dei uma olhada nisso. Além disso, estou disposto a pagar pelo trabalho de reprodução de todos os métodos de quantificação em MQL5. Até agora, as tentativas não foram bem-sucedidas. Você gostaria de tentar?

Forester #:

Como você pode ver, tudo é muito simples e não há nada intelectual aqui - basta contar, por exemplo, 100 linhas e pronto.

Você apresentou o método mais simples - sim, não é difícil.

Além disso, eu escrevi que existem métodos engenhosos de quantificação ou algo do gênero? Como isso contradiz o que escrevi?