Целевая Маркировка С Использованием Скользящего Окна Для Данных О Запасах В Python

#python-3.x #algorithm #algorithmic-trading

Вопрос:

Я пытаюсь привязать цены на покупку, ПРОДАЖУ и УДЕРЖАНИЕ к ценам акций на закрытие на основе алгоритма, который я нашел в статье. Я не совсем в состоянии понять, какую ошибку я получаю. Я был бы очень признателен вам за помощь. Спасибо.

Алгоритм:

Алгоритм

[ОТРЕДАКТИРОВАНО]

Моя реализация:

 window_size = 11
counter = 0
result = []

window_begin_idx=0; window_end_idx=0; window_middle_idx=0; min_idx=0; max_idx=0;

while counter < len(closing_price):
    if counter > window_size:

        window_begin_idx = counter - window_size
        window_end_idx = window_begin_idx   window_size - 1
        window_middle_idx = (window_begin_idx   window_end_idx)//2
        
        for i in range(window_begin_idx, window_end_idx 1):
            rng = closing_price[window_begin_idx:window_end_idx 1]
            number = closing_price[i]
            mins = rng.min()
            maxs = rng.max()
            if number < mins:
                mins=number
                min_idx = np.argmin(rng)
            if number > maxs:
                maxs=number
                max_idx = np.argmax(rng)

        if max_idx == window_middle_idx:
            result.append("SELL")
        elif min_idx == window_middle_idx:
            result.append("BUY")
        else:
            result.append("HOLD")
         
        mins = 0.0
        maxs = 10000.0
    counter =1
 

После редактирования, основанного на коде автора JAVA , я получаю только метку УДЕРЖАНИЯ. Авторская реализация находится здесь.

Комментарии:

1. Что заставляет вас думать, что первый из них-это Java-код?

2. Имя файла имеет .java расширение

3. ладно, понял. но я не думаю, что люди, которые следуют тегу Java, обязательно смогут/ заинтересуются, чтобы помочь вам с вопросом на Python. псевдокода более чем достаточно.

Ответ №1:

Вам необходимо инициализировать mins, maxs, min_idx and max_idx соответствующими значениями перед основным циклом.

В вашем случае if max_idx == происходит раньше, чем любое max_idx задание

Редактировать после изменения квеста:

Кажется, в Python вы можете сделать аналогичное поведение, заменив весь цикл for на:

  rng = closing_price[window_begin_idx:window_end_idx 1]
 mins = rng.min()
 maxs = rng.max()
 min_idx = rng.index(mins)
 max_idx = rng.index(maxs)
 

Комментарии:

1. Это странно, я думал, что мало for loop кто будет казнен первым, прежде чем выйти на max_idx сцену, и это for loop для того, чтобы выбраться mins, max, min_idx, and max_id из окна. Я не уверен, какие значения для них инициализировать. А ты как думаешь?

2. Обратите внимание, что min_idx и max_id назначаются только внутри условного оператора if . Текст ошибки показывает нам, что вы достигли if max_idx == , но if number > maxs: еще не произошло.

3. да, здесь я с вами согласен. Я действительно нашел реализацию автора на JAVA, которую я не особенно хорошо понимаю, но все же сумел избавиться от ошибки, но теперь только else предложение в конце выполняется и возвращает значения УДЕРЖАНИЯ для всех строк. Я редактирую свой вопрос, поэтому дайте мне знать, если вы можете что-то предложить. Большое спасибо за вашу помощь 🙂

4. Но вы все равно нарушаете логику. Насколько я понимаю, mins = rng.min() находит минимум в некотором подмассиве. Так if number < mins: что никогда не происходит для одного и того же подмассива, не так ли? Код статьи прост — он просто ищет минимум и максимум в окне и запоминает соответствующие индексы. Посмотрите на мою правку

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

Ответ №2:

Прочитав реализацию автора и следуя предложениям, предоставленным MBo, мне удалось решить эту проблему. Итак, теперь любой , кто хочет использовать этот алгоритм python , ниже приведен код:

 window_size = 11
counter = 0
result = []
 
window_begin_idx=0; window_end_idx=0; window_middle_idx=0; min_idx=0; max_idx=0; 
number=0.0; mins=10000.0; maxs=0.0

while counter < len(closing_price):
    if counter > window_size:
        window_begin_idx = counter - window_size
        window_end_idx = window_begin_idx   window_size - 1
        window_middle_idx = (window_begin_idx   window_end_idx)//2
        
        for i in range(window_begin_idx, window_end_idx 1):
            
            number = closing_price[i]
            
            if number < mins:
                mins=number
                min_idx = np.where(closing_price==mins)[0][0]
            if number > maxs:
                maxs=number
                max_idx = np.where(closing_price==maxs)[0][0]

        if max_idx == window_middle_idx:
            result.append("SELL")
        elif min_idx == window_middle_idx:
            result.append("BUY")
        else:
            result.append("HOLD")
        
        mins = 10000.0
        maxs = 0.0
        
    counter =1