OANDA JapanのAPIから1分足で大量のデータをダウンロードする方法

FX

OANDA JapanのAPIから1分足でデータをダウンロードする

OANDA Japan は世界的に有名なFX取引事業者です。

日本でAPIが使えるFX事業者はOANDA Japan だけですのでかなり貴重な存在と言えます。

Pythonを使って長期にわたる1分足のデータの取得方法を解説していきます。

1秒足のデータを取得することもできるので慣れたら以下で紹介するプログラムコードを改変してダウンロードしてみても良いですね。

ちなみに5分足や30分足, 4時間足, 1日足などより長い期間足はresample(リサンプル)ということを行うことによって1分足から簡単に作る事ができます。

ですので、基本の短い単位の足データを取得しておけば良いわけです。

まずはOANDA Japan で口座を開設しましょう。

PythonでOANDA APIからデータをダウンロードするための簡単なプログラミング

Pythonの開発環境構築

必要なPythonライブラリ
oandapyV20 ・・・・OANDA APIにアクセスして色々やるためのPythonラッパー
ラッパー(Wrapper)とは電子レンジでチンする時に使うヤツですね。
くるむ物という意味です。PythonでOANDA APIをイイ感じに包んで、Pythonから簡単に利用できるようにした物です。

pandas・・・・株価やFXなどテーブル・データを簡単に操作できるすごいライブラリです。

この2つをpip でインストールしましょう。

⇩pyenvとvirtualenvを使ったMacでのPython開発環境の整え方については以下で詳しく解説しています。よかったら参考にしてください。

pyenv + virtualenv でPython開発環境の整備をする
Macでpyenvが使えるようにする MacでPythonの開発環境を整備するのに、pyenv と virtualenvを使うと便利です。 他にも環境構築方法があるのですが、pyenvとvirtualenvを使うのが一番心地よいと思いました...

OANDA APIを使ったプログラミング

from oandapyV20 import API
import oandapyV20.endpoints.instruments as instruments

import json
import datetime
import pandas as pd
from dateutil.relativedelta import relativedelta


def getCandleDataFromOanda(instrument, api, date_from, date_to, granularity):
    params = {
        "from": date_from.isoformat(),
        "to": date_to.isoformat(),
        "granularity": granularity,
    }
    r = instruments.InstrumentsCandles(instrument=instrument, params=params)
    return api.request(r)


def oandaJsonToPythonList(JSONRes):
    data = []
    for res in JSONRes['candles']:
        data.append([
            datetime.datetime.fromisoformat(res['time'][:19]),
            res['volume'],
            res['mid']['o'],
            res['mid']['h'],
            res['mid']['l'],
            res['mid']['c'],
        ])
    return data


if __name__ == "__main__":
    access_info = json.load(open('./config/access_info.json', 'r'))
    accountID = access_info["access_id"]
    access_token = access_info["access_token"]

    api = API(access_token=access_token, environment="live")

    all_data = []
    # 通貨ペアと取得するデータの開始日を指定する
    # 例えば、2020年2月1日からのデータを取得したいとすると
    # startdate = datetime.datetime(2020, 2, 1)
    # とする。
    currency_pair = "USD_JPY"
    startdate = datetime.datetime(2020, 2, 1)

    date_from = None
    date_to = None
    while(1):
        if date_to == None:
            date_from = startdate
        else:
            date_from = date_to + relativedelta(minutes=1)

        date_to = date_from + relativedelta(minutes=4000)
        if date_to > datetime.datetime.now():
            date_to = datetime.datetime.now().replace(second=0, microsecond=0)

            print("From: ", date_from, ",", "To: ", date_to)
            break
        print("From: ", date_from, ",", "To: ", date_to)

        ret = getCandleDataFromOanda("USD_JPY", api, date_from, date_to, "M1")
        data = oandaJsonToPythonList(ret)

        all_data.extend(data)
    # pandas DataFrameへ変換
    df = pd.DataFrame(all_data)
    df.columns = ['Datetime', 'Volume', 'Open', 'High', 'Low', 'Close']
    df = df.set_index('Datetime')
    start = "{}{:0>2}{:0>2}".format(df.index[0].year,
                                    df.index[0].month, df.index[0].day)
    end = "{}{:0>2}{:0>2}".format(df.index[-1].year,
                                  df.index[-1].month, df.index[-1].day)
    # # CSVファイルへの出力
    df.to_csv('./{}_{}-{}_M1.csv'.format(currency_pair, start, end))

一つ一つ解説していきます。

まとめ

紹介したのは1分足のデータ取得についてですが、
OANDA APIを使うと、1秒足からデータを取得できます。
1秒足のデータは当然、膨大になるので取り扱いが難しいですが、上のプログラムをちょっと改変すれば取得できるので、もし必要であれば、やってみてください。
集めたデータからバックテストを行い、良いストラテジー(戦略)が見つかったら、OANDA APIを使って実際に取引する事ができます。
しかも、Pythonを使えば、ほとんどどんなアプローチも取れるので、自由度はほぼ無限大です。

税率の観点ではOANDA Japanは海外FXよりオススメ

OANDA Japanは世界的にも大きなFX事業者ですから安心ですし、利益に対する税率も日本国内事業者と同様で所得税15%+住民税5%+復興所得税0.315%の20.315%です。
海外FXだと利益に対して税率が総合課税になるので、めちゃくちゃ儲かると最高で、所得税45%+住民税10%+復興所得税0.945%の55.945%が課税されます。
OANDA Japan 20.315%   <  海外FX 55.945%
この税率の差はめちゃくちゃ大きいです。

コメント