用机器学习预测比特币价格

📖阅读时长:25分钟

🕙发布时间:2025-02-09

近日热文:全网最全的神经网络数学原理(代码和公式)直观解释
欢迎关注知乎和公众号的专栏内容
LLM架构专栏
知乎LLM专栏
知乎【柏企
公众号【柏企科技说】【柏企阅文

为什么要预测比特币价格?

精准的价格预测具有以下重要意义:

  • 辅助交易决策:通过预判价格趋势,帮助交易者实现利润最大化。
  • 风险管理:协助投资者在市场低迷时,尽可能降低损失。
  • 洞察市场动态:为加密货币市场的发展变化提供有价值的见解。

想象一下,有个智能助手能分析比特币的历史价格,并对明天的价格给出可靠预测,是不是很棒?这正是我们今天要打造的!

问题陈述

我们的目标是创建一个机器学习模型,依据比特币的历史价格数据,预测其下一天的收盘价。数据集包含以下信息:

  • 日期:记录价格的具体时间。
  • 开盘价:比特币当日的开盘价格。
  • 最高价:当天出现的最高交易价格。
  • 最低价:当天出现的最低交易价格。
  • 收盘价:比特币当日的收盘价格。
  • 交易量:当天比特币的交易数量。

第一步:理解和准备数据

我们的数据集涵盖了比特币的历史价格,现在开始加载并深入探索它。

  • 数据集来源:Kaggle
  • 加载数据集

    import pandas as pd
    df = pd.read_csv('bitcoin_data.csv')
    df.head()

    上述代码中,首先导入了pandas库并简写成pd,这是Python中用于数据处理和分析的常用库。接着使用pd.read_csv()函数读取名为bitcoin_data.csv的文件,并将其存储在df这个DataFrame(一种二维表格型数据结构)中。最后,df.head()用于查看数据集的前几行数据,方便快速了解数据的大致结构和内容。

  • 了解数据

    print(df.shape)
    print(df.columns)
    print(df['Symbol'].unique())
    df = df.drop('Symbol', axis=1)

    print(df.shape)用于输出数据集的形状,即行数和列数,让我们清楚知道数据量的大小。print(df.columns)会展示数据集中每一列的列名,帮助我们了解都有哪些数据类别。print(df['Symbol'].unique())则是查看Symbol这一列中所有不重复的值,在这个数据集中,如果Symbol列对我们预测比特币价格没有帮助,就可以使用df = df.drop('Symbol', axis=1)将其删除,axis = 1表示删除列,如果是axis = 0则表示删除行。

  • 探索数据

    print(df.isnull().sum())
    print(df.describe())

    print(df.isnull().sum())用于统计数据集中每一列缺失值的数量。print(df.describe())会生成一份关于数据集的统计摘要,包含数据的均值、标准差、最小值、最大值以及不同分位数的信息,有助于我们了解数据的分布情况。

    import matplotlib.pyplot as plt
    plt.figure(figsize=(10, 5))
    plt.plot(pd.to_datetime(df['Date']), df['Close'], label='Closing Price')
    plt.title('Bitcoin Closing Price Trend')
    plt.xlabel('Date')
    plt.ylabel('Price')
    plt.legend()
    plt.show()

    这段代码中,先导入了matplotlib.pyplot库并简写成plt,它是Python中常用的绘图库。plt.figure(figsize=(10, 5))设置了绘图窗口的大小为宽10单位、高5单位。plt.plot(pd.to_datetime(df['Date']), df['Close'], label='Closing Price')使用pd.to_datetime()Date列的数据转换为日期时间格式,然后以日期为横坐标,收盘价为纵坐标绘制折线图,并给这条折线添加了标签“Closing Price”。plt.title()用于设置图表的标题,plt.xlabel()plt.ylabel()分别设置了横纵坐标的标签。plt.legend()用于显示图例,plt.show()则是展示绘制好的图表,让我们直观看到比特币收盘价的变化趋势。

第二步:数据预处理

  • 处理缺失值
    如果数据集中存在缺失值,为保证数据的一致性,我们需要进行处理。

    df.fillna(method='ffill', inplace=True)

    df.fillna(method='ffill', inplace=True)表示使用前向填充的方法处理缺失值,即将缺失值用它前面一个非缺失值来填充。inplace = True表示直接在原数据集上进行修改,而不是返回一个新的数据集。

  • 特征工程

    • 日期转换:将Date列转换为日期时间格式。

      df['Date'] = pd.to_datetime(df['Date'])

      这行代码使用pd.to_datetime()函数将Date列的数据转换为日期时间格式,方便后续基于时间的分析和处理。

    • 滞后特征:创建滞后特征以捕捉历史趋势。

      df['Prev_Close'] = df['Close'].shift(1)
      df['3_Day_Mean'] = df['Close'].rolling(window=3).mean()
      df['7_Day_Mean'] = df['Close'].rolling(window=7).mean()

      df['Prev_Close'] = df['Close'].shift(1)创建了一个新列Prev_Close,它的值是Close列前一行的值,也就是前一天的收盘价,通过这种方式可以捕捉到前一天价格对当前价格的影响。df['3_Day_Mean'] = df['Close'].rolling(window=3).mean()df['7_Day_Mean'] = df['Close'].rolling(window=7).mean()分别计算了收盘价的3日移动平均值和7日移动平均值,添加到新列3_Day_Mean7_Day_Mean中,移动平均值能够平滑数据,帮助我们更好地观察价格的长期趋势。

  • 相关分析
    分析各特征之间的相关性,以确定重要特征。

    import seaborn as sns
    correlation = df.corr()
    sns.heatmap(correlation, annot=True, cmap='coolwarm')
    plt.title('Correlation Matrix')
    plt.show()

    这里先导入了seaborn库并简写成sns,它是基于matplotlib的统计绘图库,能绘制更美观的图表。df.corr()用于计算数据集中各列之间的相关性系数,得到一个相关系数矩阵。sns.heatmap(correlation, annot=True, cmap='coolwarm')使用seabornheatmap函数绘制热力图来展示相关性矩阵,annot = True表示在热力图上显示具体的相关系数值,cmap='coolwarm'指定了热力图的颜色映射方案。plt.title()设置图表标题,plt.show()展示绘制好的热力图,通过热力图可以直观地看出哪些特征之间相关性较高,哪些较低,有助于我们筛选出对预测比特币价格更重要的特征。

第三步:拆分数据

我们要将数据集划分为训练集和测试集。

from sklearn.model_selection import train_test_split
df = df.drop(columns=['Date'])
df = df.dropna()
X = df.drop(columns=['Close'])
y = df['Close']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

首先从sklearn.model_selection模块中导入train_test_split函数,它是scikit - learn库中用于数据划分的工具。df = df.drop(columns=['Date'])Date列从数据集中删除,因为日期信息在后续的模型训练中可能不需要作为特征。df = df.dropna()再次检查并删除数据集中存在缺失值的行,确保数据的完整性。然后,X = df.drop(columns=['Close'])将除了Close列(收盘价)之外的其他列作为特征数据,赋值给Xy = df['Close']Close列作为目标数据,赋值给y。最后,使用train_test_split(X, y, test_size=0.2, random_state=42)将数据集按照80%训练集、20%测试集的比例进行划分,random_state = 42设置了随机数种子,这样每次运行代码时划分的结果都是固定的,方便我们进行模型的调试和比较。

第四步:构建模型

我们将尝试几种机器学习模型,并根据评估指标选出最佳模型。

  • 训练模型

    • 随机森林回归器

      from sklearn.ensemble import RandomForestRegressor
      from sklearn.metrics import mean_absolute_error
      rf = RandomForestRegressor(random_state=42)
      rf.fit(X_train, y_train)
      y_pred_rf = rf.predict(X_test)
      mae_rf = mean_absolute_error(y_test, y_pred_rf)
      print(f"Random Forest MAE: {mae_rf}")

      sklearn.ensemble模块导入RandomForestRegressor随机森林回归器,从sklearn.metrics模块导入mean_absolute_error平均绝对误差用于评估模型性能。rf = RandomForestRegressor(random_state=42)创建一个随机森林回归器实例,random_state = 42设置随机种子保证结果可复现。rf.fit(X_train, y_train)使用训练集数据X_trainy_train对模型进行训练。y_pred_rf = rf.predict(X_test)使用训练好的模型对测试集X_test进行预测,得到预测结果y_pred_rfmae_rf = mean_absolute_error(y_test, y_pred_rf)计算预测值y_pred_rf与真实值y_test之间的平均绝对误差,并将结果存储在mae_rf中。最后,print(f"Random Forest MAE: {mae_rf}")输出随机森林回归器模型的平均绝对误差。

    • XGBoost回归器

      from xgboost import XGBRegressor
      xgb = XGBRegressor(random_state=42)
      xgb.fit(X_train, y_train)
      y_pred_xgb = xgb.predict(X_test)
      mae_xgb = mean_absolute_error(y_test, y_pred_xgb)
      print(f"XGBoost MAE: {mae_xgb}")

      xgboost库中导入XGBRegressor XGBoost回归器。xgb = XGBRegressor(random_state=42)创建XGBoost回归器实例。同样,xgb.fit(X_train, y_train)用训练集数据训练模型,y_pred_xgb = xgb.predict(X_test)对测试集进行预测,mae_xgb = mean_absolute_error(y_test, y_pred_xgb)计算预测值与真实值之间的平均绝对误差,最后输出XGBoost回归器模型的平均绝对误差。

第五步:评估和可视化结果

  • 模型比较

    print(f"Random Forest MAE: {mae_rf}")
    print(f"XGBoost MAE: {mae_xgb}")

    再次输出随机森林回归器和XGBoost回归器的平均绝对误差,方便直观比较两个模型的性能,平均绝对误差越小,说明模型的预测结果越接近真实值,模型性能越好。

  • 可视化预测

    plt.figure(figsize=(10, 5))
    plt.plot(y_test.values, label='Actual Prices')
    plt.plot(y_pred_xgb, label='Predicted Prices', linestyle='dashed')
    plt.title('Bitcoin Price Prediction')
    plt.xlabel('Time')
    plt.ylabel('Price')
    plt.legend()
    plt.show()

    这段代码使用matplotlib库绘制图表,对比比特币价格的实际值和预测值。plt.figure(figsize=(10, 5))设置图表大小。plt.plot(y_test.values, label='Actual Prices')绘制实际价格的折线图,y_test.values获取测试集中真实的收盘价数据,label='Actual Prices'为这条折线添加标签“Actual Prices”。plt.plot(y_pred_xgb, label='Predicted Prices', linestyle='dashed')绘制预测价格的折线图,y_pred_xgb是XGBoost模型的预测结果,linestyle='dashed'设置折线样式为虚线,label='Predicted Prices'添加标签“Predicted Prices”。plt.title()设置图表标题,plt.xlabel()plt.ylabel()分别设置横纵坐标标签,plt.legend()显示图例,plt.show()展示绘制好的图表,这样我们就能直观看到模型预测价格与实际价格的差异。

第六步:部署思路

以下是部署这个项目的一些方法:

  • Web应用程序:基于Flask或FastAPI构建应用程序,用户在其中输入相关特征数据,就能获取比特币价格的预测结果。
  • 交互式仪表板:使用Streamlit或Dash创建交互式仪表板,不仅可以可视化比特币价格的预测结果,还能展示历史价格趋势,方便用户进行分析和研究。
  • 自动警报系统:集成通知系统,当比特币价格出现重大变化时,及时提醒用户,帮助用户更好地把握市场动态,做出决策。

推荐阅读

1. DeepSeek-R1的顿悟时刻是如何出现的? 背后的数学原理
2. 微调 DeepSeek LLM:使用监督微调(SFT)与 Hugging Face 数据
3. 使用 DeepSeek-R1 等推理模型将 RAG 转换为 RAT
4. DeepSeek R1:了解GRPO和多阶段训练
5. 深度探索:DeepSeek-R1 如何从零开始训练
6. DeepSeek 发布 Janus Pro 7B 多模态模型,免费又强大!

本文由mdnice多平台发布


柏企科技圈
15 声望5 粉丝