我有四个数据集(请耐心等待):
- 第一个表:在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