Найти конечный период максимальной просадки? - PullRequest
0 голосов
/ 01 июля 2019

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

Это означает, что период просадки не имеет конца для графика, приведенного в ответе, с которым я связан.Я пытаюсь написать код, который может решить эту проблему, в обоих случаях {1) у него есть конечный период, 2) у него нет конечного периода}.

Если период никогда не заканчивается, я просто хочу, чтобы он возвращал последний индекс массива (так, в основном, длину массива), и если период действительно заканчивается, я хочу правильный индекс.Вот упрощенный пример, в котором я попытался решить первый случай - когда у него есть конечный период:

import numpy as np

an_array = [21, 22, 23, 40, 19, 35, 37, 45, 42, 39, 28]
running_maximum = np.maximum.accumulate(an_array)
# running_maximum = [21, 22, 23, 40, 40, 40, 40, 45, 45, 45, 45]

bottom_index = np.argmax(running_maximum - an_array)
start_index = np.argmax(an_array[:bottom_of_period])
# bottom_index = 4, start_index = 3

difference = running_maximum - an_array
# difference = [0, 0, 0, 0, 21, 5, 3, 0, 3, 6, 17]

Причина, по которой я вычисляю difference, заключается в том, что она позволяет легко увидеть, что end_index=7.Это связано с тем, что максимальная просадка составляет 21 по индексу 4, а с difference=0 снова по индексу 7 это означает, что я снова прошел (или только что достиг) своего пика.Я попытался написать np.argmin(difference[bottom_index:]), чтобы получить индекс, но, конечно, это не дает мне 7, так как я нарезаю вектор difference, вместо этого он дает мне 3, что неверно.

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

1 Ответ

0 голосов
/ 01 июля 2019

Я думаю, что это решает;

import numpy as np

an_array = [21, 22, 23, 40, 19, 35, 37, 45, 42, 39, 28]
running_maximum = np.maximum.accumulate(an_array)
difference = running_maximum - an_array

bottom_index = np.argmax(difference)
start_index = np.argmax(an_array[:bottom_index])

if difference[bottom_index:].__contains__(0):
    end_index = len(difference[:bottom_index]) + np.argmin(difference[bottom_index:])
else:
    end_index = len(difference)

С данным примером массива я получаю end_index = 7. Если я изменяю an_array[4]=39, максимальный недостаток больше не имеет конца, и я получаю end_index = 11. Не уверен, что __contains__(0) эффективен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...