原文链接:https://tecdat.cn/?p=41630
原文出处:拓端数据部落公众号

在当今数据驱动的时代,数据科学家们肩负着从海量数据中挖掘有价值信息、解决实际问题的重任。我们曾参与一个为客户提供的咨询项目,在这个项目中,我们致力于通过时间序列分析和建模的方法,对某一重要金融资产(比特币)的价格进行预测。通过对历史数据的深入研究,构建合适的预测模型,为客户提供决策支持,助力其在复杂多变的金融市场中做出明智的投资决策。
时间序列数据是按照时间顺序排列的一系列数据点,在各个领域都有着广泛的应用。时间序列预测的核心过程是预测其未来值,可以基于序列过去的行为(自回归),也可以结合其他外部变量进行建模。预测的基本公式为:Forecast=pattern+unexplained variance,其中“pattern”表示随时间具有重复性的特征(趋势、季节性、周期性因素等),“unexplained variance”表示影响响应变量但未被时间序列过去所捕获(解释)的因素。当“pattern”的重要性相对“unexplained variance”更大时,自回归预测模型成功的概率更高;反之,则需要纳入额外变量辅助解释。
在本项目中,我们聚焦于比特币价格的预测。比特币作为一种去中心化的加密货币,在全球金融市场中占据着重要地位。我们利用从2013年4月28日至2022年1月1日期间比特币每日的开盘价、收盘价、最高价、最低价等数据,借助Python中的Skforecast库以及其他相关工具,展开了一系列的分析和建模工作。
通过对数据的探索性分析、模型的构建与测试,我们试图揭示比特币价格的变化规律,寻找有效的预测方法。本项目的研究成果对于理解比特币市场的运行机制、指导投资决策具有重要的参考价值。相关的专题项目文件已分享在交流社群,阅读原文进群和500+行业人士共同交流和成长。

比特币简介与数据来源

比特币是一种去中心化的加密货币,可在无中介的情况下通过点对点网络在用户之间转移,其交易由区块链这一公共分布式账本进行验证和记录。比特币通过“挖矿”产生,可用于兑换其他货币、产品和服务。尽管人们对比特币的看法不一,但其已成为全球最具价值的金融资产之一,在按市值排名的金融资产列表中位居前列。
本项目使用的数据为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年发生一次,每次减半会使矿工获得的奖励减少一半。我们构建了一个包含比特币减半信息的字典,并根据相关网站数据计算出下一次减半的大致日期,将挖矿奖励和距离下一次减半的天数作为外部变量添加到数据集中。

图形化探索

在构建预测模型之前,对数据进行图形化探索有助于我们直观地了解数据的特征和规律。

  1. 烛台图:烛台图是一种常用的金融图表,用于描述证券、衍生品或货币的价格走势。通过绘制比特币价格的烛台图,并标记出比特币的减半日期,我们可以观察到减半事件对价格的潜在影响。
# 使用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

模型构建与评估

  1. 随机游走模拟(基线模型):在生成预测模型时,首先确定一个基线模型用于比较。根据随机游走理论,在金融市场中,市场价格表现为随机行为,而非时间序列的函数。因此,最简单的可行模型是将当前时刻的值作为下一时刻的预测值,即使用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(

结论

  1. 比特币价格不遵循自回归模式,对于tn+1值的最佳估计是tn值加上一个不可预测的变化。通过描述性分析尽早识别这种相关性的缺失,可以避免不必要的建模工作。
  2. 当面对无自相关性的时间序列时,应寻找能够辅助解决问题的外部变量。例如,在短期(小时)预测比特币价格时,可以考虑使用通过分析推文得到的市场情绪、关键意见领袖的影响、重要新闻分析等外部变量。
  3. 借助Skforecast库提供的功能,使用机器学习模型解决预测问题变得非常简单。尽管在本项目中我们尝试的模型未能显著优于基线模型,但这为后续的研究和改进提供了方向和基础。未来的研究可以进一步探索其他模型和外部变量,以提高比特币价格预测的准确性。

拓端tecdat
198 声望54 粉丝