①為替データを取得するプログラムを作る

今回は為替データを取得するプログラムを作っていきます。

前回の記事はこちら

初期設定

まず前回google drive内に作成したNotebook(simple_predict_app/Untitled0.ipynb)をcolabで開きます。

まず最初のセル(四角に)に以下のように記述します。

!pip install oandapyV20
!pip install schedule

最初に「!」マークを先頭に付けることでコマンドラインのコマンドを実行できます。このコマンドで、今回作るプログラムで使うモジュール等をインストールします。

このコマンドを入力した後に実行(Ctrl+Enter)してください。モジュールがインストールされると思います。

次に定数の設定を行います。

# OANDA API のアクセストークン
ACCESS_TOKEN = "*************************" #あなたのアクセストークン
COUNT = 5000        # 一度に取得するデータ数(max:5000)
COUNT_TIMES = 1         # count * COUNT_TIMES 分データを取得
GRANULARITY = "M5"   # 足の種類。今回は5分足
INSTRUMENT = "USD_JPY"    # USD/JPY
INPUT_LEN = 10            # 入力の長さ。現時点から10足前までのデータを入力とする。
EPOCHS = 1              # ニューラルネットワークの学習EPOCH
BATCH_SIZE = 32           # ニューラルネットワークのバッチサイズ

MODEL_PATH = "/content/drive/My Drive/simple_predict_app/models/model.json"
WEIGHTS_PATH = "/content/drive/My Drive/simple_predict_app/models/weights.h5"

各定数についてはコメントを参照してください。ここでこれから作る予想モデルの設定も行っています。とりあえずは理解しなくて大丈夫です。
ちなみにOANDA APIのアクセストークンの取得方法に関しては以下の記事を参考にして取得してください。

為替データ取得プログラムの作成

では、為替データを取得するプログラムを作成していきましょう!

まずは、今回のプログラムに必要なモジュールをインポート(import)します。とりあえずはおまじないと思ってかいてください。

from oandapyV20 import API
import oandapyV20.endpoints.instruments as instruments
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

次に以下のコードでAPI(OANDAとこのプログラムをつなぐためのもの)を作成します。ここで、取得しておいたOANDA APIのアクセストークンを使います。

api = API(access_token=ACCESS_TOKEN, environment="live") # デモ口座ならpractice、本番口座ならlive

※デモ口座ならenvironment="practice"としてください。

次にOANDA APIにアクセスして為替データを取得するためのコードを書いていきます。
今回はメソッド(get_prices)として書いちゃいます。

def get_prices(granularity, count, count_times):
    """
        終わり値を取得する
    """
    params = {
        "granularity": granularity,
        "count": count,
        "price": "B",
    }

    candles = None
    for i in range(count_times):
        instruments_candles = instruments.InstrumentsCandles(
            instrument=INSTRUMENT, params=params)
        # OANDA APIにリクエスト 
        api.request(instruments_candles)
        response = instruments_candles.response
        new_candles = pd.DataFrame(response["candles"])
        params["to"] = new_candles["time"].iloc[0]
        # 取得したデータをつなげる 
        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)

    return prices 

このメソッドの引数であるgranularityはローソク足の時間、countは一度に取得するデータの数、count_timesはデータの取得回数(データはcount✖count_times分データを取得)です

paramsはOANDA APIに渡す情報ですが、意味は以下のようになります。

  • granularity:何分足か?
  • count:一度に取得するデータ数
  • price:A(Ask)からB(Bid)

12行目のfor分で、count分の為替データの取得をcount_times分繰り返します。(OANDA APIでは一度に5000個しかデータを取得できないため)

16行目のapi.requestでapiにアクセスします。結果はinstruments_candlesのresponseに保管されています。

そして、18行目で取得したデータを、pandasのDataFrameに変換します。(のちのち加工しやすいので)

最後に今回は終値だけ使うので、終値だけ取り出します。あとは細かい変換をしています。

為替データの取得

ここまでで作成したプログラムを使ってデータを取得してみましょう。

以下のようにセルに入力してみてください。

prices = get_prices(GRANULARITY, COUNT, COUNT_TIMES)
print(prices)

上記のセルを実行すると、以下のように出力されればデータが正しく得られています。

2020-04-13T13:10:00.000000000Z
[[107.874]
 [107.893]
 [107.894]
 ...
 [106.21 ]
 [106.2  ]
 [106.185]]

さらにチャートも表示してみます。

# データのプロット
fig, ax = plt.subplots()
x = np.arange(len(prices))
ax.plot(x, prices)

plt.subplots()で画像を表示するためのインスタンスを生成します。3行目でx軸の要素を作成します。np.arange(nb)でnb分の整数値の配列を作ります。例えば、nb=3なら[0,1,2]というnumpyの配列を生成します。今回はprices分の横軸が必要なので、np.arange(len(prices))としています。
最後にax.plot(x, prices)でデータを表示しています。以下のように表示されるはずです。

お疲れ様でした!

ちなみにコードはgithubにあげてあります。以下がリンクになります。

https://github.com/tocom242242/simple_fx_predict_app/blob/master/predict_fx.ipynb

終わりに

次回は予測モデルが学習できるようにデータを加工していきます。

ちなみにこのプロジェクトのトップページは以下になります。

タイトルとURLをコピーしました