記事「MQL5における取引へのコンピュータビジョンの統合(第1回):基本関数の作成」についてのディスカッション

 

新しい記事「MQL5における取引へのコンピュータビジョンの統合(第1回):基本関数の作成」はパブリッシュされました:

コンピュータビジョンおよびディープラーニングを活用したEURUSD予測システムです。本記事では、畳み込みニューラルネットワークが外国為替市場における複雑な価格パターンをどのように認識し、最大54%の精度で為替レートの変動を予測できるかを解説します。また、従来のテクニカル指標の代わりに、チャートの視覚的分析に人工知能技術を活用するアルゴリズムの構築手法を共有します。著者は、価格データを「画像」へと変換するプロセス、それらをニューラルネットワークで処理する方法、さらに活性化マップやアテンションヒートマップを通じてAIの「意識」を可視化する独自のアプローチを解説します。MetaTrader 5ライブラリを用いた実践的なPythonコードにより、読者は本システムを再現し、自身の取引へ応用することができます。

ニューラルネットワークがEURUSD市場を見つめるとき、それは何を感じているのでしょうか。ボラティリティの急騰、トレンドの反転、そして捉えどころのないパターン形成の一つひとつを、どのように認識しているのでしょうか。

あらかじめ定められたルールを機械的に適用するのではなく、市場を真に見るコンピュータを想像してみてください。それは人間の目には見えない価格変動の微細なニュアンスを捉えます。まるでベテラン船長が水平線を見つめ、最初の兆候が現れるはるか前に嵐の接近を察知するかのように、人工知能はEURUSDチャートを読み取ります。

本記事では、コンピュータビジョンと市場分析が融合する金融テクノロジーの最前線を紹介します。私たちは単に市場を分析するのではなく、視覚的に理解するシステムを構築します。それは、群衆の中から友人の顔を自然に見分けるように、複雑な価格パターンを認識するのです。

この機能は、モデルが意思決定時にチャートのどの領域に最も注意を払っているかを可視化する、人工知能の「意識」の実際のマップを生成します。注意が高い赤いゾーンは、しばしば重要な価格レベルや反転ポイントと一致し、モデルが重要な価格形成を正しく学習していることを確認できます。


作者: Yevgeniy Koshtenko

 
こんにちは。
あなたが私たちのために提供してくれたこの記事には本当に感謝しています。しかし、私のようにMQL5言語でトレーディングシステム(EA)を作成したことはあっても、機械学習や一般的なPythonに関してはほとんど知識がない者に言いたいことがあります。
私は自分のトレーディングシステムにMLを統合して、あなたが言ったように「無心」な一般的なプログラムから、より良い意思決定をするようにアップグレードしたいと思っています。
私が知る限り、あなたの記事には初心者のステップがいくつか欠けているようです。あなたの最初のコードには、どのIDEを使うのかが書かれていません(meta quotes IDEなのでしょうか?
多分、あなたの記事は初心者にゼロから教えるものではないと思います。
 
import MetaTrader5 as mt5
import numpy as np
import pandas as pd
import matplotlib
matplotlib.use('Agg') 
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, Conv1D, MaxPooling1D, Flatten, Dropout, BatchNormalization, Input
from tensorflow.keras.callbacks import EarlyStopping
from datetime import datetime

# --- コンフィギュレーション ---
SYMBOL = "EURUSD"
TIMEFRAME = mt5.TIMEFRAME_H1
DATA_LOAD = 6200      # 上半期のデータが1年分に増加
WINDOW_SIZE = 48      # 入力ウィンドウ(48時間)
PRED_WINDOW = 24      # 予想水平線(24時間)
BACKTEST_ROWS = 20    # 手動で確認する最近のバーの数

def connect_to_mt5():
    if not mt5.initialize():
        print("Error initializing MetaTrader5")
        return False
    return True

def get_historical_data(num_bars):
    # 現在位置から特定のカウントを引き出す
    rates = mt5.copy_rates_from_pos(SYMBOL, TIMEFRAME, 0, num_bars)
    if rates is None or len(rates) == 0:
        return None
    df = pd.DataFrame(rates)
    df['time'] = pd.to_datetime(df['time'], unit='s')
    df.set_index('time', inplace=True)
    return df[['open', 'high', 'low', 'close']]

def create_images(data, window_size=48, prediction_window=24):
    images, targets = [], []
    for i in range(len(data) - window_size - prediction_window):
        window = data.iloc[i:i+window_size]
        # レーベルは24時間後の価格に基づく
        target_val = 1 if data.iloc[i+window_size+prediction_window-1]['close'] > window['close'].iloc[-1] else 0
        
        scaler = MinMaxScaler()
        window_scaled = scaler.fit_transform(window)
        
        images.append(window_scaled)
        targets.append(target_val)
    return np.array(images), np.array(targets)

def train_cv_model(images, targets):
    X_train, X_val, y_train, y_val = train_test_split(images, targets, test_size=0.15, shuffle=True)
    inputs = Input(shape=(X_train.shape[1], X_train.shape[2]))
    
    # CV_Model.pyのロジックに従ったCNNアーキテクチャ
    x = Conv1D(64, 3, padding='same', activation='relu')(inputs)
    x = BatchNormalization()(x)
    x = MaxPooling1D(2)(x)
    x = Conv1D(128, 3, padding='same', activation='relu')(x)
    x = BatchNormalization()(x)
    x = MaxPooling1D(2)(x)
    
    x = Flatten()(x)
    x = Dense(64, activation='relu')(x)
    x = Dropout(0.3)(x)
    outputs = Dense(1, activation='sigmoid')(x)
    
    model = Model(inputs, outputs)
    model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
    model.fit(X_train, y_train, epochs=40, batch_size=64, validation_data=(X_val, y_val), 
              callbacks=[EarlyStopping(patience=10, restore_best_weights=True)], verbose=0)
    return model

def run_author_backtest(model, full_data, num_checks=20):
    """
    Backtests the last 20 hours to see if a 24-hour prediction 
    made at that time would have been correct.
    """
    print(f"\n--- BACKTEST TABLE (Last {num_checks} Prediction Points) ---")
    print(f"{'Time (UTC)':<20} | {'Pred (24h)':<10} | {'Actual (24h)':<12} | {'Result'}")
    print("-" * 75)
    
    wins = 0
    # バックテストのために24時間ウィンドウが実際に終了したことを確認するために、ステップバックする。
    for i in range(num_checks + PRED_WINDOW, PRED_WINDOW, -1):
        idx = len(full_data) - i
        
        # 1.その時点で利用可能な48時間のウィンドウを取得します。
        window = full_data.iloc[idx - WINDOW_SIZE : idx]
        timestamp = full_data.index[idx-1]
        
        # 2.24時間後に実際の結果を得る
        actual_price_then = window['close'].iloc[-1]
        actual_price_future = full_data.iloc[idx + PRED_WINDOW - 1]['close']
        actual_dir = 「UP▲」。 if actual_price_future > actual_price_then else 「ダウン▼」。
        
        # 3.ウィンドウに基づくモデル予測
        scaler = MinMaxScaler()
        window_scaled = scaler.fit_transform(window)
        pred_val = model.predict(np.array([window_scaled]), verbose=0)[0][0]
        pred_dir = 「UP▲」。 if pred_val > 0.5 else 「ダウン▼」。
        
        # 4.結果
        res = "✅ WIN" if pred_dir == actual_dir else "❌損失"
        if res == "✅ WIN": wins += 1
        
        print(f"{str(timestamp):<20} | {pred_dir:<10} | {actual_dir:<12} | {res}")

    print("-" * 75)
    print(f"TOTAL BACKTEST ACCURACY: {(wins/num_checks)*100:.2 f}% ({wins}/{num_checks})")

def main():
    if not connect_to_mt5(): return
    
    print(f"Loading {DATA_LOAD} bars for EURUSD...")
    data = get_historical_data(DATA_LOAD)
    if data is None: 
        mt5.shutdown()
        return

    # バックテスト・ウィンドウに含まれないデータでのみトレーニングする。
    train_data = data.iloc[:-(BACKTEST_ROWS + PRED_WINDOW)]
    images, targets = create_images(train_data, WINDOW_SIZE, PRED_WINDOW)
    
    print("Training model on ~1 year of data...")
    model = train_cv_model(images, targets)
    
    # 指定された通りにバックテストを実行する
    run_author_backtest(model, data, BACKTEST_ROWS)
    
    # 今すぐ(今後24時間)のライブ予報
    last_window = data.iloc[-WINDOW_SIZE:]
    scaler = MinMaxScaler()
    live_pred = model.predict(np.array([scaler.fit_transform(last_window)]), verbose=0)[0][0]
    live_dir = 「UP▲」。 if live_pred > 0.5 else 「ダウン▼」。
    
    print(f"\nLIVE FORECAST FOR NEXT 24 HOURS: {live_dir}")
    print(f"Confidence: {live_pred*100 if live_pred > 0.5 else (1-live_pred)*100:.2 f}%")
    input("Process complete. Press Enter to close this window...")
    
    mt5.shutdown()

if __name__ == "__main__":
    main()
バックテスト 予測の小さな変更を行った。