用机器学习预测比特币价格
📖阅读时长: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_Mean
和7_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')
使用seaborn
的heatmap
函数绘制热力图来展示相关性矩阵,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
列(收盘价)之外的其他列作为特征数据,赋值给X
;y = 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_train
和y_train
对模型进行训练。y_pred_rf = rf.predict(X_test)
使用训练好的模型对测试集X_test
进行预测,得到预测结果y_pred_rf
。mae_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多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。