@radeon3850
Начинающий разработчик python

Как найти экстремальные значения списка (не максимального и минимального значения в списке) а последовательных экстремальных значений макс/мин?

Загвоздка возникла в том что за период времени нужно посчитать максимальную просадку по эквити (баланс счёта). Имеем список в котором каждый элемент списка означает изменение баланса. Но так как нужно посчитать максимальную просадку за весь период (не путать с максимальным количеством подряд убыточных сделок) есть проблема как определить эту максимальную просадку.
Думал сделать так сначала найти все экстремальные значения перед тем как уровень эквити начал снижаться, а после минимальное значение на протяжение всего этого снижения.
Код который я написал не верно ищет экстремальные значения максимальные потому как в список который получили на выходе попали значения которые ниже придедущего чего быть не должно.

62a35f4b16ad1183701173.png
lst1 = []

for num in range(len(equity_result1)):

    if equity_result1[num-1]<equity_result1[num]>equity_result1[num+1] and equity_result1[num] > next (iter(equity_result1[0:num])):
        lst1.append(equity_result1[num])
    
print(lst1)
>>>
[15220.0, 21550.0, 34210.0, 37250.0, 56240.0, 65750.0, 78340.0, 95980.0, 127480.0, 158830.0, 190080.0, 182930.0, 208930.0, 204980.0, 214330.0, 239580.0, 283210.0, 311950.0, 349930.0, 341350.0]


добавил картинку для наглядности
  • Вопрос задан
  • 69 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Т.е. для каждого максимума нужно найти такой последующий минимум, чтобы разница между максимумом и минимумом была наибольшей, так? И затем нужно найти наибольшую из всех таких разниц, и соответствующие ей элементы?
Я бы сделал это примерно так. Не уверен, что сработате сразу, но надеюсь что идея передана.
equity_result1 = [ ... ]  # твои данные - значения эквити во времени
# определяем индексы таких элементов, которые больше своих соседей слева и справа.
local_max_idx = [ i for i in range(1, len(equity_result1) - 1) if equity_result1[i-1] < equity_result1[i] and equity_result1[i+1] < equity_result1[i] ]
# определяем минимумы для интервалов, следующих за соотв. локальным максимумом
local_min = [ min(equity_result1[i+1:]) for i in local_max_idx ] 
# определяем индексы этих минимумов в списке equity_result1 
local_min_idx = [ i+1+equity_result1[i+1:].index(minval) for i, minval in zip(local_max_idx, local_min) ] 
# собираем сведения о "перепадах" в один список пар индексов (максимум, минимум)
differences = list(zip(local_max_idx, local_min_idx))
# ищем наибольший "перепад" по критерию "разность между значением максимума и минимума"
i_max, i_min = max(differences, key = lambda item: equity_result1[item[0]] - equity_result1[item[1]])
# интересующий тебя интервал - между i_max и i_min включительно


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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы