2011-01-05 17 views
8

Mam listę 6500 przedmiotów, które chciałbym wymienić lub zainwestować. (Nie dla prawdziwych pieniędzy, ale dla pewnej gry). Każda pozycja ma 5 liczb, które zostaną użyte do jej zaliczenia inni.Algorytmy dla pozycji rankingowych

Całkowita ilość sprzedanych sztuk na dzień: Im wyższa jest ta liczba, tym lepiej.

Kanał Donchian produktu w ciągu ostatnich 5 dni: Im wyższa jest ta liczba, tym lepiej.

Mediana spreadu ceny: Im niższa liczba, tym lepiej.

Spread 20-dniowej średniej kroczącej dla pozycji: Im niższa jest ta liczba, tym lepiej.

Spread 5-dniowej średniej ruchomej dla pozycji: Im wyższa jest ta liczba, tym lepiej.

Wszystkie 5 liczb ma tę samą "wagę", lub innymi słowy, wszystkie powinny mieć wpływ na końcową liczbę w tej samej wartości lub wartości.

W tej chwili po prostu pomnożę wszystkie 5 liczb dla każdej pozycji, ale nie pozycjonuje ona pozycji w taki sposób, w jaki chciałbym, aby były w rankingu. Chcę tylko połączyć wszystkie 5 liczb w ważoną liczbę, której mogę użyć do ustalenia wszystkich 6500 pozycji, ale nie jestem pewien, jak to zrobić poprawnie lub matematycznie.

Uwaga: Całkowita ilość handlu przedmiotami dziennie i kanał donchowski to liczby znacznie wyższe niż spready, które są bardziej procentowymi liczbami. To jest prawdopodobnie powód, dla którego pomnożenie ich wszystkich razem nie działało dla mnie; ilość handlowana dziennie i kanał donchowski miały znacznie większą rolę w końcowej liczbie.

+0

To brzmi trochę jak algorytm uczenia maszynowego - starasz się znaleźć jakąś funkcję tych pięć parametrów, które szacują "dobro" zasobów. Nie jestem ekspertem od uczenia maszynowego, ale może ktoś tu jest? – templatetypedef

+1

możesz dodać konkretny przykład? Ogólnie rzecz biorąc będziesz chciał znormalizować liczby w danych wejściowych danych, a następnie dodanie ich razem powinno zapewnić solidną pozycję. – madmik3

+0

Na przykład, ilość handlowana na dzień to 400. Kanał Donchiana to 30000. Mediana spreadu wynosi 0,30. Rozpiętość średniej z 20 dni wynosi 0,85, a rozkład średniej z 5 dni wynosi 1,2.Dodanie razem powoduje powstanie tego samego problemu, co pomnożenie ich. – Chuy

Odpowiedz

2

Zazwyczaj normalizuje się wpisy danych do odpowiedniego zakresu. Ponieważ nie ma dla nich ustalonego zakresu, musisz użyć zakresu przesuwu - lub, aby było prostsze, normalizować je do dziennych zakresów.

Za każdy dzień otrzymuj wszystkie wpisy dla danego typu, uzyskaj najwyższy i najniższy z nich, określ różnicę między nimi. Niech Bottom = wartość najniższego, Range = różnica między najwyższą i najniższą. Następnie oblicza się dla każdego wpisu (wartość - Bottom)/Range, co da w wyniku coś pomiędzy 0.0 a 1.0. Są to liczby, z którymi można dalej pracować.

Pseudokod (wsporniki wyrazami wcięcia, aby łatwiej odczytać):

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 

coś takiego. Będę bardziej elegancki z dobrą biblioteką (STL, boost, cokolwiek masz na platformie wdrożeniowej), a normalizacja powinna być w oddzielnej funkcji, więc możesz zastąpić ją innymi odmianami, takimi jak log(), gdy zajdzie taka potrzeba .

+0

Co miałem na myśli, łącząc 5 liczb w liczbę ważoną, miałem na myśli ostateczną liczbę będzie ważona, ponieważ każdy z 5 czynników wpłynie na to jednakowo. Mam ustawiony zakres, jeśli w zakresie oznaczasz najwyższą i najniższą liczbę. Jednak zakres sięga od 1 (nie 1 mil, tylko 1) do 40 milionów. Większość z nich mieści się w przedziale od 100 do 400. Czy 40 mil nie skośnie wyników? – Chuy

+0

OK, dostosowałem publikację. Przez ustalony zakres rozumiałem zakres wszystkich wartości, których nigdy nie przekraczają. - Dlatego napisałem o normalizacji. Liniowa normalizacja pomoże przeciwdziałać różnicom między pięcioma wpisami. Możesz to ulepszyć, używając czegoś takiego jak skalowanie logarytmiczne na niektórych elementach, jeśli ich dane są takie (rozproszone w stosunku do wielkości). Nie mogę jednak powiedzieć, z tego, co napisałeś. – foo

+0

Zgadzam się z @foo, że zrobienie dziennika lub innego skalowania pomogłoby –

3

Rozpocznij każdy przedmiot z wynikiem 0. Dla każdej z 5 liczb, posortuj listę według tej liczby i dodaj pozycję każdego przedmiotu w tym sortowaniu do wyniku. Następnie posortuj przedmioty według łącznej oceny.

+0

Zgoda, byłby to najprostszy sposób i rób to, co OP chce –

+0

To właśnie planowałem. Zakres danych jest jednak bardzo zróżnicowany. Na przykład, ilość handlu może wynosić od 2 do 40 milionów. 40 milionów jest znacznie wyższa niż następny wynik, który wynosi około 20 milionów m, który jest również znacznie wyższy niż następny element. Ranking według obrotu w danym dniu dałby tylko przedmiot z 40 milionów pozycji w rankingu nad pozycją z 20 milionów, mimo że istnieje znacznie większa różnica około 20 milionów. Tak właśnie zrobię, jeśli nie znajdę lepszego rozwiązania. – Chuy

+0

W końcu potrzebujesz normalizacji. – foo

5

Można zastąpić każdy atrybut wektor x (długości N = 6500) przez z-score wektora Z(x), gdzie

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

Byłoby to przekształcić je w tej samej „skali”, a następnie możesz dodać wyniki Z (z równymi ciężarami), aby uzyskać końcowy wynik, i ustawić pozycje N=6500 według tego całkowitego wyniku. Jeśli możesz znaleźć w swoim problemie inny wektor atrybutów, który byłby wskaźnikiem "dobroci" (powiedzmy 10-dniowy zwrot zabezpieczenia?), To możesz dopasować model regresji tego przewidywanego atrybutu do tych z-punktów zmienne, aby obliczyć najlepsze niejednolite wagi.

12

Powodem, dla którego ludzie mają problem z odpowiedzeniem na to pytanie, jest brak możliwości porównania dwóch różnych "atrybutów". Gdyby istniały tylko dwa atrybuty, powiedzmy, ilość handlowana i mediana rozrzut ceny, czy (20 milionów, 50%) byłaby gorsza lub lepsza niż (100,1%)? Tylko ty możesz to zdecydować.

Konwersja wszystkiego na tę samą liczbę wielkości może pomóc, to jest to, co jest znane jako "normalizacja". Dobrym sposobem na zrobienie tego jest z-score, o którym wspomina Prasad. To jest koncepcja statystyczna, patrząc na to, jak zmienia się jej ilość. Aby to wykorzystać, musisz przyjąć pewne założenia dotyczące rozkładów statystycznych twoich liczb.

Rzeczy takie jak spready są prawdopodobnie normally distributed - shaped like a normal distribution. Dla nich, jak mówi Prasad, weź z(spread) = (spread-mean(spreads))/standardDeviation(spreads).

Rzeczy takie jak ilość w obrocie mogą być Power law distribution. W tym celu przed przystąpieniem do obliczania wartości średniej i zmiennej sd należy wykonać log(). To jest wynik z to z(qty) = (log(qty)-mean(log(quantities)))/sd(log(quantities)).

Następnie dodaj z-score dla każdego atrybutu.

Aby to zrobić dla każdego atrybutu, musisz mieć pomysł jego dystrybucji. Można się domyślić, ale najlepszym sposobem jest wykreślić wykres i spojrzeć. Możesz także chcieć narysować wykresy na skali logarytmicznej. Zobacz wikipedia for a long list.

+0

+1 dowiedzieć się więcej o tym, jak myśleć o normalizowaniu liczb z tą odpowiedzią, to zrobiłem w poprzednim roku. – orangepips

+0

Hmm. Więc powinienem sporządzić wykres danych dla wszystkich 5 kategorii, a następnie porównać wykresy z listą dystrybucji na wikipedii? Nie jestem pewien, jak to wykreślić. Mogę umieścić dane na osi Y, więc czy powinienem umieścić konkretny element na osi X? Jeśli to zrobię, zgaduję, że powinienem posortować elementy na osi X przez odpowiadającą im wartość atrybutu od niskiego do wysokiego? – Chuy

+0

Należy utworzyć histogram (podobny do wykresu słupkowego). Najłatwiej to zrobić z programem excel (lub odpowiednikiem w biurze). Zobacz http://www.ncsu.edu/labwrite/res/gt/gt-bar-home.html#ith –

0

Łączna liczba sztuk w obrocie dziennie: im wyższa jest ta liczba, tym lepiej. (a)

Kanał Donchiański przedmiotu w ciągu ostatnich 5 dni: Im wyższa liczba, tym lepiej. (b)

Mediana rozkładu ceny: Im niższa ta liczba, tym lepiej. (c)

Rozłożenie średniej ruchomej wynoszącej 20 dni dla przedmiotu: im niższa ta liczba, tym lepiej. (d)

Spread 5-dniowej średniej kroczącej dla przedmiotu: im wyższa liczba, tym lepiej. (E)

a + b + e -c -d = "wynik" (wyższy wynik = lepszy wynik)

+0

Tęskni, że (a) i (b) są znacznie większe niż spread, i sprawi, że te dwa dominują wynik. – Teepeemm