1

我正在使用 Matlab 学习“大型”数据集计算。我有一个 txt 文件,其中包含为名为 MTB 的股票所做的每笔交易。我的目标是将这些分时数据转化为每日数据。例如,在第一天,发生了超过 15,000 笔交易,我的 prgm 将这些数据转化为每天的开盘价、最高价、最低价、收盘价、总交易量和净交易量。

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

我的 pgm: 20.7757 秒,我收到以下警告。我真的不知道这意味着什么警告:单元格数组忽略“行”标志。

在 32 处的 cell.unique 在 16 处的 ex5 中警告:单元格数组忽略“行”标志。在 cell.unique 中 32 在 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)
4

2 回答 2

3

只需阅读unique.

'rows' 选项不支持元胞数组。

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

于 2013-11-04T10:28:24.813 回答
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;

不确定您是否可以对其进行更多矢量化,因为该算法具有内置函数并且事务数不是恒定的。由于您的日常数据彼此独立,因此并行化中留下了一个选项。

对于测试部分,您可以

  • 处理假数据,预先知道所需的输出(数据仅为 1 或 1:n)。
  • 用不同的技术自己编写第二个算法并比较结果,
  • 请您的同事使用他选择的语言对算法进行编程(如果可靠性至关重要,则最好选择)
于 2013-11-04T11:47:29.043 回答