Подтвердить что ты не робот

Поиск минимального значения биржевой диаграммы

stock

Существуют ли какие-либо конкретные алгоритмы, которые позволят мне найти минимальную и максимальную точки на изображении выше?

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

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

Я также попытался использовать скользящее среднее, чтобы сгладить график, но снова у меня слишком много maxes и mins.

EDIT:

Я прочитал некоторые комментарии, и я просто не обвел некоторые из минимумов и максимумов случайно.

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

4b9b3361

Ответ 1

Обычно я использую комбинацию Moving Average и Exponential Moving Average. Он доказал (эмпирически), что он хорошо приспособлен к задаче (по крайней мере, для моих нужд). Результаты настраиваются только с двумя параметрами. Вот пример:

enter image description here

Edit

В случае, если это полезно для кого-то, вот мой код Mathematica:

f[sym_] := Module[{l},
  (*get data*)
  l = FinancialData[sym, "Jan. 1, 2010"][[All, 2]];
  (*perform averages*)
  l1 = ExponentialMovingAverage[MovingAverage[l, 10], .2];
  (*calculate ma and min positions in the averaged list*)
  l2 = {#[[1]], l1[[#[[1]]]]} & /@ 
    MapIndexed[If[#1[[1]] < #1[[2]] > #1[[3]], #2, Sequence @@ {}] &, 
     Partition[l1, 3, 1]];
  l3 = {#[[1]], l1[[#[[1]]]]} & /@ 
    MapIndexed[If[#1[[1]] > #1[[2]] < #1[[3]], #2, Sequence @@ {}] &, 
     Partition[l1, 3, 1]];
  (*correlate with max and mins positions in the original list*)
  maxs = First /@ (Ordering[-l[[#[[1]] ;; #[[2]]]]] + #[[1]] - 
        1 & /@ ({4 + #[[1]] - 5, 4 + #[[1]] + 5} & /@ l2));
  mins = Last /@ (Ordering[-l[[#[[1]] ;; #[[2]]]]] + #[[1]] - 
        1 & /@ ({4 + #[[1]] - 5, 4 + #[[1]] + 5} & /@ l3));
  (*Show the plots*)
  Show[{
    ListPlot[l, Joined -> True, PlotRange -> All, 
     PlotLabel -> 
      Style[Framed[sym], 16, Blue, Background -> Lighter[Yellow]]],
    ListLinePlot[ExponentialMovingAverage[MovingAverage[l, 10], .2]], 
    ListPlot[{#, l[[#]]} & /@ maxs, 
     PlotStyle -> Directive[PointSize[Large], Red]],
    ListPlot[{#, l[[#]]} & /@ mins, 
     PlotStyle -> Directive[PointSize[Large], Black]]}, 
   ImageSize -> 400]
  ]

Ответ 2

Я не знаю, что вы подразумеваете под "простыми производными". Я понимаю, что вы протестировали градиентный спуск и нашли его неудовлетворительным из-за обилия локальных экстремумов. Если это так, вы хотите посмотреть имитированный отжиг:

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

(...) Однако, чтобы избежать локальных оптимумов, алгоритм будет иметь вероятность сделать шаг в плохом направлении: другими словами, сделать шаг, который увеличивает значение для проблемы минимизации или уменьшает значение для задачи максимизации. Чтобы имитировать процесс отжига, эта вероятность будет частично зависеть от параметра "температуры" в алгоритме, который инициализируется с высоким значением и уменьшается на каждой итерации. Следовательно, алгоритм изначально будет иметь высокую вероятность отхода от ближайшего (вероятно локального) оптимума. По итерациям вероятность того, что вероятность будет уменьшаться, и алгоритм будет сходиться на (надеюсь, глобальном) оптимальном, у него не было возможности убежать. (источник, cuts &, focus mine)

Я знаю, что локальная оптимизация - это именно то, что изображают круги вашего рисунка, выше и, следовательно, то, что вы хотите найти. Но, поскольку я интерпретирую цитату "так много локальных mins и maxes простых производных, не будет работать". Это также то, что вы слишком много находите. Я предполагаю, что у вас проблемы со всем "зигзагом", который вы делаете между двумя обведенными точками.

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

Ответ 3

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

Ответ: Гауссовское скользящее среднее; Это нормальное распределение, о котором вы знаете.

Причина: фильтр Гаусса является единственным фильтром, который никогда не будет производить "поддельный" максимум; Максимум, которого не было с самого начала. Это было теоретически доказано как для непрерывных, так и для дискретных данных (убедитесь, что вы используете дискретный гауссов для дискретных данных, хотя!). По мере увеличения гауссовой сигмы локальные максимумы и минимумы будут сходиться наиболее интуитивно. Таким образом, если вы хотите, чтобы было не более одного локального максимума в день, вы устанавливаете сигму на единицу, ET cetera.

Ответ 4

Просто определите, что вы подразумеваете под минимальным и максимальным точным, но настраиваемым образом, а затем настройте его, пока не найдете нужное количество минимумов и максимумов. Например, вы можете сначала сгладить график, заменив каждое значение на среднее значение этого значения и N значений слева и справа от него. Увеличивая N, вы можете уменьшить количество минимумов и максимумов, которые вы найдете.

Затем вы можете определить минимум как точку, где, если вы пропустите значения A влево и вправо, следующие значения B показывают постоянную тенденцию к увеличению. Увеличивая B, вы можете найти меньше минимумов и максимумов. Регулируя A, вы можете настроить, как "плоский" может быть минимальным или максимальным.

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

Ответ 5

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

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

Чтобы повысить точность, после нахождения локальных mins/max в сгенерированном полиноме, для каждого x0, представляющего локальный min/max, вы должны искать во всех x таких, что x0-delta < x < x0 + delta, чтобы найти реальный min/max эта точка представляет.

Ответ 6

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

  • Выполните FFT
  • Сделайте полосу пропускания в частотном пространстве. Выберите параметры полосы пропускания, основанные на диапазоне данных, которые вы хотите, чтобы ваши экстремумы выглядели хорошо, т.е. Интересующий период времени.
  • Выполнить обратный БПФ.
  • Выберите локальные максимумы результирующей кривой.

Параметры второго шага кажутся довольно субъективными, но опять же, субъективность - это сама природа анализа биржевых карт.

Ответ 7

Как упоминалось belisarius, лучший метод, по-видимому, предполагает фильтрацию данных гладкими. При достаточном сглаживании, поиск изменений в наклоне должен определять локальные минимальные и максимальные значения (здесь будет использоваться производная). Я бы использовал центрированное скользящее окно для текущего среднего/среднего значения или текущего EMA (или аналогичного фильтра IIR).

Ответ 8

Теорема Ферма поможет вам найти локальные минимумы и максимумы.