Сжатие фондовых данных - PullRequest
       17

Сжатие фондовых данных

0 голосов
/ 17 ноября 2009

У меня есть набор данных, который составлен так:

2009,11,01,17,00,23,1.471700,1.472000

2009,11,01,17,01,04,1.471600,1.471900

2009,11,01,17,01,09,1.471900,1.472100

2009,11,01,17,01,12,1.472000,1.472300

2009,11,01,17,01,13,1.471900,1.472200

2009,11,01,17,01,14,1.471600,1.471900

2009,11,01,17,01,18,1.471700,1.472000

2009,11,01,17,01,18,1.471900,1.472200

Я использую Octave для манипулирования этими данными. Я хотел бы использовать эти данные для создания различных файлов, содержащих данные с интервалами в 5, 10 и 30 минут. С этим форматом они могут быть построены в виде графика гистограммы / подсвечника, и дальнейшие вычисления выполнены. Тем не менее, я не имею ни малейшего представления о том, как подходить к циклу данных для создания таких файлов.

Я знаком с Octave и использую это программное обеспечение, но эту конкретную задачу можно выполнить в некоторых других программах для создания файлов для последующего импорта в Octave.

Моя первая попытка закодировать это в Octave выдает эту ошибку: -

error: A(I,J,...) = X: dimensions mismatch
error: called from:
error:  /home/andrew/Documents/forex_convert/tick_to_min.m at line 105, column 25

Код, который его производит:

[i,j]=find(fMM>=45 & fMM<50);

min_5_vec(1:length(i),1)=tick_data(min(i):max(i),1);   % line 105

Код проверяет вектор «минут» fMM и должен извлечь и создать новый вектор «min_5_vec», содержащий все данные тиков, которые произошли между моментами ЧЧ: 45: 00 и ЧЧ: 49: 59 для каждого часа. Дело в том, что этот код, который является частью функции, кажется, выходит из строя только в этой конкретной строке, что я нахожу очень странным, так как он был скопирован и вставлен, и только цифры 45 и 50 были изменены, а другие подобные части код функции до строки 105 не сбой. Я визуально проверил необработанные данные и не вижу причин, по которым природа данных была причиной сбоя. Любые предложения о возможной причине отказа?

1 Ответ

0 голосов
/ 25 ноября 2009

Во-первых, используйте datenum, чтобы преобразовать переменные года, месяца, дня, часа, минуты, секунды во времена:

datenum(2009,11,01,17,00,23)

вернет количество дней, прошедших с 01.01.00. Допустим, вы сохранили все времена в векторе, который называется раз. теперь должно быть достаточно легко найти первый / последний раз, когда у вас есть:

first = min(times); 
last = max(times);

одна минута равна:

ONE_MINUTE = 1/24/60

теперь биннинг делается так:

index = 1;
means = [];
for t = first:5*ONE_MINUTE:last
    current_bin = (times>=t) & (times<t+5*ONE_MINUTE)
    % do something with all the data for which current_bin==1
    means(index) = mean(data(current_bin));
    index = index+1;
end

Только для примера я вычислил средние значения данных в каждой ячейке. Я предполагаю, что у вас есть вектор с именем data, который каждый раз содержит данные.

(я знаю, что это можно оптимизировать, но я предпочел ясность, а не производительность для этого ответа)

...