Help us understand the problem. What is going on with this article?

Alpaca API で株価データ取得

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:

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away