Машинное обучение в трейдинге: теория, модели, практика и алготорговля - страница 1557

 

статья на Хабре с громким названием "AI для людей: простыми словами о технологиях" https://habr.com/ru/company/jetinfosystems/blog/471626/

пролистал статью - все свелось к Machine Learning, ....вспомнил старый анекдот:

Студент сдает зоологию. Знает только про блох. На экзамене достается вопрос про собак.

Судент начинает:

- Собаки это млекопитающие, покрыты шерстью. В шерсти водятся блохи...дальше все про блох....

Препод:

- Ладно молодой человек, расскажите про кошек

Студент:

- Кошки это млекопитающие, покрыты шерстью. В шерсти водятся блохи...дальше все про блох....

Препод:

- Давайте-ка про рыб

Студент:

- Рыбы это не млекопитающие. Шерстью не покрыты. Покрыты чешуей, но если бы они были покрыты шерстью, то в ней бы водились блохи....

 
 
 

Финалочка обучения на ретурнах


 
Eugeni Neumoin:

Не надо использовать ZZ и вообще любые дополнительные индикаторы. Только OHLC с нескольких тф (тф должны отличаться в 4-6 раз. Например, 1-5-30-H3... вплоть до месячного тф. Подобрать самостоятельно.) и, возможно, еще тики для раннего предупреждения.

По ценам максимумов и минимумов  отдельно сверточные структуры. По OHLC -рекуррентную структуру. И так по всем используемым тф. Сигналы всего этого далее поступают, например, на полносвязную сеть.

Также тики пропущенные через рекуррентную сеть завести на один из входов полносвязной сети.

Оптимизировать по скорости увеличения депозита. Совокупная сеть сама в результате должна решать, какой объем лота и выбирать точки открытия и закрытия. Примерно так.

Ну что Вы сыпите словами, Вы нарисуйте структуру предлагаемой Вами сети. И появится море вопросов и у Вас. 

А так просто сотрясение воздуха. Идея правильная, направление неверное.

 
Maxim Dmitrievsky:

Финалочка обучения на ретурнах


А можете приложить тестер самопальный, мне интересно, вы избежали одной очень распространенной ошибки? Или в личку.

Удачи

 
Vladimir Perervenko:

А можете приложить тестер самопальный, мне интересно, вы избежали одной очень распространенной ошибки? Или в личку.

Удачи

жупитер ноутбук подойдет? скинул целиком, не секретно, т.к. весь код в видео есть

Файлы:
 
Maxim Dmitrievsky:

жупитер ноутбук подойдет? скинул целиком, не секретно, т.к. весь код в видео есть

Конечно. Спасибо. Посмотрю и отпишусь

 
Maxim Dmitrievsky:

жупитер ноутбук подойдет? скинул целиком, не секретно, т.к. весь код в видео есть

Разбирать чужой код то еще занятие. Смотрим только функцию custom_tester() и только выделенную часть.

def custom_tester(symbol, timeframe, frompos, pricesnumber, lag, num, markup = 0.0):   
    symbols_list = [symbol]
    pr_test = pd.DataFrame()
    for i in symbols_list:
        rates = MT5CopyRatesFromPos(i, timeframe, frompos, pricesnumber)
        pr_test[i] = [y.close for y in rates]

    #creating price returns with lag
    returns = np.array(np.log(1 + pr_test.pct_change(lag)))
    returns = returns[lag:]
    comp_returns = np.array(returns)
    #                   
    for i in range(num-1):
        comp_returns = np.c_[comp_returns, returns]
    #putting returns into dataframe    
    comp_returns = pd.DataFrame(comp_returns)
    #shifting columns to use it as delayed features
    for i in range(num):
        comp_returns[i] = comp_returns.shift(i)
    #deleting first 'num' rows with NaN's
    comp_returns_shifted = pd.DataFrame(comp_returns[num:]).reset_index(drop=True)
    
    testpr = np.array(pr_test[lag+num:])
    X = pd.DataFrame(comp_returns_shifted)
    p = model.predict_proba(X) # непрерывное предсказание классификатора (типа вероятность)
    
    result = np.array([0])
    
    lastdeal = int(2)
    lastpr = float(0.0)

    for i in range (X[0].size):
# При первом входе
        if lastdeal == 2:
# переводим непрерывное предсказание в номинальные значенияю Порог 0.5
            if p[i][0] > 0.5:
                lastdeal = 1
            else:
                lastdeal = 0
            lastpr = testpr[i] # сохраняем значение Close 
            continue
# при следующей итерации
        if lastdeal == 1 and p[i][0] > 0.5:
            lastdeal = 0 # это я не понял зачем
# При вычислении результата ошибка
            result = np.append(result, result[-1] - markup + lastpr - testpr[i])
            lastpr = testpr[i]
            continue
# при последующей итерации
        if lastdeal == 0 and p[i][0] < 0.5:
            lastdeal = 1 # здесь не должно быть -1?
# и здесь ошибка
            result = np.append(result, result[-1] - markup + testpr[i] - lastpr)
            lastpr = testpr[i]
            continue
            
    plt.figure(figsize=(20,5))
    plt.plot(result)
    
    from sklearn.linear_model import LinearRegression
    y = result.reshape(-1,1)
    X = np.arange(result.size).reshape(-1,1)
    lr = LinearRegression()
    lr.fit(X,y)
#     print(lr.score(X,y))
    return lr.score(X,y)

В чем же ошибка при вычислении результата? Вы вычисляете результат на каждой итерации добавляя к предыдущему значению result +=   testpr[i] - lastpr. Это разность Close текущего бара и предыдущего. По идее лучше использовать Close - Open, но это не важно. Важно другое - получив сигнал по  закрытию текущего бара  премией сигнала Вы считаете diff(Close) этого же бара. Это не верно. Премией сигнала текущего бара является diff(Close) следующего. Для правильного вычисления результата нужно сдвинуть  p = model.predict_proba(X)  вправо на один бар. Дальнейшие вычисления я приведу на R, мне так проще.

ifelse(p >= 0.5, 1, -1)%>% lag()%>% na.omit() -> sig
cumsum(sig * {diff(testpr) %>% tail(lenght(sig))})-> result

В первой строке - переводим предсказание в номинальные (1,-1), сдвигаем вправо на один бар, убираем NA, получаем вектор сигналов. Во второй строке кумулятивно суммируем произведение вектора сигналов и вектора  diff(Close), предварительно выровняв его по длине с вектором сигналов. Получаем правильный результат.

Удачи

Документация по MQL5: Основы языка / Операции и выражения / Побитовые операции
Документация по MQL5: Основы языка / Операции и выражения / Побитовые операции
  • www.mql5.com
Дополнение до единицы значения переменной. Значение выражения содержит 1 во всех разрядах, в которых значение переменной содержит 0, и 0 во всех разрядах, в которых значения переменной содержит 1. Сдвиг вправо Двоичное представление x сдвигается вправо на y разрядов. Если сдвигаемое значение имеет беззнаковый тип, то осуществляется логический...
 
Vladimir Perervenko:

Разбирать чужой код то еще занятие. Смотрим только функцию custom_tester() и только выделенную часть.

В чем же ошибка при вычислении результата? Вы вычисляете результат на каждой итерации добавляя к предыдущему значению result +=   testpr[i] - lastpr. Это разность Close текущего бара и предыдущего. По идее лучше использовать Close - Open, но это не важно. Важно другое - получив сигнал по  закрытию текущего бара  премией сигнала Вы считаете diff(Close) этого же бара. Это не верно. Премией сигнала текущего бара является diff(Close) следующего. Для правильного вычисления результата нужно сдвинуть  p = model.predict_proba(X)  вправо на один бар. Дальнейшие вычисления я приведу на R, мне так проще.

В первой строке - переводим предсказание в номинальные (1,-1), сдвигаем вправо на один бар, убираем NA, получаем вектор сигналов. Во второй строке кумулятивно суммируем произведение вектора сигналов и вектора  diff(Close), предварительно выровняв его по длине с вектором сигналов. Получаем правильный результат.

Удачи

при открытии сделки сохраняется текущая цена. В цикле, если сигнал не изменился, продолжаем двигаться по цене вперед, сохраняя открытую сделку.

Если сигнал изменился на следующем баре, переворачиваем сделку (lastdeal) и вычитаем из текущей цены цену открытия сделки, разница = профит либо лосс, прибавляем к общей накопленной сумме по балансу

для покупок вычитаем из текущей цены цену открытия, для продажи наоборот, соответственно. Ошибки там вроде нет

Поскольку сигнал берется для текущего бара, то сдвигать не нужно

1 - продажа, 0 - покупка. Условные обозначения. Тестер очень простой

Наверное, код можно сократить, не заморачивался

 
Maxim Dmitrievsky:

при открытии сделки сохраняется текущая цена. В цикле, если сигнал не изменился, продолжаем двигаться по цене вперед, сохраняя открытую сделку.

Если сигнал изменился на следующем баре, переворачиваем сделку (lastdeal) и вычитаем из текущей цены цену открытия сделки, разница = профит либо лосс, прибавляем к общей накопленной сумме по балансу

для покупок вычитаем из текущей цены цену открытия, для продажи наоборот, соответственно. Ошибки там вроде нет

Поскольку сигнал берется для текущего бара, то сдвигать не нужно

1 - продажа, 0 - покупка. Условные обозначения. Тестер очень простой

Наверное, код можно сократить, не заморачивался

Это другой подход. При таком варианте вроде действительно все правильно. Беру обратно свое замечание.

Удачи

Причина обращения: