问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

比特币10年价格数据(2014-2024)分析(进阶1_聚类分析)

创作时间:
作者:
@小白创作中心

比特币10年价格数据(2014-2024)分析(进阶1_聚类分析)

引用
CSDN
1.
https://blog.csdn.net/2301_80651329/article/details/142319298

本文通过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.titleplt.xlabel、和 plt.ylabel 分别设置了图形的标题和轴标签。最后,plt.show() 显示了图形。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号