比特币10年价格数据(2014-2024)分析(进阶1_聚类分析)
比特币10年价格数据(2014-2024)分析(进阶1_聚类分析)
本文通过K-means聚类分析方法,对2014-2024年比特币价格数据进行深入分析。通过数据预处理、聚类数选择和结果可视化等步骤,揭示了比特币价格和成交量的聚类特征。
数据说明
本数据集包含 2014 - 2024 的比特币美元价格数据,具体包含比特币每日的开盘价、最高价、最低价、收盘价以及成交量等关键信息。数据说明如下:
字段 | 说明 |
---|---|
Date | 日期,比特币的交易日期 |
Open | 开盘价,每天比特币交易开始时的价格 |
High | 最高价,每天交易期间比特币的最高成交价格 |
Low | 最低价,每天交易期间比特币的最低成交价格 |
Close | 收盘价,指当天交易结束时的价格,调整后的收盘价考虑了股息等因素 |
Volume | 成交量,每天比特币的交易量,通常以比特币的单位表示 |
在发布的上一篇中,具体分析了价格波动与趋势分析、成交量与市场波动关系分析、价格异常波动检测和成交量异常值检测等。在本文中,将从市场特征聚类分析角度进行分析。
首先读取处理过的数据:
import pandas as pd
file_path = 'data.csv'
data = pd.read_csv(file_path)
data
探究合适的聚类数
import matplotlib.pyplot as plt
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
numerical_features = data[['Adj Close', 'Volume']]
imputer = SimpleImputer(strategy='mean')
numerical_data_imputed = pd.DataFrame(imputer.fit_transform(numerical_features), columns=numerical_features.columns)
scaler = StandardScaler()
numerical_data_scaled = scaler.fit_transform(numerical_data_imputed)
wcss = []
for i in range(1, 11):
kmeans = KMeans(n_clusters=i, init='k-means++', random_state=42)
kmeans.fit(numerical_data_scaled)
wcss.append(kmeans.inertia_)
plt.figure(figsize=(10,5))
plt.plot(range(1, 11), wcss, marker='o', linestyle='--')
plt.title('Elbow Method')
plt.xlabel('Number of Clusters')
plt.ylabel('WCSS')
plt.grid(True)
plt.show()
根据肘部法则图,我们可以看到在 (k=3) 时,WCSS(聚类内样本的均方距离和)开始显著下降的速度变慢,这表明 3 可能是一个合适的聚类数。下面是代码的详细解释:
import matplotlib.pyplot as plt
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
这里导入了matplotlib.pyplot用于绘图,SimpleImputer用于数据填充,StandardScaler用于数据标准化,以及KMeans用于执行K均值聚类。
选择数值特征
numerical_features = data[['Adj Close', 'Volume']]
这里,data
是一个假设的数据集,numerical_features
选择了数据集中的’Adj Close’(调整后的收盘价)和’Volume’(成交量)两列作为数值特征。
填充缺失值
imputer = SimpleImputer(strategy='mean')
numerical_data_imputed = pd.DataFrame(imputer.fit_transform(numerical_features), columns=numerical_features.columns)
这里创建了一个SimpleImputer对象,用于填充数值特征中的缺失值。strategy='mean'
指定了使用每列的平均值来填充缺失值。然后,使用这个imputer来转换 numerical_features
,并将结果转换回DataFrame,列名保持不变。
标准化数值数据
scaler = StandardScaler()
numerical_data_scaled = scaler.fit_transform(numerical_data_imputed)
这里创建了一个StandardScaler对象,用于将数值数据标准化,即转换为具有零均值和单位方差的数据。fit_transform
方法先拟合数据,然后进行转换。
使用肘部方法找到最优的聚类数
wcss = []
for i in range(1, 11):
kmeans = KMeans(n_clusters=i, init='k-means++', random_state=42)
kmeans.fit(numerical_data_scaled)
wcss.append(kmeans.inertia_)
这段代码通过KMeans聚类算法来寻找最优的聚类数。它计算了从1到10个聚类的总内距离和(Within-Cluster Sum of Squares, WCSS)。init='k-means++'
指定了使用k-means++算法来选择初始质心,random_state=42
确保了结果的可重复性。
绘制肘部方法图
plt.figure(figsize=(10,5))
plt.plot(range(1, 11), wcss, marker='o', linestyle='--')
plt.title('Elbow Method')
plt.xlabel('Number of Clusters')
plt.ylabel('WCSS')
plt.grid(True)
plt.show()
最后,使用matplotlib.pyplot绘制了肘部方法图,它显示了不同聚类数目下的WCSS值。通过观察WCSS随着聚类数目增加的变化情况,可以找到一个“拐点”(即“肘部”),这通常被视为最优的聚类数目。图的标题、x轴和y轴标签都已设置,并且开启了网格线以便于观察。
K-means聚类分析
import seaborn as sns
kmeans = KMeans(n_clusters=3, init='k-means++', random_state=42)
numerical_data_scaled_clusters = kmeans.fit_predict(numerical_data_scaled)
clustered_data = pd.DataFrame(numerical_data_scaled, columns=numerical_features.columns)
clustered_data['Cluster'] = numerical_data_scaled_clusters
clustered_data_heatmap = clustered_data.groupby('Cluster').mean().T
plt.figure(figsize=(10,6))
sns.heatmap(clustered_data_heatmap, annot=True, cmap='viridis')
plt.title('Heatmap of Clustered Data')
plt.xlabel('Cluster')
plt.ylabel('Feature')
plt.show()
现在我们有了聚类结果的热图。每个聚类中心的特征值(调整后的收盘价和成交量)在热图中以不同的颜色表示。这可以帮助我们理解每个聚类的特征。
从热图中,我们可以看到:
- 第 0 类具有较低的调整后收盘价和成交量。
- 第 1 类具有中等的调整后收盘价和成交量。
- 第 2 类具有较高的调整后收盘价和成交量。
这段代码是用来执行K-means聚类分析并将结果以热力图形式展示的。下面我将具体解释代码的功能:
import seaborn as sns
这行代码导入了Seaborn库,它是一个基于Matplotlib的Python数据可视化库,特别适用于绘制多样的统计图表。
kmeans = KMeans(n_clusters=3, init='k-means++', random_state=42)
numerical_data_scaled_clusters = kmeans.fit_predict(numerical_data_scaled)
这里,代码使用KMeans类从scikit-learn库创建了一个K-means聚类模型,指定了3个聚类中心(n_clusters=3
),并使用’k-means++'方法来智能选择初始聚类中心。random_state=42
是为了保证结果的可重复性。fit_predict
方法对经过缩放的数值型数据 numerical_data_scaled
进行拟合,并预测每个数据点的簇标签。
clustered_data = pd.DataFrame(numerical_data_scaled, columns=numerical_features.columns)
clustered_data['Cluster'] = numerical_data_scaled_clusters
这两行代码创建了一个新的DataFrame,包含了缩放后的数值数据以及新的一列’Cluster’,该列包含每个数据点对应的簇标签。
clustered_data_heatmap = clustered_data.groupby('Cluster').mean().T
这行代码通过按’Cluster’列分组并计算每组的平均值,将数据转换成适合绘制热力图的形式。.T
是转置操作,目的是为了让特征(列)作为行,簇(Cluster)作为列,这样的格式更适合在热力图中展示。
plt.figure(figsize=(10,6))
sns.heatmap(clustered_data_heatmap, annot=True, cmap='viridis')
plt.title('Heatmap of Clustered Data')
plt.xlabel('Cluster')
plt.ylabel('Feature')
plt.show()
这部分代码绘制了热力图。plt.figure(figsize=(10,6))
设置了图形的大小为10x6英寸。sns.heatmap
函数绘制热力图,其中 annot=True
表示在热力图上显示数值,cmap='viridis'
指定了颜色映射。plt.title
、plt.xlabel
、和 plt.ylabel
分别设置了图形的标题和轴标签。最后,plt.show()
显示了图形。