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

## 要　旨
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のプログラムの一例を示します。
```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からの１じゃ環足の予測となる)
直近10個の予測と正解を表示させている。（１：上昇、０：下落）
正解数と不正解数、正解率の表示。
予測結果。（今回は、上昇と予測している。）
プログラム処理時間を秒表示
## 結　言
今回は、Colaboratory上でPython3により機械学習で外国為替(USDJPY)の1時間足予測を実施する方法について記述しました。