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

 
СанСаныч Фоменко #:

Надеюсь, займетесь делом и продемонстрируете свои выдающиеся достижения в маркете взамен мусора? 

Зачем шедевры обзывать мусором? Вам я бесплатно предлагал, в том числе на ваших суперпризнаках, как и Алексею. Но был послан в кодобазу. И теперь он, жалобщик, бегает и обзывается еще.

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

Если просто страдаете фигней, то страдайте дальше.

Не отпускаете меня все из темы никак, да 

 
Как можно так долго выбирать признаки, и не иметь в итоге никаких? Хотя бы плохонькие должны быть, забытые и никому не нужные.

Есть все, включая готовых ботов на выходе. Обучение пара минут на ваших суперпризнаках. На выходе исходник бота для мт5 и 4.

Топ признаков по моей версии: волатильность, автокорреляция в скользящем окне с разными периодами, то же самое с авторегрессией, отклонения не в виде приращений от цены, а от линии глобального/ локального тренда, с отслеживанием его изменения.
 
Aleksey Nikolayev #:

Статья с подходом, похожим на тот, что продвигает Aleksey Vyazmikin. Вместо дерева классификации строится "дерево разностей", в котором каждому листу соответствует своя вероятность события (на примере частоты пожаров). По сути, это некий вариант кластеризации.

Сразу скажу, что подробно пересказывать статью не готов, поскольку только вскользь просмотрел её. 

Спасибо за статью!

Перевёл, прочёл.

Можете помочь алгоритм в виде формул перевести на более понятный язык? А я постараюсь написать код этого способа построения дерева.

 
Maxim Dmitrievsky #:
Я конкретно ответил на ваш конкретный вопрос - в любой, какой хотите. Это ваше личное дело. Даже странно, почему у меня спросили. К интересующей меня теме это не имело отношения.

Хм, Вы тут в ветке сообщили об uplift моделях, которые являются развитием A-B тестирования. Так вот, метод разработан для оценки влияния, когда меняется от нового влияния целевая. Поэтому для меня очевидно, что точку начала влияния искомого предиктора следует установить. Вот я и хотел услышать Ваши мысли по данному вопросу. В том числе причину, по которой Вы считаете, что это неважно.

 
Maxim Dmitrievsky #:
Зачем шедевры обзывать мусором? Вам я бесплатно предлагал, в том числе на ваших суперпризнаках, как и Алексею. Но был послан в кодобазу. И теперь он, жалобщик, бегает и обзывается еще.

Кто жалобщик? Кто обзывается?

Если речь обо мне, то обвинения беспочвенны. Я буду тратить свои силы на устранение неугодных, по справедливости, только в случае, если это будет необходимо для достижения моих целей.

Я предложил дать значения предикторов для проверки, так как это быстро.

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

 
Aleksey Vyazmikin #:

Спасибо за статью!

Перевёл, прочёл.

Можете помочь алгоритм в виде формул перевести на более понятный язык? А я постараюсь написать код этого способа построения дерева.

Там, в статье, на 10-й странице есть реализация в виде псевдокода. На предпоследней странице, в приложении, есть ссылки на реализацию на языке R и на данные, использованные в статье.

Как, в общих чертах, реализуете деревья решений на mql5? Через массивы или шаблоны?

 
Aleksey Vyazmikin #:

Хм, Вы тут в ветке сообщили об uplift моделях, которые являются развитием A-B тестирования. Так вот, метод разработан для оценки влияния, когда меняется от нового влияния целевая. Поэтому для меня очевидно, что точку начала влияния искомого предиктора следует установить. Вот я и хотел услышать Ваши мысли по данному вопросу. В том числе причину, по которой Вы считаете, что это неважно.

Выборки в рандомизированных экспериментах определяются слу чай но. Самое начало книги.

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

Простым тестированием на новых данных вы не можете определить эффект, потому что часто есть смещение в данных. Поэтому формула состоит из двух слагаемых ATE + Bias. Можно пойти еще дальше и определить CATE, то есть для каждого отдельного случая, и выбрать только те, которые лучше поддаются лечению, остальные игнорировать/пропускать в торговле.

В терминах Саныча, ищете стационарное в нестационарном.
 
Aleksey Vyazmikin #:

Кто жалобщик? Кто обзывается?

Если речь обо мне, то обвинения беспочвенны. Я буду тратить свои силы на устранение неугодных, по справедливости, только в случае, если это будет необходимо для достижения моих целей.

Я предложил дать значения предикторов для проверки, так как это быстро.

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

Вы жалуетесь и обзываетесь, как дитя
А в небольшом кол-все продуктивно?)
 
def R_learner():
    dataset = get_prices()
    dataset = labeling(dataset)

    data = dataset[dataset.index < FORWARD].copy()
    data['treatment'] = data['labels'].apply(lambda x: np.random.choice([0, 1], p=[0.2, 0.8])) // случайно выбрал элементы для лечения


    X = data[data['treatment'] == 1]
    X = X[X.columns[1:-2]]
    X_t = data[data['treatment'] == 0]
    X_t = X_t[X_t.columns[1:-2]]

    y = data[data['treatment'] == 1]
    y = y[y.columns[-2]]
    y_t = data[data['treatment'] == 0]
    y_t = y_t[y_t.columns[-2]]

    treat_m = CatBoostClassifier(iterations=1000,
                                depth=6,
                                custom_loss=['Accuracy'],
                                eval_metric='Accuracy',
                                verbose=False,
                                use_best_model=True,
                                task_type='CPU')
    treat_m.fit(X, y, eval_set=(X_t, y_t),
                    early_stopping_rounds=50, plot=False) // обучил модель на этих примерах, остальные попали в валидацию

    data['y_t'] = [x[0] < 0.5 for x in treat_m.predict_proba(data[data.columns[1:-2]])] // теперь метки классов - это предсказания обученной модели
    data['y_t'] = data['y_t'].astype(float)
    
    # perform residualisation
    debias_m = CatBoostClassifier(iterations = 5,
                                    max_depth = 1,
                                    early_stopping_rounds = 2,
                                    verbose = False) // эта модель определяет смещение в оценках тритмента
    denoise_m = CatBoostClassifier(iterations = 5,
                                    max_depth = 1,
                                    early_stopping_rounds = 2,
                                    verbose = False) // эта модель определяет смещение в оценках целевой

    t_diff = data['treatment'] - cross_val_predict(debias_m, 
                                                data[data.columns[1:-3]], 
                                                data[data.columns[-2]], 
                                                method='predict_proba', cv=5)[:, 0] // определяем тритмент эффект

    y_diff =  data['y_t'] - cross_val_predict(denoise_m, 
                                                data[data.columns[1:-3]], 
                                                data[data.columns[-1]], 
                                                method='predict_proba', cv=5)[:, 0] // определяем байес

    # create the weights
    w = t_diff ** 2 // новые веса для модели
    # create the transformed target
    y_debias = (y_diff / t_diff).apply(lambda x: 1 if x > 0.0 else 0) // новые метки без смещения

    data['weights'] = w
    data['y_debias'] = y_debias
    data = data.drop(['labels', 'treatment', 'y_t'], axis=1)


    X = data[data.columns[1:-2]]
    y = data[data.columns[-2:]]

    train_X, test_X, train_y, test_y = train_test_split(
            X, y, train_size=0.5, test_size=0.5, shuffle=True)

    train_data = Pool(
        data=train_X,
        label=train_y[train_y.columns[1]],
        weight=train_y[train_y.columns[0]] // добавляем веса к обучению
    )

    eval_data = Pool(
        data=test_X,
        label=test_y[test_y.columns[1]],
        weight=test_y[test_y.columns[0]]
    )

    # learn final model with train and validation subsets
    model = CatBoostClassifier(iterations=1000,
                                depth=6,
                                learning_rate=0.1,
                                custom_loss=['Accuracy'],
                                eval_metric='Accuracy',
                                verbose=False,
                                use_best_model=True,
                                task_type='CPU')

    model.fit(X= train_data, eval_set=eval_data,
                early_stopping_rounds=50, plot=False) // учим новую модель с обесшумленными метками и дополнительными весами

    return model

Такой подход работает плохо на новых данных. Видимо потому, что плохо проработал вопрос с определением, что должно являться тритментом и по отношению к чему :)

идея R-learner взята отсюда 
 
Maxim Dmitrievsky #:

Такой подход работает плохо на новых данных. Видимо потому, что плохо проработал вопрос с определением, что должно являться тритментом и по отношению к чему :)

идея R-learner взята отсюда 

В статье используются очень важные знания о входных данных - эластичность спроса-предложения. Отсюда стойкий запах сверх подгонки.

У нас таких фундаментальных данных о котировках нет, более того, скорее всего эластичность не работает: цена актива может меняться от нуля и до  небес.

Код, который Вы выложили, а также сам причинно-следственный подход, будет иметь ценность только после прогона в тестере МКЛ-5, причем обязательно с форвардом.