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()

샘플 코드 개요(심층 학습 부분)


  • Keras 사용 (TensorFlow 버전 2)
  • 중간 레이어는 2 레이어, 두 레이어 모두 노드 수는 32, 활성화 함수는 ReLU
  • 오차 함수는 MSE(제곱 오차)
  • 최적화 기법은 Adam

  • 실행 결과





    (중략)



    부분적으로 예측이 조금 벗어나지만 거의 정확한 예측이 출력됩니다.
    필자가 말했듯이, 직전의 데이터를 사용하여 예측하고 있기 때문에,
    빗나가기가 적을 것이다.

    좋은 웹페이지 즐겨찾기