この記事では20社の株価時系列データを基にしています。株価間の相関関係に基づいてこれらの企業を分類する 4 つの異なる方法を見てみましょう。
アップル (AAPL)、アマゾン (AMZN)、フェイスブック (META)、テスラ (TSLA)、アルファベット (Google) (GOOGL)、シェル (SHEL)、サンコア エナジー (SU)、エクソン モービル コーポレーション (XOM)、ルルレモン (LULU) 、ウォルマート (WMT)、カーターズ (CRI)、チルドレンズ プレイス (PLCE)、TJX カンパニーズ (TJX)、ヴィクトリアズ シークレット & カンパニー (VSCO)、メイシーズ (M)、ウェイフェア (W)、ダラー ツリー (DLTR)、CVS ケアマーク ( CVS)、ウォルグリーン (WBA)、Curaleaf Holdings Inc. (CURLF)
私たちのデータフレーム df_combined には、欠損データのない、上記の企業の 413 日間の株価が含まれています。
目標
私たちの目標は、関連性に基づいてこれらの企業をグループ化し、これらのグループ化の妥当性を検討することです。たとえば、Apple、Amazon、Google、Facebook はテクノロジー株とみなされますが、Suncor や Exxon は石油およびガス株とみなされます。これらの企業の株価間の相関関係のみを使用して、これらの分類が取得できるかどうかを確認します。
これらの企業を分類するには、株価を使用するのではなく、類似した株価を持つ企業がクラスター化されるように相関関係を使用します。ただし、ここでは株価の動きに基づいて企業を分類したいと思います。これを達成する簡単な方法は、株価間の相関関係を使用することです。
最適なクラスター数
クラスターの数を見つけること自体が問題です。最適なクラスター数を見つけるために使用できるエルボー法などの方法があります。しかし、本研究では、これらの企業を 4 つのクラスターに分類することを試みます。理想的には、これら 4 つのグループはテクノロジー株、石油・ガス株、小売株、その他の株である必要があります。
まず、持っているデータ フレームの相関行列を取得します。
correlation_mat=df_combined.corr()
クラスターとそのクラスターに属する企業を表示するユーティリティ関数を定義します。
# 用来打印公司名称和它们所分配的集群的实用函数
def print_clusters(df_combined,cluster_labels):
cluster_dict = {}
for i, label in enumerate(cluster_labels):
if label not in cluster_dict:
cluster_dict[label] = []
cluster_dict[label].append(df_combined.columns[i])
# 打印出每个群组中的公司 -- 建议关注@公众号:数据STUDIO 定时推送更多优质内容
for cluster, companies in cluster_dict.items():
print(f"Cluster {cluster}: {', '.join(companies)}")
方法 1: K-means クラスタリング法
K 平均法クラスタリングは、特徴の類似性に基づいて類似のデータ ポイントをグループ化するために使用される、一般的な教師なし機械学習アルゴリズムです。このアルゴリズムは、各データ ポイントを最も近いクラスターの中心点に繰り返し割り当て、収束するまで新しく割り当てられたデータ ポイントに基づいて中心点を更新します。このアルゴリズムを使用して、相関行列に基づいてデータをクラスター化できます。
from sklearn.cluster import KMeans
# Perform k-means clustering with four clusters
clustering = KMeans(n_clusters=4, random_state=0).fit(correlation_mat)
# Print the cluster labels
cluster_labels=clustering.labels_
print_clusters(df_combined,cluster_labels)
予想通り、アマゾン、フェイスブック、テスラ、アルファベットがグループ化され、石油・ガス会社も同様だった。さらに、WalmartとMACYsも統合されました。しかし、アップルやウォルマートなどの一部のハイテク株が密集しているのが見られます。
方法 2: 凝集クラスタリング
集約クラスタリングは、類似したクラスタを繰り返しマージしてより大きなクラスタを形成する階層クラスタリング アルゴリズムです。このアルゴリズムは、オブジェクトごとに個別のクラスターから開始し、各ステップで最も類似した 2 つのクラスターをマージします。
from sklearn.cluster import AgglomerativeClustering
# 进行分层聚类
clustering = AgglomerativeClustering(n_clusters=n_clusters,
affinity='precomputed',
linkage='complete'
).fit(correlation_mat)
# Display the cluster labels
print_clusters(df_combined,clustering.labels_)
これらの結果は、k-means クラスタリングから得られたものとは若干異なります。いくつかの石油会社とガス会社が異なるクラスターに配置されていることがわかります。
方法 3: アフィニティ伝播クラスタリング手法 AffinityPropagation
アフィニティ伝播クラスタリングは、クラスタ数を事前に指定する必要のないクラスタリング アルゴリズムです。これは、データ ポイントのペア間でメッセージを送信し、データ ポイントにクラスターの数と最適なクラスターの割り当てを自動的に決定させることで機能します。親和性伝播クラスタリングはデータ内の複雑なパターンを効果的に識別できますが、大規模なデータセットの場合は計算コストも高くなります。
from sklearn.cluster import AffinityPropagation
# 用默认参数进行亲和传播聚类
clustering = AffinityPropagation(affinity='precomputed').fit(correlation_mat)
# Display the cluster labels
print_clusters(df_combined,clustering.labels_)
興味深いことに、この方法では 4 つのクラスターがデータの最適なクラスター数であることがわかりました。さらに、石油会社とガス会社が統合され、一部のテクノロジー企業も統合されていることがわかります。
方法 4: DBSCAN クラスタリング方法
DBSCAN は、密集したポイントをクラスタリングする密度ベースのクラスタリング アルゴリズムです。クラスタの数を事前に指定する必要がなく、任意の形状のクラスタを識別できます。このアルゴリズムはデータ内の外れ値やノイズに対して堅牢であり、それらを自動的にノイズ ポイントとしてラベル付けできます。
from sklearn.cluster import DBSCAN
# Removing negative values in correlation matrix
correlation_mat_pro = 1 + correlation_mat
# Perform DBSCAN clustering with eps=0.5 and min_samples=5
clustering = DBSCAN(eps=0.5, min_samples=5, metric='precomputed').fit(correlation_mat_pro)
# Print the cluster labels
print_clusters(df_combined,clustering.labels_)
ここで、アフィニティ ベースのクラスタリングとは異なり、DBScan メソッドは最適な数として 5 つのクラスタを特定します。一部のクラスターには 1 社または 2 社しか存在しないこともわかります。
視覚化
上記の 4 つのクラスタリング手法の結果を同時に調べて、そのパフォーマンスについての洞察を得ることが役立つ場合があります。最も簡単な方法は、X 軸に企業、Y 軸にクラスターを配置したヒート マップを使用することです。
def plot_cluster_heatmaps(cluster_results, companies):
"""
Plots the heatmaps of clustering for all companies
for different methods side by side.
Args:
- cluster_results: a dictionary of cluster labels for each
clustering method
- companies: a list of company names
- 建议关注@公众号:数据STUDIO 定时推送更多优质内容
"""
# 从字典中提取key和value
methods = list(cluster_results.keys())
labels = list(cluster_results.values())
# 定义每个方法的热图数据
heatmaps = []
for i in range(len(methods)):
heatmap = np.zeros((len(np.unique(labels[i])), len(companies)))
for j in range(len(companies)):
heatmap[labels[i][j], j] = 1
heatmaps.append(heatmap)
# Plot the heatmaps in a 2x2 grid
fig, axs = plt.subplots(nrows=2, ncols=2, figsize=(12, 12))
for i in range(len(methods)):
row = i // 2
col = i % 2
sns.heatmap(heatmaps[i], cmap="Blues", annot=True, fmt="g", xticklabels=companies, ax=axs[row, col])
axs[row, col].set_title(methods[i])
plt.tight_layout()
plt.show()
companies=df_combined.columns
plot_cluster_heatmaps(cluster_results, companies)
ただし、上記の視覚化は、複数のクラスタリング アルゴリズムの結果を比較する場合にはあまり役に立ちません。この図を表現するより良い方法を見つけると役に立ちます。
結論は
この記事では、株価間の相関関係に基づいて 20 社をクラスタリングするための 4 つの異なる方法を検討します。目的は、株価ではなく企業の行動を反映する方法でこれらの企業をクラスター化することです。K 平均法クラスタリング、凝集クラスタリング、親和性伝播クラスタリング、DBSCAN クラスタリング手法を試しましたが、それぞれの手法には独自の長所と短所があります。結果は、4 つの方法すべてが業界またはセクターに合わせて企業をクラスタリングできる一方で、一部の方法は他の方法よりも計算コストが高いことを示しています。相関ベースのクラスタリング手法は、株価ではなく企業の行動に基づいて企業をクラスタリングすることにより、株価ベースのクラスタリング手法に代わる有用な手段を提供します。
推荐阅读:
我的2022届互联网校招分享
我的2021总结
浅谈算法岗和开发岗的区别
互联网校招研发薪资汇总
2022届互联网求职现状,金9银10快变成铜9铁10!!
公众号:AI蜗牛车
保持谦逊、保持自律、保持进步
发送【蜗牛】获取一份《手把手AI项目》(AI蜗牛车著)
发送【1222】获取一份不错的leetcode刷题笔记
发送【AI四大名著】获取四本经典AI电子书