お金

【お金】OANDAのAPIをPythonで使う際のTips【シストレ】

投稿日:2019年3月28日 更新日:

※随時更新(最終更新:2019/04/3)
※下記Tipsのご利用は自己責任でお願いします


OANDAのAPIを生かす。

from oandapyV20 import API
access_token = 'xxx' #自身のaccess_tokenを記載
accountID = 'xxx' #自身のaccountIDを記載
api = API(access_token=access_token, environment="live")


OANDAで売買可能なペアを、リスト形式で取得。

def instruments ():
    import oandapyV20.endpoints.accounts as accounts
    r = accounts.AccountInstruments(accountID=accountID)
    rv = api.request(r)
    return [d['name'] for d in r.response['instruments']]

print(instruments())
# ['NZD_USD', 'GBP_USD', 'USD_MXN', 'EUR_ZAR', 'USD_CNH', 'EUR_NOK', 'NZD_JPY', 'USD_SGD', 'EUR_SEK', 'GBP_HKD', 'USD_ZAR', 'EUR_CHF', 'AUD_CHF', 'AUD_NZD', 'USD_DKK', 'CAD_HKD', 'SGD_HKD', 'AUD_JPY', 'USD_CAD', 'USD_JPY', 'EUR_TRY', 'USD_CZK', 'EUR_DKK', 'AUD_SGD', 'ZAR_JPY', 'GBP_CHF', 'USD_THB', 'TRY_JPY', 'USD_PLN', 'GBP_AUD', 'GBP_NZD', 'NZD_HKD', 'NZD_CHF', 'SGD_JPY', 'AUD_CAD', 'EUR_NZD', 'NZD_CAD', 'CHF_HKD', 'USD_INR', 'USD_CHF', 'CHF_ZAR', 'CAD_SGD', 'USD_NOK', 'EUR_JPY', 'USD_HUF', 'EUR_CAD', 'GBP_JPY', 'USD_TRY', 'USD_HKD', 'EUR_PLN', 'CHF_JPY', 'AUD_USD', 'EUR_SGD', 'HKD_JPY', 'SGD_CHF', 'CAD_JPY', 'GBP_ZAR', 'CAD_CHF', 'NZD_SGD', 'GBP_PLN', 'EUR_HUF', 'EUR_USD', 'GBP_CAD', 'USD_SAR', 'EUR_HKD', 'EUR_AUD', 'USD_SEK', 'GBP_SGD', 'EUR_GBP', 'EUR_CZK', 'AUD_HKD']


ローソク足を、DataFrame形式で取得。
取得するローソクの数は引数countで変えられるものの、5000が限界。
ローソク足の期間は5秒〜1ヶ月 。

def candles (instrument, count=5000, granularity='M3'):
    from datetime import datetime as dt
    import pandas as pd
    import oandapyV20.endpoints.instruments as instruments
    params = {'count': count, 'granularity': granularity}
    l = lambda s: dt.strptime(s, '%Y-%m-%dT%H:%M:%S.000000000Z').strftime('%Y-%m-%d %H:%M:%S')
    r = instruments.InstrumentsCandles(instrument=instrument, params=params)
    api.request(r)
    return pd.DataFrame([[l(row['time']), float(row['mid']['o']), float(row['mid']['h']), float(row['mid']['l']), float(row['mid']['c']), float(row['volume'])] for row in r.response['candles']], columns = ['time', 'open', 'high', 'low', 'close', 'volume'])

print(candles('NZD_USD'))
# “S5” - 5 秒
# “S10” - 10 秒
# “S15” - 15 秒
# “S30” - 30 秒
# “M1” - 1 分
# “M2” - 2 分
# “M3” - 3 分
# “M5” - 5 分
# “M10” - 10 分
# “M15” - 15 分
# “M30” - 30 分
# “H1” - 1 時間
# “H2” - 2 時間
# “H3” - 3 時間
# “H4” - 4 時間
# “H6” - 6 時間
# “H8” - 8 時間
# “H12” - 12 時間
# “D” - 1 日
# “W” - 1 週
# “M” - 1 か月


終値だけを、DataFrame形式で取得。

def closes (instrument, count=5000, granularity='M3'):
    from datetime import datetime as dt
    import pandas as pd
    import oandapyV20.endpoints.instruments as instruments
    params = {'count': count, 'granularity': granularity}
    l = lambda s: dt.strptime(s, '%Y-%m-%dT%H:%M:%S.000000000Z').strftime('%Y-%m-%d %H:%M:%S')
    r = instruments.InstrumentsCandles(instrument=instrument, params=params)
    api.request(r)
    return pd.DataFrame([[l(row['time']), float(row['mid']['c'])] for row in r.response['candles']], columns = ['time', 'close'])

print(closes('NZD_USD'))


終値ベースの標準偏差を、float形式で取得。

def stdev (candles):
    return candles['close'].pct_change().std()

print(stdev(candles('HKD_JPY')))


現在の価格を、タプル形式で取得。
もちろんbuyの方が買うときの価格で、sellの方が売るときの価格。

def price (instrument):
    import oandapyV20.endpoints.pricing as pricing
    r = pricing.PricingInfo(accountID=accountID, params={'instruments': instrument})
    rv = api.request(r)
    return {'buy': float(rv['prices'][0]['asks'][0]['price']),
            'sell': float(rv['prices'][0]['bids'][0]['price'])}

print(price('USD_JPY'))
# {'buy': 110.8, 'sell': 110.792}


対象ペアのpip単位とスプレッドを、タプルで取得。

def pip_spread (instrument):
    import oandapyV20.endpoints.accounts as accounts
    import oandapyV20.endpoints.pricing as pricing
    pip = 0
    r = accounts.AccountInstruments(accountID=accountID)
    api.request(r)
    for i in r.response['instruments']:
        if i['name'] == instrument:
            pip = 10**i['pipLocation']
    spread = 0
    r = pricing.PricingInfo(accountID=accountID, params={'instruments': instrument})
    api.request(r)
    response = r.response
    spread = float(response['prices'][0]['asks'][0]['price'])-float(response['prices'][0]['bids'][0]['price'])
    spread = round(spread / pip, 1)
    return pip, spread

print(pip_spread('AUD_USD'))
# (0.0001, 1.4)
# 0.0001USDがpipで、1.4pipsがスプレッド


突っ込みたい金額と通貨ペアを渡すと、何単位必要かintで返す。
JPYレートに換算しにくいものはまだ未対応。
スプレッドとかも考えていない。

def convert (jpy, instrument):
    if instrument[-3:] == 'JPY':
        if jpy > 0:
            return int(jpy / price(instrument)['buy'])
        else:
            return int(jpy / price(instrument)['sell'])
    elif instrument[-3:]+'_JPY' in instruments():
        byjpy = price(instrument[-3:]+'_JPY')['buy']
        if jpy > 0:
            return int((jpy / byjpy) / price(instrument)['buy'])
        else:
            return int((jpy / byjpy) / price(instrument)['sell'])

print(convert(-1000000, 'GBP_AUD'))
# jpyに正の値を指定すると買い、負なら売り


自分が持っている指定したペアの損益を、float型で返す。

def pl (instrument):
    import oandapyV20.endpoints.positions as positions
    r = positions.OpenPositions(accountID=accountID)
    api.request(r)
    positions = r.response['positions']
    for p in positions:
        if p['instrument'] == instrument:
            return p['unrealizedPL']
    return 0

print(pl('USD_CNH'))
# -15.0750


自分が持っている全てのペアの損益を、辞書型で返す。

def pls ():
    import oandapyV20.endpoints.positions as positions
    r = positions.OpenPositions(accountID=accountID)
    api.request(r)
    positions = r.response['positions']
    d = {}
    for p in positions:
        d[p['instrument']] = float(p['unrealizedPL'])
    return d
    
from pprint import pprint
pprint(pls())
# {'EUR_GBP': '352.1242',
#  'GBP_CHF': '22.2929',
#  'GBP_HKD': '-418.3085',
#  'GBP_JPY': '-42.5580',
#  'GBP_USD': '138790.3588',
#  'USD_CNH': '-1.5750',
#  'USD_TRY': '-190.7143'}


特定ペアと、他全ペアとの相関係数をSeries型で返す。
相関係数の取得期間を変えたい場合は、一部変更の必要あり。

def corr (instrument):
    import pandas as pd
    df = pd.DataFrame()
    for i in instruments():
        df = pd.concat([df, closes(i, count=12*10, granularity='M').drop('time', axis=1)], axis=1)
    df.columns = instruments()
    df = df.corr()
    df.mask(df==1, 0, inplace=True)
    return df[instrument].sort_values(ascending=False)

print(corr('TRY_JPY'))
# GBP_CHF    0.859406
# ZAR_JPY    0.851131
# GBP_SGD    0.832464
#              ...   
# USD_MXN   -0.867314
# EUR_TRY   -0.902063
# USD_TRY   -0.919558
# Name: TRY_JPY, Length: 71, dtype: float64

あるペアをある単位だけ買ったときの実際のスプレッドを計算。

def actual_spread (instrument, units):
    ps = pip_spread(instrument)
    return ps[0] * ps[1] * units

print(actual_spread('USD_JPY', 1000))
# 8.0
# 1000ドル分、USD_JPYを買うとスプレッドは8円
print(actual_spread('USD_JPY', convert(1000000, 'USD_JPY')))
# 71.76
# 1000000円分USD_JPYを買うとスプレッドは71.76円


-お金
-, , , ,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です



関連記事

no image

【お金】貯蓄の平均値・中央値について【格差】

貯蓄の平均値・中央値に興味がある方へ。 自分の貯蓄が多いのか少ないのか、分からない。。。貯蓄1000万がどれくらいのものか、分からない。。。格差はどれくらいあるものなの? こんなところに触れていきます …

no image

【お金】FXで相場の振動から利益を得られるかどうか【ムリ】

FXの中には、値動きの激しいものがあります。この値動きを上手く利用して、利益を出せないか検証しました。 結論は、ムリです。何かしらの予測をしないと、FXで儲けることはできません。 例えばある5分足の終 …

no image

【お金】TRY/JPY買い&USD/ZAR売り戦略【スワップ】

スワップ金利狙いでトルコリラ買いのガチホ、というのは良く聞く話です。 ここでのリスクは、下記の2つです。 ①【短期】急激な為替変動時に、強制ロスカの可能性あり ②【長期】TRY/JPYが下落すると、円 …

no image

【お金】TRY/JPY買い・USD/ZAR買い戦略について【因果関係】

トルコリラのスワップ金利投資を考えている方へ。 以前に、TRY/JPY買い・USD/ZAR買いの両建てを提案しました。 TRY/JPYとUSD/ZARの長期の相関を見ていると逆の動きをしています。そこ …

no image

【お金】世界の主要な資産の時価総額とその割合【インデックス】

自分用のメモです。 世界の主要な資産の時価総額とその割合を、下記の通りまとめました。インデックス投資をするときに、あると便利ですよね。 とはいえ、ある程度ざっくりと引っ張ってきた数字なので、上記数字の …

プロフィール

タクマ
−−−−−−−−

東南アジア(ミャンマー&フィリピン)でNW系システムインテグレーターとして6年ほど駐在していました。本を1000冊以上読んだり、プログラミングをしていたりします。嫁さんはタイ人です。
ーー
Twitterまとめのまとめ
YouTube Find!
SNS Trends

−−−−−−−−