python機械学習でドル円予想をしてみた

pythonのsklearnを使ってドル円為替予想をしてみたいと思います。

ドル円の日足データから、一週間後のドル円価格が現在よりも上昇しているか、下降しているかを予想します。

機械学習のアルゴリズムは、ランダムフォレストを採用します。

計算コード

import yfinance
import datetime
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from sklearn.metrics import classification_report
import warnings
warnings.filterwarnings("ignore")

if __name__ == "__main__":
# ろうそく足のダウンロード
    tikker = "USDJPY=X"
    start = datetime.date(1980,1,1)
    end = datetime.date(2023,12,31)
    df = yfinance.download(tikker,start,end,interval='1d')
# 目的変数
    nday = 7
    df["r"] = np.log2(df["Close"].shift(-nday)/df["Close"])
    df["y"] = 0
    df.loc[df["r"] <= 0, "y"] = 0
    df.loc[df["r"] > 0, "y"] = 1
    y = df["y"]

# 説明変数
    df["x1"] = np.log2(df["Close"]/df["Close"].shift(1))
    df["x2"] = np.log2(df["Close"]/df["Close"].shift(2))
    df["x3"] = np.log2(df["Close"]/df["Close"].shift(3))
    df["x4"] = np.log2(df["Close"]/df["Close"].shift(4))
    df["x5"] = np.log2(df["Close"]/df["Close"].shift(5))
    df["x6"] = np.log2(df["Close"]/df["Close"].shift(10))
    df["x7"] = np.log2(df["Close"]/df["Close"].shift(15))
    df["x8"] = np.log2(df["Close"]/df["Close"].shift(20))
    df["x9"] = np.log2(df["Close"]/df["Close"].shift(25))
    x = df[["x1","x2","x3","x4","x5","x6","x7","x8","x9"]]

    x = x[25:-nday]
    y = y[25:-nday]

# 訓練データと検証データに分割
    x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.2)

# 複数回学習させて平均正解率を産出する
    n = 10
    scores = []
    for i in range(n):
        model = RandomForestClassifier()
        model.fit(x_train,y_train)
        y_pred = model.predict(x_test)
        print(classification_report(y_test,y_pred))
        print("正解率=", accuracy_score(y_test,y_pred))
        scores.append(accuracy_score(y_test,y_pred))

    print("平均正解率=",np.mean(scores),"±",2*np.std(scores))

上のpythonコードを実行した結果、私の環境では、
平均正解率= 0.5191019244476123 ± 0.01600202079385227
と出力されました。正解率51.9%です。なんだか心もとないですね。乱数を使っているので、結果毎に数値は多少変化します。上のコードでは10回計算して平均を最後に出力するようにしています。

上のコードの、
# 説明変数
の部分を変更することで、機械学習に渡す説明変数を追加できます。
上のコードでは、n日間の対数収益率を使用します(n=1,2,3,4,5,10,15,20,25)。

# 目的変数
の部分では、何を予想したいかを定義しています。今回は一週間後に価格が上がっていたなら1、下がっていたら0とラベルを付けています。


今回は機械学習でドル円予想をしました。上がるか下がるかの正解率は51.9%になりました。一応は半分以上の正解率にはなりました。説明変数を変更するなどして、正解率を高められないか、今後検証してみたいと思います。この記事を見てくれた方もぜひ挑戦してみて下さい。




この記事が気に入ったらサポートをしてみませんか?