Alpaca API
Alpaca API を使うと、real-time market を取得して、分析、オーダーも出すことが出来ます。(米国株のみ?)
が、実際にオーダー出来るのは、米国に住んでいる人だけ?っぽいです。
でも、データ分析はSDKを通して出来ますし、デモトレードは出来るみたいです。
とりあえずデータ取得をやってみました。
前準備
install
pip install pylivetrader
pip install alpaca-trade-api
登録
- https://app.alpaca.markets/signup
- ログインしたら、
Generate New Key
を押して、Key IDとSecret Keyを取得しておく
docs
Python Tutorial - Alpaca Documents
最初のいっぽ
API クライアント
tradeapi.REST()
でAPIクライアント作ります。このクライアントを通じて、データを取得したりオーダーしたり出来ます。
import logging
import time
import pytz
import pandas as pd
import alpaca_trade_api as tradeapi
NY = pytz.timezone('US/Eastern')
api = tradeapi.REST(
key_id='ここを変えてね',
secret_key='ここも変えてね',
base_url='https://paper-api.alpaca.markets',
)
データアクセス
リアルタイムデータ
現在価格にアクセスする場合は、get_barset()
を使うようです。ただ、マーケットが開いている時間に試してみたのですが、前日のクローズ時のデータを返してきました。本番アカウントでアクセス出来る人はもしかしたらリアルタイムデータを取得出来るのかもしれません。
api.get_barset('SPY', 'day', limit=1)
{'SPY': [Bar({ 'c': 248.07,
'h': 248.29,
'l': 238.96,
'o': 242.57,
't': 1545886800,
'v': 185975645})]}
ヒストリカルデータ
ドキュメントに書いてある内容ですが、ヒストリカルデータの取得方法です。
def prices(symbols):
now = pd.Timestamp.now(tz=NY)
end_dt = now
# NYの現在時刻が09:30を過ぎていたら
if now.time() >= pd.Timestamp('09:30', tz=NY).time():
# end_dt を同日の 23:59 にセット
end_dt = now - pd.Timedelta(now.strftime('%H:%M:%S')) - pd.Timedelta('1 minute')
return _get_prices(symbols, end_dt)
def _get_prices(symbols, end_dt, max_workers=5):
start_dt = end_dt - pd.Timedelta('50 days')
start = start_dt.strftime('%Y-%-m-%-d') # YYYY-mm-dd
end = end_dt.strftime('%Y-%-m-%-d')
def get_barset(symbols):
'''
AlpacaのDataAPIから価格データを辞書型で取得
'''
return api.get_barset(
symbols,
'day',
limit = 50,
start=start,
end=end
)
# 一度に取得できる銘柄数は200まで
barset = None
idx = 0
while idx <= len(symbols) - 1:
if barset is None:
barset = get_barset(symbols[idx:idx+200])
else:
barset.update(get_barset(symbols[idx:idx+200]))
idx += 200
# api.get_barsetで取得したデータをDataFrameへ変更
return barset.df
prices(["AAPL","SPY"]).head()
いいね