Есть ли хороший алгоритм для проверки изменений данных в течение определенного периода времени?

StackOverflow https://stackoverflow.com/questions/2113407

  •  22-09-2019
  •  | 
  •  

Вопрос

У нас есть около 7 тыс. Финансовых продуктов, цены на закрытие которых должны теоретически двигаться вверх и вниз в определенном процентном диапазоне в течение определенного периода времени (скажем, на один неделю или месяц).

У меня есть доступ к внутренней системе, которая хранит эти исторические цены (а не реляционную базу данных!). Я хотел бы произвести отчет, в котором перечислены любые продукты, цена которых вообще не двигалась или меньше, чем, скажем, 10% за период времени.

Я не могу просто сравнить первое значение (день 1) с стоимостью в конце (день n), поскольку цена могла бы вернуться к тому, что было в последний день, что приведет к ложному положительному, в то время как цена продукта Конечно, могло бы шипо где -то посередине.

Существуют ли какие -нибудь установленные алгоритмы, чтобы сделать это в разумное вычислительное время?

Это было полезно?

Решение

Если это нужно часто проверять (для большого количества интервала, как ежедневно за последний год, и для того же набора продуктов), вы можете хранить высокие и низкие значения каждого предмета в неделю в месяц. Объединяя правильные еженедельные и/или ежемесячные границы с некоторыми необработанными данными по краям интервала, вы можете получить минимальное и максимальное значение в интервале.

Другие советы

Нет никакого способа сделать это, не глядя на каждый день.

Предположим, данные выглядят так:

oooo0oooo

С этим однодневным всплеском посередине. Вы не поймете это, если вы не проверете день, когда произойдет всплеск - другими словами, вам нужно проверять каждый день.

Если вы можете добавить данные в KDB (то есть вы не ограничиваете доступ к чтению), вы можете рассмотреть вопрос о добавлении «количество дней с момента последнего изменения цены» в качестве нового набора данных (то есть по одному номеру на финансовый инструмент). Затем ежедневная задача получила бы сегодняшнюю отметку и вчерашнюю и обновляла хранимые цифры. Точно так же вы можете поддерживать недавние (в прошлом месяце, в прошлом году) максимумы и минимумы в KDB. Вам придется запустить работу по более крупному набору данных, чтобы изначально заполнить значения, но тогда ваши ежедневные обновления будут включать гораздо меньше данных.

Рекомендую, если вы принимаете что -то подобное, у вас есть какая -то способ повторного запуска для всех или части набора данных (скажем, для добавления нового продукта).

Наконец, нормализована ли история против текущих цен? (IE - это переоценки для разделений акций или аналогичных вовлеченных во внимание). Если нет, вам нужно обнаружить эти разрывы и разделить их.

РЕДАКТИРОВАТЬ

Я бы расследовал USNG KDB+/Q Для реализации обработки сигнала, а не извлекать необработанные данные в приложение Java. Как вы говорите, это очень эффективно.

Вы можете сделать это, если вы можете отслеживать мин и максимальную стоимость цены в течение интервала времени - это предполагает, что интервал времени не постоянно меняется. Один из способов отслеживания значений MIN и MAX изменяющихся набора элементов - это две кучи, расположенные «назад к спине» - вы можете сохранить это и некоторые указатели, необходимые для поиска и удаления старых предметов в одном или двух массивах в вашем магазине Анкет Идея поставить две кучи спиной к спине заключается в искусстве компьютерного программирования Кнута в качестве упражнения 31 Раздел 5.2.3. Кнут называет такого рода зверя приоритетом, и это, кажется, доступно для поиска. Мин и Макс доступны по постоянной стоимости. Стоимость изменения его, когда прибывает новая цена, составляет log n, где n - количество хранимых предметов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top