как найти вторичные максимумы - страница 4

 
Maxim Dmitrievsky #:
4. Запутываетесь в своих массивах и находите кучу ложных пиков.

Да и "попроще" тоже не назвать ...

А что, если искать второй и третий по цене "фрактал фракталов"?

То есть: сперва ищутся фракталы;
Потом их значения принимаются за High и снова ищутся фракталы.
Второй и третий по цене фрактал фракталыч и будут искомые пики.

[Удален]  
moskitman #:

Да и "попроще" тоже не назвать ...

А что, если искать второй и третий по цене "фрактал фракталов"?

То есть: сперва ищутся фракталы;
Потом их значения принимаются за High и снова ищутся фракталы.
Второй и третий по цене фрактал фракталыч и будут искомые пики.

Ну надо исходник данных и проверять разное :)
 
Maxim Dmitrievsky #:
Ну надо исходник данных и проверять разное :)

если кому интересно, то прикладываю исходные данные в максимальном разрешении (поминутно). Просто цифры в столбик :-)

PS/ не прикладывается .zip. Сколько лет форуму ? баги видимо через столько-же поправят, хотя куда им торопится

Файлы:
volat2.zip  53 kb
 
Maxim Kuznetsov #:

если кому интересно, то прикладываю исходные данные в максимальном разрешении (поминутно). Просто цифры в столбик :-)

PS/ не прикладывается .zip. Сколько лет форуму ? баги видимо через столько-же поправят, хотя куда им торопится

вроде прицепилсо...просто другим софтом перепаковал. Первый архив был сделан в FAR (встроенным архиватором), второй 7z. Far-вский не нравится сайту, хотя во всех прочих местах никаких проблем с ним ни разу не встречал и не слыхал

zip - zip`у видимо рознь с точки зрения веб-деятелей :-)

[Удален]  

Эти данные намного сложнее, чем изначально на картинках :)

использовал find peaks

Как работает не знаю, надо лезть в код (при особой необходимости). Если результат будет удовлетворять.

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

Весь код:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import find_peaks

# Читаем данные из файла с разделителем '\s+'
p = pd.read_csv('volat2/' + 'volat_EURUSD' + '.csv', sep='\s+')

# Заменяем запятые на точки для десятичных разделителей
p = p.replace(',', '.', regex=True)

# Преобразуем данные в числовой формат
p = p.apply(pd.to_numeric, errors='coerce')

# Создаем массив x-координат
x = np.arange(len(p))

# Находим пики и впадины с помощью find_peaks
peaks, _ = find_peaks(p.values.flatten())
valleys, _ = find_peaks(-p.values.flatten())

# --- Фильтрация пиков по параметру prominence ---
# prominence - это минимальная высота пика относительно соседних впадин, 
# чтобы он считался значимым.

# Задаем значение prominence
peak_prominence = 0.02  #  Настройте этот параметр под ваши данные
valley_prominence = 0.02 #  Настройте этот параметр под ваши данные

# Находим пики с заданным prominence 
peaks, _ = find_peaks(p.values.flatten(), prominence=peak_prominence)
valleys, _ = find_peaks(-p.values.flatten(), prominence=valley_prominence)


# Строим график
plt.figure(figsize=(10, 6))
plt.plot(x, p.values, label="Исходные данные", alpha=0.5)

# Отмечаем пики на графике 
plt.scatter(x[peaks], p.values.flatten()[peaks], color='red', label="Пики")
plt.scatter(x[valleys], p.values.flatten()[valleys], color='green', label="Впадины")

plt.xlabel("Индекс")
plt.ylabel("Значение")
plt.legend()
plt.title("Поиск значимых пиков на исходных данных")
plt.grid(True)

# Отображаем график
plt.show()
[Удален]  

Зигзаг показывает похожую картину, значит аналогичные алгоритмы.


deviation=0.025

самый первый красный выброс все равно размечается как пик :)


 

задача решается в два этап:

1й этап -- по ценовым барам строится Зиг-Заг по какому-то алгоритму (терминальный Зиг-Заг, 5-ти барный фрактал, или что-то иное) -- Зиг-Заг определяет экстремумы

2й этап -- по экстремумам Зиг-Зага от 1-го этапа строится Зиг-Заг по алгоритму 1-го этапа или по другому алгоритму, можно упрощенному (например, 3-х барный фрактал).

[Удален]  

Фурье + зигзаг (уже не относится к простым, больше настроек). Пики потом можно уточнить в окрестностях. 

Помог отфильтровать первый выброс.


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import find_peaks
from scipy.fft import fft, ifft

# Читаем данные из файла с разделителем '\s+'
p = pd.read_csv('volat2/' + 'volat_EURUSD' + '.csv', sep='\s+')

# Заменяем запятые на точки для десятичных разделителей
p = p.replace(',', '.', regex=True)

# Преобразуем данные в числовой формат
p = p.apply(pd.to_numeric, errors='coerce')

# Создаем массив x-координат
x = np.arange(len(p))

# Вычисление циклической компоненты с помощью Фурье
signal = p.values.flatten()
fft_result = fft(signal)
# Оставляем только первые несколько компонент (низкие частоты)
n_components = 12  # Количество компонент для сохранения
fft_result[n_components:] = 0
# Обратное преобразование Фурье
filtered_signal = np.real(ifft(fft_result))

# Находим пики и впадины с помощью find_peaks
peaks, _ = find_peaks(filtered_signal)
valleys, _ = find_peaks(-filtered_signal)

# Фильтрация пиков - оставляем только те, которые выше определенного порога
# на исходных данных
threshold = 0.001
peaks = [peak for peak in peaks if signal[peak] > threshold]
valleys = [valley for valley in valleys if -signal[valley] < -threshold]

# Строим график
plt.figure(figsize=(10, 6))
plt.plot(x, signal, label="Исходные данные", alpha=0.5)
plt.plot(x, filtered_signal, label="Циклическая компонента", color='orange')

# Отмечаем пики на графике 
plt.scatter(x[peaks], signal[peaks], color='red', label="Пики")
plt.scatter(x[valleys], signal[valleys], color='green', label="Впадины")

plt.xlabel("Индекс")
plt.ylabel("Значение")
plt.legend()
plt.title("Поиск пиков с использованием циклической компоненты")
plt.grid(True)

# Отображаем график
plt.show()
[Удален]  

На другом символе. Ну со сглаживанием (фурье) получше.


 
Maxim Dmitrievsky #:
сглаживанием (фурье) получше.

Ага, получше...
Если не брать во внимание, что пики стали чёрт-те чем...