Алгоритм оптимизации Python для настройки линии так, чтобы она пересекала как можно больше точек

Это мой первый пост. Извините, если это выглядит как стена текста. Надеюсь, кто-то поймет мой вопрос и предоставит пример модуля, который может это сделать, или код, который можно попробовать. Я работаю с данными csv временных рядов, примерами строк ниже, столбцами являются (datetime, O, H, L, C)

1999-10-26 21:00:00 68.81 68.83 68.07 68.19
1999-10-27 21:00:00 68.19 68.2 66.83 67.43
1999-10-28 21:00:00 67.43 68.06 66.91 68.06
1999-10-29 21:00:00 68.06 68.11 66.31 66.66
1999-01-11 22:00:00 66.66 67.15 66.09 66.63
1999-02-11 22:00:00 66.63 67.38 66.42 66.58
1999-03-11 22:00:00 66.58 67.73 66.42 67.48
1999-04-11 22:00:00 67.48 67.81 66.54 66.76
1999-05-11 22:00:00 66.76 68.2 66.54 67.87

Это то, что известно как свеча в данных о финансовых ценах и может быть представлено визуально следующим образом:

введите здесь описание изображения

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

Надеюсь, это имеет смысл. Пример. Линия, пересекающая как можно больше фитилей (в данном случае ниже свечей), начинается с позиции 4, около 66,4, и имеет восходящий наклон до позиции 9, около 66,55...

Как я себе представляю линию, основываясь на картинке выше

Есть ли модуль, который может это сделать, если я укажу начальную позицию? По сути, что-то вроде линии наилучшего соответствия, но на самом деле пересекающей все точки (точка — это вертикальная линия, поэтому диапазон по оси x), избегая при этом пересечения красных/зеленых областей, так что по сути это линия тренда (не изогнутая)

Если это слишком сложно, потому что линия диагональная, вы также можете привести пример горизонтальной линии, чтобы сделать то же самое (всего одно значение по оси x). Например, значение 66,54 тоже будет работать (оно будет пересекать все фитили и касаться последних двух), как показано в данных L (4-й столбец) последних двух записей. См. желтую линию, пересекающую или касающуюся всех нижних фитилей.

в этом случае значение (ось x) свечи начального положения не имеет значения и также было скорректировано

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

Таким образом, результат, который я ищу, - это просто конечная позиция линии ((x, y), если диагональная линия тренда) или просто значение оси x (горизонтальная линия). Начальная точка будет выбрана (A), а конечная точка будет основана на алгоритме оптимизации, при котором линия должна пересекать как можно больше вертикальных линий свечей (только если смотреть вправо от начальной точки), но при этом сохраняется счетчик пересечений области тела свечи ниже принятого порогового допуска, пока не будет найдено лучшее решение. (Б)

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

Реальные файлы csv весят до 500 МБ и содержат до 6 миллионов строк. Я бы предпочел исчерпывающий алгоритм, а не генетический, который каждый раз выдает разные результаты...

У меня есть несколько идей о том, как это сделать, но я не смог найти подходящего модуля с примерами для ускорения процесса.

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

Я использовал pyqtgraph для визуализации Пример кода для построения графика: http://www.pyqtgraph.org/downloads/0.10.0/pyqtgraph-0.10.0-deb/pyqtgraph-0.10.0/examples/customGraphicsItem.py


person Cactus    schedule 25.11.2017    source источник


Ответы (1)


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

И если я тоже правильно понимаю, сегментов может быть миллион одновременно.

Если наклон линии фиксирован, пусть m, вы можете разрезать пространство таким образом, чтобы линия стала горизонтальной, а конечные точки были сдвинуты вертикально на величину m.i для сегмента i (при условии, что расстояние между единицами измерения равно единице).

Затем, отсортировав конечные точки по возрастанию ординаты, можно легко получить количество горизонтально перекрывающихся сегментов при перемещении линии. Это требует N Log N операций для сортировки и N операций для построения функции подсчета.

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

person Yves Daoust    schedule 25.11.2017
comment
Спасибо за предложения и указания мне в правильном направлении. После дальнейших исследований я считаю, что я ищу алгоритм, возвращающий все возможности +1 или -1 коэффициента корреляции Пирсона с большим количеством элементов, чем 2. - person Cactus; 28.11.2017