
在当今数据驱动的时代,数据科学家们肩负着从海量数据中挖掘有价值信息、解决实际问题的重任。
我们曾参与一个为客户提供的咨询项目,在这个项目中,我们致力于通过时间序列分析和建模的方法,对某一重要金融资产(比特币)的价格进行预测。
通过对历史数据的深入研究,构建合适的预测模型,为客户提供决策支持,助力其在复杂多变的金融市场中做出明智的投资决策。
时间序列数据是按照时间顺序排列的一系列数据点,在各个领域都有着广泛的应用。时间序列预测的核心过程是预测其未来值,可以基于序列过去的行为(自回归),也可以结合其他外部变量进行建模。预测的基本公式为:Forecast=pattern+unexplained variance,其中“pattern”表示随时间具有重复性的特征(趋势、季节性、周期性因素等),“unexplained variance”表示影响响应变量但未被时间序列过去所捕获(解释)的因素。当“pattern”的重要性相对“unexplained variance”更大时,自回归预测模型成功的概率更高;反之,则需要纳入额外变量辅助解释。
在本项目中,我们聚焦于比特币价格的预测。比特币作为一种去中心化的加密货币,在全球金融市场中占据着重要地位。我们利用从2013年4月28日至2022年1月1日期间比特币每日的开盘价、收盘价、最高价、最低价等数据,借助Python中的Skforecast库以及其他相关工具,展开了一系列的分析和建模工作。
比特币简介与数据来源
比特币是一种去中心化的加密货币,可在无中介的情况下通过点对点网络在用户之间转移,其交易由区块链这一公共分布式账本进行验证和记录。比特币通过“挖矿”产生,可用于兑换其他货币、产品和服务。尽管人们对比特币的看法不一,但其已成为全球最具价值的金融资产之一,在按市值排名的金融资产列表中位居前列。
本项目使用的数据为2013年4月28日至2022年1月1日期间比特币每日的价格记录,数据集包含“Date”(记录日期)、“Open”(开盘价)、“High”(最高价)、“Low”(最低价)、“Close”(收盘价)、“Volume”(当日实际交易总量)、“Market Cap”(市值)等列。由于加密货币市场一周七天、一天24小时不间断运行,且比特币价格在一天的最后一秒可能会有波动,所以次日开盘价与前一日收盘价不一定完全相同。

想了解更多关于模型定制、咨询辅导的信息?
数据处理与分析
为了确保数据的质量和可用性,我们进行了一系列的数据处理操作。使用pandas
库读取数据,并将日期列转换为日期时间格式,设置为索引,同时使用asfreq('D')
方法设置数据频率为每日,此时Pandas
会用Null
值填充时间序列中可能存在的空缺,随后检查发现数据中不存在缺失值。
# 数据下载
data = pd.read_csv(
)
data['date'] = pd.to_datetime(data['date'])
data = data.set_index('date')
data = data.asfreq('D')
比特币的减半是其设计和运行的一部分,大约每4年发生一次,每次减半会使矿工获得的奖励减少一半。我们构建了一个包含比特币减半信息的字典,并根据相关网站数据计算出下一次减半的大致日期,将挖矿奖励和距离下一次减半的天数作为外部变量添加到数据集中。
视频
【视频讲解】CatBoost、LightGBM和随机森林的海域气田开发分类研究
视频
【视频讲解】Python用LSTM、Wavenet神经网络、LightGBM预测股价
视频
Python比赛讲解LightGBM、XGBoost+GPU和CatBoost预测学生在游戏学习过程表现
图形化探索
在构建预测模型之前,对数据进行图形化探索有助于我们直观地了解数据的特征和规律。
- 烛台图:烛台图是一种常用的金融图表,用于描述证券、衍生品或货币的价格走势。通过绘制比特币价格的烛台图,并标记出比特币的减半日期,我们可以观察到减半事件对价格的潜在影响。
# 使用Plotly绘制交互式烛台图
candlestick = go.Candlestick(
x=data.index,

2. 数据分布:通过绘制比特币收盘价的核密度估计图(KDE),我们发现价格主要集中在20,000美元以下,对应2013年至2020年9月期间;而2021年以来,价格在35,000 – 67,500美元之间波动。对于这种高度不对称且随时间具有不同数量级的时间序列,建模时可以考虑使用价格变化量而非直接值,或者仅指示价格相对于前一天的涨跌情况。
# 绘制比特币收盘价的KDE分布图
set_dark_theme()
fig, ax = plt.subplots(figsi

3. 年度价格:分析每年比特币的开盘价、收盘价、最高价和最低价,并计算年度价格变化百分比,绘制年度烛台图并标注价格变化百分比,观察比特币价格在不同年份的变化趋势。

4. 季节性分析:分别从年度、月度和周度对数据进行分析,绘制相应的箱线图和中位数线图,观察比特币价格是否存在季节性特征。结果发现比特币在年末和年初存在一定的年度季节性,价格波动较大;而在月度和周度区间内未发现明显的季节性特征。



5. 自相关图:通过绘制比特币收盘价的自相关图(ACF)和偏自相关图(PACF),发现只有滞后1阶与滞后0阶相关,后续滞后阶数未超过显著性阈值,表明比特币价格序列的自相关性较弱。
# 绘制自相关图
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(15, 4))
axes = axes.flat

模型构建与评估
- 随机游走模拟(基线模型) :在生成预测模型时,首先确定一个基线模型用于比较。根据随机游走理论,在金融市场中,市场价格表现为随机行为,而非时间序列的函数。因此,最简单的可行模型是将当前时刻的值作为下一时刻的预测值,即使用
tn
的值预测tn+1
的值,并将其设置为基线模型。通过选取数据集中最后两年的数据进行训练和测试,计算得到基线模型的测试误差为1260.37。
# 随机游走模拟
df_rw = data[['close']].copy()
df_rw['pred_close'] = df_rw['close'].shift(1)
# 测试误差


2. 递归自回归预测器:使用基于LightGBM回归器的递归自回归预测器(ForecasterRecursive)对比特币价格进行建模。通过训练不同滞后阶数的模型并进行回测,发现随着滞后阶数的增加,模型的测试误差并未降低,说明即使纳入更多过去的信息,模型也未能优于基线模型。
随时关注您喜欢的主题
# 绘图
fig, ax = plt.subplots(figsize=(8, 4))
data.loc[end_train:, 'close'].plot(ax=ax, linewidth=2, label='Test')
# 绘制不同滞后阶数的测试预测


3. 包含外部变量的预测:在上述模型的基础上,尝试纳入比特币减半相关变量和月份变量作为外部变量进行预测。对分类变量进行独热编码后,构建包含外部变量的预测器并进行回测。
结果显示,即使纳入外部变量,模型的性能仍未优于基线模型。


# 包含外部变量的预测器回测
forecaster = ForecasterRecursive(


结论
- 比特币价格不遵循自回归模式,对于
tn+1
值的最佳估计是tn
值加上一个不可预测的变化。通过描述性分析尽早识别这种相关性的缺失,可以避免不必要的建模工作。 - 当面对无自相关性的时间序列时,应寻找能够辅助解决问题的外部变量。例如,在短期(小时)预测比特币价格时,可以考虑使用通过分析推文得到的市场情绪、关键意见领袖的影响、重要新闻分析等外部变量。
- 借助Skforecast库提供的功能,使用机器学习模型解决预测问题变得非常简单。尽管在本项目中我们尝试的模型未能显著优于基线模型,但这为后续的研究和改进提供了方向和基础。未来的研究可以进一步探索其他模型和外部变量,以提高比特币价格预测的准确性。
每日分享最新报告和数据资料至会员群
关于会员群
- 会员群主要以数据研究、报告分享、数据工具讨论为主;
- 加入后免费阅读、下载相关数据内容,并同步海内外优质数据文档;
- 老用户可九折续费。
- 提供报告PDF代找服务
非常感谢您阅读本文,如需帮助请联系我们!