はじめに
機械学習を利用したシステムトレードでは、大量のデータを効率的に分類し、隠れたパターンや異常値を見つけることが重要です。
その際に役立つ手法の1つが「DBSCANクラスタリング」です。本記事では、DBSCANクラスタリングについての基本的な仕組みから具体的な活用方法まで、初学者の方にもわかるように解説していきます。
クラスタリングとは?
データをグループ化する方法
クラスタリングとは、似た特徴を持つデータをグループ化する方法です。たとえば、果物を色や大きさ、形で分類するようなものです。この技術を使えば、大量のデータの中から規則性や特徴を発見することができます。
システムトレードや機械学習では、以下のような用途に役立ちます。
- 市場データを分類してトレンドを見つける。
- 異常値を検出する。
- データに基づいて戦略を立てる。
※クラスタリング全般に関する詳細については下記の記事をご参照ください。
DBSCANクラスタリングとは?
密度を使ったクラスタリング手法
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)は、データの「密度」に注目したクラスタリング手法です。端的に言えば、、「データの密集した場所をグループに分けて、他のバラバラなデータはノイズとして無視する方法」となります。
DBSCANにより、密集したデータを1つのグループとしてまとめ、離れた点(外れ値)はノイズとして除外します。
DBSCANクラスタリングは以下のような場面で特に有効です:
- 特定の条件に基づいてトレンドを分析する。
- 例えば、SNS上で特定のキーワードが急に増えた時、そのトレンドを検出することです。たとえば、特定の商品名やイベント名が急に多くつぶやかれる場合、それが流行の兆しである可能性があります。このようなトレンドを検出することで、マーケティングキャンペーンを最適化したり、消費者の関心の変化を迅速に把握したりすることができます。
- 市場データの異常値を検出する。
- 例えば、株価の通常の変動から大きく外れた異常な値動きを見つけることです。例えば、ある企業の株価が急激に上昇したり、下落したりする場合、それが不正取引や市場の異常な反応である可能性があります。DBSCANを使うことで、こうした異常な動きを迅速に検出し、投資判断やリスク管理に役立てることができます。
- 時系列データからパターンを見つける。
- 例えば、一定期間ごとに発生する売上のピークや季節的なパターンを検出することです。例えば、小売業において、特定の時期に売上が増加する傾向がある場合(クリスマスやお正月などのイベントシーズン)、DBSCANを用いてこのような季節的なパターンを特定し、適切な在庫管理や販売戦略を立てることができます。
コア点、境界点、ノイズ点とは?
DBSCANクラスタリングは、データポイントを次の3種類に分類します。
データポイントとは?
データポイントとは、分析対象となる個々のデータのことです。例えば、地図上の位置情報を分析する場合、一つ一つの地点がデータポイントに相当します。
コア点
コア点とは、ある点の近くに一定以上のデータポイントが存在する場合、その点を「密集の中心」として判定するものです。
例えば、街中のショッピングエリアを考えると、人気のある商店街の中心部がコア点にあたります。このような場所は周囲に多くの店が集まっているため、密度が高いと見なされます。
境界点
境界点とは、コア点の近くに存在するが、密集の中心ではない点です。クラスタの外縁に位置するポイントとして扱われます。
例えば、商店街の端にある小さな店のようなイメージです。この店は人気のあるエリアの近くにはありますが、その中心に位置するわけではありません。それでも、商店街の一部として重要な役割を果たしています。
ノイズ点
ノイズ点とは、どのクラスタにも属さない孤立した点です。外れ値や異常値として扱われることが多いです。
例えば、郊外にぽつんとあるコンビニのような存在です。このコンビニは他の店から離れており、特定の商店街には属していないため、密集地とは見なされず、ノイズ点として分類されます。
DBSCANのパラメータ
DBSCANを正しく動作させるには、2つのパラメータを設定します。
eps(エプシロン)
epsは、ある点を基準として「どの範囲を近隣とみなすか」を決定する値です。
この値が大きいと、広い範囲が近隣と判定されます。
例えば、地図上の特定の地点を考えたとき、「この地点から半径500メートル以内の場所を近隣とみなす」と決めるようなものです。
この半径の長さがepsです。epsの値を大きく設定すると、より広い範囲が一つのグループとしてまとめられますが、その分、データが密集していない部分も同じグループに含まれる可能性が高まります。
minPts(ミニマムポイント)
minPtsは、コア点とみなすために必要な近隣点の数です。
epsの範囲内にminPts以上の点があれば、その点はコア点とされます。
例えば、遊び場で友達同士が集まっていると考えてみてください。ある子どもの周りに少なくとも4人以上の友達が集まっていれば、その子どもは「中心的な存在」と見なせます。
この「4人以上」という基準がminPtsです。minPtsの値を大きくすると、本当に密集している場所だけがコア点として認識され、小さな集まりは無視されることになります。
DBSCANの仕組み
- 各データポイントについて、epsの範囲内の近隣点を調べます。
- 例えば、地図上で一つの公園を考え、その周り500メートルの範囲にどれだけの人が集まっているかを確認するようなイメージです。epsはこの範囲の広さを示しています。
- minPts以上の近隣点が存在する場合、その点をコア点と判定します。
- コア点を中心にクラスタを形成し、隣接する点を取り込みます。
- 公園がコア点として判定されたら、その公園の周りにいる他の人たちも同じグループに含めていくような感じです。こうして、同じ地域に集まっている人たちが一つのクラスタとしてまとめられます。
- クラスタに属さない点をノイズとして扱います。
- 公園から離れた場所に一人だけぽつんといる人は、どのグループにも属さないため、ノイズとして扱われます。例えば、郊外に一軒だけある店のように、どのクラスタにも含まれないデータはノイズと見なされます。
この手法は、クラスタの形状が不規則でも適用可能で、ノイズを自動的に検出する特徴があります。つまり、DBSCANはデータの密集している部分を見つけることに長けており、形が決まっていないような複雑なパターンを持つデータにも対応できます。また、外れ値を自動的に無視するので、異常なデータを除いた分析が可能になります。
DBSCANのメリットとデメリット
メリット
メリット
- クラスタ数を事前に指定する必要がない:
- 異常値(ノイズ)を検出可能:
- 不規則な形状のクラスタに対応:
デメリット
- パラメータ調整が必要:
- 高次元データでは性能が低下:
DBSCANをシステムトレードに活用する方法
異常値の検出
DBSCANは、市場データの中から異常な価格変動や取引量を検出するのに役立ちます。
ノイズ点として分類されたデータを異常値として分析することで、通常では見逃してしまうような重要な情報を得ることができます。例
えば、株価が急に大きく変動したり、ある通貨ペアの取引量が突然増えたりした場合、DBSCANを使えばそれらをノイズとして検出し、その異常な動きが何らかの市場イベントやニュースによるものなのかを調査することが可能です。
これにより、異常な動きを迅速に把握し、リスク管理や投資判断に活かすことができます。
トレンドの分析
DBSCANは、株価や通貨ペアの時系列データに対してクラスタリングを行い、価格の上昇や下降といったパターンを発見することに役立ちます。
例えば、株価が上昇しているときと下降しているときのデータをグループ化することで、市場のトレンドを視覚的に理解しやすくなります。
DBSCANを使えば、価格が連続して変動する際に、それが上昇トレンドなのか下降トレンドなのかを自動的に分類できます。
これにより、トレンドが変わるタイミングを把握しやすくなり、適切な売買のタイミングを見つけることが可能です。
たとえば、ある期間に価格が密集して上昇している場合、それを一つのトレンドとしてグループ化し、次に売りに出るべきタイミングを見極める手助けになります。
データ分類による戦略の構築
DBSCANを使ってデータをクラスタに分けることで、異なる市場条件に応じたトレード戦略を構築することができます。
例えば、ある時期に市場が非常に活発である場合と、静かな状態にある場合とでデータを別々のクラスタに分類します。それぞれのクラスタごとに最適な戦略を立てることができ、リスクを最小限に抑えながら利益を最大化することができます。
例えば、市場が活発なときにはリスクを取った攻めのトレードを行い、市場が静かなときには守りのトレードをする、といった形です。
DBSCANを用いることで、こうした異なる市場環境を適切に分類し、それに応じた戦略を自動的に適用することができるようになります。
PythonでのDBSCAN実装と解説
以下は、Pythonを使ってDBSCANクラスタリングを実行するサンプルコードです。
サンプルコード
# 必要なライブラリをインポートします
import numpy as np # 数値計算用のライブラリ
import matplotlib.pyplot as plt # グラフ描画用のライブラリ
from sklearn.cluster import DBSCAN # DBSCANクラスタリングを提供するライブラリ
from sklearn.datasets import make_blobs # サンプルデータを作成する関数
# サンプルデータを生成します
# データは2次元空間に4つの密集したグループを持つ形で作成されます
data, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.6, random_state=0)
# DBSCANクラスタリングを設定します
# eps: 近隣とみなす距離の上限、min_samples: コア点とみなす最低限の点数
dbscan = DBSCAN(eps=0.5, min_samples=5)
# クラスタリングを実行し、各点がどのクラスタに属するかを判定します
clusters = dbscan.fit_predict(data)
# 結果をプロットして可視化します
plt.scatter(data[:, 0], data[:, 1], c=clusters, cmap='viridis') # 点をクラスタごとに色分けして表示
plt.title('DBSCANクラスタリング結果') # グラフのタイトル
plt.xlabel('特徴量1') # x軸のラベル
plt.ylabel('特徴量2') # y軸のラベル
plt.show() # グラフを表示
サンプルコードの解説
1. 必要なライブラリをインポート
- numpy: 数値計算用のライブラリで、データの格納や操作に使います。
- matplotlib.pyplot: データの可視化用ライブラリで、散布図やグラフを描くことができます。
- DBSCAN: scikit-learnライブラリに含まれるDBSCANクラスタリングのクラスです。
- make_blobs: サンプルデータを生成する関数です。
2. サンプルデータの生成
make_blobsを使ってクラスタリングの練習用データを生成します。
- n_samples=300: データポイントの数を300に指定します。
- centers=4: 4つの異なる密集領域(クラスタ)を生成します。
- cluster_std=0.6: 各クラスタのばらつき具合を設定します。
- random_state=0: 乱数のシードを固定して、毎回同じデータを生成します。
この設定により、2次元平面上にランダムに分布した4つのグループを持つデータセットが作成されます。
3. DBSCANクラスタリングの設定
DBSCAN(eps=0.5, min_samples=5)は、DBSCANクラスタリングを設定するための関数です。この関数の役割は、密度ベースのクラスタリングのルールを定義することです。
- eps(エプシロン): ある点を基準に「近隣」とみなす範囲を指定します。たとえば、eps=0.5の場合、半径0.5以内にある点が近隣と判定されます。
- min_samples(ミニマムサンプル): コア点とみなすために必要な最小のデータ点数を指定します。たとえば、min_samples=5では、近隣に5つ以上の点がある場合にコア点と判定されます。
この関数を使って設定したルールは、次のクラスタリング処理で利用されます。
4. クラスタリングの実行
fit_predictメソッド
dbscan.fit_predict(data)は、DBSCANクラスタリングをデータに適用し、クラスタ番号を計算するメソッドです。このメソッドの役割は以下の通りです。
fit
部分: DBSCANクラスタリングを実行し、データのグループ化を行います。- predict部分: 各データポイントがどのクラスタに属するかを判定します。
このメソッドを実行すると、データポイントごとにクラスタ番号が割り当てられます。ノイズ(どのクラスタにも属さないデータ)には番号として-1
が割り当てられます。結果はclusters変数に保存され、後のプロット処理で利用されます。
5. 結果のプロット
plt.scatterメソッド
plt.scatter(data[:, 0], data[:, 1], c=clusters, cmap=’viridis’)は、散布図を作成するためのメソッドです。このメソッドは、2次元のデータを画面上にプロットし、クラスタリング結果を視覚化する役割を持っています。
- data[:, 0]: データの1列目(特徴量1)をx軸に使用します。
- data[:, 1]: データの2列目(特徴量2)をy軸に使用します。
- c=clusters: 各データポイントが属するクラスタ番号を色分けに使用します。
- cmap=’viridis’: データを色分けする際に利用するカラーマップを指定します。
このメソッドを使うことで、クラスタごとに異なる色でプロットされ、結果が視覚的に分かりやすくなります。
plt.showメソッド
plt.show()は、作成したグラフを画面に表示するメソッドです。このメソッド自体に計算処理はなく、これまでに作成されたプロットを実際に描画するだけの役割を果たします。
たとえば、plt.scatterで作成した散布図は、plt.show()を実行することで画面上に表示されます。これがないと、プロットしたグラフを見ることができません。簡単に言えば「図を見せてね」と指示する役割です。
DBSCANクラスタリングのまとめ
DBSCANクラスタリングは、密度に基づいてデータを効率的にグループ化し、外れ値を検出する強力な手法です。
- 密度という概念に基づいて、クラスタの形が不規則でも柔軟に対応できます。
- パラメータ設定が適切であれば、異常値の検出やトレンド分析に非常に役立ちます。