#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