記事「アルゴリズム取引戦略:AIで金市場の頂点を目指す」についてのディスカッション

 

新しい記事「アルゴリズム取引戦略:AIで金市場の頂点を目指す」はパブリッシュされました:

本記事では、機械学習を用いた金(ゴールド)の取引戦略作成手法を紹介します。提案された手法は、時系列データをさまざまな角度から分析して予測するアプローチに基づいており、従来の金融時系列の分析と予測のみを用いた取引システム作成手法と比較して、その利点や欠点を明らかにすることができます。

機械学習手法が取引分野で有効であることが広く認識されるようになり、さまざまなアルゴリズムが生まれました。これらのアルゴリズムは、同じタスクに対して同様の性能を発揮しますが、基本的な仕組みは異なります。本記事でも金市場における一方向型のトレンドフォロー戦略を構築しますが、今回はクラスタリングアルゴリズムを使用します。

  • 前回の記事では、同様の金のトレンド戦略を作成するための2種類の因果推論アルゴリズムが紹介されました。
  • 時系列クラスタリングに関する記事では、取引タスクにおけるクラスタリングのさまざまな方法について解説しています。
  • さらに、クラスタリングアルゴリズムを用いた平均回帰戦略の作成事例も公開されました。
  • 今回のクラスタリングに基づくトレンドフォロー型取引システムの開発は、このアプローチの有用性をさらに明らかにしています。

このように、時系列データを多角的に分析・予測する重要なアプローチを考慮することで、従来の金融時系列の分析と予測のみを基にした取引システム作成法と比較し、利点や欠点を評価することが可能です。場合によっては、これらのアルゴリズムは非常に高い効果を発揮し、作成速度や生成される取引システムの品質の両面で、従来手法を上回ることもあります。

本記事では、一方向性取引戦略に焦点を当てます。この場合、アルゴリズムは買いまたは売りのいずれか一方向のポジションのみを保有します。基本アルゴリズムとしてCatBoostとK-Meansを使用します。CatBoostは、取引方向を判定する二値分類モデルとして機能します。一方、K-Meansは、前処理フェーズで市場のモードを判定するために使用されます。


作者: dmitrievsky

削除済み  

この記事を読んだ後、クラスタリング処理そのものを弄ることを思いついた。

データセット全体ではなく、スライディングウィンドウでクラスタリングを実行する変種を書いた。これにより、BPの時間的構造を考慮したクラスタの分割が改善されるかもしれない。

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

この関数をコードに挿入し、クラスタリングをsliding_window_clusteringに置き換えてください。

結果は改善されるようだ。

それでも、記事を書くことが役に立つこともある。

 

ドミトリエフスキーさん、記事ありがとうございます。アップロードしたEAとインクルードファイルが不一致のようです。mpqファイルは "Trend following "フォルダにありますが、サンプルファイルは "Mean reversion "フォルダにあります。
また、"causal one direction.py "のget_features関数は記事にあるものとは異なります。さらに、.onnxをエクスポートする際に "causal one direction.py " が生成するmqhファイルは、MQL5_files.zipで提供されているものと同じではありません。

必要な説明をしていただければ幸いです。

ポール


Maxim Dmitrievsky
Maxim Dmitrievsky
  • 2025.04.16
  • www.mql5.com
Профиль трейдера
削除済み  
Sun Paul #:

ドミトリエフスキーさん、記事ありがとうございます。アップロードしたEAとインクルードファイルが不一致のようです。mpqファイルは "Trend following "フォルダにありますが、サンプルファイルは "Mean reversion "フォルダにあります。
また、"causal one direction.py "のget_features関数は記事にあるものとは異なります。また、"causal one direction.py "が.onnxをエクスポートする際に 生成するmqhファイルは、MQL5_files.zipで提供されているものとは異なります。

必要な説明をしていただければ幸いです。

ポール

ありがとう、チェックして再アップロードするよ。
削除済み  

アーカイブを更新し、新しいクラスタリング手法を追加した。

これですべてのパスと関数が一致するようになった。

ファイル:
Python_files.zip  548 kb
MQL5_files.zip  104 kb
 
最適なパラメータを選択するために、CatBoost モデルにRandomisedSearchCVパラメータ列挙を追加すべきだと思う。クロスバリデーションも悪くない。これらすべてがモデルの精度を向上させる。
 
Maxim Dmitrievsky #:

アーカイブを更新し、新しいクラスタリング手法を追加した。

これですべてのパスと関数が一致するようになった。

これらのファイルを記事にアップロードした

削除済み  
sportoman CatBoost モデルにRandomisedSearchCVパラメータ列挙を追加すべきだと思う。クロスバリデーションも悪くない。これらすべてがモデルの精度を向上させる。
ランダムさにランダムさを掛け合わせるのだ。再現するのは難しいだろう。
通常、ループの中で何度か再トレーニングを行えば、戦略を評価するには十分だ。
 
つまり、R 2は修正指数であり、その効率はpipsの利益に基づいています。ドローダウンやその他のパフォーマンス指標はどうでしょうか?トレーニングで90%以上、テストで85%以上の結果を出すモデルがあれば、その指標は印象的な数字になるでしょう。MT5で何度テスターを実行しても、履歴で利益を得たことがありません。入金は途絶えています。Pythonのテスターでは0.97-0.98の利益を出しているにもかかわらずです。
削除済み  
sportoman #:
つまり、R2は修正指数であり、その効率はpipsの利益に基づいています。ドローダウンやその他のパフォーマンス指標はどうでしょうか?トレーニングで90%以上、テストで85%以上の結果を出すモデルがあれば、その指標は印象的な数字になるでしょう。MT5で何度テスターを実行しても、履歴で利益を得たことがありません。入金は途絶えています。Pythonのテスターでは0.97-0.98の利益を出しているにもかかわらずです。

これがCVと何の関係があるのか理解できません。

これらの戦略はすべて、非定常相場の履歴のみに基づいているため、証明力が低い。しかし、トレンドを捉えることはできる。

履歴をダブルチェックしても、トレンドが変われば確率は上がらない。つまり、歴史に基づいて将来について何かを証明することはできず、利用可能なデータに基づいてモデルがどの程度一般化できるかを推定することしかできない。そのためのテスト期間がある。

非定常系列のモデルをテストする新しい効率的な方法がすでに発明されていたら、ぜひ教えてください :).
削除済み  
平均回帰戦略に関する記事もある。そこでは、時系列はほとんど常に平均に戻るという、より強力な仮定がなされている。変化するトレンドとは異なります。