English Русский 中文 Español Deutsch Português
preview
ニューラルネットワークが簡単に(第14部):データクラスタリング

ニューラルネットワークが簡単に(第14部):データクラスタリング

MetaTrader 5 | 16 8月 2022, 10:22
412 0
Dmitriy Gizlyk
Dmitriy Gizlyk

内容

はじめに

この連載では、さまざまなニューラルネットワークアルゴリズムの研究において、すでにかなりの進歩を遂げていますが、これまで考察してきたアルゴリズムはすべて、教師ありモデルの学習原理に基づいていました。これは、モデルが参照結果に非常に近い値を返すように、一部の履歴データと最適化した重みをモデルに入力することを意味します。実際、このアプローチは通常、最大の結果を生み出します。ただし、この学習プロセスを実装するには、訓練サンプルの履歴データに加えて、システムの各状態の参照結果も必要です。ご理解のとおり、参照値の作成には、訓練サンプルを作成する際に追加の人件費がかかります。さらに、各システム状態に対して明確な参照結果を与えることが常に可能であるとは限りません。結果として、これは訓練サンプルの可能なサイズに制限を課します。

人工知能の学習方法には、「教師なし学習」という別のアプローチがあります。この方法では、参照値を提供する必要なく、元のデータのみを使用したモデルの訓練が可能になります。訓練サンプルを準備する際の人件費が削減されるため、より多くの入力データを使用してモデルを訓練できます。ただし、可能なタスクも制限されます。

この記事では、以前に使用されたいくつかのニューラルレイヤーで構成されるニューラルネットワークの垂直構造については説明しません。まず必要なことから始めていきます。可能なアルゴリズムを考えて、取引でどのように使用できるか見てみましょう。

1.教師なし学習

通常、AIアルゴリズム開発の分野では、次の3つの領域が区別されています。

  • 教師あり学習:
  • 教師なし学習
  • 強化学習

名前からわかるように、それらの主な違いは、モデルの訓練へのアプローチにあります。最初の方法である教師あり学習については、本連載の以前の記事で詳しく説明しました。この方法を実装するには、「システム状態 - 正しい出力」というラベル付きの値のペアを持つ訓練セットが必要です。実際、このアプローチは通常、最大の結果を生み出します。ただし、追加のリソース(人的資源を含む)と、ラベル付けされた訓練セットを準備するための時間も必要です。さらに、各システム状態の明確な参照結果を常に見つけることができるとは限りません。同時に、ある程度の確率で人的要因を考慮に入れる必要があります。場合によっては、これらの理由が、訓練データセットの生成における主な制限となることがあります。

では、初期データがたくさんあるのにそれらについての知識がほとんどない場合、どうすればよいでしょうか。学習プロセスの各状態の特定の参照値にラベル付けできない場合や、この参照値がどうあるべきかさえわからない場合はどうでしょうか。これらは、大量のデータと最初に遭遇したときに非常に頻繁に発生するケースです。各システム状態の正しい参照出力を見つけるためにリソースを費やす代わりに、教師なし学習に切り替えます。タスクに応じて、教師なしモデル学習を使用して、問題の解決策を取得したり、初期データを前処理したりできます。

教師あり学習法と教師なし学習法によって解決される問題は大きく異なります。たとえば、教師なし学習を使用して回帰問題を解くことはできません。教師あり学習法によって解決された分類タスクと、教師なし学習アルゴリズムによって解決されたクラスタリングの問題が比較されるかもしれませんが、この2つの言葉の似通った意味の裏には、全く異なる論理があります。多くの場合、これら2つの方法では、まったく異なる結果が生成されます。教師ありの分類を使用する場合、どのシステム状態がどのクラスに対応するかを学習するモデルを提供します。教師なしクラスタリングでは、この状態を説明する一連の特徴に基づいて、システムの状態をどのクラスタに帰属させるかを個別に決定するモデルを提供します。この場合、作業の開始時にそのようなクラスタの数さえわからない場合があります。この数値はシステムのハイパーパラメータであり、モデルを訓練する過程で選択できます。

教師なし学習アルゴリズムによって解決される2つ目の問題は、異常の検索です。つまり、モデルは特定のシステムの特徴ではないが、さまざまな外的要因によりわずかな確率で現れる可能性がある状態を検索する必要があるということです。

教師なし学習アルゴリズムによって解決されるもう1つの問題は、データの次元削減です。以前の記事で、畳み込みネットワークを使用して同様の問題を解決したことを思い出してください。ただし、教師あり学習では、この特定のタスクに特徴的な特定の特徴を探していたのとは対照的に、教師なし学習では、失われる情報を最小限に抑えてデータを圧縮する必要があります。

教師なし学習アルゴリズムによって解決されるすべての問題を見ると、そのようなアプローチの主なタスクは、入力データで見つかった特徴を研究して一般化することであると言えます。このアプローチでは、モデルはシステムの状態を表す特徴を個別に調査できます。これは、教師あり学習の問題を解決する際にもよく使用されます。この場合、モデルはまず大量のデータに対して教師なし学習アルゴリズムを使用して訓練されます。システムは、可能な限りシステムの特徴を学習する必要があります。次の手順として、少量のラベル付きデータを使用して特定の問題を解決するようにモデルを訓練します。

ご覧のとおり、教師なし学習アルゴリズムを使用してさまざまな問題を解決することができますが、それらはどのように取引に使用できるのでしょうか。考えてみましょう。グラフィカルな分析方法には、ほとんどの場合、ダブルトップ・ダブルボトム、ヘッドアンドショルダー、フラッグ、ハーモニーパターン各種などの、特定のチャートパターンが含まれます。さらに、ローソク足が1~3本の小さなパターンもたくさんあります。ただし、数学言語で特定のパターンを記述しようとすると、多数の規則と許容誤差に対処する必要があるため、アルゴリズム取引での使用が複雑になります。人間のトレーダーがパターンを決定する場合でさえ、多くの主観があるため、同じチャートを分析した異なるトレーダーが異なるパターンを特定し、逆方向の予測の動きを示すことがよくあります。これはおそらく取引全体の基本的なルールでしょう。利益を出す人もいれば、損をする人もいるということです。取引プロセスでは、新しい商品素材の価値は作成されず、マネーサプライは変更されません。あるウォレットから別のウォレットに移動するだけです。では、どうすれば損失を回避できるでしょうか。

ヘッドアンドショルダーのパターン

上記のチャートパターンをもう一度見てみましょう。それらにはすべてバリエーションがありますが、同時に、各パターンには固有の構造があり、一般的な価格変動チャートに対してそれを識別します。では、教師なしデータクラスタリングアルゴリズムを使用して、モデルが特定の期間のデータで考えられるすべての変動を識別できるようにするとどうなるでしょうか。教師なし学習を使用しているため、データにラベル付けする必要はなく、期間を非常に長くする可能性があります。ただし、履歴期間が長くなると、モデルの訓練コストが増加します。

2.k-meansアルゴリズム

上記で提案されたクラスタリングの問題を解決するために、最も単純で最も理解しやすい方法の1つであるk-meansを使用します。その単純さにもかかわらず、この方法はデータクラスタリングの問題を解決するのに効果的であり、単独で、またはデータの前処理に使用できます。

メソッドを使用できるようにするには、システムの各状態を、1つのベクトルに収集された特定のデータセットによって記述する必要があります。このような各ベクトルは、N次元空間内の点の座標を表します。空間の次元は、システム状態記述ベクトルの次元と同じです。

平面の初期データ

この方法のアイデアは、システムのすべての既知の状態をクラスタに結合できるような中心(ベクトル)を見つけることです。システムのすべての状態から対応するクラスタの中心までの平均距離は、最小になるはずです。これが、メソッド名「k-means」の由来です。このようなクラスタの数は、モデルのハイパーパラメータです。これは、モデルの設計または検証段階で決定されます。

「…モデルの設計または検証段階で決定」というフレーズは、少し奇妙に聞こえるかもしれません。これらの概念は、時間的にも、モデルの作成と訓練の段階によっても分離されているようです。しかし、ケースは異なります。問題を設定するときに、そのようなクラスタの数が指定される場合があります。これは、顧客が以前の経験または計画された使用に基づいてクラスタの数を明確に理解している場合に発生します。または、データの視覚化中に個別のクラスタの数を明確に確認できます。このような場合、探しているクラスタの数をモデルにすぐに示すことができます。

また、クラスタ数を明確に決定するための十分な知識がない場合は、最適なクラスタ数を決定するために一連のモデル訓練を実施する必要があります。これは少し後で説明します。次に、メソッド操作アルゴリズムを分析しましょう。

上の図は、平面上のランダムな100点の視覚化を示しています。データの視覚化は、その構造を理解するのに役立ちますが、この方法では必須ではありません。ご覧のとおり、点は平面全体に非常に均等に分布しており、クラスタを視覚的に明確に区別することはできません。したがって、その数を知ることはできません。最初の実験では、たとえば5つのクラスタを使用します。

数はわかりましたが、中心はどこに配置すればよいでしょうか。重みを初期化したときに行列にランダムな値を入力したことを覚えていらっしゃるでしょうか。ここでもほぼ同じことをおこないます。ただし、ランダムなベクトルは初期データから除外される可能性があるため、生成しません。訓練セットから5つのランダムな点を取得します。以下の図では、それらはXでマークされています。

クラスタの中心の追加

次に、各点から各中心までの距離を計算する必要があります。直線(1次元空間)上の2点間の距離を求めることは、それほど難しいことではないと思います。平面上の2点間の距離を決定するには、学校の数学で習ったピタゴラスの定理を使用します。この定理は、斜辺の二乗は他の2辺の二乗の和に等しいと述べています。したがって、平面上の2点間の距離は、座標軸上の点の投影間の距離の2乗の和の平方根に等しくなります。簡単に言えば、対応する座標の差の二乗和です。N-1平面への点の射影に同様のアプローチを適用すると、N次元空間に対して同様の等式が得られます。

点間距離の算出式

各クラスタの中心までの距離がわかっているため、最も近い点によって、そのポイントがこのクラスタに属していると判断されます。反復処理で、訓練サンプルのすべての点の距離とクラスタを決定します。その後、単純な算術平均を使用して、各クラスタの新しい中心を決定します。次の図は、最初の反復の結果を示しています。各クラスタの点は、個別の色で色付けされます。

最初の反復 

ご覧のとおり、最初の反復の後、点はクラスタ間で不均一に分散されます。しかし、クラスタの中心は、前のチャートと比較してシフトしています。したがって、クラスタの中心までの距離を繰り返し再計算している間に、点がどのクラスタに属しているかを判断するときに、クラスタ全体の点の分布が変化します。

クラスタの中心が動かなくなり、点が属するクラスタが変更されなくなるまで、このような反復処理を繰り返します。

データサンプルを数回反復処理した後、次の結果が得られました。ご覧のとおり、クラスタ全体で訓練シーケンス点がかなり均一に分布しています。

最終分布 

考察されたアルゴリズムを要約しましょう。

  1. 訓練サンプルからk個のランダムな点をクラスタの中心として決定する
  2. 操作の反復処理を編成する
    • 各点から各中心までの距離を決定する
    • 最も近い中心を見つけて、このクラスタに点を割り当てる
    • 算術平均を使用して各クラスタの新しい中心を決定する
  3. クラスタの中心が「動かなくなる」まで反復処理で操作を繰り返す

この例では、点から中心までの特定の距離には関心がなく、最短距離を見つけるだけのため、リソースを節約するために、距離を計算するときに結果の合計の平方根を計算しません。これは、データクラスタリングの結果にまったく影響を与えないためです。

この段階で、訓練サンプルデータをクラスタに分割しました。次に、このクラスタ数が最適であることはどのようにわかるでしょうか。教師あり学習と同様に、訓練済みモデルの品質を評価し、異なるハイパーパラメータを使用した場合のモデルのパフォーマンスを比較するのに役立つ損失関数を導入します。クラスタリングの問題の場合、このような損失関数は、対応するクラスタの中心からの点の平均偏差です。それは以下の式により算出されます。

損失関数

ここで、

  • mは、訓練サンプルの要素数
  • Nは、訓練サンプルからの1つの要素の記述ベクトルのサイズ
  • Xi jは、訓練サンプルのj番目の要素の記述ベクトルのi番目の値
  • Ci x jは、訓練サンプルのj番目の要素が属するクラスの中心ベクトルのi番目の値

上記の式からわかるように、クラスタの数が訓練サンプルの要素の数と等しい場合、損失関数の値は0になります。ただし、訓練サンプル全体をクラスタの中心の行列にコピーしたくはありません。反対に、データを一般化して、各クラスタの可能なパターンを探す方法を見つけることが目的です。

異なる数のクラスタを使用して、同じ訓練セットのクラスタリングを繰り返しました。下の図は、損失関数のクラスタ数への依存性を示しています。損失関数の値を表示しなかったのは、入力データによって大きく異なる可能性があるためです。同時に、クラスタの数も訓練サンプルに依存するため、指定された値に依存するべきではありません。ここで提供されているのは、グラフを説明するためにのみです。重要なのはチャート解釈の原則を理解することです。

誤差のクラスタ数への依存性

上のグラフは、クラスタの数が2から4に変化すると、誤差関数の値が急激に減少することを明確に示しています。さらにクラスタ数が6になると、誤差関数値の減少率は徐々に減少し、クラスタ数が6から7に変化しても、誤差関数の値はほとんど変化しません。これは、損失関数の平滑化された変化です。ただし、特定の点でグラフが「ブレイク」することがあります。この現象は、訓練データが明確に分離できる場合によく発生します。

グラフを解釈するための一般的なルールは次のとおりです。

  • グラフに「ブレイク」がある場合、最適なクラスタ数はブレイクした点にある
  • グラフが平滑化されたら、織れた領域の品質とパフォーマンスのバランスを見つける  

サンプルサイズが小さく、クラスタの数が少ないため、この例では5、6のクラスタを使用することをお勧めします。

3.Python実装

例として抽象データを使用して、k-means法の理論的側面について説明しました。合理的な質問は、この方法が実際のデータに対してどのように機能するかということです。この質問に答えるために、MetaTrader 5とPythonの統合を使用します。Pythonには、ほとんどすべてのニーズに対応できる多数のライブラリが用意されています。

統合ツールについては、このサイトですでに何度も言及されていますが、ライブラリのインストール手順はドキュメントに記載されています。

3.1.ライブラリをインクルードする

タスクを実装するためにはいくつかのライブラリを使用します。まずMetaTrader5ライブラリです。このライブラリは、PythonとのMetaTrader 5ターミナル統合のすべてのポイントを実装します。

2番目に使用するライブラリはScikit-Learnです。このライブラリは、データ分析のためのシンプルで効果的なツールを提供します。特に、いくつかのデータクラスタリングアルゴリズムが実装されており、そのうちの1つが、ここで考察しているk-means法です。

データの視覚化は、Matplotlibライブラリを使用して実装されます。

MetaTrader 5とPython統合ツールを使用して、口座のステータス、取引操作、市場状況に関する情報をスクリプトに転送できます。ただし、指標などの内部プログラムのデータを使用することはできないため、指標の実装全体をPython側で再現する必要があります。タスクを簡単にするために、さまざまなテクニカル分析ツールを提供するTA-Libライブラリを使用します。

スクリプトの作成に進む前に、これらすべてのライブラリとPythonインタープリタをコンピュータにインストールします。このプロセスは、この記事の範囲を超えていますが、問題がある場合は、記事へのコメントでお答えします。 

3.2.スクリプトの作成

使用するライブラリのリストを決定したので、スクリプトの作成を開始します。スクリプトコードをclustering.pyとして保存します。

スクリプトの先頭に、必要なライブラリをインクルードします。

# Import Libraries
import numpy as np
import matplotlib.pyplot as plt
import MetaTrader5 as mt5
from talib import abstract as tl
import sklearn.cluster as cluster
from datetime import datetime as dt


次に、ターミナルへの接続を整理します。動作の正確性を確認します。エラーが発生した場合は、関連するメッセージを表示してプログラムを終了します。

# Connect to the MetaTrader 5 terminal
if not mt5.initialize():
    print("initialize() failed, error code =",mt5.last_error())
    quit()


ターミナルへの接続が成功したら、分析された期間の履歴データをダウンロードし、ターミナルから切断します。

# Downloading quotes
rates=mt5.copy_rates_range('EURUSD',mt5.TIMEFRAME_H1,dt(2006,1,1),dt(2022,1,1))
mt5.shutdown()


履歴データが利用可能になったので、指標値の決定に移りましょう。このブロックでは、教師あり学習でさまざまなモデルをテストするときに使用したのと同じ指標の値を計算します。これらは古典的なオシレータ(RSI、CCI、MACD)です。

# Calculate indicator values
rsi=tl.RSI(rates['close'])
cci=tl.CCI(rates['high'],rates['low'],rates['close'])
macd,macdsignal,macdhist=tl.MACD(rates['close'])


これでソースデータができましたが、6つのテンソルに分割されており、分析のためには1つのテンソルに結合する必要があります。以下にご注目ください。クラスタリング関数は、2次元配列を入力として受け取るように構成されています。この配列の行は、個別のパターンと見なされます。すべてのテンソルを1つに結合することにより、2次元配列も得られます。その各行には1つの個々のローソク足に関する情報が含まれています。この形で使えますが、これは個々のローソク足のクラスタリングになります。この情報は役に立つでしょうか。複数のローソク足で構成されるパターンを探したい場合は、テンソルの次元を変更する必要があります。ただし、単に次元を変更するだけでは、要件を完全に満たすことはできません。これは、移動ステップがそのサイズに等しいローリングウィンドウを使用するようなものです。ただし、各ローソク足でのパターンを知る必要があるため、データのコピーでテンソルを再フォーマットする必要があります。以下の例は、テンソルを結合し、データをコピーして20個のローソク足のパターンを作成するコードを示しています。指標値が定義されていない履歴データのカットオフに注意してください。

# Group the training sample
data=np.array([rates['close']-rates['open'],rates['high']-rates['close'],rates['close']-rates['low'],
                                                                   rsi,cci,macd,macdsignal,macdhist]).T
s=data.shape[0]
data=np.hstack([data[40+k:s-20+k] for k in range(0,20)])


これで、データの準備プロセスは完了したので、データクラスタリングに進むことができます。ただし、必要なクラスタ数を見積もるには、異なる数のクラスタでいくつかのテストを実行する必要があります。この例では、50から1000クラスタの範囲で、50クラスタの増分でクラスタリングを実行しました。

# Perform clustering with a different number of clusters
R=range(50,1000,50)
KM = (cluster.KMeans(n_clusters=k).fit(data) for k in R)


次に、各ケースのエラーを決定し、取得したデータを視覚化します。

distance=(k.transform(data) for k in KM)                      
dist = (np.min(D, axis=1) for D in distance)
avgWithinSS = [sum(d) / data.shape[0] for d in dist]
# Plotting the model training results
plt.plot(R, avgWithinSS)
plt.xlabel('$Clasters$')
plt.title('Loss dynamic')
# Display generated graphs
plt.show()


これで、スクリプトコードでの作業は終了です。次に来るのはテストです。指標のコード全体は本稿に添付されています。

4.テスト

Pythonスクリプトを作成し、テストすることができます。すべてのテスト パラメータは、スクリプトコードで指定されます。

  • 銘柄:EURUSD
  • 時間枠:H1
  • 履歴間隔:2006年1月1日から2022年1月1日までの16年間
  • クラスタ数:50から1000まで(50ずつ増加)

以下は、クラスタ数に対する損失関数の依存性を示すグラフです。 

モデル誤差に対するクラスタ数の影響

グラフでわかるように、ブレイクはかなり伸びていることがわかりました。最適なクラスタ数は400から500のようです。合計で、システムの98,641の状態を分析しました。

結論

この記事では、教師なし学習アルゴリズムの1つであるk-meansデータクラスタリング手法を紹介します。Pythonライブラリを使用してスクリプトを作成し、異なる数のクラスタでモデルを訓練しました。テスト結果に基づいて、モデルは約500のパターンを識別できたと結論付けることができます。もちろん、それらすべてが取引操作の明確なシグナルを提供するわけではありません。実際に得られた結果をどのように使用するかについては、次の記事で説明します。


参考文献リスト

  1. ニューラルネットワークが簡単に
  2. ニューラルネットワークが簡単に(第2部):ネットワークのトレーニングとテスト
  3. ニューラルネットワークが簡単に(第3部):コンボリューションネットワーク
  4. ニューラルネットワークが簡単に(第4部):リカレントネットワーク
  5. ニューラルネットワークが簡単に(第5部):OPENCLでのマルチスレッド計算
  6. ニューラルネットワークが簡単に(第6部):ニューラル ネットワークの学習率の実験
  7. ニューラルネットワークが簡単に(第7部):適応的最適化法
  8. ニューラルネットワークが簡単に(第8部):アテンションメカニズム
  9. ニューラルネットワークが簡単に(第9部):作業の文書化
  10. ニューラルネットワークが簡単に(第10部):Multi-Head Attention
  11. ニューラルネットワークが簡単に(第11部):GPTについて
  12. ニューラルネットワークが簡単に(第12部):ドロップアウト
  13. ニューラルネットワークが簡単に(第13部):Batch Normalization

記事で使用されているプログラム

# ファイル名 タイプ 詳細
1 clustering.py スクリプト データクラスタリング - Pythonスクリプト



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

添付されたファイル |
clustering.py (2.97 KB)
ビデオ:シンプルな自動取引 – MQL5でシンプルなエキスパートアドバイザーを作成する方法 ビデオ:シンプルな自動取引 – MQL5でシンプルなエキスパートアドバイザーを作成する方法
私のコースの学生の大半は、MQL5を理解するのが本当に難しいと感じていました。これに加えて、彼らはいくつかのプロセスを自動化する簡単な方法を探していました。この記事に含まれる情報を読んで、今すぐMQL5のを使い始める方法を見つけてください。これまでに何らかの形のプログラミングをおこなったことがない場合でも、観察した前のイラストを理解できない場合でも.です。
一からの取引エキスパートアドバイザーの開発(第15部):Web上のデータにアクセスする(I) 一からの取引エキスパートアドバイザーの開発(第15部):Web上のデータにアクセスする(I)
MetaTrader5ではどのようにオンラインデータにアクセスするのでしょうか。Web上にはたくさんのサイトや場所があり、膨大な量の情報が掲載されています。知るべきことは、どこを調べて、この情報をどのように使用するのが最善かということです。
DoEasy - コントロール(第6部):パネルコントロール、内部コンテンツに合わせたコンテナサイズの自動変更 DoEasy - コントロール(第6部):パネルコントロール、内部コンテンツに合わせたコンテナサイズの自動変更
本稿では、Panel WinFormsオブジェクトの作業を続け、パネル内にあるDockオブジェクトの一般的なサイズに合わせた自動サイズ変更を実装します。さらに、銘柄ライブラリオブジェクトに新しいプロパティを追加します。
データサイエンスと機械学習(第03回):行列回帰 データサイエンスと機械学習(第03回):行列回帰
今回のモデルは行列によって作成されています。これにより柔軟性が得られ、コンピュータの計算限界内に留まる限り、5つの独立変数だけでなく多くの変数を処理できる強力なモデルを作成できます。この記事を面白く読めることは間違いありません。