Aprendizaje automático en el trading: teoría, práctica, operaciones y más - página 2974

 
Maxim Dmitrievsky #:

eliminar los rasgos simétricos para reducir el sesgo

por ejemplo, sustituir los incrementos por incrementos absolutos (volatilidad)

A veces ayuda.

No, es mucho más complicado que eso.
 
Aleksey Vyazmikin #:

Mi idea es obtener un modelo que seleccione segmentos cuánticos estables mediante una serie de características estadísticas. Todo el mundo es bienvenido a unirse a este proyecto.

¿Por qué estás tan obsesionado con estos cuantos?...

No tienen nada de intelectual. Simplemente dividimos por ejemplo 10000 líneas en 100 trozos, es decir ordenamos y vamos desde abajo contamos 100 líneas, si las siguientes coinciden con la centésima línea (es decir se repiten), entonces las remitimos todas al primer trozo. Los duplicados son más de empezar a escribir las líneas en el segundo cuanto - los próximos 100 + duplicados si los hay. Y así sucesivamente hasta que nos quedemos sin filas.

Incluso 1 árbol contiene órdenes de magnitud de información más útil (porque está entrenado en los datos) que estos segmentos cuánticos (sólo 100 cadenas ordenadas con duplicados).

 
Forester #:

¿Por qué estás tan obsesionado con estos cuantos? ....

No hay nada intelectual en ellos en absoluto. Basta con dividir por ejemplo 10000 líneas en 100 trozos, es decir, ordenar e ir desde abajo contar 100 líneas, si las siguientes coinciden con la línea centésima (es decir, repeticiones), entonces las remitimos todas al primer trozo. Los duplicados son más de empezar a escribir las líneas en el segundo cuanto - los próximos 100 + duplicados si los hay. Y así sucesivamente hasta que nos quedemos sin líneas.

Incluso 1 árbol contiene órdenes de magnitud de información más útil (porque está entrenado con datos) que estos segmentos cuánticos (sólo 100 líneas ordenadas con duplicados).

Los segmentos cuánticos son los ladrillos a partir de los cuales se construye el modelo CatBoost. Inicialmente, según tenía entendido, de esta forma se resolvía la cuestión del ahorro de memoria y, en general, la aceleración de los cálculos. Una ganancia colateral es la reducción de variantes de combinaciones de indicadores predictores, se da un paso hacia la reducción de la multicolinealidad, lo que en general contribuye a la velocidad y calidad del entrenamiento. Además, en parte, se resuelve el problema de la deriva de los datos.

Yo también veo un filón para otra cosa: explorar el potencial de la estimación probabilística en datos de segmentos cuánticos. Si tomamos el método de cuantificación que propones (en realidad es mejor imaginar que el propósito del proceso es cribar grupos homogéneos -análogo- clustering), y dividimos los datos en 20 segmentos cuánticos iguales según el número de ejemplos, resulta que en cada segmento cuántico sólo queda un 5% de datos. CatBoost crea por defecto 254 separadores - 255 segmentos. A continuación, se construyen árboles a partir de estos segmentos. Se supone que todos los segmentos cuánticos son igualmente útiles, y su interposición debe determinarse particionando el grupo en subgrupos, por el método de construcción de un árbol de decisión. La partición se realiza tanto por la raíz como por otros predictores. Incluso si tomamos un árbol, ¿cuántos de los ejemplos originales de la clase positiva "1" permanecerán en la lista final después de 6 divisiones? Debemos tener en cuenta que la selección de divisiones se basa en la métrica del número acumulado de divisiones cuánticas. Teniendo en cuenta el propio método de construcción del árbol, resulta obvio que cuanto más cualitativa sea la partición del predictor en segmentos cuánticos, menos divisiones serán necesarias para alcanzar la misma precisión en la hoja. Observo - que cada división es una hipótesis, y todas las hipótesis no pueden ser verdaderas. Por lo tanto, si hacemos la división teniendo en cuenta el potencial de un segmento cuántico para pertenecer más a una de las clases, reducimos el número de divisiones para lograr una precisión similar, y por lo tanto reducir el número de hipótesis potencialmente falsas (divisiones). Además, si podemos dividir inmediatamente el predictor en 3 regiones globales - dos para la pertenencia a una clase y una para la incertidumbre, entonces los modelos serán de media más pequeños y con mejor rendimiento estadístico - espero que también más robustos.

Por ejemplo, imaginemos que el predictor es el oscilador RSI - acciones significativas de los participantes se producen en torno a los niveles de 70, 50, 30 - todo más allá - digamos, no afecta a la toma de decisiones de los participantes del mercado. Entonces es razonable construir una tabla cuántica de tal manera que separe estos 3 valores del resto de la población. De lo contrario, una de las divisiones tendrá aleatoriamente más ejemplos en el segmento cuántico de pertenencia a la clase y obtendrá una regla falsa sobre una hipótesis falsa.

Puede dibujar un gráfico de barras con las puntuaciones cuantificadas de los predictores y dibujar una curva de probabilidades de pertenencia a la clase "1" para cada columna. Si la curva tiene más probabilidades de ser una línea recta, entonces yo pondría en el banquillo un predictor de este tipo. Un buen predictor, en mi opinión, tendrá una línea inclinada o picos en algunas columnas.

Podemos decir que, mediante la cuantificación, busco acontecimientos discretos que influyan en la probabilidad de movimiento de los precios.

 
La regla es exactamente lo que dividirá
rsi>69 & rsi<71....
Eso es todo cuantificación.
Coges un AMO de madera, lo divides en árboles y sacas los correctos.

¿Qué cuantificación? Eres un sinsentido, es patético.

Todo se resuelve en tres líneas de código...
Y has estado trabajando con esta cuantificación durante años, como un profesor loco.
 
mytarmailS #:
La regla simplemente dividirá
rsi>69 & rsi<71....
Esa es toda la cuantificación...
Tomas un AMO de madera, lo divides en árboles y sacas los correctos...

¿Qué cuantificación? Dices tantas tonterías que es patético.

Todo se resuelve en tres líneas de código...
Y llevas años jugueteando con este medio de cuantificación, como un profesor chiflado.

Hay diferentes maneras de crear una tabla de cuantificación. Creo, de hecho, que puedes hacerlo a través de un paquete off-the-shelf que construye árboles sobre un único predictor con restricciones dadas en la hoja sobre el porcentaje de ejemplos. Lo que ese paquete es y cómo obtener los datos en el formato que necesito - no lo sé.

Lo importante no es sólo la partición, sino encontrar criterios para evaluar esta división cuántica que aumente la probabilidad de que la pertenencia a una clase se conserve en los nuevos datos.

Por qué lo hago: porque es la clave para construir un modelo cualitativo.

Por qué lleva mucho tiempo - un montón de experimentos y scripts de prueba. Tengo un poco de comprensión de OpenCL y el código está ahora parcialmente contado en una tarjeta de vídeo - se necesita tiempo - Tengo que estudiar un montón de cosas.

 
Aleksey Vyazmikin #:

Lo importante no es sólo la partición, sino encontrar criterios para evaluar este corte cuántico que aumente la probabilidad de que la pertenencia a una clase persista en los nuevos datos.

¿Has mirado alguna vez el código en el mismo catbuster? Lo está usando. No utiliza paquetes de terceros. Pero es una función tan pequeña (es incluso más simple que lo que describí, no desplaza el punto de separación por el número de duplicados).
Escribí comentarios sobre lo que sale. La entrada es una columna ordenada.

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 se puede ver todo es muy simple y no hay nada intelectual aquí - sólo contar por ejemplo 100 filas y eso es todo.
Variantes ligeramente más complejas pueden desplazar al número de duplicados, también puede optimizar el tamaño de los cuantos (por ejemplo, si de 10000 filas 9000 duplicados, la función simple será de 11 cuantos: 10 de las primeras 1000 filas y en la 11ª los 9000 duplicados restantes, o puedes dividir las primeras 1000 filas en 99 cuantos + 1 cuanto con 9000 duplicados).
Pero tampoco tienen nada de intelectual: la base es el mismo recuento simple del número necesario de filas.

El original (hay variantes más complicadas) https://github.com/catboost/catboost/blob/3cde523d326e08b32caf1b8b138c2c5303dc52e5/library/cpp/grid_creator/binarization.cpp
Estudie las funciones de esta página durante una semana y ahórrese varios años.

P.s. La razón principal por la que el siguiente quantum no tiene exactamente 100 cadenas, sino 315 o 88 o 4121 no está en alguna fórmula súper complicada (donde las cadenas se combinan según el poder predictivo, que se quiere usar para buscar criterios de evaluación de este segmento del quantum ), sino simplemente en el número de duplicados.
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
 
¿Es necesario rescatar a una persona que evidentemente se está ahogando pero disfruta con su suicidio?
Cuando le ofreces una mano de ayuda, la rechaza, discute contigo, no intenta hacer nada para salir por sí mismo y dicta sus propias condiciones como:
"O me rescatas tú mismo, me sacas del agua sosteniéndome sobre tu cabeza al ritmo de mi música favorita, o no lo haces.
Y entonces no tienes ningún deseo de salvarme.


 
Forester #:

¿Has mirado siquiera el código en los mismos catbusters? Lo está usando. No utiliza paquetes de terceros. Pero es una función tan pequeña (es incluso más simple que lo que describí, no desplaza el punto de separación por el número de duplicados).
Escribí comentarios sobre lo que sale. La entrada es una columna ordenada.

Por supuesto que lo miré. Además, estoy dispuesto a pagar por el trabajo para reproducir todos los métodos de cuantificación en MQL5. Hasta ahora los intentos han sido infructuosos, ¿le gustaría intentarlo?

Forester #:

Como se puede ver, todo es muy simple y no hay nada intelectual aquí - sólo contar por ejemplo 100 líneas y eso es todo.

Usted ha dado el método más simple - sí, no es difícil.

Además, ¿he escrito yo que hay métodos de cuantificación ingeniosos o algo así? ¿Cómo se contradice con lo que escribí?

 
mytarmailS #:
¿Es necesario salvar a una persona que evidentemente se está ahogando pero disfruta con su suicidio?
Cuando le ofreces una mano de ayuda, la rechaza, discute contigo, no intenta hacer nada para salir por su propio pie y dicta sus propias condiciones como:
"O me salvas tú mismo, me sacas del agua sosteniéndome sobre tu cabeza al ritmo de mi música favorita, o no lo haces.
Y entonces no tienes ningún deseo de salvarme.


Siéntate en la orilla - héroe - es tu elección.

Ya te he dicho suficiente sobre cuál es el punto y por qué resolver el problema aumentará la estabilidad del modelo.

¿De qué sirve presumir de que conoces un paquete en R que puede resolver tal o cual problema si yo no puedo usarlo?

 
Aleksey Vyazmikin #:

Hasta ahora los intentos han sido infructuosos, ¿quieres intentarlo?

No. Inténtelo usted mismo (mientras se realizan los próximos cálculos y le llevará tiempo), los idiomas son similares.

Aleksey Vyazmikin #:

Usted ha dado el método más simple - sí, no es difícil.

Otros tienen la misma esencia simple. He descrito un par de opciones en el texto - saltarse los duplicados y volver a calcular el tamaño cuántico base teniendo en cuenta los duplicados. También existe la división no por número, sino por rango y la combinación de estos métodos.