English Русский 中文 Español Deutsch Português
preview
CatBoost AIによるレンコ足の予測

CatBoost AIによるレンコ足の予測

MetaTrader 5エキスパート |
21 4
Yevgeniy Koshtenko
Yevgeniy Koshtenko

はじめに

静寂に包まれた書斎の中で、モニターの光だけが淡く輝いています。MetaTrader 5ターミナルは最新のティックデータを吐き出し、私が開発したアルゴリズムは、市場の混沌を整然としたレンコ足へと淡々と変換していきます。午前3時。本物のトレーディング戦略が生まれる瞬間です。私は無精ひげの生えた顎を撫でながら、すっかり冷めてしまったお気に入りのCarte Noirのコーヒーを一口飲みます。モデル精度59.27%。それは勝利です。金融市場の予測不可能性を理解している者にとって、本物の勝利なのです。


従来型分析が無力になった時

約10年前、私は「テクニカル分析こそトレーダーのバイブルだ」という確信を持って市場に入りました。サポートラインとレジスタンスラインを引き、移動平均線のクロスを監視し、RSIやMACDのダイバージェンスを探していました。しかし年月が経つにつれ、これらの手法の有効性が徐々に低下していくのを目の当たりにしたのです。市場は変化していました。高頻度取引(HFT)アルゴリズムが市場構造そのものを変え、古典的な分析手法では以前のような優位性を得られなくなっていたのです。

ある日、特に悲惨なトレード週間を終えた後、私は自分自身に問いかけました。「もし、前世紀に書かれたテクニカル分析の本が、今では実践的な価値を失っているとしたら。」この問いが、私のトレーディングへのアプローチを根本から見直すきっかけとなり、最終的には機械学習をベースにしたレンコ足予測システムの開発へとつながっていきました。


レンコ足 – トレーダーのためのデジタル禅

私が初めてレンコ足に出会ったのは、シンガポールで開催されたあるカンファレンスでした。 名前は決して明かさないと約束した日本人トレーダーが、通常のローソク足ではなく、見慣れない長方形のブロックが並ぶターミナル画面を見せてくれたのです。「これはレンコ足です」彼はそう言いました。「本当に重要なもの、つまり価格変動だけを示すチャートです」

情報が過剰にあふれる現代において、レンコ足はまさに「デジタル禅」とも言える存在です。 ノイズ、時間軸、そして市場の本質的な動きを見えにくくするあらゆる要素を削ぎ落としてくれます。新しいブロックは、価格が一定幅だけ上昇または下落した時にのみ形成されます。このシンプルさの中には、驚くほど大きな力が秘められているのです。

私はさまざまな金融商品でレンコ足を試し始めました。EURUSD、GBPUSD、DAX、S&P 500など、どの市場においても、レンコ足は市場構造をより明確かつ透明に見せてくれました。しかし、手動分析には時間が必要です。そして時間は、常に不足しています。そこで私は、機械学習へと舵を切りました。


CatBoost:世界市場を制したアルゴリズム

アルゴリズムの選択は、トレーディング戦略の選択に劣らないほど重要でした。私は数十種類もの機械学習モデルを試した末に、最終的にYandexが開発した勾配ブースティングアルゴリズム「CatBoost」にたどり着きました。初めて使った瞬間に魅了されました。

# Initialize the CatBoost model
params = {
    'iterations': 300,
    'learning_rate': 0.05,
    'depth': 5,
    'loss_function': 'Logloss',
    'random_seed': 42,
    'verbose': False
}

model = CatBoostClassifier(**params)
model.fit(X_train, y_train, eval_set=(X_test, y_test), early_stopping_rounds=30, verbose=False)

CatBoostは、レンコ足パターン分析において重要となるカテゴリ特徴量の処理性能に優れているだけでなく、過学習にも強く、さらに毎日新しいデータで再学習できるほど高速でした。

私の実験は、60日分のEURUSDデータを取得することから始まりました。これは12,000本を超える5分足データです。このデータは、アルゴリズムによって算出された最適ブロックサイズ「0.00028」を用いて、11,578本のレンコ足へと変換されました。さらに特徴量生成を行った結果、モデル学習用として11,572件のサンプルが得られました。

そして、いよいよ結果を確認する瞬間が訪れました。準備されたデータを用いて、CatBoostモデルの学習を開始する時が来たのです。


数字が明かした真実:実験結果が示したもの

アルゴリズムの学習が完了し、その結果を目にした瞬間、それはまるで啓示のようでした。テストデータにおけるモデル精度は59.27%。トレーディング経験のない人にとっては、控えめな数字に見えるかもしれません。しかし、金融市場取引の厳しい統計的現実を知る者にとって、この結果は驚異的です。

ここで、ミシガン大学がおこなった有名な研究を思い出す価値があります。その研究では、アクティブ運用型ファンドの大半が、単純なバイアンドホールド戦略すら上回れないことが示されました。こうしたファンドには、博士号を持つ優秀なアナリストや、膨大な情報へアクセスできる専門家たちが関わっています。それを踏まえれば、59.27%という精度は、単に優秀というだけでなく、むしろ驚異的と言えるでしょう。

しかし、さらに衝撃的だったのは特徴量重要度の分析結果でした。従来のテクニカル分析の常識に反し、価格パターンよりも出来高関連指標の方がはるかに重要であることが判明したのです。特に、last_volume(重要度 18.36)、avg_volume(14.23)、 volume_ratio(12.81)が上位3項目を占めました。その後に続いたのは、連続した価格変動に関するパラメータでした。

以前、ある著名なSNSで成功を収めているトレーダーが、こんなことを語っているのを見たことがあります。「聖杯は、出来高をレンコブロックとボリュームクラスタに分解することにある」もしかすると、今回の結果は単なる偶然ではなく、そこに本質的な意味が隠されているのかもしれません。


レンコ足の仕組み

レンコ足を扱う上で、最初に重要となるのが最適なブロックサイズの決定です。それは顕微鏡のピント調整にも似ています。倍率が低すぎれば細部は見えず、高すぎれば全体像が歪んでしまいます。レンコブロックのサイズとは、いわば市場を観察するための「解像度」なのです。

# Create Renko bars with adaptive block size
def create_renko_bars(df, brick_size=None):
    if brick_size is None:
        # Calculate ATR to determine block size
        df['tr'] = np.maximum(
            df['high'] - df['low'],
            np.maximum(
                np.abs(df['high'] - df['close'].shift(1)),
                np.abs(df['low'] - df['close'].shift(1))
            )
        )
        df['atr'] = df['tr'].rolling(window=14).mean()
        brick_size = df['atr'].mean() * 0.5
        print(f"Renko block size: {brick_size:.5f}")
    
    # Create Renko bars 
    renko_bars = []
    current_price = df.iloc[0]['close']
    # ... the rest of the code

数多くの実験を重ねた結果、私はブロックサイズを決定する最良の方法は、ATR (Average True Range)を用いることだという結論に至りました。この手法により、ブロックサイズは市場の現在のボラティリティに適応するようになります。

EURUSDの場合、アルゴリズムは最適ブロックサイズとして0.00028を算出しました。これはおよそ2.8pipsに相当します。一見すると小さな値に思えるかもしれません。 しかし、この絶妙な粒度こそが、重要な価格変動を捉えながら、市場ノイズを効果的に排除する鍵となるのです。

レンコ足の生成とは、単なる価格データの機械的変換ではありません。それは、ノイズの中からシグナルを抽出する技術であり、無数の値動きの中から本質的な動きを抽出する作業です。そして、変換後のデータをチャート上で初めて目にした瞬間、そこには、驚くほど明瞭な市場の姿が広がっていました。赤と緑のブロックが階段状に連なるその姿は、時間軸による歪みを排除し、純粋な価格変動だけを映し出していたのです。


特徴量設計:予測に本当に重要なもの

あらゆる機械学習モデルの成功は、特徴量の質と関連性に大きく左右されます。次のレンコ足の方向を予測するために、私は価格変動の履歴と出来高特性の両方を考慮した、多層的な特徴量システムを構築しました。

# Prepare features for the model
def prepare_features(renko_df, lookback=5):
    features = []
    targets = []
    
    for i in range(lookback, len(renko_df) - 1):
        window = renko_df.iloc[i-lookback:i]
        
        feature_dict = {
            # Directions of the last n bars
            **{f'dir_{j}': window['direction'].iloc[-(j+1)] for j in range(lookback)},
            
            # Movement statistics
            'up_ratio': (window['direction'] > 0).mean(),
            'max_up_streak': window['consec_up_streak'].max(),
            'max_down_streak': window['consec_down_streak'].max(),
            'last_up_streak': window['consec_up_streak'].iloc[-1],
            'last_down_streak': window['consec_down_streak'].iloc[-1],
            
            # Volume
            'last_volume': window['volume'].iloc[-1],
            'avg_volume': window['volume'].mean(),
            'volume_ratio': window['volume'].iloc[-1] / window['volume'].mean() 
                if window['volume'].mean() > 0 else 1
        }
        
        features.append(feature_dict)
        
        # Direction of the next bar (1 - up, 0 - down)
        next_direction = 1 if renko_df.iloc[i+1]['direction'] > 0 else 0
        targets.append(next_direction)
    
    return pd.DataFrame(features), np.array(targets)

まず私は、直近数本のローソク足の方向という、比較的わかりやすい特徴量を取り入れました。続いて、上昇バーと下降バーの比率、同方向への連続回数、最大連続本数といった統計的指標を追加しました。そして最後に、最新バーの出来高、一定期間の平均出来高、現在の出来高と平均出来高の比率などの出来高関連指標を組み込みました。

驚いたことに、予測において最も重要だったのは、出来高指標でした。この結果は、私の価格分析に対する理解を根本から変えました。長年にわたり、私も多くのトレーダーと同様、ローソク足の形状、チャートパターン、トレンドラインばかりに注目してきました。しかし、本当の答えは最初から「出来高」にあったのです。FX市場は分散型市場であるため、出来高は軽視されがちです。

最終的な特徴量セットは14項目となりました。これは、モデルの複雑さと予測性能のバランスという点で最適な構成でした。特徴量を増やしすぎれば過学習が発生し、逆に減らしすぎれば十分な学習ができなくなります。


予測の実践:理論から実践へ

構築したモデルは、次のレンコ足の方向を単純に二択で予測するだけではありません。その値動きが発生する確率まで算出します。直近の例では、モデルは69.35%の確率で下落を予測しました。これは比較的高い信頼度の予測ですが、私が売買シグナルの基準として設定している75%には届いていません。そのため、実際のシグナルは生成されませんでした。

# Forecast the next bar
def predict_next_bar(model, renko_df, lookback=5, feature_names=None):
    if len(renko_df) < lookback:
        return {"error": "Insufficient data"}
    
    window = renko_df.iloc[-lookback:]
    
    feature_dict = {
        **{f'dir_{j}': window['direction'].iloc[-(j+1)] for j in range(lookback)},
        'up_ratio': (window['direction'] > 0).mean(),
        'max_up_streak': window['consec_up_streak'].max(),
        'max_down_streak': window['consec_down_streak'].max(),
        'last_up_streak': window['consec_up_streak'].iloc[-1],
        'last_down_streak': window['consec_down_streak'].iloc[-1],
        'last_volume': window['volume'].iloc[-1],
        'avg_volume': window['volume'].mean(),
        'volume_ratio': window['volume'].iloc[-1] / window['volume'].mean() 
            if window['volume'].mean() > 0 else 1
    }
    
    X_pred = pd.DataFrame([feature_dict])
    
    # Make sure all the features are present
    if feature_names:
        for feature in feature_names:
            if feature not in X_pred.columns:
                X_pred[feature] = 0
        X_pred = X_pred[feature_names]
    
    prob = model.predict_proba(X_pred)[0]
    prediction = model.predict(X_pred)[0]
    
    return {
        'prediction': 'UP' if prediction == 1 else 'DOWN',
        'probability': prob[prediction],
        'prob_up': prob[1],
        'prob_down': prob[0],
        'signal': 'BUY' if prob[1] > 0.75 else 
                 'SELL' if prob[0] > 0.75 else 
                 'NEUTRAL'
    }

しかし、本当の価値は単一の予測そのものではなく、包括的なトレーディングシステムにあります。直近5本のレンコ足は興味深い動きを示していました。3本連続の下落の後に、2本の上昇が続いていたのです。この短期的な上昇トレンドと、高いながらもシグナル発生には十分ではない下落予測が組み合わさることで、市場が保ち合い状態にあり、不確実性が高まっている可能性が示唆されていました。

そして、まさにこのような局面こそが、トレードにおいて最も危険なのです。システムはその状態を正確に識別し、下落確率が比較的高かったにもかかわらず、あえて売買シグナルを生成しませんでした。


システムの内部構造:アーキテクチャを読み解く

開発したシステムは、多層構造を持つ仕組みとなっており、それぞれのコンポーネントが予測システム全体の中で固有の役割を担っています。ここでは、このアーキテクチャの主要要素を見ていきます。

python# Main function
def main():
    # Get EURUSD data
    print("Load EURUSD data from MetaTrader5...")
    df = get_mt5_data(symbol='EURUSD', days=60)
    
    if df is None or len(df) == 0:
        print("Unable to retrieve data")
        return
    
    print(f"Loaded {len(df)} bars")
    
    # Create Renko bars 
    print("Creating Renko bars...")
    renko_df, brick_size = create_renko_bars(df)
    print(f"Created {len(renko_df)} Renko bars")
    
    # Prepare features
    print("Preparing features...")
    X, y = prepare_features(renko_df)
    print(f"Prepared {len(X)} samples")
    
    # Train the model
    print("Training the model...")
    model, X_test, y_test = train_model(X, y)
    
    # Next bar forecast
    feature_names = X.columns.tolist()
    prediction = predict_next_bar(model, renko_df, feature_names=feature_names)
    
    print("\nNEXT RENKO BAR FORECAST:")
    for k, v in prediction.items():
        print(f"{k}: {v}")
    
    # Info about the latest bars
    print("\nLast 5 Renko bars:")
    print(renko_df.tail(5)[['time', 'open', 'close', 'direction']])

システムの基盤となっているのは、MetaTrader 5からデータを取得するモジュールです。MetaTrader 5との統合により、ほぼリアルタイムで最新の市場データを取得することができます。このモジュールは公式MetaTrader 5 APIを利用しており、高い信頼性と安定性を確保しています。 

次のレイヤーでは、通常の時間足をレンコ足へ変換します。アルゴリズムはATRに基づいて最適なブロックサイズを算出し、出来高や時間情報も考慮しながら変換を実行します。この実装の大きな特徴は、レンコ足形成時に連続的な値動きとその特性を同時に計算している点にあり、これによってシステム全体の効率が向上しています。 

システムの中核となるのは、特徴量生成とモデル学習を行うモジュールです。ここでは各レンコ足が数値的特徴量の集合へ変換され、そのデータがCatBoostアルゴリズムへ入力されます。最適なモデルパラメータの選定は、金融時系列特有の性質を考慮したクロスバリデーションによって行われます。 

最後に、予測モジュールが学習済みモデルと現在のデータを用いて予測を生成し、設定された信頼度閾値に達した場合には売買シグナルを出力します。 

システム全体はPythonで記述されており、numpy、pandas、MetaTrader 5、catboostライブラリを使用しています。Pythonを選択した理由は、開発の容易さだけではなく、データ分析や結果可視化のための豊富な機能が利用できるためです。 


結論と展望:アルゴリズム取引の未来

レンコ足予測システムの開発と検証を通じて、私はアルゴリズム取引に対する考え方を変え得る、いくつかの重要な結論に至りました。 

第一に、従来型のテクニカル分析手法は、現代の機械学習アルゴリズムに比べて効率面で劣っているということです。59.27%という精度は、一見すると突出して見えないかもしれません。しかし長期的には、多くのテクニカル指標を安定して上回る結果を示しています。 

第二に、市場変動の予測において、出来高指標は価格パターンよりもはるかに重要であることが明らかになりました。これは多くの古典的トレーディング書籍の内容と矛盾していますが、実データによるシミュレーション結果がそれを裏付けています。 

第三に、レンコ足は実際に価格データからノイズを除去し、機械学習アルゴリズムが市場変動におけるより一貫したパターンを識別できるようにしているという点です。 

しかし、最も重要なのは、これがまだ始まりに過ぎないということです。私はこのシステムにさらなる発展の可能性を感じています。ファンダメンタルデータ、ニュースイベント、さらにはSNSを用いた市場センチメント分析を組み込むことも可能でしょう。また、他の金融商品や時間軸への拡張も考えられます。予測精度向上のために、複数モデルによるアンサンブルを構築することもできるはずです。 


結論

アルゴリズム取引の世界は、今まさに新たな革命の入り口に立っています。そして、レンコ足と最新の機械学習アルゴリズムの組み合わせは、その原動力の一つになるかもしれません。この分野に興味を持つすべての人に、データ、アルゴリズム、そして予測の世界へ飛び込むことを勧めたいと思います。トレーディングの未来は、すでにここにあります。そして、それはアルゴリズムが主導する未来なのです。 

MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/17531

添付されたファイル |
RenkoPredict.py (8.26 KB)
最後のコメント | ディスカッションに移動 (4)
Aliaksandr Kazunka
Aliaksandr Kazunka | 15 5月 2025 において 19:12
63パーセント以上は得られない。どんなサインを加えようとも。FXで63は大失敗
Yevgeniy Koshtenko
Yevgeniy Koshtenko | 15 5月 2025 において 22:22
sportoman #:
63パーセント以上は得られない。どんなサインを加えようとも。FXで63は大失敗

ミダス(マルチモジュラー、多くのモジュールがシグナルを一つのシグナルにまとめる)では75%以上取れた。しかし、その後、別の問題が発生します - シグナルは1ヶ月半に1回)))信頼性の高いシグナルほど、それが発生する頻度が低くなります...私は最近のロボットで高い勝率を忘れるようになった理由です、私は1:3、1:4などで利益を得るためにリスクを取るために動きの深さを予測しようとします。深い動きを正しくマークしたモデルには、DQNを通じてボーナスを与えるようにマークを設定する......これが最終的にLSTMヨーロッパというロボットにつながった。

Aliaksandr Kazunka
Aliaksandr Kazunka | 17 5月 2025 において 21:10
Yevgeniy Koshtenko #:

私はミダス(マルチモジュラー、多くのモジュールがシグナルを1つのシグナルにまとめる)で75%以上を獲得しました。しかし、その後、別の問題が発生しました - シグナルは1ヶ月半に1回)))信頼性の高いシグナルほど、発生頻度が低くなります...そのため、最近のロボットでは高い収益性を忘れるようになりました、私は1:3、1:4などで利益を得るためにリスクを取るために動きの深さを予測しようとします。深い動きを正しくマークしたモデルには、DQNを通じてボーナスを与えるようにマークを設定した。

LTSMの75はlookback = 5 bars_ahead = 1ですが、これはバイナリー取引用で、FX用ではありません。

Vladimir Perervenko
Vladimir Perervenko | 18 5月 2025 において 18:46

では、AIはどこにいるのか?それともキャットバスターズをそのランクに引き上げたのか?

テストか何かした方がいいよ。58%でいいのか?このAccuracyは単なるベンチマークだ。主な指標は、受信した信号に基づくテストのバランスだ。

おもしろくないですよ。

多通貨エキスパートアドバイザーの開発(第26回):取引商品の情報提供 多通貨エキスパートアドバイザーの開発(第26回):取引商品の情報提供
多通貨EAの開発へと進む前に、まずはこれまで構築してきたライブラリを用いて、新しいプロジェクトを作成する段階へ移行してみましょう。この例では、ソースコードの管理方法をどのように整理するのが最も適切か、そしてMetaQuotesの新しいコードリポジトリを活用することで、どのような利点が得られるのかを示していきます。
FX裁定取引:関係性評価パネル FX裁定取引:関係性評価パネル
MQL5における裁定取引分析パネルの開発について説明します。さまざまな方法で、Forexで理論為替レートを導き出すにはどうすればよいでしょうか。市場価格と理論為替レートとの乖離を把握し、ある通貨を別の通貨に交換する裁定取引(三角裁定取引など)の収益機会を評価するためのインジケーターを作成します。
エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法 エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
この記事では、MT4において複数のEAの衝突をさける方法を扱います。ターミナルの操作、MQL4の基本的な使い方がわかる人にとって、役に立つでしょう。
一次元特異スペクトル解析 一次元特異スペクトル解析
本記事では、特異スペクトル解析(SSA, Singular Spectrum Analysis)法の理論的および実践的側面について考察します。SSAは時系列解析の有効な手法の一つであり、時系列の複雑な構造を、トレンド、季節性(周期的)変動、ノイズなどの単純な成分へ分解して表現することを可能にします。