2011-01-05 5 views
8

Tengo una lista de 6500 artículos en los que me gustaría intercambiar o invertir (no por dinero real, sino por cierto juego). Cada artículo tiene 5 números que se usarán para clasificarlo entre los demás.Algoritmo para los artículos del ranking

Cantidad total del artículo negociado por día: Cuanto mayor sea este número, mejor.

The Donchian Canal del artículo en los últimos 5 días: Cuanto mayor sea este número, mejor.

La mediana de la difusión del precio: Cuanto menor sea este número, mejor.

La propagación de la media móvil de 20 días para el artículo: Cuanto menor sea este número, mejor.

La propagación de la media móvil de 5 días para el artículo: Cuanto mayor sea este número, mejor.

Todos los 5 números tienen el mismo 'peso', o en otras palabras, todos deben afectar el número final en el con el mismo valor o valor.

Por el momento, simplemente multiplico los 5 números para cada artículo, pero no clasifica los artículos de la forma en que los clasificaría. Solo quiero combinar los 5 números en un número ponderado que puedo usar para clasificar los 6500 ítems, pero no estoy seguro de cómo hacerlo correctamente o matemáticamente.

Nota: La cantidad total del artículo comercializado por día y el canal donchian son números que son mucho más altos que los spreads, que son más de números de tipo porcentual. Esta es probablemente la razón por la cual multiplicarlos a todos juntos no funcionó para mí; la cantidad intercambiada por día y el canal donchian tenían un papel mucho más importante en el número final.

+0

Esto se parece mucho a un algoritmo de aprendizaje automático - que está tratando de encontrar alguna función de los cinco parámetros que estiman la "bondad" de la acción. No soy un experto en aprendizaje automático, ¿pero quizás alguien más esté aquí? – templatetypedef

+1

puede agregar un ejemplo concreto? en general, querrás normalizar los números en tus datos de datos de entrada y luego simplemente sumarlos debería producir una clasificación sólida. – madmik3

+0

Por ejemplo, la cantidad intercambiada por día es 400. Donchian Channel es 30000. La mediana de propagación es .30. La extensión del promedio de 20 días es .85, y la extensión del promedio de 5 días es 1.2.Agregar el conjunto plantea el mismo problema que multiplicarlos. – Chuy

Respuesta

2

Normalmente normalizará sus entradas de datos a sus respectivos rangos. Como no hay un rango fijo para ellos, tendrás que usar un rango deslizante o, para hacerlo más simple, normalizarlos a los rangos diarios.

Para cada día, obtenga todas las entradas para un tipo determinado, obtenga el más alto y el más bajo de ellos, determine la diferencia entre ellos. Let Bottom = valor de la más baja, Range = diferencia entre la más alta y la más baja. Luego, calcula para cada entrada (valor - Inferior)/Rango, lo que dará como resultado algo entre 0.0 y 1.0. Estos son los números con los que puede continuar trabajando, entonces.

Pseudocódigo (soportes reemplazados por el sangrado para hacer más fácil de leer):

double maxvalues[5]; 
double minvalues[5]; 
// init arrays with any item 
for(i=0; i<5; i++) 
    maxvalues[i] = items[0][i]; 
    minvalues[i] = items[0][i]; 
// find minimum and maximum values 
foreach (items as item) 
    for(i=0; i<5; i++) 
     if (minvalues[i] > item[i]) 
      minvalues[i] = item[i]; 
     if (maxvalues[i] < item[i]) 
      maxvalues[i] = item[i]; 

// now scale them - in this case, to the range of 0 to 1. 
double scaledItems[sizeof(items)][5]; 
double t; 
foreach(i=0; i<5; i++) 
    double delta = maxvalues[i] - minvalues[i]; 
    foreach(j=sizeof(items)-1; j>=0; --j) 
     scaledItems[j][i] = (items[j][i] - minvalues[i])/delta; 
     // linear normalization 

algo por el estilo. Seré más elegante con una buena biblioteca (STL, boost, lo que sea que tengas en la plataforma de implementación), y la normalización debería estar en una función separada, para que puedas reemplazarla con otras variaciones como log() a medida que surja la necesidad .

+0

Lo que quise decir al combinar los 5 números en un número ponderado, quise decir que el número final será ponderado porque cada uno de los 5 factores lo afectará por igual. Tengo un rango establecido, si por rango quiere decir el número más alto y el número más bajo. Sin embargo, el rango va de 1 (no 1mil, solo 1) a 40 millones. La mayor parte del rango está entre 100 y 400. ¿No los 40mil sesgarían los resultados? – Chuy

+0

OK, adaptó la publicación. Por rango fijo quise decir un rango sobre todos los valores que nunca exceden. - Es por eso que escribí sobre la normalización. La normalización lineal aquí ayudará contra las diferencias entre las cinco entradas. Es posible que desee mejorar esto mediante el uso de una escala logarítmica en ciertos elementos, si sus datos son así (distribuidos en magnitudes). Sin embargo, no puede decir lo que escribió. – foo

+0

Estoy de acuerdo con @foo en que hacer un registro u otra escala ayudaría al –

3

Comience cada artículo con un puntaje de 0. Para cada uno de los 5 números, ordene la lista por ese número y agregue el puntaje de cada artículo en esa clasificación a su puntaje. Luego, solo ordena los artículos por el puntaje combinado.

+0

De acuerdo, esta sería la manera más simple y hacer lo que el OP quiere –

+0

Esto es lo que estaba planeando hacer. Sin embargo, el rango de los datos varía enormemente. Por ejemplo, la cantidad intercambiada puede variar de 2 a 40 millones. El 40million es mucho más alto que el siguiente resultado, que es de aproximadamente 20millionm, que también es significativamente más alto que el siguiente elemento. La clasificación según el orden operado por día solo daría al artículo 40 millones en una posición de clasificación sobre el elemento con 20 millones, a pesar de que hay una diferencia mucho mayor de alrededor de 20 millones. Esto es lo que haré si no encuentro una mejor solución. – Chuy

+0

Entonces necesitas una normalización, después de todo. – foo

5

Puede sustituir cada atributo en vectores x (de longitud N = 6500) por el puntuación z del vector Z(x), donde

Z(x) = (x - mean(x))/sd(x). 

Esto transformarlos en el mismo "escala", y luego puede sumar los puntajes Z (con pesos iguales) para obtener un puntaje final y clasificar los artículos N=6500 por este puntaje total. Si puede encontrar en su problema algún otro vector de atributo que sería un indicador de "bondad" (digamos el retorno de 10 días de la seguridad?), Entonces podría ajustarse un modelo de regresión de este atributo predicho contra estos z-score variables, para descubrir los mejores pesos no uniformes.

12

La razón por la que las personas tienen problemas para responder esta pregunta es porque no tenemos forma de comparar dos "atributos" diferentes. Si hubiera solo dos atributos, por ejemplo, la cantidad negociada y la diferencia de precio medio, ¿(20 millones, 50%) sería peor o mejor que (100,1%)? Solo tú puedes decidir esto.

Convertir todo en números del mismo tamaño podría ayudar, esto es lo que se conoce como "normalización". Una buena forma de hacerlo es el z-score que Prasad menciona. Este es un concepto estadístico que analiza cómo varía la cantidad. Debe hacer algunas suposiciones sobre las distribuciones estadísticas de sus números para usar esto.

Las cosas como los diferenciales son probablemente normally distributed - shaped like a normal distribution. Para estos, como dice Prasad, toma z(spread) = (spread-mean(spreads))/standardDeviation(spreads).

Cosas como la cantidad negociada podría ser un Power law distribution. Para estos, es posible que desee tomar el log() antes de calcular la media y la sd. Esa es la puntuación z es z(qty) = (log(qty)-mean(log(quantities)))/sd(log(quantities)).

Luego solo suma el puntaje z para cada atributo.

Para hacer esto para cada atributo, necesitará tener una idea de su distribución. Se podría adivinar, pero la mejor manera es trazar un gráfico y echar un vistazo. También es posible que desee trazar gráficos en escalas de registro. Ver wikipedia for a long list.

+0

+1 a obtener más información sobre cómo pensar acerca de la normalización de números con esta respuesta que hice el año anterior. – orangepips

+0

Hmm. Entonces, ¿debería graficar los datos de las 5 categorías, luego comparar los gráficos con la lista de distribuciones en wikipedia? Sin embargo, no estoy seguro de cómo graficarlo. Puedo poner los datos en el eje y, entonces ¿debería poner el elemento específico en el eje x? Si hago eso, supongo que debo ordenar los elementos en el eje x por el valor correspondiente del atributo de menor a mayor. – Chuy

+0

Necesita crear un histograma (similar a un gráfico de barras). La forma más fácil de hacerlo es con Excel (o equivalente de oficina abierta). Ver http://www.ncsu.edu/labwrite/res/gt/gt-bar-home.html#ith –

0

Cantidad total del artículo negociado por día: Cuanto mayor sea este número, mejor. (a)

El canal Donchian del artículo en los últimos 5 días: cuanto mayor sea este número, mejor. (b)

La propagación mediana del precio: cuanto menor sea este número, mejor. (c)

La propagación de la media móvil de 20 días para el artículo: cuanto menor sea este número, mejor. (d)

La propagación de la media móvil de 5 días para el elemento: cuanto mayor sea este número, mejor. (E)

a + b -c -d + e = "puntuación" (= mayor puntuación mejor puntuación)

+0

Esto echa de menos que (a) y (b) son mucho más grandes que la propagación, y hará que esos dos dominen el resultado. – Teepeemm

Cuestiones relacionadas