在Matlab维护顺序中读取和组合Excel时间序列

我有以下代码读取时间序列数据(包含在Excel工作簿5至19页)。 每个工作表的标题是“TS”,后面跟着时间序列号。 除了一件事以外,这个过程很好,当我研究收益时,我发现所有的时间序列都被移动了5.即TS 6成为“收益”数据中的第11列,TS 19成为第5列,TS 15成为第一列等我需要他们是在相同的顺序,他们阅读 – 这样TS 1是在第一列,TS 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)=[]; 

%循环显示页数和RETRIEVE VALUES

 merge_count = 1; for I=FirstSheet:lngth [FundValues, ~, FundSheet] = xlsread(XL,I); 

%提取date和数据和结合%(去除行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 

%分析投资组合

 Returns=tick2ret(Port); q = Portfolio; q = q.estimateAssetMoments(Returns) [qassetmean, qassetcovar] = q.getAssetMoments 

这可能是由于merge 。 默认情况下,它按字母顺序对列进行sorting。 不幸的是,由于您的命名模式是“FundN”,这意味着,例如,Fund10通常会在Fund9之前sorting。 因此,当您从5日到19日循环时,您将通过Fund19 ,然后通过Fund4 Fund9

解决这个问题的一种方法是使用零填充(Fund01,Fund02等),这样字母顺序和数字顺序是相同的。 或者,通过将SortColumns设置为0来强制它保持读取/合并数据的顺序:

Port = merge(Port,Fundts{I},'DateSetMethod','Intersection','SortColumns',0);