Обсуждение статьи "Торговля по алгоритму: ИИ и его путь к золотым вершинам"

 

Опубликована статья Торговля по алгоритму: ИИ и его путь к золотым вершинам:

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

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

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

В этой статье мы сконцентрируем свое внимание на однонаправленной торговле, когда алгоритм будет открывать сделки только на покупку или продажу. В качестве базовых алгоритмов будут использованы алгоритмы CatBoost и K-Means. CatBoost является базовой моделью, которая выполняет функции бинарного классификатора для классификации сделок. K-Means же используется для определения режимов рынка на этапе препроцессинга.

Автор: Maxim Dmitrievsky

[Удален]  

После того, как прочел статью, появилась мысль поиграть с самим процессом кластеризации.

Написал такой вариант, который производит кластеризацию в скользящем окне, а не на всем датасете. Это может улучшить разметку кластеров, с учетом временной структуры ВР.

def sliding_window_clustering(dataset, n_clusters: int, window_size=200) -> pd.DataFrame:
    import numpy as np
    
    data = dataset[(dataset.index < hyper_params['forward']) & (dataset.index > hyper_params['backward'])].copy()
    meta_X = data.loc[:, data.columns.str.contains('meta_feature')]
    
    # Сначала создаем глобальные эталонные центроиды
    global_kmeans = KMeans(n_clusters=n_clusters).fit(meta_X)
    global_centroids = global_kmeans.cluster_centers_
    
    clusters = np.zeros(len(data))
    
    # Применяем кластеризацию в скользящем окне
    for i in range(0, len(data) - window_size + 1, window_size):
        window_data = meta_X.iloc[i:i+window_size]
        
        # Обучаем KMeans на текущем окне
        local_kmeans = KMeans(n_clusters=n_clusters).fit(window_data)
        local_centroids = local_kmeans.cluster_centers_
        
        # Сопоставляем локальные центроиды с глобальными
        # для обеспечения согласованности меток кластеров
        centroid_mapping = {}
        for local_idx in range(n_clusters):
            # Находим ближайший глобальный центроид к данному локальному
            distances = np.linalg.norm(local_centroids[local_idx] - global_centroids, axis=1)
            global_idx = np.argmin(distances)
            centroid_mapping[local_idx] = global_idx + 1  # +1 для начала нумерации с 1
        
        # Получаем метки для текущего окна
        local_labels = local_kmeans.predict(window_data)
        
        # Преобразуем локальные метки в согласованные глобальные метки
        for j in range(window_size):
            if i+j < len(clusters):  # Проверка на выход за границы
                clusters[i+j] = centroid_mapping[local_labels[j]]
    
    data['clusters'] = clusters
    return data

Эту функцию вставить в код и заменить clustering на sliding_window_clustering.

По ощущениям, улучшает результаты.

Все-таки иногда полезно писать статьи.

 

Thanks for the article Dmitrievsky. It looks the uploaded EA and its include file are mismatch with each other. It refer the mpq file in the folder "Trend following", but the sample files were in "Mean reversion". 
And the function get_features in the "causal one direction.py" are not same as what appears in the article. Besides that, the mqh file generated by "causal one direction.py" when exporting .onnx is not same as what offered in MQL5_files.zip. 

Very appriciate if you can make necessary clarification.

Paul 


 

Maxim Dmitrievsky
Maxim Dmitrievsky
  • 2025.04.16
  • www.mql5.com
Профиль трейдера
[Удален]  
Sun Paul #:

Thanks for the article Dmitrievsky. It looks the uploaded EA and its include file are mismatch with each other. It refer the mpq file in the folder "Trend following", but the sample files were in "Mean reversion". 
And the function get_features in the "causal one direction.py" are not same as what appears in the article. Besides that, the mqh file generated by "causal one direction.py" when exporting .onnx is not same as what offered in MQL5_files.zip. 

Very appriciate if you can make necessary clarification.

Paul 

Thanks, I'll check and re-upload, maybe I mixed up some files.
[Удален]  

Обновил архивы + добавил новый метод кластеризации.

Теперь все пути и функции соответствуют.

Файлы:
Python_files.zip  548 kb
MQL5_files.zip  104 kb
 
Думаю стоит добавить перебор параметров RandomizedSearchCV  для модели CatBoost для подбора лучших параметров. Да и кросс-валидация не помешает. Все это улучшает точность модели.
 
Maxim Dmitrievsky #:

Обновил архивы + добавил новый метод кластеризации.

Теперь все пути и функции соответствуют.

Залил эти файлы в статью

[Удален]  
sportoman #:
Думаю стоит добавить перебор параметров RandomizedSearchCV  для модели CatBoost для подбора лучших параметров. Да и кросс-валидация не помешает. Все это улучшает точность модели.
Получится случайность, помноженная на случайность. Сложно будет воспроизвести, тогда нужно фиксировать seed везде.
Обычно хватает нескольких переобучений в цикле, чтобы оценить стратегию.
 
Так у вас же R2 это модифицированный показатель, эффективность которого основывается на профите в пипсах. А как же просадка и другие показатели эффективности? Если мы получим модель которая на обучении выдает более 90% и на тесте не менее 85%, то и ваш показатель выдаст внушительные цифры. Я вот сколько ни гонял тестер на MT5 ни разу не получил профита на истории. Депозит сливается. Это при том, что ваш тестер на питоне выдает 0.97-0.98
[Удален]  
sportoman #:
Так у вас же R2 это модифицированный показатель, эффективность которого основывается на профите в пипсах. А как же просадка и другие показатели эффективности? Если мы получим модель которая на обучении выдает более 90% и на тесте не менее 85%, то и ваш показатель выдаст внушительные цифры. Я вот сколько ни гонял тестер на MT5 ни разу не получил профита на истории. Депозит сливается. Это при том, что ваш тестер на питоне выдает 0.97-0.98

Не понял какое отношение это имеет к CV.

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

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

Если уже изобретен какой-то новый эффективный способ проверки моделей на нестационарных рядах - маякните :)
[Удален]  
По стратегиям возврата к среднему тоже есть статья. Там мы исходим из более сильного предположения, что временной ряд возвращается к среднему значению почти всегда. В отличие от трендов, которые меняются.