-2

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

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

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

有任何想法吗?简而言之,我最终需要一个带有三个股票代码的顶级桶......

4

1 回答 1

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
于 2013-02-10T23:02:46.670 回答