我正在使用Matlab学习“大型”数据集计算。我有一个txt文件,包含一个名为MTB的股票交易。我的目标是将此刻度数据转换为每日数据。 例如,在第一天,发生了超过15,000笔交易,我的prgm将这些数据转换为每天的开盘价,最高价,最低价,收盘价和净交易数。
我的问题: 你能帮助我加快代码的速度吗? 您是否有任何实用的“技术”来验证计算,因为它们是在如此大的数据集上进行的?
花了我的pgm:20.7757秒 我发出以下警告我真的不知道这意味着什么 警告:单元格数组将忽略“rows”标志。
32岁的cell.unique 在ex5在16 警告:单元格数组将忽略“rows”标志。 在32岁的cell.unique中 在ex5在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)
答案 0 :(得分:3)
只需阅读unique
的文档。
'rows'选项不支持单元格数组。
您的输入是一个单元格,因此您无法使用'rows'标志。如果输出符合您的预期,请删除“行”,一切都很好。
答案 1 :(得分:1)
对于代码,我会替换内部for
循环
cumSum=0;
for i=begIdx(j):endIdx(j)
cumSum=cumSum+close(i)*(upVol(i)-downVol(i));
end
netTransaction(j)=cumSum;
通过
cs = cumsum( close(begIdx(j):endIdx(j)) .* ...
(upVol(begIdx(j):endIdx(j)) - downVol(begIdx(j):endIdx(j))) );
netTransaction(j) = cs(end);
稍快一些。
您还可以使用highDay=zeros(1,n);
或highDay(1,n)=0;
预先分配变量。
由于算法具有内置函数且事务数不是常数,因此不确定是否可以对其进行矢量化。由于您的每日数据彼此独立,因此并行化了一个选项。
对于测试部分,您可以