引言

时间序列预测是金融领域一项普遍的任务,支持交易、风险管理和战略规划中的决策。尽管它广泛应用,但预测金融资产的未来价格仍然是一个艰巨的挑战,这主要是由于金融市场固有的波动性。

对于那些相信预测这些资产的可能性的人,或者对于其工作需要此类预测的专业人士而言,TimeGPT 是一个强大的工具,可以简化预测过程。

在本教程中,我们将演示如何使用 TimeGPT 进行金融时间序列预测,重点关注比特币价格预测。我们还将展示如何使用 TimeGPT 进行不确定性量化,这对于风险管理和决策至关重要。

目录

  1. 加载比特币价格数据

  2. TimeGPT 入门

  3. 可视化数据

  4. 使用 TimeGPT 进行预测

  5. 使用 TimeGPT 扩展比特币价格分析

  6. 了解模型的局限性

  7. 参考文献和附加材料

1. 加载比特币价格数据

比特币 (₿) 是第一种去中心化的数字货币,也是最受欢迎的加密货币之一。交易在称为区块链的公共账本上进行管理和记录。比特币通过挖矿产生,挖矿是一个涉及解决复杂加密任务以验证交易的过程。这种数字货币可用于商品和服务的支付,与其他货币兑换,或作为价值储存手段。

在本教程中,我们将首先下载美元计价的历史比特币价格数据,格式为 pandas DataFrame。

import pandas as pd 

df = pd.read_csv('https://raw.githubusercontent.com/Nixtla/transfer-learning-time-series/main/datasets/bitcoin_price_usd.csv', sep=',')  
df.head()
日期收盘价
02020-01-017200.174316
12020-01-026985.470215
22020-01-037344.884277
32020-01-047410.656738
42020-01-057411.317383

此数据集包含 2020-01-01 至 2023-12-31 期间比特币的美元收盘价。重要的是要注意,与传统金融资产不同,比特币是全天候交易的。因此,收盘价代表每天特定时间比特币的价格,而不是交易日结束时的价格。

为了方便起见,我们将 DateClose 列分别重命名为 dsy

df.rename(columns={'Date': 'ds', 'Close': 'y'}, inplace=True)

2. TimeGPT 入门

要开始使用 TimeGPT,您需要实例化 NixtlaClient 类。为此,您需要一个 Nixtla API 密钥。

from nixtla import NixtlaClient
nixtla_client = NixtlaClient(
    # defaults to os.environ.get("NIXTLA_API_KEY")
    api_key = 'my_api_key_provided_by_nixtla'
)

👍 使用 Azure AI 端点

要使用 Azure AI 端点,请记住同时设置 base_url 参数

nixtla_client = NixtlaClient(base_url="您的 Azure AI 端点", api_key="您的 api_key")

要了解更多关于如何设置 API 密钥的信息,请参阅 设置您的身份验证 API 密钥 教程。

3. 可视化数据

在尝试任何预测之前,最好先可视化我们要预测的数据。NixtlaClient 类为此提供了一个 plot 方法。

plot 方法有一个 engine 参数,允许您选择不同的绘图库。默认是 matplotlib,但您也可以使用 plotly 进行交互式绘图。

nixtla_client.plot(df)

如果您尚未将 DataFrame 的列名重命名为 dsy,您将需要指定 plot 方法的 time_coltarget_col 参数

nixtla_client.plot(df, time_col='name of your time column', target_col='name of your target column')

这不仅适用于 plot 方法,也适用于 NixtlaClient 类的所有方法。

4. 使用 TimeGPT 进行预测

现在我们准备使用 TimeGPT 生成预测。为此,我们将使用 NixtlaClient 类中的 forecast 方法。

forecast 方法需要以下参数

  • df: 包含时间序列数据的 DataFrame

  • h: (int) 预测范围。在本例中,我们将预测未来 7 天。

  • level: (list) 预测区间的置信水平。考虑到比特币固有的波动性,我们将使用多个置信水平。

level = [50,80,90] # confidence levels 

fcst = nixtla_client.forecast(df, h=7, level=level)
fcst.head()
INFO:nixtla.nixtla_client:Validating inputs...
INFO:nixtla.nixtla_client:Preprocessing dataframes...
INFO:nixtla.nixtla_client:Inferred freq: D
INFO:nixtla.nixtla_client:Restricting input...
INFO:nixtla.nixtla_client:Calling Forecast Endpoint...
dsTimeGPTTimeGPT-lo-90TimeGPT-lo-80TimeGPT-lo-50TimeGPT-hi-50TimeGPT-hi-80TimeGPT-hi-90
02024-01-0142269.46093839567.20902040429.95363641380.65464643158.26722944108.96823944971.712855
12024-01-0242469.91796939697.94166940578.19704941466.51136143473.32457644361.63888845241.894268
22024-01-0342864.07812540538.87124341586.25250742284.31667443443.83957644141.90374345189.285007
32024-01-0442881.62109440603.11744841216.10649342058.53939243704.70279544547.13569445160.124739
42024-01-0542773.45703140213.69976040665.38478041489.81243144057.10163244881.52928245333.214302

📘 Azure AI 中的可用模型

如果您正在使用 Azure AI 端点,请确保设置 model="azureai"

nixtla_client.forecast(..., model="azureai")

对于公共 API,我们支持两种模型:timegpt-1timegpt-1-long-horizon

默认情况下使用 timegpt-1。请参阅本教程了解何时以及如何使用 timegpt-1-long-horizon

我们可以将刚刚生成的预测传递给 plot 方法,以与历史数据一起可视化预测结果。

nixtla_client.plot(df, fcst, level=level)

为了更仔细地查看预测结果,我们可以放大绘图或使用 max_insample_length 参数指定要绘制的最大样本内观测值数量。请注意,例如将 max_insample_length 设置为 60,将显示最后 60 个历史值以及完整的预测结果。

nixtla_client.plot(df, fcst, level=level, max_insample_length=60)

此外,如果您将 forecast 方法的 add_history 参数设置为 TrueTimeGPT 也会为历史观测值生成预测。这对于评估模型在训练数据上的性能非常有用。

forecast = nixtla_client.forecast(df, h=7, level=level, add_history=True)
forecast.head()
INFO:nixtla.nixtla_client:Validating inputs...
INFO:nixtla.nixtla_client:Preprocessing dataframes...
INFO:nixtla.nixtla_client:Inferred freq: D
INFO:nixtla.nixtla_client:Calling Forecast Endpoint...
INFO:nixtla.nixtla_client:Calling Historical Forecast Endpoint...
dsTimeGPTTimeGPT-lo-50TimeGPT-lo-80TimeGPT-lo-90TimeGPT-hi-50TimeGPT-hi-80TimeGPT-hi-90
02020-02-039425.7021487622.2871945999.1574795027.77967711229.11710312852.24681813823.624619
12020-02-049568.4824227765.0674676141.9377525170.55995111371.89737612995.02709213966.404893
22020-02-059557.0820317753.6670776130.5373625159.15956011360.49698612983.62670113955.004502
32020-02-069486.1230477682.7080926059.5783775088.20057611289.53800112912.66771713884.045518
42020-02-079475.2421887671.8272336048.6975185077.31971611278.65714212901.78685713873.164659

📘 Azure AI 中的可用模型

如果您正在使用 Azure AI 端点,请确保设置 model="azureai"

nixtla_client.forecast(..., model="azureai")

对于公共 API,我们支持两种模型:timegpt-1timegpt-1-long-horizon

默认情况下使用 timegpt-1。请参阅本教程了解何时以及如何使用 timegpt-1-long-horizon

nixtla_client.plot(df, forecast, level=level)

5. 使用 TimeGPT 扩展比特币价格分析

异常检测

鉴于比特币价格的波动性,尝试识别数据中的异常情况会很有用。可以通过调用 NixtlaClient 类中的 detect_anomalies 方法来使用 TimeGPT 执行此操作。此方法根据序列中的上下文评估每个观测值,使用统计度量来确定其成为异常的可能性。默认情况下,它基于 99% 的预测区间识别异常。要更改此设置,您可以指定 level 参数。

anomalies_df = nixtla_client.detect_anomalies(df)
INFO:nixtla.nixtla_client:Validating inputs...
INFO:nixtla.nixtla_client:Preprocessing dataframes...
INFO:nixtla.nixtla_client:Inferred freq: D
INFO:nixtla.nixtla_client:Calling Anomaly Detector Endpoint...

📘 Azure AI 中的可用模型

如果您正在使用 Azure AI 端点,请确保设置 model="azureai"

nixtla_client.detect_anomalies(..., model="azureai")

对于公共 API,我们支持两种模型:timegpt-1timegpt-1-long-horizon

默认情况下使用 timegpt-1。请参阅本教程了解何时以及如何使用 timegpt-1-long-horizon

nixtla_client.plot(df, anomalies_df, plot_anomalies=True)

要了解更多关于如何使用 TimeGPT 检测异常的信息,请参阅我们的异常检测教程。

添加外部变量

如果您有其他信息,并认为这些信息有助于改进预测,请考虑将其作为外部变量包含进来。例如,您可以添加其他加密货币的价格、专有信息、股票市场指数或比特币网络中的交易数量等数据。

TimeGPT 支持在 forecast 方法中包含外部变量。但是,请记住您需要知道这些变量的未来值。

要了解如何将外部变量纳入 TimeGPT,请参阅外部变量教程。

6. 了解模型的局限性

正如引言中所述,预测金融资产的未来价格是一项具有挑战性的任务,特别是对于像比特币这样的资产。本教程中的预测可能看起来很准确,主要是因为它们与最近的历史数据一致,并且模型会以短间隔更新新值,从而避免了显著偏差。然而,真正的挑战在于预测比特币未来几天的价格,而不仅仅是其历史表现。对于需要或希望尝试预测这些资产的人来说,TimeGPT 可以是一个简化预测过程的选择。只需几行代码,TimeGPT 就可以帮助您

  • 生成点预测
  • 量化预测的不确定性
  • 生成样本内预测
  • 检测异常
  • 纳入外部变量

要了解更多关于 TimeGPT 功能的信息,请参阅TimeGPT 文档

7. 参考文献和附加材料

参考文献

此外,对于许多金融时间序列而言,价格的最佳估计通常是随机游走模型,这意味着明天价格的最佳预测是今天的价格。Nixtla 的 StatsForecast 库允许您轻松实现此模型及其变体。