如何在matlab中基于两个独立数据表的输入创建排名(降序)表



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

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

现在:我想对每天的股票组合进行排名,其中包括表一中某一天的3只股票(最大值)和表2中倒数第三只股票(最小值)。输出必须是基于两个因素的组合排名的每天(在这种情况下为3)的股票行情表(如表3和4所述)。

有什么想法吗?简言之,我最终需要一个有三个股票行情的顶部桶。。。

从帖子中还不完全清楚你想要实现什么。这是一个基于猜测的观点,有各种选择。

你的前两个"表"存储股票和天数的符号(与排名无关)。你的第三分和第四分是以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

如果你需要从大的_of_3和小的_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

最新更新