3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

はじめてのアドベントカレンダーAdvent Calendar 2023

Day 14

Python3で機械学習により、外国為替1時間足の予測をする方法

Posted at

要 旨

Colaboratory上でPython3により機械学習で外国為替(USDJPY)の1時間足予測を実施する方法について記述します。

実行環境等

コンピューター: iMac 21.5インチ 2017年モデル
macOS: Ventura 13.6.1
Google Colaboratory使用(https://colab.research.google.com/notebooks/welcome.ipynb)

実施要領

プラットフォーム:Google Colaboratory
使用データ:yahoo finance
外国為替銘柄:USDJPY(米ドル円)
予測モデル:Scikit-learn pipeline
以下に外国為替(USDJPY)の1時間足を予測するPython3のプログラムの一例を示します。

USDJPY_H1_predict.py
import time
t1 = time.time()
import numpy as np
import csv
import math
import pandas as pd
import yfinance as yf
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

# 外為データ取得
tks  = 'USDJPY=X'
data = yf.download(tickers  = tks ,          # 通貨ペア
                   period   = '1y',          # データ取得期間 15m,1d,1mo,3mo,1y,10y,20y,30y  1996年10月30日からデータがある。
                   interval = '1h',         # データ表示間隔 1m,2m,5m,15m,30m,60m,90m,1h,1d,5d,1wk,1mo,3mo
                  )

#最後の日時を取り出す。
lastdatetime = data.index[-1]

#Close価格のみを取り出す。
data_close = data['Close']

#対数表示に変換する
ln_fx_price = []
for line in data_close:
    ln_fx_price.append(math.log(line))
count_s = len(ln_fx_price)

# 為替の上昇率を算出、おおよそ-1.0-1.0の範囲に収まるように調整
modified_data = []
for i in range(1, count_s):
    modified_data.append(float(ln_fx_price[i] - ln_fx_price[i-1])*1000)
count_m = len(modified_data)

# 前日までの4連続の上昇率のデータ
successive_data = []
# 正解値 価格上昇: 1 価格下落: 0
answers = []
for i in range(4, count_m):
    successive_data.append([modified_data[i-4], modified_data[i-3], modified_data[i-2], modified_data[i-1]])
    if modified_data[i] > 0:
        answers.append(1)
    else:
        answers.append(0)
# print (successive_data)
# print (answers)

# データ数
n = len(successive_data)
# print (n)
m = len(answers)
# print (m)

# pipelineモデル
clf = Pipeline([ ('scaler', StandardScaler()), ('clf', LogisticRegression())])
# モデルによる訓練 (データの75%を訓練に使用)
clf.fit(successive_data[:int(n*750/1000)], answers[:int(n*750/1000)])

# テスト用データ
# 正解
expected = answers[int(-n*250/1000):]
# 予測
predicted = clf.predict(successive_data[int(-n*250/1000):])

print(f'{lastdatetime}の次の1時間足の予測')
# 末尾の10個を比較
print ('正解:' + str(expected[-10:]))
print ('予測:' + str(list(predicted[-10:])))

# 正解率の計算
correct = 0.0
wrong = 0.0
for i in range(int(n*250/1000)):
    if expected[i] == predicted[i]:
        correct += 1
    else:
        wrong += 1

print('正解数: ' + str(int(correct)))
print('不正解数: ' + str(int(wrong)))

print ("正解率: " + str(round(correct / (correct+wrong) * 100,  2)) + "%")

successive_data.append([modified_data[count_m-4], modified_data[count_m-3], modified_data[count_m-2], modified_data[count_m-1]])
predicted = clf.predict(successive_data[-1:])
#print ('次の1時間足の予測:' + str(list(predicted)) + ' 1:陽線, 0:陰線')
if str(list(predicted)) == str([1]):
    print('上昇するでしょう。')
else:
    print('下落するでしょう。')

t2 = time.time()
elapsed_time = t2- t1
elapsed_time = round(elapsed_time, 2)
print('プログラム処理時間: ' + str(elapsed_time) + '')

出力例:
[100%%*] 1 of 1 completed
2023-12-05 11:00:00+00:00の次の1時間足の予測
正解:[1, 0, 0, 0, 0, 0, 1, 1, 0, 0]
予測:[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
正解数: 795
不正解数: 746
正解率: 51.59%
上昇するでしょう。
プログラム処理時間: 21.21秒

出力例の解説:
2023-12-05 11:00+00:00の次の1時間足の予測
2023年12月5日11:00(UTC)(日本時間20:00)の次の1時間足の予測(つまり21:00からの1じゃ環足の予測となる)
直近10個の予測と正解を表示させている。(1:上昇、0:下落)
正解数と不正解数、正解率の表示。
予測結果。(今回は、上昇と予測している。)
プログラム処理時間を秒表示

結 言

今回は、Colaboratory上でPython3により機械学習で外国為替(USDJPY)の1時間足予測を実施する方法について記述しました。

3
2
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
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?