排序项的算法

时间:2011-01-05 01:02:30

标签: algorithm statistics ranking

我有一份6500件商品清单,我想交易或投资。(不是真钱,而是特定游戏。)每件商品都有5个数字,用于将其排在其他商品中。< / p>

每天交易的商品总数量:此数字越高越好。

过去5天内该项目的Donchian频道:此数字越高越好。

价格的中位数差价:此数字越低越好。

该项目的20天移动平均值的差价:此数字越低越好。

该项目的5天移动平均值的差价:此数字越高越好。

所有5个数字都具有相同的权重&#39;或者换句话说,它们都应该影响具有相同价值或价值的最终数字。

目前,我只是将每个项目的所有5个数字相乘,但它并没有按照我们排名的方式对项目进行排名。我只想将所有5个数字组合成一个加权数字,我可以用来对所有6500个项目进行排名,但我不确定如何正确或数学地执行此操作。

注意:每天交易的商品和donchian渠道的总数量远远高于差价,而更多的是百分比类型数字。这可能就是为什么将它们相乘而不能为我工作的原因;每天交易的数量和donchian渠道在最终数量中发挥的作用要大得多。

5 个答案:

答案 0 :(得分:14)

人们在回答这个问题时遇到问题的原因是我们无法比较两个不同的“属性”。如果只有两个属性,比如数量交易和中位数价差,那么(2000万,50%)会更差还是更好(100,1%)?只有你可以决定这一点。

将所有内容转换为相同大小的数字可能会有所帮助,这就是所谓的“规范化”。这样做的一个好方法是普拉萨德提到的z分数。这是一个统计概念,着眼于数量的变化。您需要对数字的统计分布做一些假设才能使用它。

传播之类的东西可能是normally distributed - shaped like a normal distribution。对于这些,正如普拉萨德所说,采取z(spread) = (spread-mean(spreads))/standardDeviation(spreads)

交易数量之类的东西可能是Power law distribution。对于这些,您可能需要在计算均值和sd之前采用log()。这是z分数为z(qty) = (log(qty)-mean(log(quantities)))/sd(log(quantities))

然后只需为每个属性添加z分数。

要为每个属性执行此操作,您需要了解其分布情况。你可以猜测,但最好的方法是绘制图表并看一看。您可能还想在对数刻度上绘制图表。见wikipedia for a long list

答案 1 :(得分:5)

您可以使用向量x z-score 替换每个属性向量N = 6500(长度为Z(x)),其中

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

这会将它们转换为相同的“比例”,然后您可以将Z分数(具有相同的权重)相加以获得最终分数,并将N=6500项目按此总分排名。如果你能在你的问题中找到一些其他的属性向量,它可以作为“善”的指标(比如安全性的10天回报?),那么你可以根据这些z得分拟合这个预测属性的回归模型变量,以找出最佳的非均匀权重。

答案 2 :(得分:3)

以分数0开始每个项目。对于5个数字中的每一个,按该数字对列表进行排序,并将该项目排序中的每个项目的排名添加到其分数中。然后,只需按组合分数对项目进行排序。

答案 3 :(得分:2)

您通常会将数据条目规范化为各自的范围。由于它们没有固定的范围,因此您必须使用滑动范围 - 或者,为了使其更简单,将它们标准化为每日范围。

对于每一天,获取给定类型的所有条目,获取它们中的最高和最低,确定它们之间的差异。设Bottom =最低值,Range =最高和最低之间的差值。然后计算每个条目(值 - 底部)/范围,这将产生介于0.0和1.0之间的值。这些是您可以继续使用的数字。

伪代码(括号替换为缩进以便于阅读):

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
这样的事情。一个好的库(STL,boost,无论你在实现平台上有什么),我会更优雅,并且规范化应该在一个单独的函数中,所以你可以在需要时用其他变量如log()替换它

答案 4 :(得分:0)

每日交易的商品总数:此数字越高越好。 (a)中

过去5天内该项目的Donchian频道:此数字越高越好。 (b)中

价格的中位数差价:这个数字越低越好。 (c)中

该项目的20日移动平均值的差价:该数字越低越好。 (d)

项目的5天移动平均值的扩展:这个数字越高越好。 (e)中

a + b -c -d + e =&#34;得分&#34; (得分越高=得分越高)