2013-11-04 68 views
1

我正在使用Matlab学习“大型”数据集计算。我有一个txt文件,包括为MTB所做的每笔交易。我的目标是将此刻度数据转换为日常数据。例如,在第一天,发生了超过15,000笔交易,我的prgm将这些数据转换为每天的开盘价,最高价,最低价,收盘价和总成交量。如何使用Matlab为“大数据集”矢量化for循环

我的问题: 你能帮我让代码更快吗? 您是否有任何实用的“技术”来验证计算,因为它们是在这样大的数据集上进行的?

这花了我的PGM:20.7757秒 ,我发出以下警告。我真的不知道这意味着什么 警告:对于单元阵列,'rows'标志被忽略。

在cell.unique在32 在EX5在16 警告: '行' 标志为单元阵列忽略。 。在32 在EX5 cell.unique在17

%DESCRIPTION: Turn tick data into daily data 
%INPUT: stock tick data(tradeDate,tradeTime,open,high,low, 
%close,upVol,downVol) 
%OUTPUT: openDay,highDay,lowDay,closeDay,volumeDay,netTransaction 
%net transaction taded = sum (price*upVol -price*downVol) 

clear; 
startTime=tic; 
%load data from MTB_db2 
[tradeDate, tradeTime,open,high,low,close,upVol,downVol]=textread('MTB_db2.txt','%s %u %f %f %f %f %f %f','delimiter',','); 


%begIdx:Index the first trade for the day from tick database and 
%endIdx:index for the last trade for that day 
[dailyDate begIdx]=unique(tradeDate,'rows','first'); 
[dailyDate2 endIdx]=unique(tradeDate,'rows','last'); 

%the number of daily elements, useful for the loop. 
n=numel(dailyDate); 

%initilize arrays 
highDay=[]; 
lowDay=[];openDay=[];closeDay=[]; 
volumeDay=[];netTransaction=[]; 
priceChange(1)=NaN; mfChange(1)=NaN; 

%loop: bottleneck is here!! 
for j=1:n 
    openDay(j)=open(begIdx(j)); 
    closeDay(j)=close(endIdx(j)); 
    highDay(j)=max(high(begIdx(j):endIdx(j))); 
    lowDay(j)=min(low(begIdx(j):endIdx(j))); 
    volumeDay(j)=sum(upVol(begIdx(j):endIdx(j)))+sum(downVol(begIdx(j):endIdx(j))); 
    cumSum=0; 
    for i=begIdx(j):endIdx(j) 
    cumSum=cumSum+close(i)*(upVol(i)-downVol(i)); 
    end 
    netTransaction(j)=cumSum; 
end 

elapsedTimeNonVectorized=toc(startTime) 
+2

它如果你发布了代码的_reproducible_版本(通过不使用外部文件)会更好。 –

+0

我该怎么做? – user1561949

+0

替换行[[tradeDate,tradeTime,open,high,low,close,upVol,downVol] = textread('MTB_db2。txt','%s%u%f%f%f%f%f%f','delimiter',',');'带有“虚拟”数据。或提供.txt示例文件 –

回答

1

的代码,我会通过

cs = cumsum(close(begIdx(j):endIdx(j)) .* ... 
    (upVol(begIdx(j):endIdx(j)) - downVol(begIdx(j):endIdx(j)))); 
netTransaction(j) = cs(end); 

是稍快更换内部for循环

cumSum=0; 
for i=begIdx(j):endIdx(j) 
    cumSum=cumSum+close(i)*(upVol(i)-downVol(i)); 
end 
netTransaction(j)=cumSum; 

您也可以预先分配变量highDay=zeros(1,n);highDay(1,n)=0;

不确定您可以更多地进行矢量化,因为算法具有内置函数并且事务数量不是常量。由于您的日常数据是彼此独立的,因此可以选择一种方式进行并行化。

对于测试部分,可以在假数据

  • 工作,所需的输出被预先已知(数据是唯一的或1:N)。
  • 程序的第二算法自己一个不同的技术,并比较结果,
  • 问你的一个同事(如果可靠性是基本的最好的选择)与他所选择的语言算法亲切编程
3

只需读取unique的文档。

'行'选项不支持单元阵列。

您的输入是一个单元格,因此您不能使用“行”标志。如果输出符合您的期望,请删除'行',一切都很好。