我有以下代码来读取时间序列数据(包含在excel工作簿中的表5到19中)。每个工作表的标题为“TS”,后跟时间序列的编号。除了一件事之外,这个过程工作正常 - 当我研究回报时,我发现所有时间序列都沿着5移动。即TS 6成为“返回”数据中的第11列,TS 19成为第5列,TS 15成为第1列等。我需要它们与读取的顺序相同 - 这样TS 1在第1列,TS 2在第2列等。 这是一个问题,因为我读取了工作表的标题(“AssetList”),这些标题在后续代码中保持了它们的实际顺序。因此,当我重新组合标题和回报时,我发现它们不匹配。当例如第4列标题为“TS 4”但实际上包含TS 18的数据时,这使得进一步的操作变得复杂。 这段代码中有什么东西我错了吗?
XL='TimeSeries.xlsx';
formatIn = 'dd/mm/yyyy';
formatOut = 'mmm-dd-yyyy';
Bounds=3;
[Bounds,~] = xlsread(XL,Bounds);
%确定xls文件中的工作表数量:
FirstSheet=5;
[~,AssetList] = xlsfinfo(XL);
lngth=size(AssetList,2);
AssetList(:,1:FirstSheet-1)=[];
%循环播放页数并检索值
merge_count = 1;
for I=FirstSheet:lngth
[FundValues, ~, FundSheet] = xlsread(XL,I);
%提取日期和数据并合并 %(删除第1至第4行中的不同文本)
Fund_dates_data = FundSheet(4:end,1:2);
FundDates = cellstr(datestr(datevec(Fund_dates_data(:,1),...
formatIn),formatOut));
FundData = cell2mat(Fund_dates_data(:,2));
% CREATE TIME SERIES FOR EACH FUND
Fundts{I}=fints(FundDates,FundData,['Fund',num2str(I)]);
if merge_count == 2
Port = merge(Fundts{I-1},Fundts{I},'DateSetMethod','Intersection');
end
if merge_count > 2
Port = merge(Port,Fundts{I},'DateSetMethod','Intersection');
end
merge_count = merge_count + 1;
end
%ANALYZE PORTFOLIO
Returns=tick2ret(Port);
q = Portfolio;
q = q.estimateAssetMoments(Returns)
[qassetmean, qassetcovar] = q.getAssetMoments
答案 0 :(得分:1)
这可能是merge
造成的。默认情况下,它按字母顺序对列进行排序。不幸的是,由于您的命名模式是" FundN",这意味着,例如,Fund10通常会在Fund9之前进行排序。因此,当您从5到19循环我时,您将Fund10
,Fund19
,然后是Fund4
到Fund9
。
解决此问题的一种方法是始终使用零填充(Fund01,Fund02等),以便字母顺序和数字顺序相同。或者,通过将SortColumns设置为0来强制它保持读取/合并数据的顺序:
Port = merge(Port,Fundts{I},'DateSetMethod','Intersection','SortColumns',0);