追加の学習なしで、ローカルで動き、ミリ秒で予測を返す小さな AI モデルで株価を予測できたらどうでしょうか?
時系列予測といえば、通常は ARIMA のような統計手法、機械学習パイプライン、あるいは特定データセットで学習したモデルを指します。Timestral は、2026 年 10 月 15 日に Mistral AI から公開されたオープンウェイトの予測モデル群で、別のアプローチを取ります。微調整なしで過去データから将来値を予測し、Mistral によれば最大モデルは 3 つの公開ベンチマークで事前学習済みゼロショットモデルの中で首位にランクインしています。
モデルは小型ながら、複数の予測ベンチマークで競争力のある精度を示し、金融市場からエネルギー消費、小売需要まで幅広く適用できます。
本チュートリアルでは、Timestral の概要と仕組みを紹介し、Python と uv を使ってローカル環境を構築し、実際の Apple(AAPL)株データで検証します。ローリング方式で 1 日先の予測を生成し、実際の終値やナイーブなベースラインと比較し、予測をシンプルな Buy/Sell/Hold シグナルに変換します。ほかにも、TimeGPT による時系列予測 や、ARIMA を用いた時系列予測 のチュートリアルも参照できます。
What Is Mistral Timestral?
Timestral は、Mistral AI が提供する高速・汎用の予測を目的としたオープンウェイトの時系列基盤モデル群です。時系列の基盤モデルは、多様で大規模な系列コレクションで一度だけ事前学習され、未見のデータでも予測できます。
特定データセットでの学習が必要な従来型の予測モデルと異なり、Timestral はゼロショット予測 に対応します。追加の学習や微調整なしに、過去データから直接将来値を予測します。
Timestral は因果的でパッチベースのトランスフォーマーで、主に合成データで学習したのち、実データと合成データの混合による第 2 段階の学習を行っています。株価、エネルギー需要、販売数、センサー計測などを扱えます。アーキテクチャと学習については 技術レポート で説明されています。
Mistral は、モデルサイズ・速度・精度のトレードオフが異なる 4 つのサイズを公開しました。
Model Parameters Weight size (FP32) Timestral-5M 5 million 21 MB Timestral-28M 28 million 111 MB Timestral-123M 123 million 490 MB Timestral-209M 209 million 837 MB
Mistral が公開したベンチマークによれば、Timestral-209M は GIFT-Eval 、TIME 、fev-bench において、事前学習済みゼロショットモデルの中で首位 とされています。報告では、TimesFM-3 や Falcon-2.0 のようなより大きなモデルを上回りました。これらは Mistral 自身の結果で、GIFT-Eval と TIME のリーダーボードにも提出されています。独立の検証はリーダーボードを確認してください。
速度も強みです。8 スレッドの標準的なサーバー CPU で、Timestral-209M は 15 分刻みの 3 週間分の履歴から 1 日先を113 ミリ秒 で予測し、5M モデルは 17 ミリ秒と報告されています。GPU は不要です。
Timestral は次の予測機能をサポートします。
長い履歴コンテキスト: 最大 32,768 ステップの過去データを入力可能。
多変量予測: 複数の関連時系列を同時に予測し、精度向上を図る。
確率的予測: 単一点ではなく 21 個の分位点を返し、不確実性を推定。
共変量: 過去のみ/将来既知の変数(数値・カテゴリ)を受け付け、予測に影響する要因を取り込む。
ローカル推論: 有料 API なしで CPU/GPU 上で動作。コードは Apache 2.0、ウェイトは修正 MIT ライセンスで公開。
本チュートリアルでは、Mistral の公開ベンチマークで最も大きく高精度な Timestral-209M を使用します。NVIDIA RTX 4070 GPU 上でローカル実行し、株価を予測して実データで性能評価します。
Set Up Timestral on Linux
Timestral には Python 3.10 以降と PyTorch 2.4 以降が必要です。ここでは Python 3.12、PyTorch 2.7.0、uv を使用し、Linux マシンに軽量な開発環境を構築します。Timestral は CPU 推論にも対応しているため、GPU は任意です。
まず、NVIDIA GPU が認識されドライバが機能しているか確認します。
nvidia-smi提供:
このコマンドは GPU 情報、ドライババージョン、CUDA 互換性を表示します。出力に GPU が表示されれば次へ進めます。
次に、高速な Python パッケージ/環境マネージャである uv をインストールします。
curl -LsSf https://astral.sh/uv/install.sh | sh 提供:
uv のインストール後はターミナルを再起動 し、コマンドがシェルで使えるようにしてください。
続いて、プロジェクトディレクトリと Python 3.12 の仮想環境を作成します。
mkdir timestral-project
cd timestral-project
uv venv --python 3.12
source .venv/bin/activate提供:
次に、CUDA 12.6 対応の PyTorch 2.7.0 をインストールします。
uv pip install torch == 2.7 .0 \
--index-url https://download.pytorch.org/whl/cu126提供:
検証時、RTX 4070 では CUDA 12.8 ビルドでドライバ互換性エラーが発生しました。PyTorch 2.7.0(CUDA 12.6)に切り替えると、ドライバ更新なしで解決しました。GPU と NVIDIA ドライバによっては別の CUDA ビルドが必要な場合があります。
GPU がない場合は、インデックス URL を https://download.pytorch.org/whl/cpu に置き換えて CPU 版をインストールしてください。後述のコードは自動的に CPU にフォールバックします。
続いて、公式 GitHub リポジトリ から直接 Timestral をインストールします。
uv pip install git+https://github.com/mistralai/timestral.git提供:
株価データの取得、予測処理、可視化、ノートブック実行に必要なライブラリをインストールします。
uv pip install numpy "pandas>=2.2,<3.1" matplotlib \
yfinance jupyterlab ipykernel tqdm提供:
yfinance で過去株価を取得し、pandas と NumPy でデータ処理、Matplotlib で実測と予測の可視化を行います。検証時の環境に合わせて pandas のバージョン範囲を制約し、互換性関連の警告を避けています。
先へ進む前に、PyTorch が GPU にアクセスできるか確認します。
python -c "import torch; print(torch.__version__); print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'No CUDA GPU available')" 提供:
出力例:
2.7.0+cu126
True
NVIDIA GeForce RTX 4070提供:
True は PyTorch から CUDA が利用可能であることを示し、最後の行は GPU 名です。これで Timestral の実験を始める準備が整いました。
個別の Python スクリプトではなく JupyterLab を使い、コードを段階的に実行し、予測値を確認し、実際の市場データと比較します。プロジェクトディレクトリから JupyterLab を起動してください。
python -m jupyter lab提供:
ターミナルに表示される URL(通常は http://localhost:8888/lab)を開き、設定した環境で新しい Python ノートブックを作成します。このノートブックで Timestral を読み込み、予測を生成し、モデルの性能を評価します。
Forecast Apple Stock Prices With Timestral
合成データではなく、実際の Apple の過去株価を使い、Timestral が翌営業日の終値をどれだけ正確に予測できるかを測ります。
より現実的な実験のため、ローリング方式の 1 日先予測 を行います。テスト期間の各営業日について、直近 500 本の終値を入力し、翌日の終値のみを予測します。
また、次の 2 手法を比較します。
生の価格予測: 翌日の終値を直接予測。
対数リターン予測: 翌日の対数価格変化を予測し、終値に戻す。
1. 過去株価をダウンロードする
ノートブックを開始して必要なライブラリをインポートします。ティッカー、テスト日数、コンテキスト長、モデル名も設定します。
import numpy as np
import pandas as pd
import torch
import yfinance as yf
import matplotlib. pyplot as plt
from tqdm. auto import tqdm
from IPython. display import display
from timestral import TimestralForecaster
TICKER = "AAPL"
DAYS = 60
WINDOW = 500
MODEL = "mistralai/Timestral-209M" 提供:
Apple の日次データを 5 年分ダウンロードします。auto_adjust=True を指定すると、分割や配当で調整された終値が返されます。
data = yf. download(
TICKER,
period= "5y" ,
interval= "1d" ,
auto_adjust= True ,
multi_level_index= False ,
progress= False ,
)
close = data[ "Close" ] . dropna( ) . astype( float )
assert len ( close) >= WINDOW + DAYS
assert ( close > 0 ) . all ( )
display( data. tail( ) ) 提供:
テストには直近の 60 営業日を使用し、各予測のコンテキストとしてその直前の 500 観測を用います。
2. GPU に Timestral を読み込む
209M モデルを GPU にロードします。CUDA が利用できない場合は CPU にフォールバックします。最初の実行時は 837 MB のウェイトが Hugging Face からダウンロードされます。
device = "cuda" if torch. cuda. is_available( ) else "cpu"
model = TimestralForecaster. from_pretrained(
MODEL,
device= device,
)
print ( f"Loaded { MODEL} on { device} " ) 提供:
RTX 4070 上で正常に読み込めました。
Loaded mistralai/Timestral-209M on cuda提供:
3. ローリング方式で 1 日先予測を生成する
各営業日について 2 種類の予測を作成します。1 つは過去の終値から、もう 1 つは対数リターンからです。対数リターンは価格の対数の前日比変化で、予測したリターンは直前の終値を使って価格に戻します。
actual = [ ]
price_predictions = [ ]
return_predictions = [ ]
previous_prices = [ ]
lower_bounds = [ ]
upper_bounds = [ ]
dates = [ ]
for i in tqdm( range ( DAYS) , desc= "Forecasting" ) :
pos = len ( close) - DAYS + i
history = close. iloc[ pos - WINDOW: pos] . to_numpy( dtype= np. float32)
previous = float ( history[ - 1 ] )
with torch. inference_mode( ) :
price_fc = model. forecast(
history,
prediction_length= 1 ,
)
price_pred = float ( price_fc. median. squeeze( ) )
returns = np. diff( np. log( history) )
return_fc = model. forecast(
returns. astype( np. float32) ,
prediction_length= 1 ,
)
return_pred = previous * np. exp(
float ( return_fc. median. squeeze( ) )
)
actual. append( float ( close. iloc[ pos] ) )
previous_prices. append( previous)
price_predictions. append( price_pred)
return_predictions. append( return_pred)
lower_bounds. append( float ( price_fc. quantile( 0.1 ) . squeeze( ) ) )
upper_bounds. append( float ( price_fc. quantile( 0.9 ) . squeeze( ) ) )
dates. append( close. index[ pos] )
actual = np. array( actual)
previous_prices = np. array( previous_prices)
price_predictions = np. array( price_predictions)
return_predictions = np. array( return_predictions)
lower_bounds = np. array( lower_bounds)
upper_bounds = np. array( upper_bounds)
results = pd. DataFrame( {
"Previous Close" : previous_prices,
"Actual" : actual,
"Raw Prediction" : price_predictions,
"Return Prediction" : return_predictions,
"Lower 10%" : lower_bounds,
"Upper 90%" : upper_bounds,
} , index= pd. DatetimeIndex( dates, name= "Date" ) )
display( results. tail( ) ) 提供:
モデルは 60 個のローリング 1 日先予測を生成し、それぞれ直近 500 本の終値を使用します。各予測は対象日の前に利用可能なデータのみを使うため、将来の価格が入力に漏れ込むことはありません。
4. 予測精度を評価する
平均絶対誤差(MAE)、二乗平均平方根誤差(RMSE)、平均絶対百分率誤差(MAPE)、方向性精度を測定します。また、明日の終値が今日と等しいと仮定するナイーブなベースラインとも比較します。
actual = results[ "Actual" ] . to_numpy( )
previous = results[ "Previous Close" ] . to_numpy( )
raw = results[ "Raw Prediction" ] . to_numpy( )
ret = results[ "Return Prediction" ] . to_numpy( )
def evaluate ( prediction, baseline= False ) :
metrics = {
"MAE ($)" : np. mean( np. abs ( actual - prediction) ) ,
"RMSE ($)" : np. sqrt( np. mean( ( actual - prediction) ** 2 ) ) ,
"MAPE (%)" : np. mean( np. abs ( ( actual - prediction) / actual) ) * 100 ,
}
metrics[ "Direction (%)" ] = (
np. nan if baseline
else np. mean( np. sign( actual - previous) == np. sign( prediction - previous) ) * 100
)
return metrics
metrics = pd. DataFrame( {
"Baseline" : evaluate( previous, baseline= True ) ,
"Raw Prices" : evaluate( raw) ,
"Log Returns" : evaluate( ret) ,
} ) . T
coverage = (
( actual >= results[ "Lower 10%" ] . to_numpy( ) )
& ( actual <= results[ "Upper 90%" ] . to_numpy( ) )
) . mean( ) * 100
display( metrics. round ( 2 ) )
print ( f"Raw-price 10-90% interval coverage: { coverage: .1f } %" ) 提供:
結果から、株価の生データよりも対数リターンを予測した方が、Timestral の性能がわずかに良いことが分かりました。
対数リターン方式は、MAE($3.05)、RMSE($3.84)、MAPE(0.93%)で最小となり、ベースラインを僅差で上回りました。
より重要なのは、方向性精度が生の価格の 41.67% から対数リターンでは 55% に改善し、株価が上がるか下がるかの予測がより良好になった点です。
また、生の価格モデルの予測区間カバレッジは 81.7% で、期待値の 80% に近く、不確実性推定がそこそこ較正されていることを示します。総じて、Timestral はかなり妥当な価格予測を生成しましたが、単純なベースラインに対する改善は最小限であり、取引判断を安定的に支えられるか判断するにはさらなる検証が必要です。
5. Timestral の予測を可視化する
Matplotlib を使って、実際の終値と 2 つの予測手法をプロットします。
fig, axes = plt. subplots(
2 , 1 ,
figsize= ( 14 , 9 ) ,
gridspec_kw= { "height_ratios" : [ 2 , 1 ] } ,
sharex= True ,
)
axes[ 0 ] . plot(
dates, actual,
label= "Actual Price" ,
color= "green" ,
linewidth= 2.5 ,
)
axes[ 0 ] . plot(
dates, price_predictions,
label= "Timestral Raw Price" ,
color= "orange" ,
linestyle= "--" ,
)
axes[ 0 ] . plot(
dates, return_predictions,
label= "Timestral Log Returns" ,
color= "royalblue" ,
linestyle= "--" ,
)
axes[ 0 ] . fill_between(
dates,
lower_bounds,
upper_bounds,
color= "orange" ,
alpha= 0.12 ,
label= "10-90% Forecast Range" ,
)
axes[ 0 ] . set_title( f"Timestral-209M | { TICKER} Rolling One-Day Forecast" )
axes[ 0 ] . set_ylabel( "Adjusted Close (USD)" )
axes[ 0 ] . legend( )
axes[ 0 ] . grid( alpha= 0.2 )
axes[ 1 ] . plot(
dates,
price_predictions - actual,
label= "Raw Price Error" ,
color= "orange" ,
)
axes[ 1 ] . plot(
dates,
return_predictions - actual,
label= "Log Return Error" ,
color= "royalblue" ,
)
axes[ 1 ] . axhline( 0 , color= "black" , linestyle= ":" )
axes[ 1 ] . set_ylabel( "Error ($)" )
axes[ 1 ] . set_xlabel( "Date" )
axes[ 1 ] . legend( )
axes[ 1 ] . grid( alpha= 0.2 )
fig. autofmt_xdate( )
plt. tight_layout( )
fig. savefig( "aapl_improved.png" , dpi= 180 , bbox_inches= "tight" )
plt. show( ) 提供:
チャートから、60 営業日にわたって Timestral がどれほど実際の Apple の価格に追随しているかがわかります。どちらの手法も上昇トレンドを捉えており、オレンジのシェーディングは生の価格モデルの 10–90% 予測区間です。下段は日次の予測誤差です。
多くの誤差は約 $5 の範囲内に収まり、急激な値動き時に $9~$11 の大きな外れが数回あります。2 つの手法の予測はほぼ同じで、わずかに対数リターンが優勢です。どちらの予測線も実際の価格に対して 1 日ほど遅れが見られ、ナイーブベースラインとの差が小さいことと整合します。
6. Buy/Hold/Sell シグナルを生成する
生の価格予測を、実験的な Buy/Hold/Sell シグナルに変換します。予測価格変化に 1% のしきい値を使います。
BUY: 予測上昇率が 1% 超。
SELL: 予測下落率が 1% 超。
HOLD: 予測変動が -1% ~ +1% の範囲。
これらのルールは NumPy で実装できます。
THRESHOLD = 1.0
change_pct = (
price_predictions / previous_prices - 1
) * 100
signals = np. where(
change_pct > THRESHOLD,
"BUY" ,
np. where( change_pct < - THRESHOLD, "SELL" , "HOLD" ) ,
)
results[ "Expected Change (%)" ] = change_pct
results[ "Signal" ] = signals
display( results. tail( 10 ) . round ( 2 ) )
display( results[ "Signal" ] . value_counts( ) )
results. to_csv( "aapl_signals.csv" ) 提供:
60 営業日のすべてで HOLD シグナル となり、BUY/SELL の推奨は出ませんでした。最後に示した 10 行では、想定変化率はいずれも ±0.15% を超えず、1% のしきい値から大きく下回っています。
これらのシグナルは方向性精度が弱かった(41.67%)生の価格予測に基づきます。対数リターン予測からのシグナルを見たい場合は、change_pct の計算で price_predictions を return_predictions に置き換えてください。しきい値を下げれば BUY/SELL シグナルは増えますが、予測誤差や市場ノイズへの感度も高まります。
これらのシグナルは実験用であり、実運用の取引を推奨するものではありません。本チュートリアルは投資助言ではありません。採算の取れる戦略になり得るかを判断するには、さらなるバックテスト、しきい値の調整、取引コスト分析が必要です。
Final Thoughts
総じて、Timestral には強く感心しました。
セットアップはシンプルで、推論は高速、外部 API に頼らず RTX 4070 上でローカル実行できました。
しかも、これらの軽量モデルは CPU でも動作するため、高価なハードウェアがなくても扱えるのが魅力です。
一方で、予測精度については結果がまちまちでした。
Timestral は株価にそこそこ追随しましたが、単純なベースラインをわずかに上回る程度でした。
私は金融予測やトレーディングの専門家ではないため、データ前処理、予測戦略、パラメータ調整でもっと改善できる余地はあるはずです。
これまでは TimeGPT のようなホスティング型の予測サービスを使ってきましたが、Timestral によってローカル予測の魅力が大きく高まりました。リリース以降、API 呼び出しや従量課金が不要で、高速かつ軽量なローカルモデルへと、予測ワークロードをより多く移行し始めています。
私にとって、 Timestral 最大の強みは精度だけでなく、予測をこれほど簡単かつ低コストにしてくれる点です。
手元のハードウェアで十分に使える時系列モデルを動かし、自由に実験し、外部サービスに依存せずアプリケーションに組み込めます。今回の株価予測は目覚ましいものではなかったとしても、ローカル予測アプリを構築する方にとって、Timestral は非常に有力な選択肢だと思います。
予測をもっと学びたい場合は、Time Series Analysis in Python コースをおすすめします。金融特化のモデリングには、Machine Learning for Finance in Python をお試しください。
追加の学習なしで、ローカルで動き、ミリ秒で予測を返す小さな AI モデルで株価を予測できたらどうでしょうか?
時系列予測といえば、通常は ARIMA のような統計手法、機械学習パイプライン、あるいは特定データセットで学習したモデルを指します。Timestral は、2026 年 10 月 15 日に Mistral AI から公開されたオープンウェイトの予測モデル群で、別のアプローチを取ります。微調整なしで過去データから将来値を予測し、Mistral によれば最大モデルは 3 つの公開ベンチマークで事前学習済みゼロショットモデルの中で首位にランクインしています。
モデルは小型ながら、複数の予測ベンチマークで競争力のある精度を示し、金融市場からエネルギー消費、小売需要まで幅広く適用できます。
本チュートリアルでは、Timestral の概要と仕組みを紹介し、Python と uv を使ってローカル環境を構築し、実際の Apple(AAPL)株データで検証します。ローリング方式で 1 日先の予測を生成し、実際の終値やナイーブなベースラインと比較し、予測をシンプルな Buy/Sell/Hold シグナルに変換します。ほかにも、TimeGPT による時系列予測や、ARIMA を用いた時系列予測のチュートリアルも参照できます。
What Is Mistral Timestral?
Timestral は、Mistral AI が提供する高速・汎用の予測を目的としたオープンウェイトの時系列基盤モデル群です。時系列の基盤モデルは、多様で大規模な系列コレクションで一度だけ事前学習され、未見のデータでも予測できます。
特定データセットでの学習が必要な従来型の予測モデルと異なり、Timestral はゼロショット予測に対応します。追加の学習や微調整なしに、過去データから直接将来値を予測します。
Timestral は因果的でパッチベースのトランスフォーマーで、主に合成データで学習したのち、実データと合成データの混合による第 2 段階の学習を行っています。株価、エネルギー需要、販売数、センサー計測などを扱えます。アーキテクチャと学習については 技術レポートで説明されています。
Mistral は、モデルサイズ・速度・精度のトレードオフが異なる 4 つのサイズを公開しました。
Mistral が公開したベンチマークによれば、Timestral-209M は GIFT-Eval、TIME、fev-bench において、事前学習済みゼロショットモデルの中で首位とされています。報告では、TimesFM-3 や Falcon-2.0 のようなより大きなモデルを上回りました。これらは Mistral 自身の結果で、GIFT-Eval と TIME のリーダーボードにも提出されています。独立の検証はリーダーボードを確認してください。
速度も強みです。8 スレッドの標準的なサーバー CPU で、Timestral-209M は 15 分刻みの 3 週間分の履歴から 1 日先を113 ミリ秒で予測し、5M モデルは 17 ミリ秒と報告されています。GPU は不要です。
Timestral は次の予測機能をサポートします。
本チュートリアルでは、Mistral の公開ベンチマークで最も大きく高精度な Timestral-209M を使用します。NVIDIA RTX 4070 GPU 上でローカル実行し、株価を予測して実データで性能評価します。
Set Up Timestral on Linux
Timestral には Python 3.10 以降と PyTorch 2.4 以降が必要です。ここでは Python 3.12、PyTorch 2.7.0、uv を使用し、Linux マシンに軽量な開発環境を構築します。Timestral は CPU 推論にも対応しているため、GPU は任意です。
まず、NVIDIA GPU が認識されドライバが機能しているか確認します。
このコマンドは GPU 情報、ドライババージョン、CUDA 互換性を表示します。出力に GPU が表示されれば次へ進めます。
次に、高速な Python パッケージ/環境マネージャである uv をインストールします。
uv のインストール後はターミナルを再起動し、コマンドがシェルで使えるようにしてください。
続いて、プロジェクトディレクトリと Python 3.12 の仮想環境を作成します。
次に、CUDA 12.6 対応の PyTorch 2.7.0 をインストールします。
検証時、RTX 4070 では CUDA 12.8 ビルドでドライバ互換性エラーが発生しました。PyTorch 2.7.0(CUDA 12.6)に切り替えると、ドライバ更新なしで解決しました。GPU と NVIDIA ドライバによっては別の CUDA ビルドが必要な場合があります。
GPU がない場合は、インデックス URL を
https://download.pytorch.org/whl/cpuに置き換えて CPU 版をインストールしてください。後述のコードは自動的に CPU にフォールバックします。続いて、公式 GitHub リポジトリから直接 Timestral をインストールします。
株価データの取得、予測処理、可視化、ノートブック実行に必要なライブラリをインストールします。
yfinance で過去株価を取得し、pandas と NumPy でデータ処理、Matplotlib で実測と予測の可視化を行います。検証時の環境に合わせて pandas のバージョン範囲を制約し、互換性関連の警告を避けています。
先へ進む前に、PyTorch が GPU にアクセスできるか確認します。
出力例:
Trueは PyTorch から CUDA が利用可能であることを示し、最後の行は GPU 名です。これで Timestral の実験を始める準備が整いました。個別の Python スクリプトではなく JupyterLab を使い、コードを段階的に実行し、予測値を確認し、実際の市場データと比較します。プロジェクトディレクトリから JupyterLab を起動してください。
ターミナルに表示される URL(通常は
http://localhost:8888/lab)を開き、設定した環境で新しい Python ノートブックを作成します。このノートブックで Timestral を読み込み、予測を生成し、モデルの性能を評価します。Forecast Apple Stock Prices With Timestral
合成データではなく、実際の Apple の過去株価を使い、Timestral が翌営業日の終値をどれだけ正確に予測できるかを測ります。
より現実的な実験のため、ローリング方式の 1 日先予測を行います。テスト期間の各営業日について、直近 500 本の終値を入力し、翌日の終値のみを予測します。
また、次の 2 手法を比較します。
1. 過去株価をダウンロードする
ノートブックを開始して必要なライブラリをインポートします。ティッカー、テスト日数、コンテキスト長、モデル名も設定します。
Apple の日次データを 5 年分ダウンロードします。
auto_adjust=Trueを指定すると、分割や配当で調整された終値が返されます。テストには直近の 60 営業日を使用し、各予測のコンテキストとしてその直前の 500 観測を用います。
2. GPU に Timestral を読み込む
209M モデルを GPU にロードします。CUDA が利用できない場合は CPU にフォールバックします。最初の実行時は 837 MB のウェイトが Hugging Face からダウンロードされます。
RTX 4070 上で正常に読み込めました。
3. ローリング方式で 1 日先予測を生成する
各営業日について 2 種類の予測を作成します。1 つは過去の終値から、もう 1 つは対数リターンからです。対数リターンは価格の対数の前日比変化で、予測したリターンは直前の終値を使って価格に戻します。
モデルは 60 個のローリング 1 日先予測を生成し、それぞれ直近 500 本の終値を使用します。各予測は対象日の前に利用可能なデータのみを使うため、将来の価格が入力に漏れ込むことはありません。
4. 予測精度を評価する
平均絶対誤差(MAE)、二乗平均平方根誤差(RMSE)、平均絶対百分率誤差(MAPE)、方向性精度を測定します。また、明日の終値が今日と等しいと仮定するナイーブなベースラインとも比較します。
結果から、株価の生データよりも対数リターンを予測した方が、Timestral の性能がわずかに良いことが分かりました。
対数リターン方式は、MAE($3.05)、RMSE($3.84)、MAPE(0.93%)で最小となり、ベースラインを僅差で上回りました。
より重要なのは、方向性精度が生の価格の 41.67% から対数リターンでは 55% に改善し、株価が上がるか下がるかの予測がより良好になった点です。
また、生の価格モデルの予測区間カバレッジは 81.7% で、期待値の 80% に近く、不確実性推定がそこそこ較正されていることを示します。総じて、Timestral はかなり妥当な価格予測を生成しましたが、単純なベースラインに対する改善は最小限であり、取引判断を安定的に支えられるか判断するにはさらなる検証が必要です。
5. Timestral の予測を可視化する
Matplotlib を使って、実際の終値と 2 つの予測手法をプロットします。
チャートから、60 営業日にわたって Timestral がどれほど実際の Apple の価格に追随しているかがわかります。どちらの手法も上昇トレンドを捉えており、オレンジのシェーディングは生の価格モデルの 10–90% 予測区間です。下段は日次の予測誤差です。
多くの誤差は約 $5 の範囲内に収まり、急激な値動き時に $9~$11 の大きな外れが数回あります。2 つの手法の予測はほぼ同じで、わずかに対数リターンが優勢です。どちらの予測線も実際の価格に対して 1 日ほど遅れが見られ、ナイーブベースラインとの差が小さいことと整合します。
6. Buy/Hold/Sell シグナルを生成する
生の価格予測を、実験的な Buy/Hold/Sell シグナルに変換します。予測価格変化に 1% のしきい値を使います。
これらのルールは NumPy で実装できます。
60 営業日のすべてで HOLD シグナルとなり、BUY/SELL の推奨は出ませんでした。最後に示した 10 行では、想定変化率はいずれも ±0.15% を超えず、1% のしきい値から大きく下回っています。
これらのシグナルは方向性精度が弱かった(41.67%)生の価格予測に基づきます。対数リターン予測からのシグナルを見たい場合は、
change_pctの計算でprice_predictionsをreturn_predictionsに置き換えてください。しきい値を下げれば BUY/SELL シグナルは増えますが、予測誤差や市場ノイズへの感度も高まります。これらのシグナルは実験用であり、実運用の取引を推奨するものではありません。本チュートリアルは投資助言ではありません。採算の取れる戦略になり得るかを判断するには、さらなるバックテスト、しきい値の調整、取引コスト分析が必要です。
Final Thoughts
総じて、Timestral には強く感心しました。
セットアップはシンプルで、推論は高速、外部 API に頼らず RTX 4070 上でローカル実行できました。
しかも、これらの軽量モデルは CPU でも動作するため、高価なハードウェアがなくても扱えるのが魅力です。
一方で、予測精度については結果がまちまちでした。
Timestral は株価にそこそこ追随しましたが、単純なベースラインをわずかに上回る程度でした。
私は金融予測やトレーディングの専門家ではないため、データ前処理、予測戦略、パラメータ調整でもっと改善できる余地はあるはずです。
これまでは TimeGPT のようなホスティング型の予測サービスを使ってきましたが、Timestral によってローカル予測の魅力が大きく高まりました。リリース以降、API 呼び出しや従量課金が不要で、高速かつ軽量なローカルモデルへと、予測ワークロードをより多く移行し始めています。
私にとって、Timestral 最大の強みは精度だけでなく、予測をこれほど簡単かつ低コストにしてくれる点です。
手元のハードウェアで十分に使える時系列モデルを動かし、自由に実験し、外部サービスに依存せずアプリケーションに組み込めます。今回の株価予測は目覚ましいものではなかったとしても、ローカル予測アプリを構築する方にとって、Timestral は非常に有力な選択肢だと思います。
予測をもっと学びたい場合は、Time Series Analysis in Python コースをおすすめします。金融特化のモデリングには、Machine Learning for Finance in Python をお試しください。