【Python機械学習】ドル円の未来予測をしてもらう具体的な手順

Alpha VantageのAPIを使ってよりたくさんのことをやってみたいということで、Pythonを使って為替レートの未来予測をシュミレートしてみましょう。

APIの取得はこちらの記事から。

ALPHA VANTAGE API を使って株価のデータを取得

具体的な手順を確認

プロジェクトを成功させるためには、以下のステップを踏むことが重要です。

ステップ 1: Alpha Vantage APIのセットアップ

  • Alpha Vantageのウェブサイトで無料APIキーを取得します。
  • 必要なPythonライブラリ(例:requestspandasmatplotlib、機械学習用のscikit-learnなど)をインストールします。

ステップ 2: 為替レートデータの取得

  • Alpha Vantage APIを使用して、特定の通貨ペアの過去の為替レートデータを取得します。
  • データをpandas DataFrameに格納し、前処理(例:欠損値の処理、データ型の変換など)を行います。

ステップ 3: データの探索的分析

  • matplotlibseabornを使用してデータを可視化し、トレンド、季節性、異常値などのパターンを探します。
  • 必要に応じて統計的分析を行います。

ステップ 4: 予測モデルの構築

  • scikit-learnや他の機械学習ライブラリを使用して予測モデルを構築します。時系列予測にはARIMA、LSTM(長短期記憶ネットワーク)、XGBoostなどの手法があります。
  • モデルのトレーニングとバリデーションを行い、過学習を避けるための手法(クロスバリデーション、正則化など)を適用します。

ステップ 5: モデルの評価と調整

  • テストデータセットを使用してモデルのパフォーマンスを評価します。
  • 評価指標(例:平均絶対誤差、平均二乗誤差、R2スコアなど)を使用して、モデルの精度を測定します。
  • 必要に応じてモデルの調整やフィーチャーエンジニアリングを行います。

ステップ 6: モデルのデプロイと監視

  • 完成したモデルを実際の環境にデプロイします。
  • モデルのパフォーマンスを継続的に監視し、必要に応じて調整します。

これらのステップを順に進めていけば、為替レートの分析と予測プロジェクトを成功させることができます。

通貨ペアの為替レートデータを取得

ステップ1はクリアしているはずですので、実際に通貨ペアのデータをAPIを使って取得していきます。

処理するためのPythonコードを作成。

以下の手順で進めていきましょう。

  1. Alpha Vantage APIの利用: Pythonのrequestsライブラリを使ってAPIにアクセスします。
  2. データの取得と前処理: 取得したデータをpandas DataFrameに格納し、前処理を行います。

まず、必要なライブラリをインストールする必要があります。

以下のコマンドを実行してください(すでにインストール済みの場合はスキップしてください)。

pip install pandas requests

ここでは例として、USD(アメリカドル)とJPY(日本円)の為替レートを取得します。

あなたのAPIキーをYOUR_API_KEYに置き換えてください。

import requests
import pandas as pd
def fetch_forex_data(api_key, from_currency, to_currency):
    url = f"https://www.alphavantage.co/query?function=CURRENCY_EXCHANGE_RATE&from_currency={from_currency}&to_currency={to_currency}&apikey={api_key}"
    
    response = requests.get(url)
    data = response.json()
    return data
# APIキーと通貨ペアを設定
api_key = "YOUR_API_KEY"  # ここにあなたのAPIキーを入力してください
from_currency = "USD"
to_currency = "JPY"
# データの取得
forex_data = fetch_forex_data(api_key, from_currency, to_currency)
# データをDataFrameに変換
df = pd.DataFrame([forex_data['Realtime Currency Exchange Rate']])
df = df.rename(columns=lambda x: x.split(". ")[1])
print(df)

現在の価格レートが正しく表示されているはずです。

各フレームを解説すると次のようになります。

出力されたデータフレームの各列には以下の情報が含まれています:

  • From_Currency Code: 基準通貨のコード(ここでは「USD」)
  • From_Currency Name: 基準通貨の名前(「United States Dollar」)
  • To_Currency Code: 対象通貨のコード(「JPY」)
  • To_Currency Name: 対象通貨の名前(「Japanese Yen」)
  • Exchange Rate: 為替レート(1 USDが何JPYか)
  • Last Refreshed: データの最終更新時刻(UTC)
  • Time Zone: 時間帯(「UTC」)
  • Bid Price: 買値
  • Ask Price: 売値

過去のデータを取得

Alpha Vantage APIを使用して過去の時系列為替レートデータを取得し、探索的データ分析(EDA)を行います。

このプロセスには、データの取得、可視化、および基本的な統計分析が含まれます。

まず、過去の時系列データを取得するためのコードを示します。

ここでは、USD/JPYの日次為替レートデータを取得する例を用います。

APIキーは前のステップで使用したものを再利用してください。

def fetch_daily_forex_data(api_key, from_currency, to_currency):
    url = f"https://www.alphavantage.co/query?function=FX_DAILY&from_symbol={from_currency}&to_symbol={to_currency}&apikey={api_key}&outputsize=full"
    
    response = requests.get(url)
    data = response.json()
    return data['Time Series FX (Daily)']
# データの取得
daily_forex_data = fetch_daily_forex_data(api_key, from_currency, to_currency)
# データをDataFrameに変換し、データ型を調整
df_daily = pd.DataFrame(daily_forex_data).T
df_daily = df_daily.apply(pd.to_numeric)
df_daily.index = pd.to_datetime(df_daily.index)
print(df_daily.head())

USD/JPYの過去の日次為替レートデータを取得し、pandas DataFrameに格納します。

DataFrameのインデックスは日付に変換され、すべての数値列は数値型に変換されます。

次に、取得したデータに対して基本的な探索的データ分析(EDA)を行います。

これには、データの可視化や基本統計の把握が含まれます。

以下に、データの可視化のためのコード例を示します。

import matplotlib.pyplot as plt
# 為替レートの時系列プロット
plt.figure(figsize=(12,6))
plt.plot(df_daily['4. close'], label='USD/JPY')
plt.title('USD/JPY Daily Exchange Rate')
plt.xlabel('Date')
plt.ylabel('Exchange Rate')
plt.legend()
plt.show()

このコードは、USD/JPYの日次為替レートを時系列プロットとして表示します。

これにより、データの全体的なトレンド、季節性、および異常値を視覚的に把握することができます。

予測モデルの構築

  1. データの前処理:
    • 欠損値の処理
    • 必要に応じてデータの平滑化や変換
  2. 特徴量エンジニアリング:
    • 過去のデータから新しい特徴量を生成(例:遅れ変数、移動平均など)
  3. モデルの選択:
    • 時系列予測に適したモデルを選択(例:ARIMA、LSTM、XGBoost)
  4. モデルのトレーニングとバリデーション:
    • データをトレーニングセットとテストセットに分割
    • モデルのトレーニングとバリデーション
  5. モデルの評価:
    • モデルのパフォーマンスを評価(例:平均絶対誤差、平均二乗誤差)

ここでは、ARIMA(自己回帰和分移動平均)モデルを例にして、簡単な予測モデルを構築する方法を示します。

ARIMAモデルは時系列データの予測に広く使われています。

まず、必要なライブラリをインストールしてください(すでにインストールしている場合はスキップ)。

pip install statsmodels
# 環境の違いでインポートエラーが出る場合は都度インポート
from statsmodels.tsa.arima.model import ARIMA
# DataFrameのインデックスに日次の頻度を設定
df_daily = df_daily.asfreq('B')  # 'B' は営業日の頻度を表します
# モデルの構築とフィット
model = ARIMA(df_daily['4. close'], order=(5,1,0))
model_fit = model.fit()
# 予測の取得
forecast = model_fit.forecast(steps=5)
# 実際のデータと予測のプロット
plt.figure(figsize=(12,6))
plt.plot(df_daily.index[-60:], df_daily['4. close'][-60:], label='Actual')
plt.plot(pd.date_range(df_daily.index[-1], periods=5, freq='B'), forecast, label='Forecast')
plt.title('USD/JPY Exchange Rate Forecast')
plt.xlabel('Date')
plt.ylabel('Exchange Rate')
plt.legend()
plt.show()

データフレームのインデックスは営業日の頻度情報を持つようになり、モデルはこの情報を使用して予測時に適切な日付インデックスを提供できるようになります。

現状だと精度はほぼないに等しい状態であることがわかります。

もし、データが非営業日も含む場合や別の頻度(例えば週次、月次)のデータである場合は、asfreqメソッドの引数を適宜変更してください。

これで警告メッセージは解消され、予測値に日付インデックスが正しく適用されるはずです。

モデルの評価と調整

  1. モデルのパフォーマンス評価:
    • モデルの精度を評価するための指標(例:平均絶対誤差 (MAE)、平均二乗誤差 (MSE))を使用します。
    • テストデータセットに対するモデルの予測を評価します。
  2. モデルのパラメータ調整:
    • ARIMAモデルのパラメータ(p, d, q)を調整して、モデルのパフォーマンスを向上させます。
    • 異なるモデルやアプローチを試してみることも有効です(例:SARIMA, LSTM)。
  3. 過学習のチェック:
    • トレーニングデータとテストデータのパフォーマンスを比較して、過学習の有無を確認します。

モデル評価のためのコード例

以下に、モデルの評価を行うためのコード例を示します。

この例では、データセットをトレーニングセットとテストセットに分割し、モデルの精度を評価します。

from sklearn.metrics import mean_squared_error, mean_absolute_error
import numpy as np
# データセットをトレーニングセットとテストセットに分割
train_size = int(len(df_daily) * 0.8)
train, test = df_daily[0:train_size], df_daily[train_size:len(df_daily)]
# モデルの構築とフィット(トレーニングデータで)
model = ARIMA(train['4. close'], order=(5,1,0))
model_fit = model.fit()
# テストデータに対する予測
forecast = model_fit.forecast(steps=len(test))
# モデル評価
mse = mean_squared_error(test['4. close'], forecast)
mae = mean_absolute_error(test['4. close'], forecast)
print('MSE: %.3f' % mse)
print('MAE: %.3f' % mae)

このコードは、データセットをトレーニングセットとテストセットに分割し、トレーニングセットでモデルを構築してから、テストセットでモデルの予測を行い、その精度を評価します。

評価指標としてMSE(平均二乗誤差)とMAE(平均絶対誤差)を使用します。

このコードを実行すると次のような出力になりました。

MSE: 404.475
MAE: 14.568

さてこの数字は一体何を意味しているのか。

解説していきましょう。

MSE(平均二乗誤差)とMAE(平均絶対誤差)

表示されたMSE(平均二乗誤差)とMAE(平均絶対誤差)は、モデルの予測精度を測定するための指標です。それぞれの指標が何を意味しているのか、そしてこれらの値からどのように改善を進めるべきかについて説明します。

MSE(平均二乗誤差)

  • MSEは、予測値と実際の値の差の二乗の平均を表します。
  • 数式では、MSE = Σ(予測値 – 実際の値)² / n (nはデータの数)。
  • MSEは常に正の値を取り、値が小さいほどモデルの予測精度が高いことを示します。
  • MSEは、大きな誤差によりペナルティを与えるため、大きな予測誤差が存在する場合に敏感です。

MAE(平均絶対誤差)

  • MAEは、予測値と実際の値の差の絶対値の平均を表します。
  • 数式では、MAE = Σ|予測値 – 実際の値| / n。
  • MAEも正の値を取り、値が小さいほどモデルの予測精度が高いことを示します。
  • MAEはMSEと比べて外れ値の影響を受けにくいです。

これらの値からの洞察

  • MSEが404.475、MAEが14.568という値は、予測誤差が比較的大きいことを示唆しています。特に、MSEが大きいことから、いくつかの予測値が実際の値から大きく逸脱している可能性があります。

改善のためのアプローチ

  1. モデルパラメータの調整:
    • ARIMAモデルのパラメータ(p, d, q)を調整してみます。これにはグリッドサーチやランダムサーチなどの手法が使えます。
  2. 特徴量の再検討:
    • 現在使用している特徴量(ここでは為替レートの履歴データ)以外の追加的な特徴量を検討します。
  3. 別のモデルの試行:
    • ARIMA以外のモデル(例:SARIMA、LSTM、XGBoost)を試してみると良いでしょう。
  4. データの追加:
    • さらに多くの歴史データを使用してモデルをトレーニングすると、パフォーマンスが向上する場合があります。
  5. 過学習の確認:
    • モデルがトレーニングデータに過剰に適合していないかを確認します。

ここからの手順

ここまでで非常に精度の低い未来予測ができるようになりました。

ここからそれぞれ学習していくことで精度を上げていくことが可能になります。

1. モデルパラメータの最適化(ARIMAの場合)

ARIMAモデルのパラメータ(p, d, q)を最適化することは、パフォーマンス向上に直接的に寄与します。これらのパラメータを変更することで、モデルがデータの特性(トレンド、季節性、ノイズなど)をより適切に捉えることができるようになります。

  • p(自己回帰項の数): データの自己相関を捉えます。自己相関プロットを確認して、適切なpの値を決定します。
  • d(差分の次数): 非定常性を除去します。データのトレンドや季節性を考慮してdを設定します。
  • q(移動平均項の数): モデルの誤差項の依存性を捉えます。

これらのパラメータは、通常、グリッドサーチや他の自動化された方法を用いて最適化されます。

2. 別のモデルへの切り替え

ARIMA以外のモデルを試すことも有効です。特に、以下のモデルは時系列データの予測において良い結果をもたらすことが多いです。

  • SARIMA(季節性ARIMA): ARIMAの拡張版で、季節性を持つデータに適しています。
  • LSTM(長短期記憶ネットワーク): 深層学習に基づくアプローチで、特に複雑な時系列データに適しています。
  • XGBoost: 決定木ベースのアンサンブル学習で、時系列データに対しても強力です。

3. データの追加や特徴量エンジニアリング

データ量を増やす、または特徴量を追加・改善することで、モデルがより多くの情報から学習できるようになります。例えば、経済指標や市場関連のニュースなど、為替レートに影響を与える可能性のある他のデータソースを組み込むことが考えられます。

安全なアプローチの選択

  • 段階的に進める: 一度に多くの変更を加えるのではなく、一つずつ変更を加えてその影響を観察します。
  • 過学習に注意する: 訓練データに過剰に適合しないように注意し、十分な量のテストデータでモデルを評価します。

これらのアプローチを通じてモデルの精度を改善し、より信頼性の高い予測結果を得ることが可能です。

現段階での予測結果を出力

他のトレーニングに移行する前にひとまずここまでの精度での出力をしてみましょう。

コードの要点を把握してください。

  1. データセットをトレーニングセットとテストセットに分割します。
  2. ARIMAモデルをトレーニングセットで構築し、フィットさせます。
  3. フィットしたモデルを使用してテストデータセットに対する予測を行います。
from statsmodels.tsa.arima.model import ARIMA
from sklearn.metrics import mean_squared_error, mean_absolute_error
# データセットをトレーニングセットとテストセットに分割
train_size = int(len(df_daily) * 0.8)
train, test = df_daily[0:train_size], df_daily[train_size:len(df_daily)]
# モデルの構築とフィット(トレーニングデータで)
model = ARIMA(train['4. close'], order=(5,1,0))
model_fit = model.fit()
# テストデータに対する予測
forecast = model_fit.forecast(steps=len(test))
# 予測結果と実際の値をプロット
plt.figure(figsize=(12,6))
plt.plot(test.index, test['4. close'], label='Actual')
plt.plot(test.index, forecast, label='Forecast')
plt.title('USD/JPY Exchange Rate Forecast vs Actual')
plt.xlabel('Date')
plt.ylabel('Exchange Rate')
plt.legend()
plt.show()
# モデル評価
mse = mean_squared_error(test['4. close'], forecast)
mae = mean_absolute_error(test['4. close'], forecast)
print('MSE: %.3f' % mse)
print('MAE: %.3f' % mae)

このコードにより、予測結果を視覚的に確認し、MSEとMAEを用いてモデルの精度を評価することができます。

5日後の予測

コードは、モデルを全データセットでトレーニングし、その後で実際の未来のデータに対する予測を行います。

# 全データでモデルをトレーニング
model = ARIMA(df_daily['4. close'], order=(5,1,0))
model_fit = model.fit()
# 未来のデータに対する予測(例:次の5日間)
forecast = model_fit.forecast(steps=5)
# 予測結果のプロット
plt.figure(figsize=(12,6))
plt.plot(df_daily.index, df_daily['4. close'], label='Actual')
plt.plot(pd.date_range(df_daily.index[-1], periods=5, freq='B'), forecast, label='Forecast', color='red')
plt.title('USD/JPY Future Exchange Rate Forecast')
plt.xlabel('Date')
plt.ylabel('Exchange Rate')
plt.legend()
plt.show()

このコードは、データセットの最後の日付から次の5営業日にわたる為替レートの予測値を生成し、それをプロットします。

プロットせずに出力

# 全データでモデルをトレーニング
model = ARIMA(df_daily['4. close'], order=(5,1,0))
model_fit = model.fit()
# 未来のデータに対する予測(例:次の5日間)
forecast = model_fit.forecast(steps=5)
# 予測結果の出力
forecast_dates = pd.date_range(df_daily.index[-1] + pd.Timedelta(days=1), periods=5, freq='B')
forecast_df = pd.DataFrame({'Date': forecast_dates, 'Forecast': forecast})
print(forecast_df)

モデルパラメータの最適化(ARIMAの場合)

モデルパラメータの最適化手順

  1. パラメータの範囲を決定する: p, d, q のそれぞれについて、試行するパラメータの範囲を決定します。
  2. グリッドサーチを実行する: 決定した範囲内で異なる組み合わせのパラメータを試し、最適な組み合わせを見つけます。
  3. モデルの性能を評価する: 各パラメータの組み合わせについてモデルをトレーニングし、テストデータセットでの性能を評価します。

パラメータ最適化のためのコード例

以下のコードは、グリッドサーチを用いてARIMAモデルの最適なパラメータを見つける一例です。このコードは計算量が多いので、実行には時間がかかる場合があります。

from statsmodels.tsa.arima.model import ARIMA
from sklearn.metrics import mean_squared_error
import itertools
import warnings
# パラメータの範囲を設定
p = d = q = range(0, 3)  # 例として 0 から 2 までの範囲を設定
pdq_combinations = list(itertools.product(p, d, q))
train_size = int(len(df_daily) * 0.8)
train, test = df_daily[0:train_size], df_daily[train_size:len(df_daily)]
lowest_mse = float('inf')
best_pdq = None
# グリッドサーチ
for pdq in pdq_combinations:
    try:
        model = ARIMA(train['4. close'], order=pdq)
        model_fit = model.fit()
        forecast = model_fit.forecast(steps=len(test))
        mse = mean_squared_error(test['4. close'], forecast)
        
        if mse < lowest_mse:
            lowest_mse = mse
            best_pdq = pdq
        print(f'ARIMA{pdq} MSE={mse}')
    except Exception as e:
        continue
print(f'Best ARIMA{best_pdq} MSE={lowest_mse}')

このコードは、異なるp, d, qの組み合わせを試し、各組み合わせに対するモデルのMSE(平均二乗誤差)を計算します。最も低いMSEを持つ組み合わせが最適なパラメータとして選択されます。

注意点

  • このプロセスは計算コストが高いため、まずはp, d, qの範囲を小さくして試行することをお勧めします。
  • 時間を節約するため、一部のデータを使って初期テストを行うことも有効です。
  • 異なる範囲や組み合わせで複数回試行し、最適な結果が得られるか確認することが重要です。

パラメータの最適化を通じて、モデルの精度を改善できることを願っています。他にご質問があれば、お気軽にお尋ねください。

範囲を絞って計算

予備テストを行うことで最適なARIMAモデルのパラメータが判明します。

p = d = q = range(0, 2)  # 0 と 1 のみを考慮
pdq_combinations = list(itertools.product(p, d, q))
lowest_mse = float('inf')
best_pdq = None
for pdq in pdq_combinations:
    try:
        model = ARIMA(train['4. close'], order=pdq)
        model_fit = model.fit()
        forecast = model_fit.forecast(steps=len(test))
        mse = mean_squared_error(test['4. close'], forecast)
        
        if mse < lowest_mse:
            lowest_mse = mse
            best_pdq = pdq
        print(f'ARIMA{pdq} MSE={mse}')
    except Exception as e:
        continue
print(f'Best ARIMA{best_pdq} MSE={lowest_mse}')

出力結果は次のようになりました。

ARIMA(0, 0, 0) MSE=584.6108732877307 ARIMA(0, 0, 1) MSE=584.540831888934 ARIMA(0, 1, 0) MSE=403.1676533320001 ARIMA(0, 1, 1) MSE=404.15281639072947 ARIMA(1, 0, 0) MSE=505.5165476166941 ARIMA(1, 0, 1) MSE=498.52736323470293 ARIMA(1, 1, 0) MSE=404.08354287523866 ARIMA(1, 1, 1) MSE=404.23406307034776 Best ARIMA(0, 1, 0) MSE=403.1676533320001

最適なARIMAモデルのパラメータは (0, 1, 0) であり、このパラメータによるモデルのMSE(平均二乗誤差)が最も低いことがわかります。これは、モデルが1次の差分を取ることで最良の予測を行うことを示していますが、自己回帰項(p)や移動平均項(q)は不要であることを意味します。

次に、この最適なパラメータ (0, 1, 0) を使用してモデルをトレーニングし、その後の5営業日の為替レートを予測します。以下のコードを実行して、未来の予測値を取得してください。

# 最適なパラメータでモデルをトレーニング
model_optimized = ARIMA(df_daily['4. close'], order=(0, 1, 0))
model_optimized_fit = model_optimized.fit()
# 未来のデータに対する予測(次の5日間)
forecast_optimized = model_optimized_fit.forecast(steps=5)
# 予測結果の出力
forecast_dates_optimized = pd.date_range(df_daily.index[-1] + pd.Timedelta(days=1), periods=5, freq='B')
forecast_df_optimized = pd.DataFrame({'Date': forecast_dates_optimized, 'Forecast': forecast_optimized})
print(forecast_df_optimized)

範囲を広げてグリッドサーチ

ここからは予備計算から、さらにARIMAモデルのパラメータ範囲を拡大して最適な組み合わせを探索することを試みます。

以下のコードは、p, d, qの各パラメータをより広い範囲で試すためのグリッドサーチの実装例です。

from statsmodels.tsa.arima.model import ARIMA
from sklearn.metrics import mean_squared_error
import itertools
import warnings
# パラメータの範囲を設定(より広い範囲で試す)
p = d = q = range(0, 3)  # 0 から 2 までの範囲を設定
pdq_combinations = list(itertools.product(p, d, q))
train_size = int(len(df_daily) * 0.8)
train, test = df_daily[0:train_size], df_daily[train_size:len(df_daily)]
lowest_mse = float('inf')
best_pdq = None
# グリッドサーチ
for pdq in pdq_combinations:
    try:
        model = ARIMA(train['4. close'], order=pdq)
        model_fit = model.fit()
        forecast = model_fit.forecast(steps=len(test))
        mse = mean_squared_error(test['4. close'], forecast)
        
        if mse < lowest_mse:
            lowest_mse = mse
            best_pdq = pdq
        print(f'ARIMA{pdq} MSE={mse}')
    except Exception as e:
        continue
print(f'Best ARIMA{best_pdq} MSE={lowest_mse}')

このコードは、p, d, qの範囲を0から2までに設定し、各組み合わせのモデルについてMSEを計算して、最も低いMSEを持つ組み合わせを見つけます。

未来予測のためのコード

グリッドサーチで見つかった最適なパラメータを使用して、モデルを再トレーニングし、未来の5営業日の為替レートを予測します。

このコードは、最適なパラメータを使用してモデルをトレーニングし、次の5営業日の為替レート予測を出力します。

# グリッドサーチで見つかった最適なパラメータでモデルをトレーニング
model_optimized = ARIMA(df_daily['4. close'], order=best_pdq)
model_optimized_fit = model_optimized.fit()
# 未来のデータに対する予測(次の5日間)
forecast_optimized = model_optimized_fit.forecast(steps=5)
# 予測結果の出力
forecast_dates_optimized = pd.date_range(df_daily.index[-1] + pd.Timedelta(days=1), periods=5, freq='B')
forecast_df_optimized = pd.DataFrame({'Date': forecast_dates_optimized, 'Forecast': forecast_optimized})
print(forecast_df_optimized)

30日後(forecastメソッドのsteps

次の30日の予測を行うためには、forecastメソッドのstepsパラメータを5から30に変更するだけです。これにより、モデルは現在のデータセットの最後から30日間の為替レート予測を行います。

以下のコードを実行することで、次の30営業日の為替レートの予測値を取得できます。

# 最適なパラメータでモデルをトレーニング
model_optimized = ARIMA(df_daily['4. close'], order=(0, 2, 1))
model_optimized_fit = model_optimized.fit()
# 未来のデータに対する予測(次の30日間)
forecast_optimized_30 = model_optimized_fit.forecast(steps=30)
# 予測結果の出力
forecast_dates_optimized_30 = pd.date_range(df_daily.index[-1] + pd.Timedelta(days=1), periods=30, freq='B')
forecast_df_optimized_30 = pd.DataFrame({'Date': forecast_dates_optimized_30, 'Forecast': forecast_optimized_30})
print(forecast_df_optimized_30)

このコードは、選択された最適なパラメータ (0, 2, 1) を使用してモデルをトレーニングし、データセットの最後の日から次の30営業日にわたる為替レートの予測値を計算します。

そして、これらの予測値と対応する日付が含まれるDataFrameを出力します。

ただし、より長期の予測を行う場合、予測の不確実性が増加することに注意してください。

特に、為替レートのような金融市場のデータは、多くの外部要因に影響されるため、長期予測は困難な場合があります。

サンプルデプロイ

モデルデプロイのステップ

  1. モデルの保存: トレーニング済みのモデルを保存することから始めます。Pythonでは、picklejoblibを使ってモデルオブジェクトをファイルに保存できます。
  2. デプロイ環境の選定: モデルをどこにデプロイするかを決定します。これには、自社のサーバー、クラウドサービス(AWS, Azure, GCPなど)、または専門のモデルホスティングサービスが含まれる場合があります。
  3. APIの構築: モデルをWeb APIとして構築し、外部からのリクエストに応じて予測結果を返すようにします。これにはFlaskやFastAPIなどのフレームワークがよく使用されます。
  4. インフラストラクチャの設定: モデルを稼働させるためのサーバー設定や、必要に応じて負荷分散、セキュリティ対策などを行います。
  5. モニタリングとメンテナンス: デプロイ後は、モデルのパフォーマンスを監視し、必要に応じてメンテナンスを行います。これにはデータドリフトの監視や再トレーニングが含まれる場合があります。

デプロイによる変化

  • アクセス性: デプロイにより、モデルが広範囲のユーザーやシステムからアクセス可能になります。
  • リアルタイム性: Web APIを通じてリアルタイムで予測を提供することが可能になります。
  • 自動化: モデルを通じた決定や予測の自動化が可能になり、業務効率が向上します。
  • スケーラビリティ: クラウドベースのデプロイメントを利用すると、需要に応じてリソースを調整することが容易になります。

実装例: Flaskを使用したモデルのデプロイ

from flask import Flask, request, jsonify
import joblib
# Flask アプリの初期化
app = Flask(__name__)
# モデルの読み込み
model = joblib.load('model_filename.pkl')
# 予測エンドポイントの定義
@app.route('/predict', methods=['POST'])
def predict():
    data = request.get_json()
    prediction = model.predict([data['input']])
    return jsonify({'prediction': prediction.tolist()})
if __name__ == '__main__':
    app.run(debug=True)

このコードは、Flaskを使用してシンプルな予測APIを構築する例です。

ここでは、事前にトレーニングされ保存されたモデルを読み込み、クライアントからのリクエストに基づいて予測結果を返します。

モデルのデプロイは、技術的な課題だけでなく、運用の観点からも様々な考慮が必要です。

適切なデプロイメント戦略は、プロジェクトの要件やリソースに大きく依存します。

期間を過去20年間に伸ばす

Alpha VantageのAPIは無料版ですと、過去2〜5年ほどとなっています。

他のAPIを使うことによってより広範囲のデータを抽出することができます。

ここでは一般的に無料で使えるデータソースとしてYahoo financeを使います。

import yfinance as yf
import pandas as pd
from statsmodels.tsa.arima.model import ARIMA
from sklearn.metrics import mean_squared_error, mean_absolute_error
# USD/JPYの為替レートデータを過去20年分取得
df = yf.download("JPY=X", start="2003-01-01", end="2023-12-07")
# データの前処理:日次の終値を使用し、欠損値を除去
df_daily = df[['Close']]
df_daily = df_daily.dropna()
# DataFrameのインデックスを日付形式に変換し、営業日の頻度を設定
df_daily.index = pd.DatetimeIndex(df_daily.index).to_period('B')
# データセットをトレーニングセットとテストセットに分割
train_size = int(len(df_daily) * 0.8)
train, test = df_daily[0:train_size], df_daily[train_size:len(df_daily)]
# ARIMAモデルの構築とフィット(トレーニングデータで)
model = ARIMA(train['Close'], order=(5,1,0))
model_fit = model.fit()
# テストデータに対する予測
forecast = model_fit.forecast(steps=len(test))
# モデル評価
mse = mean_squared_error(test['Close'], forecast)
mae = mean_absolute_error(test['Close'], forecast)
print('MSE: %.3f' % mse)
print('MAE: %.3f' % mae)

このコードを使うことによって過去20年分の為替レートデータからモデル分析を行うことができました。

実行結果を見てみましょう。

[*********************100%***********************] 1 of 1 completed MSE: 439.419 MAE: 14.803

from pandas.tseries.offsets import BDay
import pandas as pd
# 最後の観測日から予測開始日までの営業日数を計算
last_obs_date = df_daily.index[-1].to_timestamp()
start_forecast_date = pd.Timestamp('2023-12-08')
days_until_start_forecast = len(pd.date_range(last_obs_date, start_forecast_date, freq=BDay()))
# 予測開始日から5営業日後までの予測を行うために必要な合計予測日数
total_forecast_days = days_until_start_forecast + 5
# 予測を行う
future_forecast = model_fit.forecast(steps=total_forecast_days)
# 最後の5日間の予測結果を表示
print(future_forecast[-5:])
上部へスクロール