Kaggle入门:比特币走势预测实战指南
比特币作为最具代表性的加密货币,其价格波动剧烈且受多种因素影响,既是投资者的关注焦点,也是数据科学领域的热门研究课题,对于初学者而言,Kaggle作为全球最大的数据科学竞赛平台,提供了丰富的数据集、成熟的竞赛环境和强大的社区支持,是入门比特币走势预测的理想起点,本文将从数据获取、特征工程、模型构建到结果优化,手把手带你完成一个比特币价格预测的Kaggle入门项目。
项目准备:明确目标与数据获取
定义预测任务
比特币走势预测通常分为两类:分类预测(如预测次日价格涨跌,输出“涨”“跌”“平”三类标签)和回归预测(如预测次日收盘价的具体数值),初学者建议从分类任务入手,逻辑更简单且便于评估模型效果。
数据集选择
Kaggle上有多个公开的比特币价格数据集,推荐使用以下两类:
- 历史价格数据:如Bitcoin Historical Data(包含2012-2021年的分钟级、小时级收盘价、开盘价、最高价、最低价等)。
- 辅助数据(可选):如Bitcoin Tweets(社交媒体情绪数据)、Google Trends比特币搜索指数(热度数据)等,可用于构建情绪特征。
初学者可优先使用历史价格数据,熟悉后再尝试融合多源数据。
数据预处理:从原始数据到“干净”特征
加载与初步观察
使用pandas加载数据,检查基本信息:
import pandas as pd
import numpy as np
df = pd.read_csv('bitstampUSD_1-min_data_2012-01-01_to2021-03-31.csv')
# 查看数据形状、缺失值、数据类型
print(df.info())
print(df.describe())
比特币数据常因交易所维护等原因存在缺失值,需通过前向填充(ffill)或线性插值(interpolate)处理。
时间序列重采样
原始数据可能是分钟级或小时级,但预测任务通常以“日”或“周”为单位,可通过resample方法重采样:
# 转换时间列为datetime格式
df['Timestamp'] = pd.to_datetime(df['Timestamp'], unit='s')
df.set_index('Timestamp', inplace=True)
# 重采样为日度数据(取每日收盘价、最高价、最低价等)
df_daily = df['Close'].resample('D').last().to_frame() # 收盘价取每日最后一行
df_daily['Open'] = df['Open'].resample('D').first()
df_daily['High'] = df['High'].resample('D').max()
df_daily['Low'] = df['Low'].resample('D').min()
df_daily['Volume'] = df['Volume_(BTC)'].resample('D').sum()
构建目标变量
以分类任务为例,定义“次日涨跌”标签(若次日收盘价>当日收盘价,标签为1,否则为0):
df_daily['Target'] = (df_daily['Close'].shift(-1) > df_daily['Close']).astype(int)
特征工程:让模型“读懂”价格规律
特征工程是预测任务的核心,比特币价格数据的常见特征包括:
技术指标特征
利用金融领域经典指标捕捉价格趋势,可通过ta-lib库快速计算:
- 移动平均线(MA):如5日、10日、20日收盘价均值。
- 相对强弱指数(RSI):衡量价格变动速度和幅度,判断超买超卖。
- 布林带(Bollinger Bands):由中轨(MA20)、上轨(中轨+2倍标准差)、下轨组成,反映价格波动区间。
import talib as ta
df_daily['MA5'] = ta.MA(df_daily['Close'], timeperiod=5) df_daily['MA20'] = ta.MA(df_daily['Close'], timeperiod=20) df_daily['RSI'] = ta.RSI(df_daily['Close'], timeperiod=14) df_daily['Upper_Band'], df_daily['Middle_Band'], df_daily['Lower_Band'] = ta.BBANDS( df_daily['Close'], timeperiod=20, nbdevup=2, nbdevdn=2 )
#### 2. 时间特征
比特币价格可能受时间周期影响(如周末效应、季度效应),可提取:
```python
df_daily['DayOfWeek'] = df_daily.index.dayofweek # 星期几(0=周一)
df_daily['Month'] = df_daily.index.month
df_daily['Quarter'] = df_daily.index.quarter
滞后特征(Lag Features)
价格序列具有自相关性,可用过去N天的价格作为特征:
for lag in [1, 2, 3, 5, 7]:
df_daily[f'Close_Lag_{lag}'] = df_daily['Close'].shift(lag)
统计特征
计算过去N天的价格统计量(如均值、标准差、波动率):
df_daily['Volatility'] = df_daily['Close'].rolling(7).std() # 7日波动率 df_daily['MA7_Ratio'] = df_daily['Close'] / df_daily['Close'].rolling(7).mean() # 收盘价/7日均价
数据清洗与标准化
删除包含缺失值的行(因滞后特

df_daily.dropna(inplace=True) from sklearn.preprocessing import StandardScaler scaler = StandardScaler() feature_cols = [col for col in df_daily.columns if col not in ['Target']] df_daily[feature_cols] = scaler.fit_transform(df_daily[feature_cols])
模型构建与训练
划分训练集与测试集
时间序列数据不能随机划分,需按时间顺序分割(如用2020年之前的数据训练,2020年之后的数据测试):
train = df_daily[df_daily.index < '2020-01-01'] test = df_daily[df_daily.index >= '2020-01-01'] X_train, y_train = train[feature_cols], train['Target'] X_test, y_test = test[feature_cols], test['Target']
选择 baseline 模型
初学者建议从简单模型入手,逐步迭代:
- 逻辑回归(Logistic Regression):线性模型,训练速度快,可解释性强。
- 随机森林(Random Forest):集成学习方法,能捕捉非线性关系,对异常值不敏感。
- XGBoost/LightGBM:梯度提升树模型,在Kaggle竞赛中表现优异,适合结构化数据。
以随机森林为例:
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
print("Classification Report:\n", classification_report(y_test, y_pred))
模型调参
通过网格搜索(GridSearchCV)或随机搜索(RandomizedSearchCV)优化超参数,如随机森林的n_estimators(树的数量)、max_depth(树的最大深度)等:
from sklearn.model_selection import GridSearchCV
param_grid = {
'n_estimators': [50, 100, 200],
'max_depth': [5, 10, None],
'min_samples_split': [2, 5, 10]
}
grid_search = GridSearchCV(RandomForestClassifier(random_state=42), param_grid, cv=5)
grid_search.fit(X_train, y_train)
best_model = grid_search.best_estimator_
结果分析与优化
评估指标
分类任务的常用指标包括:
- 准确率(Accuracy):整体预测正确的比例,但类别不平衡时可能失真。
- 精确率(Precision)、召回率(Recall)、F1-score:关注“涨”或“跌”类别的预测效果。
- 混淆矩阵:直观查看各类别的预测情况。
比特币数据常存在“涨多跌少”或“跌多涨少”的类别不平衡问题,可通过过采样(SMOTE)或调整类别权重(class_weight)优化。
特征重要性分析
通过