2013-11-04 104 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的文檔。

'行'選項不支持單元陣列。

您的輸入是一個單元格,因此您不能使用「行」標誌。如果輸出符合您的期望,請刪除'行',一切都很好。