Программно сравнить две строки (сопоставление с шаблоном)

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

  •  22-08-2019
  •  | 
  •  

Вопрос

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

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

Мой лучший подход прямо сейчас - получить несколько максимумов и минимумов из диапазона исторических данных, который я просматриваю, найти наклоны линий и сравнить их с наклонами шаблона, который я пытаюсь сопоставить, чтобы увидеть, примерно ли они одинаковы.

Есть идеи получше?Я бы с удовольствием их послушал!

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

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

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

Решение

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

Честно говоря, я думаю, что разумным и относительно простым решением является "масштабирование" и "растягивание" вашего шаблона так, чтобы он отображался в том же диапазоне, что и исторические данные.Вы можете использовать интерполяцию для оси x и умножение плюс смещение для оси y.После этого просто посмотрите на среднее значение квадратов различий в каждой точке, и если оно ниже порогового значения, то вы можете считать это совпадением.Это потребует небольшой настройки для достижения предсказуемых результатов, но я думаю, что это хороший подход, который должен позволить вам определить любой тип шаблона, не полагаясь на регрессию, создающую хорошо подобранную кривую.По сути, это просто применение статистики.Вы также могли бы посмотреть на стандартные отклонения или дисперсию для более комплексного подхода.

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

Вычислите общее количество наименьших квадратов остатков (y разностей) в каждой точке.Это должно дать вам представление о геометрической подгонке (насколько они похожи).Затем вы должны быть в состоянии установить некоторый допуск для "достаточно похожего".

Видишь http://en.wikipedia.org/wiki/Curve_fitting

Математика не является моей сильной стороной, однако вы могли бы использовать Корреляция.

Вычислите значение корреляции между двумя наборами данных и, и если корреляция больше некоторого значения (.8?), то считайте наборы похожими достаточно.

или, может быть, посмотреть на производные?

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

если вы не возражаете, я спрошу, с какой целью это может быть?

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

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

Просто мысль.

Математический мир (http://mathworld .wolfram.com/) также должен иметь некоторый подход к сравнению кривых.

Наименьшие квадраты были бы не лучшим, что вы могли бы с этим сделать.Используйте алгоритм RANSAC.Он будет обрабатывать такого рода данные, потому что такого рода данные очень непредсказуемы и часто зашумлены.

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