はじめに
システムトレードは、コンピュータが自動的に取引を行う仕組みのことです。そのためにはデータを分析して、どのように取引を行うかの判断をコンピュータに学ばせることが必要です。そこで役立つのが機械学習です。今回は、その機械学習の1つである「教師なし学習」について、解説していきます。
機械学習とは?
まずは、機械学習について簡単に説明します。
機械学習とは、コンピュータに膨大なデータを学ばせることで、データから何かしらのパターンや関係性を見つけ出させる技術です。これにより、コンピュータは新しいデータを分析して判断を下すことができるようになります。
機械学習には大きく分けて3つの種類があります。
それが教師あり学習、教師なし学習、そして強化学習です。今回は、この中の「教師なし学習」に焦点を当てて説明します。
※機械学習全般についての詳細については下記の記事をご参照ください
教師なし学習とは?
教師なし学習とは、データに「答え」を与えずに、コンピュータ自身がデータの中のパターンや共通点を見つける学習方法です。
教師なし学習と教師あり学習の違い
教師あり学習は、データに「正しい答え」を与えて学ばせます。例えば、猫の画像と犬の画像を与えて、それぞれが何であるかを教えることで、コンピュータは猫と犬を区別できるようになります。
一方、教師なし学習では「これは猫、これは犬」といったラベル(答え)を与えません。
※ここで言うラベルとは、データに対してその内容を示す「名前」や「カテゴリー」のことです。コンピュータはただ画像を見て、そこにあるパターンや似た特徴をグループ化するだけです。つまり、データの中の「隠れた構造」を見つけることを目指しています。
※教師あり学習については下記の記事をご参照ください↓
教師なし学習の種類
教師なし学習にはいくつかの方法があります。その中でも代表的なものをいくつか紹介します。
1. クラスタリング
クラスタリングとは、データを「似たもの同士のグループ」にまとめる方法です。
例えば、多くの果物の写真があった場合、それらを「形や色の似たものごとにグループ化」することをします。クラスタリングを使うと、コンピュータは自動的に「リンゴ」「バナナ」「オレンジ」といったグループを作り出します。
※クラスタリングについての詳細は下記の記事をご参照ください。
2. 次元削減
次元削減は、たくさんの情報から重要な部分だけを取り出して、データの複雑さを減らす方法です。
例えば、大量の生徒の成績データがあったとします。このデータから、成績の傾向をつかむために重要な科目だけを選んで分析することが次元削減です。
コンピュータが次元削減を行うことで、データの特徴をより分かりやすくまとめることができます。
教師なし学習の使い道
教師なし学習は、以下のような場面で役立ちます。
1. 顧客のグループ分け
例えば、お店でたくさんの顧客がいるとします。それぞれのお客様の購買行動から「似たような商品を買う人たち」を見つけ出し、顧客をグループに分けることができます。このようにして、グループごとに異なるマーケティング戦略を立てることができます。
2. 異常検知
異常検知とは、普段とは違う「おかしなデータ」を見つけることです。このような異常なデータや動きを「アノマリー」と呼ぶことがあります。
例えば、銀行では不正な取引を見つけるために教師なし学習が使われます。普段の取引パターンから外れる動きを見つけることで、怪しい取引を発見することができます。
※アノマリーについての詳細は下記の記事をご参照ください。↓
システムトレードでの教師なし学習の役割
システムトレードでは、大量の価格データや取引データを利用して、次のようなことを行います。
市場のパターンを見つける
市場の価格には何らかのパターンが隠れていることがあります。教師なし学習を使うことで、価格の動きにおけるパターンや、相場がどう動くかの手がかりを見つけることができます。例えば、過去のデータをクラスタリングすることで、相場の似たような動きやタイミングを発見することができます。
リスクの管理
取引を行う上でリスクを管理することは非常に重要です。教師なし学習を使って、過去のデータの中からリスクが高い取引のパターンを見つけ出すこともできます。これにより、リスクの高い場面では取引を控えたり、リスクに応じた戦略を取ることができます。
教師なし学習を実践するPythonのサンプルコード
ここでは、教師なし学習のクラスタリングを行うPythonのサンプルコードを紹介します。このコードでは「K-meansクラスタリング」という手法を使ってデータをグループ化します。
※K-meansクラスタリングについての詳細は下記の記事をご参照ください。
# 必要なライブラリをインポート
# numpy: 数値計算用のライブラリ
# pandas: データの操作や処理に便利なライブラリ
# sklearn: 機械学習の手法を提供するライブラリ
import numpy as np # 数値計算ライブラリnumpyをnpという短い名前で使えるようにします
import pandas as pd # データ処理ライブラリpandasをpdという短い名前で使えるようにします
from sklearn.cluster import KMeans # クラスタリング手法であるKMeansをsklearnからインポートします
import matplotlib.pyplot as plt # グラフ描画ライブラリmatplotlibのpyplotモジュールをpltという短い名前で使えるようにします
# サンプルデータの作成
# 今回は2次元のデータポイントを作成します
# 2次元データの例として、50個のランダムなポイントを生成します
np.random.seed(42) # 再現性のために乱数のシードを設定します(同じシードを使うと毎回同じデータが生成されます)
# 2次元のデータ(x座標とy座標)を生成
x = np.random.rand(50) # 0から1までのランダムな値を50個生成してx座標とします
y = np.random.rand(50) # 同様に、0から1までのランダムな値を50個生成してy座標とします
# データをDataFrameにまとめる(データの可視化や処理がしやすくなります)
# DataFrameは表形式のデータを扱うための便利な構造です
data = pd.DataFrame({'x': x, 'y': y}) # xとyの値を持つDataFrameを作成します
# KMeansクラスタリングの実行
# クラスタ数を3に設定して、データを3つのグループに分けます
kmeans = KMeans(n_clusters=3, random_state=42) # KMeansクラスのインスタンスを作成し、クラスタ数を3に設定します
kmeans.fit(data) # fitメソッドを使ってデータをクラスタリングします(クラスタリングの実行)
# クラスタリングの結果として、各データポイントがどのグループに属するかを取得
labels = kmeans.labels_ # クラスタのラベル(グループ番号)を取得します
# データの可視化
# 各データポイントを散布図でプロットし、グループごとに色分けします
plt.scatter(data['x'], data['y'], c=labels, cmap='viridis') # 散布図を描画し、c引数で各データポイントの色をグループごとに設定します
plt.xlabel('X軸') # X軸のラベル
plt.ylabel('Y軸') # Y軸のラベル
plt.title('KMeansによるクラスタリング結果') # グラフのタイトル
plt.show() # グラフを表示します
サンプルコードの説明
- ライブラリのインポート:
import numpy as np
:numpy
は数値計算用のライブラリで、np
という短い名前で呼び出せるようにします。こうすることでコードが簡潔になります。
import pandas as pd
:pandas
はデータを扱うのに便利なライブラリです。表形式のデータを操作することが得意で、pd
という短い名前で呼び出せるようにします。
from sklearn.cluster import KMeans
:import matplotlib.pyplot as plt
:matplotlib
のpyplot
モジュールはグラフを描画するためのライブラリで、plt
という短い名前で呼び出せるようにします。
- データの作成:
np.random.seed(42)
:np.random.seed()
は乱数を生成する際の「シード」を設定する関数です。
- シードとは、乱数を作り出すための出発点の値のことです。同じシードを使うと、毎回同じ順番で同じ乱数が生成されます。例えば、友達と同じレシピを使って料理をすると、同じ味になるように、シードを使うことで毎回同じ結果を得ることができます。これにより、結果の再現性が確保されます。
x = np.random.rand(50)
:np.random.rand(50)
は0から1までのランダムな実数値を50個生成する関数です。このランダムな値をx
という変数に代入しています。
y = np.random.rand(50)
:- 同様に、
y
もランダムな値を50個生成します。
- 同様に、
data = pd.DataFrame({'x': x, 'y': y})
:pandas
のDataFrame
を使って、x
とy
のデータを表形式にまとめます。DataFrame
は行と列でデータを管理できるので、可視化や分析がしやすくなります。
- KMeansクラスタリングの実行:
kmeans = KMeans(n_clusters=3, random_state=42)
:kmeans.fit(data)
:labels = kmeans.labels_
:labels_
属性を使って、各データポイントがどのクラスタに属するかを示すラベル(グループ番号)を取得します。このラベルは各データが属するクラスタの情報です。
- データの可視化:
plt.scatter(data['x'], data['y'], c=labels, cmap='viridis')
:plt.scatter()
は散布図を描画する関数です。data['x']
とdata['y']
でデータポイントの座標を指定し、c=labels
で各ポイントの色をクラスタラベルに基づいて設定します。cmap='viridis'
はカラーマップの指定です。
plt.xlabel('X軸')
とplt.ylabel('Y軸')
:- X軸とY軸のラベルをそれぞれ設定します。
- plt.title(‘KMeansによるクラスタリング
結果')
:- グラフのタイトルを設定します。
plt.show()
:- グラフを画面に表示する関数です。
教師なし学習の限界
教師なし学習には強みもありますが、限界もあります。
- 答えがないため評価が難しい:教師なし学習では「正しい答え」がないため、学習結果がどれほど良いものなのかを判断するのが難しいです。
例えば、クラスタリングの結果としてデータがいくつかのグループに分けられたとしても、それが正しい分け方であるかどうかを判断する基準がありません。 - 結果が必ずしも意味を持つとは限らない:データをグループ化したりパターンを見つけたりしても、その結果が現実世界で役立つかどうかはわからないことがあります。
例えば、クラスタリングによって作られたグループが、ビジネスの観点で全く有用でないこともあります。見つけたパターンが偶然の産物であり、実際の問題解決に寄与しないこともあるため、得られた結果を慎重に評価する必要があります。
まとめ
教師なし学習は、データに「答え」を与えずに、データの中のパターンや共通点を見つける技術です。クラスタリングや次元削減といった方法を用いて、システムトレードやさまざまな場面で活用されています。ただし、答えがないため評価が難しいといった課題もあります。
システムトレードで教師なし学習を活用することで、取引パターンやリスク管理などに役立つ情報を得ることができます。この技術をうまく使うことで、より賢い取引が可能になるかもしれません。