Блог им. AdrenaLeen

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

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

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

Далее оставался вопрос, каким методом заполнять данные. На выбор было:
  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 с поверхностной копией текущего объекта, чтобы предоставить специальному типу возможность возвращения вызывающему коду идентичной копии самого себя.
★2
17 комментариев
Держите в курсе, если вдруг попробуйте метод >= 4 )
avatar
Андрей К, хорошо )
пропуски из-за разного расписания торгов?
заполнение выглядит подозрительно: неопределенность заменяется моделью и так же происходит как-бы увеличение торгового времени пары
можно проверить чему соответствует pnl пары — оценке с заполнением или без
avatar
bwc, пропуски из-за отсутствия ликвидности. Например, на каких-то инструментах в 9 утра тупо нет объема.
Ксения Кузнецова, смотри,
если пропуски из-за отсутствия ликвидности, то на практике такое торговать не получится. И такое исследование лишено практического смысла.
Ограничься ликвидными инструментами.
Какие рынки и тикеры исследуешь?
avatar
T-800, исследование временных рядов на коинтеграцию и возможность их торговли — это принципиально две разные задачи. Здесь наши мнения о практическом смысле расходятся. То, что 25 января в 9 утра на каком-то инструменте не было ликвидности, еще не означает, что ее там нет вообще.

Исследую все тикеры на 7 биржах (MOEX, NYSE, NASDAQ, AMEX, Poloniex, Binance, Kraken).
Ксения Кузнецова, а какая конечная цель исследования, если это не торговля? От конечной цели зависит способ 1-7 как считать недостающие значения.
Для торговли я бы заполнял эти пробелы значениями по которым можно войти в сделку, а для статистики может сгодиться и среднее значение между до и после пробела.
avatar
T-800, для грамотной торговли важно разделять исследования на этапы. Наши мнения расходятся также и на мотивацию для выбора способов заполнения пропущенных данных. Для бектеста пропущенные значения не факт, что нужно вообще заполнять, потому что в это время не было ликвидности, и мы предполагаем, что не сможем совершить сделку в этот момент.

Задача грамотной симуляции торговли — это другой вопрос, который к статистическим тестам имеет мало отношения.
Ксения Кузнецова, полагаю, что вы до практики еще не дошли, а работаете только над первым этапом?

Помню я тоже лет 10 назад искал зависимости в парах на основе скачанных котировок. И также решал проблемы с заполнением пустот. И получал красивые и обнадеживающие результаты. Потом все пришлось выкинуть в корзину, т.к. для практики оказались нужны совершенно другие данные и другие методы анализа.

В любом случае, всякий опыт полезен. Успехов в исследованиях!
avatar
T-800, я ушла далеко за первый этап. Есть разница между тем, чтобы по-быстрому наколхозить что-то для себя, и тем, чтобы сделать масштабируемый продукт для других.
  1. предыдущим не пропущенным значением
Другие случаи некорректны.
avatar
не понял. испольщуются данные о сделках или котировки на момент времени?
имхо сделка это уже прошлое, и повоторить прошлое трудно.

я смотрю только на текущие котировки, сделки только как ориентир по объему и разбросу цен
avatar
evg_gen, я запрашиваю свечи указанного инструмента по выбранному режиму торгов.
помимо этого у тебя есть еще одна проблема
маленький объем свечки… т.е свеча с маленьким обемом < торгуемой суммы...

должно быть обьем свечи >> торгуемой суммы… торгуемая сумма должна быть 3% от объема свечи максимум
avatar
ves2010, данное исследование оставляет за рамками возможность торговли и нацелено на отбор пар, которые затем попадут на бектест.
Было дело заполнил пропуски, скормил оптимизатору. Он как давай чудо-граали метать. Оказалось, что линейная интерполяция фактичеки приводит к подглядыванию вперед.
avatar
следующим не пропущенным значением

В будущее подглядывание чувствую я.
avatar

теги блога Ксения Кузнецова

....все тэги



UPDONW
Новый дизайн