1

Matlab を使用して「大規模な」データセットの計算を学習しています。MTB と呼ばれる株のすべての取引からなる txt ファイルがあります。私の目標は、このティック データを日次データに変換することです。たとえば、初日には 15,000 を超えるトランザクションが発生しました。私のプログラムは、そのデータを各日の始値、高値、安値、終値、合計ボリューム、およびネット トランザクションに変換します。

私の質問: コードを高速化するのを手伝ってくれませんか? このような大規模なデータセットに対して計算が行われているため、計算を検証するための実用的な「テクニック」はありますか?

pgm: 20.7757 秒かかり、次の警告が表示されます。意味がよくわかりません 警告: 'rows' フラグはセル配列では無視されます。

cell.unique では 32 で ex5 では 16 で 警告: 'rows' フラグはセル配列では無視されます。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' オプションは cell 配列をサポートしていません。

入力はセルであるため、「行」フラグは使用できません。出力が期待と一致する場合は、「行」を削除すれば問題ありません。

于 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 または 1:n のみ)。
  • 別の手法で 2 番目のアルゴリズムを自分でプログラムし、結果を比較します。
  • あなたの同僚に、彼が選んだ言語で親切にアルゴリズムをプログラミングするように頼んでください (信頼性が基本的な場合は最良のオプションです)。
于 2013-11-04T11:47:29.043 に答える