LoginSignup
29
31

More than 5 years have passed since last update.

Alpaca API で株価データ取得

Posted at

Alpaca API

2018-12-29_001.jpg

Alpaca API を使うと、real-time market を取得して、分析、オーダーも出すことが出来ます。(米国株のみ?)
が、実際にオーダー出来るのは、米国に住んでいる人だけ?っぽいです。

でも、データ分析はSDKを通して出来ますし、デモトレードは出来るみたいです。
とりあえずデータ取得をやってみました。

前準備

install

pip install pylivetrader
pip install alpaca-trade-api

登録

  1. https://app.alpaca.markets/signup
  2. ログインしたら、Generate New Key を押して、Key IDSecret Keyを取得しておく

2018-12-28_14.jpg

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

2018-12-29_002.jpg

いいね:thumbsup:

29
31
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
31