【问题标题】:Algorithm For Ranking Items排序项目的算法
【发布时间】:2011-06-03 18:04:20
【问题描述】:

我有 6500 件物品的清单,我想交易或投资。(不是为了真钱,而是为了某个游戏。)每件物品都有 5 个数字,用于在其他物品中进行排名。

每天交易的物品总量:这个数字越高越好。

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

价格的中间价差:这个数字越低越好。

该项目的 20 天移动平均线的价差:这个数字越低越好。

该项目的 5 天移动平均线的价差:这个数字越高越好。

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

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

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

【问题讨论】:

  • 这听起来很像机器学习算法——你试图从这五个参数中找出一些函数来估计股票的“好坏”。我不是机器学习专家,但也许这里有其他人?
  • 你能添加一个具体的例子吗?通常,您需要对输入数据数据中的数字进行规范化,然后简单地将它们相加即可产生可靠的排名。
  • 例如,每天的交易量是 400。Donchian Channel 是 30000。中间点差是 0.30。 20 天平均线的点差为 0.85,5 天平均线的点差为 1.2。将它们相加会产生与相乘相同的问题。
  • 如果你想做一些关于机器学习的事情(正如 templatetypedef 所怀疑的那样),我可以给你一些链接和建议;但是,如果你不这样做,我会为我省去麻烦。请澄清。
  • 那是“特定游戏”EVE 在线吗? :)

标签: algorithm statistics ranking


【解决方案1】:

人们无法回答这个问题的原因是我们无法比较两个不同的“属性”。如果只有两个属性,比如交易数量和中间价差,(2000 万,50%)会比(100.1%)更差还是更好?只有你自己可以决定。

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

点差之类的东西可能是normally distributed - shaped like a normal distribution。对于这些,正如 Prasad 所说,请使用z(spread) = (spread-mean(spreads))/standardDeviation(spreads)

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

然后将每个属性的 z-score 相加。

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

【讨论】:

  • 嗯。那么,我应该将所有 5 个类别的数据绘制成图表,然后将这些图表与维基百科上的分布列表进行比较?我不确定如何绘制它。我可以将数据放在y轴上,那么我应该将特定项目放在x轴上吗?如果我这样做,我猜我应该按属性的相应值从低到高对 x 轴上的项目进行排序?
  • 您需要创建一个直方图(类似于条形图)。最简单的方法是使用 excel(或开放式办公室等价物)。见ncsu.edu/labwrite/res/gt/gt-bar-home.html#ith
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 同意,这将是最简单的方法,并按照 OP 的要求进行操作
    • 这是我打算做的。但是,数据的范围差异很大。例如,交易数量可以从 2 到 4000 万不等。 4000 万比下一个结果高得多,大约是 2000 万米,这也明显高于下一个项目。以每天交易的订单进行排名只会让4000万的物品比2000万的物品排名高一个,尽管相差大约2000万。如果我找不到更好的解决方案,我会这样做。
    • 所以你确实需要归一化,毕竟。
    【解决方案4】:

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

    对于每一天,获取给定类型的所有条目,获取它们中的最高值和最低值,确定它们之间的差异。令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() 等其他变体.

    【讨论】:

    • 我的意思是将 5 个数字组合成一个加权数字,我的意思是最终数字将被加权,因为 5 个因素中的每一个都会对它产生同样的影响。我有一个固定的范围,如果你所说的范围是指最高数字和最低数字。但是,范围从 1(不是 100 万,只是 1)到 4000 万。大多数范围在 100 到 400 之间。4000 万不会扭曲结果吗?
    • 好的,修改了帖子。固定范围是指它们从未超过的所有值的范围。 - 这就是我写规范化的原因。这里的线性归一化将有助于消除五个条目之间的差异。如果它们的数据是这样的(分布在幅度上),您可能希望通过对某些项目使用对数缩放等方法来改进这一点。但是,无法从您写的内容中看出。
    • 我同意 @foo 的观点,即进行日志或其他缩放会有所帮助
    【解决方案5】:

    每天交易的物品总量:这个数字越高越好。 (一)

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

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

    该项目的 20 天移动平均线的价差:这个数字越低越好。 (d)

    该项目的 5 天移动平均线的价差:这个数字越高越好。 (e)

    a + b -c -d + e = “分数”(分数越高 = 分数越高)

    【讨论】:

    • 这忽略了 (a) 和 (b) 比价差大得多,并且会使这两者在结果中占主导地位。
    猜你喜欢
    • 2010-10-14
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多