Ксения Кузнецова
Ксения Кузнецова личный блог
26 марта 2023, 21:28

Проблема заполнения пропущенных данных

В связи с тем, что у моего проекта появились доны, считаю важным рассказать о своих успехах за прошедший месяц. Я конкретно упоролась с тестированием коинтеграции на часовом таймфрейме брутфорсом. Давно еще обнаружилась проблема в моем софте: на часовиках появляется очень много «дыр» в данных, из-за чего совместить их «в лоб» друг с другом оказывается не самой лучшей идеей, потому что идеально совпадающих пар в таком случае получается очень мало.

Этой проблемы практически не возникало на дневном таймфрейме. Также это легко решить при тестировании одной пары, но когда речь идет о тысячах или миллионах пар, ребром встает вопрос, а что с этим делать? Первое, что предстояло решить: заполнять пропущенные значения или симметрично удалять «дыры» из второго ряда в паре. Я решила, что удалять данные, — это слишком расточительно, поэтому выбрала первый вариант.

Далее оставался вопрос, каким методом заполнять данные. На выбор было:
  1. предыдущим не пропущенным значением
  2. следующим не пропущенным значением
  3. ближайшим не пропущенным значением
  4. линейной интерполяцией соседних, не пропущенных значений
  5. кусочно-кубической сплайн-интерполяцией
  6. сохраняющей форму кусочно-кубической сплайн-интерполяцией
  7. модифицированной Акима кубической эрмитовой интерполяцией
Я выбрала самый простой первый вариант. На будущее интересно попробовать линейную интерполяцию и сплайны. Не знаю, насколько они будут лучше. Это на самом деле задача для отдельного исследования. Буду рада, если кто-то поделится своими наработками по этой проблеме.

Еще из особенностей работы алгоритма. Если у нас есть 3 ряда со значениями за даты, например:
[3.01.2023, 4.01.2023, 6.01.2023, 9.01.2023, 10.01.2023]
[3.01.2023, 5.01.2023, 6.01.2023, 9.01.2023, 10.01.2023]
[3.01.2023, 4.01.2023, 6.01.2023, 7.01.2023, 10.01.2023]

то при тестировании первой и второй пары значения будут динамически достроены до массива:
[3.01.2023, 4.01.2023, 5.01.2023, 6.01.2023, 9.01.2023, 10.01.2023]
а при тестировании первой и третьей пары значения будут динамически достроены до массива:
[3.01.2023, 4.01.2023, 6.01.2023, 7.01.2023, 9.01.2023, 10.01.2023]

то есть я пытаюсь по минимуму модифицировать исходные ряды своими «догадками» о пропущенных значениях, чтобы сохранить адекватность статистических тестов на коинтеграцию. Для того, чтобы обеспечить такую аккуратную подстройку, оригинальные массивы остаются без изменений: алгоритмы оперируют динамически «восстановленными» копиями.

Так как у меня шарповый код, еще одной проблемой стала работа со ссылочными типами, для решения которой пришлось реализовать интерфейс ICloneable с поверхностной копией текущего объекта, чтобы предоставить специальному типу возможность возвращения вызывающему коду идентичной копии самого себя.
17 Комментариев
  • Андрей К
    26 марта 2023, 21:51
    Держите в курсе, если вдруг попробуйте метод >= 4 )
  • ..
    27 марта 2023, 00:11
    пропуски из-за разного расписания торгов?
    заполнение выглядит подозрительно: неопределенность заменяется моделью и так же происходит как-бы увеличение торгового времени пары
    можно проверить чему соответствует pnl пары — оценке с заполнением или без
  • 3Qu
    27 марта 2023, 00:17
    1. предыдущим не пропущенным значением
    Другие случаи некорректны.
  • evg_gen +100(100)
    27 марта 2023, 07:24
    не понял. испольщуются данные о сделках или котировки на момент времени?
    имхо сделка это уже прошлое, и повоторить прошлое трудно.

    я смотрю только на текущие котировки, сделки только как ориентир по объему и разбросу цен

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн