Day 4 - 외환 데이터 취급 요약
17703 단어 심층 학습
강의
강의 없음.
완전한 자습.
오히려 "환율 데이터 처리"라는 것이
실라버스에서 어떤 것에 상당하는지도 모른다.
구현 연습
구현 정책
다음 페이지를 참고하여 실행해 보았다.
간단한 딥 러닝으로 환율 예상https://www.tcom242242.net/entry/fx-begin/%E3%80%90fx-ai%E3%80%91%E5%8D%98%E7%B4%94%E3%81%AA%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%A7%E7%82%BA%E6%9B%BF%E3%82%92%E4%BA%88%E6%83%B3%E3%81%99/
단, 다음 부분만 변경
· 소스 코드의 시작 부분에 oandapyV20을 설치하는 줄 (!pip install oandapyV20) 추가
· 스스로 발행 한 액세스 토큰 지정
· 그래프에 라벨을 표시하기 위한 행(plt.legend())의 행을 추가
(복사원의 소스에는 이 행이 존재하지 않지만, 어째서 라벨을 표시할 수 있을까?)
샘플 코드
!pip install oandapyV20
import numpy as np
import pandas as pd
from oandapyV20 import API
import oandapyV20.endpoints.instruments as instruments
import matplotlib.pyplot as plt
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation, Flatten
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
COUNT = 5000 # 一度に取得するデータ数(max:5000)
NB_ITR = 10 # count * NB_ITR 分データを取得
GRANULARITY = "M5" # 足の種類。今回は5分足
INSTRUMENT = "USD_JPY" # USD/JPY
INPUT_LEN = 10 # 入力の長さ。現時点から10足前までのデータを入力とする。
EPOCHS = 100 # ニューラルネットワークの学習EPOCH
BATCH_SIZE = 32 # ニューラルネットワークのバッチサイズ
ACCESS_TOKEN = "************" # OANDA APIのアクセストークン(この部分は自分で取得したトークンを指定)
api = API(access_token=ACCESS_TOKEN, environment="practice")
params = {
"granularity": GRANULARITY,
"count": COUNT,
"price": "B",
}
def get_candles(instrument="USD_JPY", params=None, api=None):
"""
足データを取得してDataFrameに変換
"""
instruments_candles = instruments.InstrumentsCandles(
instrument=instrument, params=params)
api.request(instruments_candles)
response = instruments_candles.response
df = pd.DataFrame(response["candles"])
return df
# 足データの取得
candles = None
for i in range(NB_ITR):
print(i)
new_candles = get_candles(instrument=INSTRUMENT, params=params, api=api)
params["to"] = new_candles["time"].iloc[0]
print(params["to"])
candles = pd.concat([new_candles, candles])
prices = np.array([x["c"] for x in candles["bid"].values])
prices = prices.astype(np.float64)
prices = prices.reshape(-1, 1)
sc = MinMaxScaler(feature_range=(0, 1))
prices = sc.fit_transform(prices)
X, Y = [], []
for i, _ in enumerate(prices):
if (i+INPUT_LEN+1 >= len(prices)):
break
X.append(prices[i:i+INPUT_LEN])
Y.append(prices[i+INPUT_LEN+1])
X = np.array(X)
Y = np.array(Y)
# 学習用・テスト用に分割
split_index = int(len(prices)*0.7)
X_train = X[:split_index]
Y_train = Y[:split_index]
X_test = X[split_index:]
Y_test = Y[split_index:]
# モデルの作成
model = Sequential()
model.add(Flatten(input_shape=[INPUT_LEN, 1]))
model.add(Dense(32))
model.add(Activation("relu"))
model.add(Dense(32))
model.add(Activation("relu"))
model.add(Dense(1))
model.add(Activation("linear"))
model.compile(loss="mse", # 誤差関数
optimizer="adam", # 最適化手法
metrics=["accuracy"])
model.fit(X_train, Y_train, batch_size=BATCH_SIZE, epochs=EPOCHS)
print(model.evaluate(X_test, Y_test))
# 実際の値と評価値を比較する
predicted_y = model.predict(X_test)
fig, ax = plt.subplots()
# 実際の値のプロット
Y_test = sc.inverse_transform(Y_test)
ax.plot(np.arange(len(Y_test)), Y_test, label="real")
# 予測値のプロット
predicted_y = sc.inverse_transform(predicted_y)
ax.plot(np.arange(len(predicted_y)), predicted_y, label="predicted_value")
plt.legend()
plt.show()
샘플 코드 개요(심층 학습 부분)
구현 정책
다음 페이지를 참고하여 실행해 보았다.
간단한 딥 러닝으로 환율 예상
https://www.tcom242242.net/entry/fx-begin/%E3%80%90fx-ai%E3%80%91%E5%8D%98%E7%B4%94%E3%81%AA%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%A7%E7%82%BA%E6%9B%BF%E3%82%92%E4%BA%88%E6%83%B3%E3%81%99/
단, 다음 부분만 변경
· 소스 코드의 시작 부분에 oandapyV20을 설치하는 줄 (!pip install oandapyV20) 추가
· 스스로 발행 한 액세스 토큰 지정
· 그래프에 라벨을 표시하기 위한 행(plt.legend())의 행을 추가
(복사원의 소스에는 이 행이 존재하지 않지만, 어째서 라벨을 표시할 수 있을까?)
샘플 코드
!pip install oandapyV20
import numpy as np
import pandas as pd
from oandapyV20 import API
import oandapyV20.endpoints.instruments as instruments
import matplotlib.pyplot as plt
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation, Flatten
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
COUNT = 5000 # 一度に取得するデータ数(max:5000)
NB_ITR = 10 # count * NB_ITR 分データを取得
GRANULARITY = "M5" # 足の種類。今回は5分足
INSTRUMENT = "USD_JPY" # USD/JPY
INPUT_LEN = 10 # 入力の長さ。現時点から10足前までのデータを入力とする。
EPOCHS = 100 # ニューラルネットワークの学習EPOCH
BATCH_SIZE = 32 # ニューラルネットワークのバッチサイズ
ACCESS_TOKEN = "************" # OANDA APIのアクセストークン(この部分は自分で取得したトークンを指定)
api = API(access_token=ACCESS_TOKEN, environment="practice")
params = {
"granularity": GRANULARITY,
"count": COUNT,
"price": "B",
}
def get_candles(instrument="USD_JPY", params=None, api=None):
"""
足データを取得してDataFrameに変換
"""
instruments_candles = instruments.InstrumentsCandles(
instrument=instrument, params=params)
api.request(instruments_candles)
response = instruments_candles.response
df = pd.DataFrame(response["candles"])
return df
# 足データの取得
candles = None
for i in range(NB_ITR):
print(i)
new_candles = get_candles(instrument=INSTRUMENT, params=params, api=api)
params["to"] = new_candles["time"].iloc[0]
print(params["to"])
candles = pd.concat([new_candles, candles])
prices = np.array([x["c"] for x in candles["bid"].values])
prices = prices.astype(np.float64)
prices = prices.reshape(-1, 1)
sc = MinMaxScaler(feature_range=(0, 1))
prices = sc.fit_transform(prices)
X, Y = [], []
for i, _ in enumerate(prices):
if (i+INPUT_LEN+1 >= len(prices)):
break
X.append(prices[i:i+INPUT_LEN])
Y.append(prices[i+INPUT_LEN+1])
X = np.array(X)
Y = np.array(Y)
# 学習用・テスト用に分割
split_index = int(len(prices)*0.7)
X_train = X[:split_index]
Y_train = Y[:split_index]
X_test = X[split_index:]
Y_test = Y[split_index:]
# モデルの作成
model = Sequential()
model.add(Flatten(input_shape=[INPUT_LEN, 1]))
model.add(Dense(32))
model.add(Activation("relu"))
model.add(Dense(32))
model.add(Activation("relu"))
model.add(Dense(1))
model.add(Activation("linear"))
model.compile(loss="mse", # 誤差関数
optimizer="adam", # 最適化手法
metrics=["accuracy"])
model.fit(X_train, Y_train, batch_size=BATCH_SIZE, epochs=EPOCHS)
print(model.evaluate(X_test, Y_test))
# 実際の値と評価値を比較する
predicted_y = model.predict(X_test)
fig, ax = plt.subplots()
# 実際の値のプロット
Y_test = sc.inverse_transform(Y_test)
ax.plot(np.arange(len(Y_test)), Y_test, label="real")
# 予測値のプロット
predicted_y = sc.inverse_transform(predicted_y)
ax.plot(np.arange(len(predicted_y)), predicted_y, label="predicted_value")
plt.legend()
plt.show()
샘플 코드 개요(심층 학습 부분)
실행 결과
(중략)
부분적으로 예측이 조금 벗어나지만 거의 정확한 예측이 출력됩니다.
필자가 말했듯이, 직전의 데이터를 사용하여 예측하고 있기 때문에,
빗나가기가 적을 것이다.
Reference
이 문제에 관하여(Day 4 - 외환 데이터 취급 요약), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/amateur2020/items/424b43c32edd68b1c587텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)