Это мой первый пост. Извините, если это выглядит как стена текста. Надеюсь, кто-то поймет мой вопрос и предоставит пример модуля, который может это сделать, или код, который можно попробовать. Я работаю с данными 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