跳至主要内容

比特币价格模式:用 Python 进行时间序列分析

学习如何在 Python 中使用时间序列分析来分析和预测比特币价格。

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续继续即表示您接受我们的 使用条款,我们的 隐私政策 ,并且您的数据存储在美国。

免责声明: 以下分析仅用于教育目的,不应被视为财务建议。

随着价格飙升至历史新高,并在当前牛市中突破神奇的 $100,000 大关,比特币再次成为热门话题。

在这篇博客中,我将使用 Python,基于比特币的历史价格数据提炼关键信息。从识别与减半事件相关的季节性模式,到探索盘中与日历效应中的微观模式,我将挖掘能够为比特币价格走势提供背景的趋势。

我会逐步讲解我的方法,我们将一起:

  • 用直观图表可视化模式;
  • 执行时间序列分解;以及
  • 应用技术指标来识别潜在交易信号。

为便于阅读,我将所有代码移到了这个DataLab 笔记本中。虽然我鼓励您查看代码,但文章本身也可独立阅读,您可以带着或不带代码一起跟进。

比特币历史数据探索

历史比特币价格数据可以通过多种方式收集。对于我们使用的日度价格数据,一个简单的方式是从可靠网站下载 CSV 文件,例如CoinCodex,可在无需账户的情况下获取每日比特币价格数据。随后可使用 pandas.read_csv() 将 CSV 导入 Python。

或者,也可以通过 CoinGecko 或 Binance 等平台的 API 访问历史数据,但免费获取通常有限制。一个技术上的变通办法是使用分段请求,逐步汇集大规模数据集。本文的小时级数据使用的是 Mark Zielinski 的Bitcoin Historical Dataset,其中甚至包含逐分钟价格。

原始数据在分析前需要进行基础预处理,包括设置日期时间索引、将数值型列转换为浮点格式,以及处理缺失值。

需要特别注意的一点是,小时数据的交易量以 BTC 表示,而日度数据的交易量以 USD 表示,后续分析需牢记这一点。

初步探索包括将价格与每日波动率的 7 日移动平均进行可视化对比。

比特币每日收盘价与区间的 7 日移动平均线图

比特币价格呈现出强劲的上行趋势,使得 2017 年之前的数据在对比之下显得微不足道。值得注意的是,2020 年末价格极其陡峭地上涨,随后出现高波动,并在 2022 年末之前经历了明显的下行趋势。

波动性依旧显著,日度涨跌幅常在价格的 10% 左右,且在 2018 年 1 月和 2021 年 5 月等事件期间峰值可达 30%。

近期,比特币强势反弹,两年内从 $16,000 涨至 $100,000。为更好理解比特币的价格演变,有必要考察影响其供给的内置机制。除了总量上限 2100 万枚之外,其中最重要的机制之一是减半的概念。

减半是写入比特币代码的预设事件,会将矿工每添加一个新区块所获得的区块奖励削减 50%。该事件大约每四年发生一次,从而放缓新比特币进入流通的速度,长期维持其稀缺性。这一机制是比特币通缩模型的核心,常通过制造供给冲击影响市场动态,使得价格在减半后的数月内可能上涨。

为更好地观察比特币的长期趋势,使用对数价格图很有帮助。这种方式能压缩指数式增长,便于观察随时间推移的模式。

比特币每日收盘价,含减半日期与历史新高(对数刻度)

关键事件(如比特币减半日期)用白色竖线标出。历史数据显示,历史新高通常出现在两次减半之间,往往在减半后 1 至 1.5 年达到峰值,图中用绿色竖线标示。这一模式暗示比特币价格呈现由供给机制驱动的周期性特征。

剖析比特币价格的时间序列

时间序列分解是一种将时间序列拆解为三大组成部分的方法:

  1. 趋势(Trend):数据的长期运动,显示数值总体是上升、下降还是基本不变。
  2. 季节性(Seasonality):在固定周期内重复出现的模式。
  3. 残差(Residuals):在去除趋势与季节性之后的随机噪声或未解释的变动。

我们将涵盖两种分解方式——加性与乘性:

  • 在加性模型中,每个观测值(即时间点)的实际序列值等于三部分之和,假设趋势与季节性的幅度随时间保持恒定。
  • 在乘性模型中,序列表达为各组成部分的乘积,季节性与趋势效应会随序列水平而缩放,更适用于呈指数增长的数据。

时间序列分析中的一个关键概念是平稳性。平稳序列的统计特性(均值、方差与自相关)随时间保持不变,更易建模与预测。许多预测方法与加性分解都假设序列是平稳的。对于非平稳数据,通常需要进行变换以稳定方差并去除趋势,从而确保分解结果准确且可解释。

处理非平稳性

由于金融资产的价格通常由许多相互叠加的不同模式共同作用,因此几乎不会是平稳的。对于比特币来说更是如此,其价格历史具有高波动、强劲上行趋势与不规则季节性。对原始时间序列进行增强型 Dickey-Fuller(ADF)检验的结果验证了我们的初步判断,显示比特币价格远非平稳。

面对非平稳时间序列,仍然可以进行分解。我们可以对原始时间序列执行乘性分解,或通过将每个值减去其前一个值(差分)、对数变换(取对数),或两者结合,使其适用于加性分解。

相应地,我们基于每日的 Close 价格创建三列新数据,命名为 Close_Diff、Close_Log 与 Close_Log_Diff。需要注意后一种情况中变换顺序的重要性:如果先做差分,会产生许多负值,无法取对数。因此必须先取对数再差分。

对这些新列进行进一步的 ADF 检验表明,Close_Diff 与 Close_Log_Diff 是平稳的,而 Close_Log 不是。这本身不一定是问题,但会增加组成部分分离不完全的可能性,具体表现为残差存在自相关且不呈正态分布。

总之,我们将执行以下分解:

  • 原始时间序列:乘性分解
  • 差分后时间序列:加性分解
  • 取对数时间序列:加性分解
  • 取对数并差分时间序列:加性分解

分析不同的分解方法

我们可以使用 statsmodels 包进行分解。需要传入时间序列、model 参数中的分解类型,以及季节性的 period。

比特币价格中唯一可预期的季节性与减半事件相关。由于每次减半之间的时间跨度大致相同,我们可以取迄今各次减半日期间的平均天数,得到 1,379 天的季节性周期。

趋势与季节性组件必须能提供有意义的洞见,因此首先应关注各方法的可解释性。原始时间序列的乘性分解与取对数序列的加性分解都给出了平滑、方向明确的趋势线以及各周期中一致的季节性组件。而两种差分序列都未能提供易于解释的趋势线,从而未能实现其主要目的。

对残差进行进一步统计评估,揭示了两种可行分解方法各自的优劣。两者共有的弱点是残差的高自相关性,这在Ljung-Box 检验统计量(分别为 30618.1 与 29331.3,p 值均为 0)的很高数值中有所体现。这表明成分分离不完全,残差中似乎仍残留一些模式。

原始时间序列乘性分解的优势在于残差近似正态,Shapiro-Wilk 统计量为 0.992,即 99.2% 的正态性。这表明残差在分布上类似白噪声,因为正态分布的残差往往意味着未解释的变动是纯随机且无偏的。取对数序列的加性分解的残差也接近正态,但程度稍低(SW = 0.971)。

最后,取对数序列的加性分解中,残差与取对数序列的相关性接近于零(-0.059)。这意味着分解未解释的数据量很小,且明显小于原始时间序列乘性分解的对应值(0.249)。

总体而言,取对数的加性分解在统计意义上提供了更为稳健的残差,尽管其正态性略有折衷,但与更强的随机性和更低的相关性相比,这一权衡是值得考虑的。

结果解读

毫不意外,两种分解都指向强劲的上升趋势。原始收盘价(白色)的趋势线呈指数增长,随着比特币价格上升,其斜率逐渐变陡。虽然该趋势抓住了总体上行,但由于指数增长的尺度,后期较大的变动被放大,容易掩盖早期的变化。

原始收盘与对数收盘两种方法的趋势线

相比之下,对数变换后的趋势线(绿色)平滑了增长,更接近线性,便于解读。仅在整体时间线的后三分之一,斜率略有下降,暗示比特币的指数增长有所放缓。通过稳定方差,对数变换避免了后期较大变动掩盖早期较小价格波动的情况。

在分析季节性时,我们需要牢记前述的统计限制。尽管如此,两张折线图都显示出一致且重复的季节性循环,表明比特币价格随时间呈现周期性行为。峰值与谷值对齐,暗示着市场活跃度或关注度的规律性阶段性变化。

原始收盘与对数收盘两种方法的季节性

峰谷的对称性表明,尽管比特币本身波动性很强,但节奏相对稳定。这可能意味着一致的市场趋势或参与者行为影响了比特币的周期性行为。由于图示季节性的一个周期等于两次减半之间的时间跨度,我们可以查看各周期中价格在何时见顶或见底。

根据提取的季节性组件,比特币价格在减半后约 466 天达到季节性峰值,而在下一次减半前约 97 天达到季节性谷值。若将其作为绿色与红色竖线标注到前面的对数比特币价格图上,效果如下:

比特币每日收盘价与减半日期、季节性成分极值(对数刻度)

季节性峰值与减半后的实际峰值始终高度吻合,总在实际峰值日期的三个月窗口内出现。相比之下,季节性谷值往往明显晚于实际周期低点,从而产生表面上的偏差。

这一偏差源于两个因素。首先,在每次周期性峰值之后,会有一段较长时期的周期性成分维持在接近最低值的水平,而实际低点就出现在这一阶段中。

其次,还必须考虑比特币价格的强劲上行趋势。由于季节性成分会一直保持不变,直到下一次减半前不久,上行趋势会使得减半前的价格高于实际周期低点,导致与预期季节性值的偏差更大。

发掘比特币价格中的微观模式

预测市场走势本就充满挑战,尤其是对比特币这类高度波动的资产。价格可能受宏观经济趋势、市场情绪与突发事件等复杂因素交织影响。尽管如此,我们仍尝试在混沌中寻找模式。

这包括比特币价格的盘中模式与日历效应,后者不同于在分解后的时间序列中观察到的“季节性”。分解得到的季节性跨度约四年,而日历效应关联的是较短、在特定时间框架内反复出现的模式,包括一周中的星期效应、一个月中的日期效应,以及一年中的月份效应。

小时级模式

与传统金融资产相比,加密货币的一大特点是 24/7 不间断交易。我们来看看平均一天中价格如何变化、成交量如何波动,是否存在某种模式。所有时间均以 GMT 表示。

为计算每小时的平均价格变动与波动率,我们首先使用 Timestamp 列的 .dt.hour 属性提取小时。随后用 .diff() 计算价格变动,即相对上一小时的 Close 差值。最后按小时分组并用 .agg() 计算各小时的平均价格变动与成交量。

结果以Plotly 折线图展示。橙色线代表各小时的平均价格变动,绿色线代表平均交易量。灰色阴影区域依时间顺序标示全球主要证券交易所——上海、伦敦与纽约(NYSE 与 NASDAQ)——的开盘时段。

比特币按小时的平均价格变动与交易量

比特币价格在 GMT 凌晨 2 点的平均涨幅最大,平均上涨 $11.48;其次为 GMT 下午 6 点,平均上涨 $3.59。该峰值与上交所开盘时间重合,并出现在一天中三个主要交易所均未开市(GMT 晚 9 点至凌晨 2 点)的唯一时段之后。

需要注意的是,各小时价格变动的标准差大致在 $150 到 $250 之间,远高于相应的均值多个数量级。这表明相较于更大的趋势,日内模式相当微弱且影响有限。尽管如此,凌晨 2 点与下午 6 点的平均价格变动差异在 99% 显著性水平上仍具有统计显著性。

交易量似乎从伦敦证券交易所开盘后开始上升,直至在纽约证交所与纳斯达克收盘前不久达到每小时 8.70 BTC 的峰值。此后,成交量持续下降,至上午 9 点降至最低(每小时 3.96 BTC)。这些观察表明,比特币的价格与成交量受主要证券交易所活跃时段与全球各地区作息的影响。

按星期的日度模式

为分析比特币在工作日的价格变动,我们先从 Date 列提取 .dt.weekday 分量,并用 .diff() 计算每日价格变动,方法与小时分析类似。该方法可洞察与特定星期几相关的重复模式。

比特币按星期的平均价格变动与成交量

从价格变动看,周一与周三涨幅最强,周二与周四则往往小幅回落。周五与周末较为中性,通常略有上涨。尽管标准差依然远大于均值,这一模式在各市场周期中均大体成立,仅有小幅差异。

平均交易量大致保持在 $280 亿左右,但周末有所回落,周日降至最低(约 $200 亿),周六与周一也略低。这进一步强调了全球证券交易所时间对比特币交易的影响。

按每月中的日期分析比特币价格变动时,各周期间并未出现一致的模式。每个周期都有其独特表现,难以识别与特定日期相关的一般性趋势或重复效应。

按月份的月度模式

为确保月度价格变动的准确性,我们先提取每月最后一天的收盘价。随后据此计算相对上月收盘的价格变动。之后将计算得到的价格变动与聚合后的月度交易量数据合并进行分析。

比特币按月份的平均价格变动与成交量

10 月与 2 月表现最为突出,平均涨幅约 $3,000。尤为值得一提的是,样本中近一半覆盖了比特币早期阶段,当时资产价格尚未达到 $3,000(首次达到是在 2017 年 10 月)。唯一显著的平均跌幅出现在 4 至 6 月,其中 5 月跌幅最大(-$1,380)。

4 月与 11 月的平均交易量最高,均超过 9,000 亿美元。有趣的是,4 月的高成交量伴随着价格下跌,而 11 月的高交易活跃则与明显的价格上涨($2,500)相一致。成交量较低的月份,如 8 月、9 月与 12 月,通常对应更为稳定的价格走势,反映出市场活跃度和波动性降低。

比特币的移动平均与金叉/死叉买卖策略

最后,我们看看如何使用移动平均来应用数据驱动的买卖策略。

注意:本章纯粹用于教育目的,不构成财务建议。

简单移动平均(SMA)与指数移动平均(EMA)是用于在指定时间段内平滑价格波动的工具,帮助交易者在波动市场中识别更稳定的趋势。SMA 计算固定期数内的平均价格,对每一期赋予同等权重;EMA 则对更近期的价格赋予更高权重,从而对最新的市场变化更为敏感。

“交叉”策略关注两条移动平均线——通常一条为短周期,一条为长周期。金叉是短期均线向上穿越长期均线,被视为潜在的多头信号,传统上对应买入;相反,死叉是短期均线向下穿越长期均线,被视为可能的空头信号,对应卖出。

这些交叉因能反映市场动能转变而被广泛视为较为可靠的交易指示。对于像比特币这样波动性极高的资产,选择合适的移动平均用于交叉策略需要在灵敏度(及早捕捉趋势)与稳定性(过滤噪声)之间取得平衡。因此,采用买卖信号定义不同的混合方法可能更为有效。

买入信号

比特币历史上长期表现为正增长,因此将较长周期作为买入信号是有意义的。因此,中长期移动平均(如 50 日与 200 日 SMA)很适合作为金叉搭配。它们有助于捕捉持续的上行趋势,同时过滤短期噪声,帮助交易者在更可靠的多头阶段入场。

比特币 50 日与 200 日移动平均及金叉点

图中显示了自 2020 年中至今,比特币价格与其 50 日和 200 日移动平均。白色虚线为 200 日均线,绿色虚线为 50 日均线,橙色线为比特币实际价格。发生 50 日向上穿越 200 日的金叉位置,用橙色竖线标注。

乍看之下,金叉策略效果不错,五次出现后均伴随显著上涨。例如,最近一次金叉发生在 2024 年 10 月 28 日,价格为 $69,892,此后仅一个半月内上涨了 40%。

然而,随后出现的峰值(最佳卖出点)的时间跨度差异很大,从 1.5 个月到 1.5 年不等。比如 2021 年 9 月的买入信号,仅 1.5 个月后就上涨了 40%,但随后的熊市阶段使价格花了两年多才回到 2021 年 9 月的买入价。

这一方法仍可进一步优化,但目前看来已足够可用。接下来我们看看另一面——应关注的卖出信号。

卖出信号

相比之下,找到合适的卖出时机以避免价格下跌更加困难。在熊市期间,比特币的波动性可能导致快速且陡峭的回撤,如果信号滞后,损失会更大。因此,从理论上说,死叉应采用短中期均线(如 21 日与 50 日 EMA),以尽早识别潜在下行并在高波动时期减小损失。

然而,从 2020 年中至今的可视化来看,卖出信号过多,其中一些出现在非常不合时宜的时间点,例如 2020 年 9 月或 2023 年 8 月,恰好是更大涨势的起点。

传统的死叉概念旨在回避短期损失,但对于像比特币这样长期呈强劲上行趋势且高度波动的资产,可能并非最佳。若假设这一长期趋势持续,可通过引入附加条件来优化策略,例如仅当价格相对平均买入价上涨 x 倍时才卖出。或者,引入其他度量,包括基于供给的指标或动量分析,可能提供更契合比特币独特市场行为的卖出信号。

其中一种动量取向的度量是相对强弱指数(RSI),通过衡量价格变动的速度与幅度来识别超买或超卖状态。高 RSI(通常高于 70)暗示资产处于超买,可能出现回调,是在价格飙升期间识别潜在卖出信号的有用工具。

若要考虑比特币的供给机制,考察 ThermoCap Multiple 会有帮助。该指标评估比特币市值与 ThermoCap(跟踪矿工收入)的比值。ThermoCap Multiple 偏高往往预示投机泡沫,暗示市场过热、价格可能回调,是长期卖出信号的有力指标。

最后,Reserve Risk 衡量长期持有者相对当前价格的信心。高 Reserve Risk 表明市场过度乐观与潜在高估,提示在显著回调发生前或许是合适的卖出时机。

结语

本分析基于比特币历史价格数据提炼了关键洞见。从识别与减半事件相关的季节性模式,到发掘盘中与日历效应中的微观模式,我们揭示了为比特币价格走势提供背景的趋势。若您希望更深入或扩展分析,完整代码见配套的DataLab 笔记本。

如果您想进一步学习时间序列分析,推荐查看以下资源:

主题