【问题标题】:How do I create ranking (descending) table in matlab based on inputs from two separate data tables? [closed]如何根据来自两个单独数据表的输入在 matlab 中创建排名(降序)表? [关闭]
【发布时间】:2013-02-09 21:29:10
【问题描述】:

我有四个数据集(请耐心等待):

  • 第 1 表:matlab 中一列 txt 格式的 10 个股票代码(股票代码)列表。
  • 第二张表:一列中数字格式的日期(双格式为 10 天)。
  • 第三张表:我有 10*10 的随机数数据集(为简单起见假设 0-1)。 (例如每股收益增长 EPS)--所以我希望在我的投资组合构建排名中实现高 EPS 增长。
  • 第四张表:我还有另一个10*10的随机数数据集(为简单起见假设0-1)。 (例如每天的市盈率)。-所以我希望我的投资组合构建排名中的市盈率较低。

现在:我想对每天由表 1 中的 3 只股票(最大值)和表 2 中的底部 3 只股票(最小值)组成的股票组合进行排名。输出必须是基于两个因素的组合排名(如表 3 和表 4 所述)每天的代码列表(在本例中为 3 个)。

有什么想法吗?简而言之,我需要得到一个带有三个股票代码的顶级桶......

【问题讨论】:

  • 表3和4的目的是什么?表 3 和表 4 的内容是什么?它们是表 1 中每个股票代码的每日数据吗?
  • 协作编辑是 SO stackoverflow.com/faq#editing 的一部分“如果您对您的贡献由其他受信任的用户协作编辑的想法感到不满意,那么这可能不适合您。”考虑自己编辑您的帖子,从数据和输入/输出方面抽象出您的问题,并可能提供一个示例案例。

标签: matlab ranking bucket-sort


【解决方案1】:

从帖子中您要达到的目标并不完全清楚。这是基于猜测的结果,有多种选择。

您的前两个“表格”存储股票和日期的符号(与排名无关)。您的第三个和第四个分数是以stock x day 的方式排列的。让我们假设股票是垂直的,天是水平的,股票的符号是[1:10]

N = 10; % num of stocks
M = 10; % num of days   
T3 = rand(N,M); % table 3 stocks x days
T4 = rand(N,M); % table 4 stocks x days

按升序和降序对分数表进行排序(以获得每天的高低分数,即每列):

[Sl,L] = sort(T3, 'descend'); 
[Ss,S] = sort(T4, 'ascend');

保持三个最大和最小:

largest = L(1:3,:);  % bucket of 3 largest per day
smallest = S(1:3,:); % bucket of 3 smallest per day

如果你需要两者中的那些(0 是 nan):

% Inter-section of both buckets
indexI = zeros(3,M);
for i=1:M
    z = largest(ismember(largest(:,i),smallest(:,i)));
    if ~isempty(z)
        indexI(1:length(z),i) = z;
    end
end

如果您需要其中任何一个(0 是 nan):

% Union of both buckets
indexU = zeros(6,M);
for i=1:M
    z = unique([largest(:,i),smallest(:,i)]);
    indexU(1:length(z),i) = z;
end

如果您需要从 maximum_of_3 和 minimum_of_4 集合中对分数/股票进行排名:

scoreAll = [Sl(1:3,:); Ss(1:3,:)];
indexAll = [largest;smallest];

[~,indexSort] = sort(scoreAll,'descend');
for i=1:M
    indexBest(:,i) = indexAll(indexSort(1:3,i),i);
end

更新

要获得最终分数的加权排名,请定义权重向量(1 x 分数)并使用以下两个选项之一,然后排序 scoreAllW 而不是 scoreAll

w = [0.3 ;0.3; 0.3; 0.7; 0.7; 0.7];
scoreAllW = scoreAll.*repmat(w,1,10);    % Option 1
scoreAllW = bsxfun(@times, scoreAll, w); % Option 2

【讨论】:

  • 亲爱的 Gevang,非常感谢您的帮助,完全有道理。快速提问,我将如何修改最终输出的每个因素的权重?在最后阶段的意思是,假设我想要在 indexBest 中获得最终输出之前,我希望 T3 的权重为 0.3,T4 的权重为 0.7?
  • @Noob_1 您可以通过选定的权重(w1 和 w2)对 T3 和 T4 进行预加权,或者在最终的 sort. 之前使用 scoreAll 矩阵,请参阅我的答案中的更新。
猜你喜欢
  • 2013-03-27
  • 1970-01-01
  • 2019-11-05
  • 2018-09-20
  • 2023-02-03
  • 1970-01-01
  • 2018-03-05
  • 2017-09-30
  • 2022-01-03
相关资源
最近更新 更多