見出し画像

FX機械学習入門(3/6):MT5からデータの吸い出し、特徴量カラムの作成

機械学習でも色々種類があるんだけど、今回は教師有り学習の機械学習をしていきます。

教師有り学習は複数の特徴量から正解データを当てる手法です。例えるなら、問題集と答えを覚えさせることで正解を機械がパターンを覚えてて似たような問題なら答えを過去のパターンから導き出す方法です。

特徴量は問題集の問題で、答えと問題は1セットです。特徴と、答えは1セットです。特徴は複数あるといいみたいなので特徴を作るとこまでやってるみたいです。

Jupyter labを起動する

適当なファルダを作ってエディタを起動させます。

記事から引用し、日本語化させてます。通貨ペアをEURUSDmにしてあります。

import numpy as np
import pandas as pd
import random
from datetime import datetime
import MetaTrader5 as mt5
import time
import concurrent.futures
from tqdm import tqdm
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
from sklearn.utils import class_weight
from imblearn.under_sampling import RandomUnderSampler

# グローバル変数
MARKUP = 0.00001
BACKWARD = datetime(2000, 1, 1)  # 開始日
FORWARD = datetime(2010, 1, 1)   # 終了日
EXAMWARD = datetime(2024, 1, 1)  # 試験用の終了日
MAX_OPEN_TRADES = 3
symbol = "EURUSDm"#Exnessように変更したわ

def retrieve_data(symbol, retries_limit=300):

    attempt = 0
    raw_data = None

    # データ取得の再試行ループ
    while attempt < retries_limit:
        if not mt5.initialize():
            print("MetaTraderの初期化に失敗しました")
            return None

        instrument_count = mt5.symbols_total()
        if instrument_count > 0:
            print(f"端末内の通貨ペア数: {instrument_count}")
        else:
            print("端末内に通貨ペアがありません")

        rates = mt5.copy_rates_range(symbol, mt5.TIMEFRAME_H1, BACKWARD, EXAMWARD)
        mt5.shutdown()

        if rates is None or len(rates) == 0:
            print(f"{symbol}のデータが利用できません(試行回数 {attempt+1})")
            attempt += 1
            time.sleep(1)
        else:
            raw_data = pd.DataFrame(rates[:-1], columns=['time', 'open', 'high', 'low', 'close', 'tick_volume'])
            raw_data['time'] = pd.to_datetime(raw_data['time'], unit='s')
            raw_data.set_index('time', inplace=True)
            break

    if raw_data is None:
        print(f"{retries_limit}回の試行後にデータ取得に失敗しました")
        return None

    # 単純な特徴量を追加
    raw_data['raw_SMA_10'] = raw_data['close'].rolling(window=10).mean()
    raw_data['raw_SMA_20'] = raw_data['close'].rolling(window=20).mean()
    raw_data['Price_Change'] = raw_data['close'].pct_change() * 100

    # 追加の特徴量
    raw_data['raw_Std_Dev_Close'] = raw_data['close'].rolling(window=20).std()
    raw_data['raw_Volume_Change'] = raw_data['tick_volume'].pct_change() * 100

    raw_data['raw_Prev_Day_Price_Change'] = raw_data['close'] - raw_data['close'].shift(1)
    raw_data['raw_Prev_Week_Price_Change'] = raw_data['close'] - raw_data['close'].shift(7)
    raw_data['raw_Prev_Month_Price_Change'] = raw_data['close'] - raw_data['close'].shift(30)

    raw_data['Consecutive_Positive_Changes'] = (raw_data['Price_Change'] > 0).astype(int).groupby((raw_data['Price_Change'] > 0).astype(int).diff().ne(0).cumsum()).cumsum()
    raw_data['Consecutive_Negative_Changes'] = (raw_data['Price_Change'] < 0).astype(int).groupby((raw_data['Price_Change'] < 0).astype(int).diff().ne(0).cumsum()).cumsum()
    raw_data['Price_Density'] = raw_data['close'].rolling(window=10).apply(lambda x: len(set(x)))
    raw_data['Fractal_Analysis'] = raw_data['close'].rolling(window=10).apply(lambda x: 1 if x.idxmax() else (-1 if x.idxmin() else 0))
    raw_data['Price_Volume_Ratio'] = raw_data['close'] / raw_data['tick_volume']
    raw_data['Median_Close_7'] = raw_data['close'].rolling(window=7).median()
    raw_data['Median_Close_30'] = raw_data['close'].rolling(window=30).median()
    raw_data['Price_Volatility'] = raw_data['close'].rolling(window=20).std() / raw_data['close'].rolling(window=20).mean()

    print("\n元のカラム:")
    print(raw_data[['close', 'high', 'low', 'open', 'tick_volume']].tail(100))

    print("\n特徴量リスト:")
    print(raw_data.columns.tolist())

    print("\n最後の100の特徴量:")
    print(raw_data.tail(100))

    # NaN値を平均値で置換
    raw_data.fillna(raw_data.mean(), inplace=True)

    return raw_data

raw_data = retrieve_data(symbol)

ChatGPTの解説

1. 必要なライブラリのインポート

  • numpy, pandas はデータ操作に広く使われるライブラリです。

  • random はランダムな数値の生成に使います。

  • datetime は日付と時間を扱います。

  • MetaTrader5 (mt5) はMetaTrader 5プラットフォームとのインターフェースを提供します。MetaTraderは外国為替市場(Forex)での取引に広く使われるプラットフォームです。

  • time は時間に関連した関数を提供します。

  • concurrent.futures は並列タスク実行に使用されます。

  • tqdm はプログレスバーの表示に使われます。

  • sklearn.model_selectiontrain_test_split はデータセットを訓練セットとテストセットに分割するのに使われます。

  • matplotlib.pyplot はグラフ描画に使用されます。

  • sklearn.utilsclass_weight はクラスの重みを計算するのに使用されます。

  • imblearn.under_samplingRandomUnderSampler は不均衡データのサンプリングに使われます。

2. グローバル変数の設定

この部分では、分析に使用する変数や日付の範囲、取引の最大数など、プログラム全体で使用される変数を定義しています。

3. retrieve_data 関数

この関数は、MetaTrader 5プラットフォームから特定のシンボル(例えば、EURUSDなどの通貨ペア)の市場データを取得し、加工するためのものです。具体的なステップは以下の通りです。

  • MetaTrader 5を初期化し、指定された通貨ペアのデータを特定の期間で取得します。

  • 取得したデータを pandas のDataFrameに変換し、タイムスタンプを日付型に変換してインデックスとして設定します。

  • 様々な技術指標や特徴量をデータに追加します。これには、単純移動平均 (SMA)、価格の変動率、ボリュームの変動率、過去の価格変化、連続した価格上昇(または下降)の日数などが含まれます。

  • 欠損値を処理します。この例では、欠損値を列の平均値で置換しています。

4. 実行部分

最後に、retrieve_data 関数を呼び出し、EURUSDの市場データを取得し、加工します。

参考:




この記事が気に入ったらサポートをしてみませんか?