0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

時系列にも「基盤モデル」の時代が来た ― Chronos・TimeGPT・MOMENTの仕組みと使いどころ

0
Posted at

時系列にも「基盤モデル」の時代が来た ― Chronos・TimeGPT・MOMENTの仕組みと使いどころ

はじめに

時系列予測といえば、ARIMAや状態空間モデルなどの統計モデルに加え、XGBoost、LightGBM、LSTM、Transformerなどを使う方法が広く知られています。

これらの手法では、予測したいデータを用意し、そのデータの性質に合わせてモデルを学習・調整するのが基本でした。例えば、電力需要を予測するときは過去の需要や気温を、雨量を予測するときは過去の観測値や気象予報値を使ってモデルを作ります。

ところが、2024年頃から、少し違った方法が使われるようになってきました。さまざまな分野の時系列をあらかじめ大量に学習させておき、新しいデータに対しては追加学習をせずに予測する方法です。

このようなモデルを**時系列基盤モデル(Time Series Foundation Model:TSFM)**と呼びます。文章を扱う大規模言語モデル(LLM)と発想が似ているため、「時系列版LLM」と説明されることもあります。ただし、時系列基盤モデルが文章のLLMとまったく同じ仕組みというわけではありません。

本記事では、AmazonのChronos、NixtlaのTimeGPT、MOMENTを中心に、2026年時点の動向を整理します。また、ローカルPCでの実行例と、降雨予測に応用するときの注意点も紹介します。

1. 時系列基盤モデルとは

1.1 従来のモデルとの違い

従来の機械学習では、対象のデータを使ってモデルを学習します。一方、時系列基盤モデルは、さまざまな時系列から事前に学習した規則性を、新しいデータの予測にも利用します。

fig01_traditional_vs_foundation.png

図1:従来型のモデル構築と、時系列基盤モデルを用いた予測の違い

例えば、ある観測所の過去168時間のデータから、その先3時間を予測するとします。従来なら、その観測所の過去データを使ってモデルを学習する必要があります。時系列基盤モデルでは、事前学習済みのモデルに直近168時間を渡し、その先3時間を出力させることができます。

ただし、「追加学習が不要」と「入力データが不要」は別です。Zero-shot予測でも、通常は予測対象の過去の観測値を与えます。

1.2 Zero-shotとFine-tuning

よく使われる用語を整理しておきます。

用語 内容 モデルの重みの更新
Zero-shot 新しい対象データで追加学習せず、そのまま予測します なし
Few-shot / In-context 少数の例や関連情報を入力に含めて利用します 通常はなし
Fine-tuning 対象データを使って事前学習済みモデルを追加学習します あり
Linear probing 事前学習した特徴表現を取り出し、小さな予測器などを学習します 通常は追加の予測器のみ

まずZero-shotで予測し、その結果を見てからFine-tuningを検討する、という進め方ができます。最初から大きなモデルを学習する必要がないのは便利です。

一方で、Zero-shotの精度は対象データとの相性に左右されます。新しいデータを入力しただけで、必ず高精度な予測になるわけではありません。

2. 主な時系列基盤モデル

2026年10月時点で、よく知られているモデルを整理すると次のようになります。

モデル 主な開発元 特徴 主な利用形態
Chronos / Chronos-Bolt / Chronos-2 Amazon Zero-shot予測、確率予測。Chronos-2では多変量・外生変数に対応 公開モデルをローカルで利用可能
TimeGPT / TimeGPT 2.1 Nixtla APIでの予測、Fine-tuning、業務向けの提供 主にAPI。企業向けの専用提供もあります
MOMENT 研究チーム(CMUなど) 予測のほか、異常検知、分類、欠測補完、特徴抽出 公開モデルを利用可能
TimesFM / TimesFM-3 Google Research Zero-shot予測。TimesFM-3で多変量・外生変数に対応 公開実装・モデルを利用可能。ただし重みのライセンスに注意
Moirai / Moirai-2.0 Salesforce Research 多様な時系列を扱う汎用予測モデル 公開実装・モデルを利用可能

モデル名が似ていても、何を得意とするか、どのように提供されるかは異なります。特に、予測だけを行いたいのか、異常検知や分類まで使いたいのかで候補が変わります。

3. Chronos:数値の並びをTransformerで扱う

3.1 初代Chronosの考え方

Amazonが2024年に公開した初代Chronosは、数値の時系列をトークンに変換する方法を採用しています。

文章のLLMでは、文章をトークンに分け、続きを予測するように学習します。初代Chronosでは、数値を正規化・量子化してトークンへ変換し、数値列の続きを予測します。

fig02_chronos_tokenization.png

図2:初代Chronosにおける数値のトークン化と予測の流れ

この方法では、将来の系列を複数回サンプリングすることで、予測のばらつきも求められます。予測値を一つだけ出すのではなく、将来の値がどのあたりに分布しそうかを扱える点が特徴です。

3.2 Chronos-Boltで処理を高速化

2024年11月にはChronos-Boltが公開されました。

初代Chronosとは異なり、連続した複数の観測値をひとまとまりの**パッチ(patch)**として扱います。そして、将来の複数時点の分位点をまとめて出力します。

Amazonが公表している比較では、初代Chronosの同程度のモデルサイズに対し、最大250倍の推論高速化と最大20倍のメモリ効率改善が報告されています。ただし、これは特定条件での比較です。自分のPCでも同じ倍率になるという意味ではありません。

3.3 Chronos-2では多変量・外生変数にも対応

2025年10月に公開されたChronos-2では、単一の時系列だけでなく、関連する複数の時系列や外生変数を扱えるようになりました。

例えば、地点Aの雨量を予測するとき、地点Aの過去雨量だけを与える方法に加えて、近隣の地点B・Cの雨量や、予測時刻に利用可能な気象予報値を入力する構成が考えられます。

fig03_chronos2_multivariate.png

図3:複数観測所と気象予報値を使ったChronos-2の利用イメージ

Chronos-2の公開モデルは約1億2,000万パラメータです。ローカルで試すことができ、単変量予測から多変量予測へ段階的に進められます。

ただし、周辺観測所を追加すれば必ず精度が上がるわけではありません。観測所の配置や雨域の移動、予報値の品質によって結果は変わるため、入力条件を分けて評価する必要があります。

4. TimeGPT:APIから利用できる時系列基盤モデル

TimeGPTはNixtlaが開発しているモデルです。PythonからAPIを呼び出して予測を行えるため、モデルの重みを自分で管理せずに試せる点が便利です。

TimeGPTでは、Zero-shot予測に加えて、予測区間、外生変数、Fine-tuning、異常検知などの機能が提供されています。2025年12月に発表されたTimeGPT 2.1では、多変量予測や外生変数の処理などが強化されました。

APIを使う基本的な形は次のとおりです。

python -m pip install nixtla pandas
"""NixtlaのAPIを使って1時間データを3ステップ先まで予測します。"""

import os

import pandas as pd
from nixtla import NixtlaClient


def forecast_three_hours(csv_path: str) -> pd.DataFrame:
    """日時ds、観測値yを持つCSVから3時間先を予測します。

    本関数はAPI利用を前提とします。観測間隔の欠落や重複は、
    実行前のデータ整備工程で取り除いてください。
    """
    df = pd.read_csv(csv_path, parse_dates=["ds"])

    # APIキーをソースコードに書かず、環境変数から取得します。
    client = NixtlaClient(api_key=os.environ["NIXTLA_API_KEY"])

    # h=3、freq="h"で1時間ごとの3ステップ先を指定します。
    return client.forecast(
        df=df,
        h=3,
        freq="h",
        time_col="ds",
        target_col="y",
        level=[80, 90],
    )


if __name__ == "__main__":
    print(forecast_three_hours("rainfall.csv"))

上のコードはSDKの基本的な使い方を示したものです。APIキーが必要で、利用可能なモデルや料金、呼び出し条件は契約内容によって変わります。TimeGPT 2.1を明示的に選ぶ場合は、利用権限とSDKの対応状況を確認したうえで、model="timegpt-2.1"などの指定を検討してください。

また、TimeGPTは企業向けに専用環境やセルフホスト方式も案内されていますが、一般にモデルの重みを自由にダウンロードして実行する方式とは異なります。観測データを外部サービスへ送れない場合には、導入方法の確認が必要です。

5. MOMENT:予測以外の時系列解析にも使える

MOMENTは、ICML 2024で発表された時系列基盤モデルです。予測だけでなく、異常検知、分類、欠測補完、特徴表現の取得など、複数の課題を扱えることを目指しています。

MOMENTの事前学習では、時系列をパッチへ分割し、一部を隠して復元するMasked Reconstructionという方法を利用します。文章で使われるマスク学習の発想に近いものです。

fig04_moment_masked_reconstruction.png

図4:MOMENTのマスク復元学習と特徴表現の利用

MOMENTは、例えばセンサー異常を検知したい、似た波形を分類したい、欠測値を補完したいといった用途で候補になります。

ただし、すべてのタスクが同じ条件でZero-shot動作するわけではありません。予測のための追加ヘッドやLinear probing、Fine-tuningなどが必要になる場合があります。

6. TimesFM-3とMoiraiも押さえておきたい

6.1 TimesFM-3

Google ResearchのTimesFMも、時系列基盤モデルの代表例です。2026年8月に発表されたTimesFM-3は約3億3,000万パラメータで、単変量だけでなく、多変量や外生変数を用いたZero-shot予測に対応しています。

Google Researchは、GIFT-EvalやFEV-Benchなどのベンチマークで高い性能を報告しています。ただし、こうした結果は特定のデータセットや評価条件に基づくため、実務データでも同じ順位になるとは限りません。

利用する際にはライセンスを確認してください。 TimesFMのソースコードはApache-2.0ですが、TimesFM-3の公開事前学習済み重みは、2026年10月時点では非商用・非本番利用に制限されています。研究用途の検証と、業務システムへの採用は分けて考える必要があります。

6.2 Moirai

Salesforce ResearchのMoiraiも、幅広い分野の時系列を扱うためのモデルです。Moirai-2.0は2025年に公開されました。

モデルを比較するとき、ChronosとTimesFMだけに絞らず、Moiraiのような異なる設計のモデルを含めると、対象データとの相性を確認しやすくなります。

7. Zero-shot予測の精度をどう考えるか

時系列基盤モデルは便利ですが、従来の手法をすべて置き換えるものではありません。

電力需要や販売量のように、曜日や季節による規則性を持つデータでは、事前学習した特徴を利用できる可能性があります。一方、突発的な事故や極端な気象現象など、発生頻度が低く急激な変化を伴うデータは難しい場合があります。

とくに降雨データには、雨が降らない時間が多い一方で、短い時間に雨量が急増する特徴があります。全体の平均誤差が小さくても、強雨を見逃していれば防災用途には不十分です。

モデルを比較するときは、少なくとも次の点を確認します。

  • 同じデータ、同じ予測時刻、同じ予測対象期間で比較します。
  • Zero-shotモデルにも、ARIMAやXGBoostなどの従来モデルにも、同じ時点で利用可能だった情報だけを与えます。
  • 全体のMAEやRMSEだけでなく、強雨事例に限った評価も行います。
  • 確率予測を使う場合は、予測区間が実際に妥当な割合で観測値を含むか確かめます。
  • メモリ使用量、処理時間、再学習や運用の手間も比較します。

また、公開モデルの事前学習データに評価用データと重なる期間・系列が含まれていないか、確認できる範囲で調べる必要があります。基盤モデルのベンチマークでは、事前学習データと評価データの重複が課題になることがあります。

8. Chronos-2をローカルPCで動かしてみる

ここでは、公開モデルのChronos-2を使い、CSVに保存した1時間データの3ステップ先を予測する例を示します。学習処理は行わず、事前学習済みモデルを読み込んで推論します。

動作例の想定環境は、Ubuntu 24.04、Python、PyTorchです。GPUが使える場合はCUDAを利用します。以下はAPIの確認に基づくサンプルコードであり、本記事の作成環境でGPU推論まで実行確認したものではありません。

8.1 準備

まず仮想環境を用意します。

python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip

# CUDA環境では、公式手順に従って適切なPyTorchを先に導入します。
# https://pytorch.org/get-started/locally/
python -m pip install "chronos-forecasting>=2.0" pandas

GPUが認識されているか確認します。

python -c "import torch; print(torch.__version__); print(torch.cuda.is_available())"

Trueであれば、PyTorchからCUDAが利用可能です。Falseの場合はCPUで実行するか、PyTorchとCUDAの環境を確認してください。

8.2 入力CSV

入力ファイルをrainfall.csvとします。列はds(日時)とy(1時間雨量、mm)です。

ds,y
2026-09-01 00:00:00,0.0
2026-09-01 01:00:00,0.0
2026-09-01 02:00:00,0.5
2026-09-01 03:00:00,1.0
2026-09-01 04:00:00,0.0

これはCSV形式を示すための抜粋です。実行時には連続した1時間間隔のデータを十分な期間用意します。次のコードでは、説明用の入力条件として24点以上を必要とし、最大168点を使用します。24点という下限はこの例の設定であり、Chronos-2の必須条件を示すものではありません。

観測所データを使う場合は、欠測値、重複時刻、時刻が示す降雨集計区間などを先に整理しておきます。

8.3 Pythonコード

forecast_chronos2.pyとして保存します。

forecast_chronos2.py
"""1時間雨量からChronos-2で3時間先をZero-shot予測します。

入力:
    rainfall.csv: ds(日時), y(1時間雨量、mm)

出力:
    rainfall_forecast.csv: 予測日時、代表予測値、分位点

このコードは入力形式と推論APIを確認するための最小構成です。
予測精度の評価や外生変数の追加は別の処理として実装します。
"""

from pathlib import Path

import pandas as pd
import torch
from chronos import Chronos2Pipeline


INPUT_CSV = Path("rainfall.csv")
OUTPUT_CSV = Path("rainfall_forecast.csv")
CONTEXT_LENGTH = 168  # 過去7日分の1時間値を入力に利用します。
PREDICTION_LENGTH = 3  # 1時間、2時間、3時間先を予測します。


def load_rainfall(path: Path) -> pd.DataFrame:
    """CSVを読み込み、Chronos-2の長形式データへ変換します。

    欠測や時刻の不連続を推測で埋めると、元の観測データの
    意味が変わることがあります。そのため、本例では自動補完せず
    エラーとして扱い、入力データを見直せるようにします。

    Args:
        path: 入力CSVファイルのパス。

    Returns:
        item_id、timestamp、targetの3列を持つDataFrame。

    Raises:
        ValueError: 不正な日時、欠測、負の雨量、不連続な時刻など。
    """
    df = pd.read_csv(path)

    # 必須列が揃っていることを最初に確認します。
    if not {"ds", "y"}.issubset(df.columns):
        raise ValueError("CSVにはds列とy列が必要です。")

    # 日時と雨量を明示的に変換し、不正な値はエラーとします。
    df["ds"] = pd.to_datetime(df["ds"], errors="raise")
    df["y"] = pd.to_numeric(df["y"], errors="raise")
    df = df.sort_values("ds").reset_index(drop=True)

    if df["ds"].isna().any() or df["y"].isna().any():
        raise ValueError("日時または雨量に欠測があります。")
    if df["ds"].duplicated().any():
        raise ValueError("観測日時に重複があります。")
    if (df["y"] < 0).any():
        raise ValueError("雨量に負の値があります。")

    # 直近168時間を最大入力長として利用します。
    # 今回のサンプルでは短すぎる系列を受け付けないようにします。
    df = df.tail(CONTEXT_LENGTH).copy()
    if len(df) < 24:
        raise ValueError("このサンプルでは24点以上の1時間値が必要です。")

    # 1時間間隔が維持されているか調べます。
    intervals = df["ds"].diff().dropna()
    if not intervals.eq(pd.Timedelta(hours=1)).all():
        raise ValueError("日時が連続した1時間間隔になっていません。")

    # Chronos-2のDataFrame APIに合わせて列名を変換します。
    return pd.DataFrame(
        {
            "item_id": "station_001",
            "timestamp": df["ds"],
            "target": df["y"],
        }
    )


def run_forecast() -> pd.DataFrame:
    """公開済みChronos-2モデルで将来3ステップを予測します。"""
    context = load_rainfall(INPUT_CSV)

    # CUDAが利用可能な環境ではGPUを、それ以外ではCPUを使います。
    device = "cuda" if torch.cuda.is_available() else "cpu"
    print(f"推論デバイス: {device}")

    # 初回はモデル重みをダウンロードします。
    # ここではFine-tuningを行わず、公開モデルをそのまま使います。
    pipeline = Chronos2Pipeline.from_pretrained(
        "amazon/chronos-2",
        device_map=device,
    )

    # 分位点0.1、0.5、0.9を同時に取得します。
    # それぞれ10%、50%、90%分位点に対応します。
    forecast = pipeline.predict_df(
        context,
        prediction_length=PREDICTION_LENGTH,
        quantile_levels=[0.1, 0.5, 0.9],
        id_column="item_id",
        timestamp_column="timestamp",
        target="target",
        freq="h",
    )

    # 後続の可視化・精度評価で使えるようにCSVへ保存します。
    forecast.to_csv(OUTPUT_CSV, index=False)
    return forecast


def main() -> None:
    """予測処理を実行し、必要な列をコンソールへ出力します。"""
    forecast = run_forecast()
    columns = ["timestamp", "predictions", "0.1", "0.5", "0.9"]
    print(forecast[columns].to_string(index=False))
    print(f"出力ファイル: {OUTPUT_CSV}")


if __name__ == "__main__":
    main()

実行は次のとおりです。

python forecast_chronos2.py

予測結果には日時、代表予測値、10%・50%・90%分位点が含まれます。なお、ゼロ付近の雨量ではモデルが負の予測値を返す可能性もあります。物理的な非負制約をどう扱うかは、後処理と評価を含めて別途検討してください。

8.4 確率予測の見方

分位点予測は、予測値の不確実性を確認するために使います。

例えば、10%分位点が2 mm、中央値が12 mm、90%分位点が28 mmという結果なら、予測分布の中央80%に相当する範囲が2〜28 mmであることを表します。

ただし、モデルの出力する80%予測区間が、実際にも80%程度の割合で観測値を含むとは限りません。過去の予測事例に対して予測区間の被覆率を調べ、必要であれば確率校正を行います。

9. 降雨予測に応用する場合の進め方

1時間雨量から1〜3時間先を予測する場合、時系列基盤モデルは従来モデルとの比較対象として使えます。

例えば、AMeDASとMSMを用いるなら、以下のように条件を分けると、何が精度の改善に効いているのかを確認しやすくなります。

ケース 入力 方法
A 単一観測所の過去雨量 XGBoostなどの学習モデル
B 複数観測所の過去雨量 XGBoostなどの学習モデル
C MSM予報値 数値予報をそのまま利用
C' MSM予報値と過去の誤差 地点別の補正モデル
D 観測雨量とMSM予報値 統合学習モデル
E 単一観測所の過去雨量 Chronos-2のZero-shot予測
F 複数観測所とMSM予報値 Chronos-2の多変量・外生変数予測

fig05_rainfall_benchmark.png

図5:同じ予測条件で従来モデルと時系列基盤モデルを比較する流れ

9.1 将来の情報を混入させない

評価で特に気を付けたいのは、将来の情報を誤って入力しないことです。

例えば、9時の時点で10〜12時の雨量を予測するなら、9時に入手できた実況と、その時点で利用可能だったMSM予報だけを使います。後から取得した新しいMSM予報や将来の観測値を入力すると、正しい予測精度を測れません。

また、時刻の定義にも注意が必要です。雨量の「9時」は、通常9時までの1時間に積算した値です。入力値の集計区間と、予測対象の集計区間が揃っていることを確認します。

9.2 評価指標を分けておく

降雨予測では、単に平均誤差を比較するだけでは不十分です。

評価対象 指標の例 目的
雨量の大きさ MAE、RMSE 予測値と観測値の差を評価します
降雨の有無 Precision、Recall 空振りと見逃しを確認します
強雨の検出 POD、FAR、CSI 設定した雨量閾値の超過を評価します
確率予測 CRPS、分位点損失、Brier Score 分布や閾値超過確率の品質を評価します
予測区間 区間被覆率 不確実性の表現を確認します
運用性 推論時間、メモリ使用量 実運用に必要な資源を確認します

MAEが小さいモデルでも、強い雨を見逃すことはあります。全期間の評価に加え、一定雨量以上の時間帯や、独立した降雨イベントごとの評価を行うほうが実際の用途に合っています。

また、1時間先、2時間先、3時間先を分けて結果を示すことも重要です。予測が先になるほど、入力情報だけでは捉えられない変化が増えるためです。

10. どのモデルから試すか

目的 候補
軽いモデルでZero-shot予測を試す Chronos-Bolt
ローカルで単変量・多変量予測を比較する Chronos-2
APIを通じてすぐに予測する TimeGPT
異常検知や分類、欠測補完も調べる MOMENT
複数の基盤モデルを比較研究する Chronos-2、TimesFM-3、Moirai

GPUメモリが8GB程度の環境でも、小規模モデルや小さなバッチサイズで試せる余地はあります。16GB程度あれば選択肢は広がりますが、使用量は系列長、観測所数、バッチサイズ、数値精度などによって変わります。モデルのパラメータ数だけで必要VRAMを断定することはできません。

まずは、単一の時系列についてChronos-2でZero-shot予測を行い、単純な持続予測や季節ナイーブ予測、ARIMAなどと比較するのがよいと思います。そのうえで、XGBoostやLSTMとの比較、多変量化、Fine-tuningと進めれば、それぞれの手法の特徴がつかみやすくなります。

おわりに

時系列基盤モデルの登場によって、個々のデータに合わせてモデルを一から学習する方法に加え、事前学習済みのモデルをそのまま利用する方法が選べるようになりました。

Chronosはローカルで試しやすく、TimeGPTはAPIによる利用が特徴です。MOMENTは予測以外の時系列解析にも用途があり、TimesFMやMoiraiも比較対象として注目されています。

一方、基盤モデルを使えば必ず従来手法より精度が上がるというわけではありません。特に降雨のように急激な変化やまれな極端現象が重要なデータでは、予測時点で使えた情報を揃え、強雨の見逃しや予測区間の妥当性まで確認する必要があります。

今後、時系列予測の手法を比較する際には、Zero-shotの基盤モデルも一つの基準として加える価値があると思います。

参考資料

  1. Amazon Science, Chronos: Pretrained Models for Time Series Forecasting(Chronos、Chronos-Bolt、Chronos-2の公式実装)
  2. Amazon, Chronos-2 model card(モデル概要、実行例)
  3. Nixtla, TimeGPT 2.1: The Next Generation of Foundation Models for Time Series Forecasting(2025年12月10日)
  4. Nixtla, Nixtla Python SDK(APIの実行例)
  5. Goswami et al., MOMENT: A Family of Open Time-series Foundation Models(ICML 2024、公式実装)
  6. Google Research, TimesFM-3: A zero-shot foundation model for multivariate forecasting(2026年8月31日)
  7. Google Research, TimesFM GitHub(バージョン、ライセンス)
  8. Salesforce Research, Uni2TS / Moirai(公式実装)
  9. PyTorch, Start Locally(使用環境に応じたインストール)

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?