Краткая шпаргалка

Попытка торговать

Какое-то время я был одержим финансовыми рынками и хотел быть внутридневным трейдером. Я работал по ночам, поэтому было легко проводить утро в окружении компьютерных мониторов, отображающих все, от акций, опционов, новостей и торговых чатов. Предупреждение о спойлере… Я отказался от внутридневной торговли, но не от инвестирования. В конце концов, я понял, что мне нравится анализировать данные больше, чем торговать, а затем я встал на путь, чтобы научиться анализу данных и заняться наукой о данных.

Когда я изучал способы сбора данных об акциях и опционах, я проверил API, предлагаемый одним из моих брокеров, Ally Financial. Его можно было бесплатно использовать и легко кодировать. Это шпаргалка, которую я составил для использования Ally Financial API, чтобы собрать следующее:

  • Время и продажи для акций
  • Глубина рынка опционов
  • Опции Расширенное предложение

Если вы не знакомы с API, ознакомьтесь с некоторыми из этих ресурсов. Можно автоматизировать сделки через их API, но я никогда не заходил так далеко. Изучите все функции в их документации.



Вы можете найти полную шпаргалку внизу статьи или на моем GitHub!



К коду!

Импортировать зависимости

Для подключения к API используется OAuth1. Вы можете найти список клиентов OAuth на сайте OAuth здесь. Я использую библиотеку OAuth requests_oauthlib. При необходимости используйте pip install requests-oauthlib.

import requests
from requests_oauthlib import OAuth1
from config import (api_key, secret, oath_token, oath_secret)

import pandas as pd
import sqlalchemy
import numpy as np

import sqlite3
from sqlite3 import Error

import matplotlib.pyplot as plt
import datetime as dt

Обратите внимание, что я использую файл конфигурации для импорта api_key, secret, oath_token, oath_secret. Таким образом, мне не нужно включать эти личные токены в код.

#authentication 
auth = OAuth1(api_key, secret, oath_token, oath_secret)

Я передаю импортированные токены в OAuth1. Это будет использоваться, когда мы сделаем запрос к API.

Пример времени и продаж для запасов

Этот вызов API возвращает время и данные о расценках на продажу на основе символа, переданного в качестве параметра запроса. Список всех параметров запроса можно найти в документации. Пример URL состоит из базового URL, маршрута API и запроса .

Базовый URL: https://api.tradeking.com/
Маршрут: v1 / market / timesales.json
Запрос :? symbols = MSFT & startdate = 2019–05–03 & interval = 1min.

Документация: https://www.ally.com/api/invest/documentation/market-timesales-get/

#url call to the api
url = 'https://api.tradeking.com/v1/market/timesales.json?symbols=MSFT&startdate=2019-05-03&interval=1min'
#api request
response = requests.get(url, auth = auth).json()

Обратите внимание, что я передаю значения URL и oAuth в запросы и возвращаю ответ как json. Это пример ответа:

Я помещаю данные цитаты в DataFrame Panda и форматирую типы данных.

#send to data frame and format data types
df = pd.DataFrame(response["response"]["quotes"]["quote"])
df = df.sort_values(['datetime'], ascending = False)
df['date'] = pd.to_datetime(df['date'])
df['datetime'] = pd.to_datetime(df['datetime'],  utc=False).dt.tz_convert('US/Central')
df['hi'] = df["hi"].astype(float)
df['incr_vol'] = df["incr_vl"].astype(float)
df['last'] = df["last"].astype(float)
df['lo'] = df["lo"].astype(float)
df['opn'] = df["opn"].astype(float)
df['vl'] = df['vl'].astype(float)
df.head()

Значения даты и времени необходимо преобразовать, чтобы их можно было пересчитать. Передискретизация позволяет вам управлять частотой временного ряда. Согласно документации, объект должен иметь datetime-подобный индекс (DatetimeIndex, PeriodIndex или TimedeltaIndex) или передайте значения datetime - like в ключевое слово on или level.

#resample the time value to be greater than 1 min as needed. Example: 30 min resample for last price
df.set_index(df['datetime'], inplace = True)
df.head()
df_resample30 = df.resample(rule = '30min', label = 'right').last()
df_resample30.head()

Обратите внимание, что datetime увеличивается на 30 минут вместо 1 минуты после повторной выборки.

Варианты поиска Пример

Этот вызов API обеспечивает глубину рынка для опционов. Этот вызов вернет полный список доступных опционов для данного символа. Хотя этот тип запроса - GET, POST также может использоваться и рекомендуется для более длинных запросов.

Документация: https://www.ally.com/api/invest/documentation/market-options-search-get-post/

Базовый URL: https://api.tradeking.com/
Маршрут: v1 / market / timesales.json
Запрос :? symbol = MSFT & query = xyear-eq% 3A2019% 20AND% 20xmonth-eq% 3A06% 20AND% 20strikeprice-eq% 3A140

Разбивка запроса:

год истечения равен 2019 году:
xyear-eq% 3A 2019

и:
% 20AND% 20

срок действия равен 06:
xmonth-eq% 3A 06

и цена исполнения равна 140:
% 20AND% 20 strikeprice -eq% 3A 140

Операторы:

lt: меньше
gt: больше
gte: больше или равно
lte: меньше или равно
eq: равно

url = 'https://api.tradeking.com/v1/market/options/search.json?symbol=MSFT&query=xyear-eq%3A2019%20AND%20xmonth-eq%3A06%20AND%20strikeprice-eq%3A140'
#api call
response = requests.get(url, auth = auth).json()
#load the response into the dataframe
df = pd.DataFrame(response["response"]["quotes"]["quote"])
df

Пример расширенного предложения (опция)

Этот маршрут работает для акций, но это пример колла опциона, поскольку они немного сложнее. Этот вызов вернет кавычки для символа или списка символов, переданных в качестве параметра запроса.

Документация: https://www.ally.com/api/invest/documentation/market-ext-quotes-get-post/
Базовый URL : https://api.tradeking.com/
Маршрут: v1 / market / ext / quotes.json
Запрос:? symbols = MSFT190607C00140000

Соглашение об именах символов опций:

Базовый символ - MSFT
2-значный год истечения срока - 19
2-значный месяц истечения срока - 06
2-значный день истечения срока - 07
«C» для вызова или «P» для пут - C
8-значная цена исполнения - 00140000
Укажите нужные поля в запросе, если необходимо, используя fids:
т.е. fids = ask, bid, vol

Хотя соглашение об именах состоит из нескольких компонентов, после нескольких примеров оно становится довольно простым. А пока используйте изображение в качестве примера, приведенное в документации или в этой шпаргалке!

url = 'https://api.tradeking.com/v1/market/ext/quotes.json?symbols=MSFT190607C00140000'
#api call
response = requests.get(url, auth = auth).json()
#load the response into the dataframe
df = pd.DataFrame(response["response"]["quotes"]["quote"], index = [0])
df

Соединение точек

Используя Pandas, легко сохранить данные в CSV или базу данных SQL. Если вы не знакомы с SQLite, им очень легко пользоваться. Процитируем документацию:

SQLite - это библиотека C, которая предоставляет легкую дисковую базу данных, не требующую отдельного серверного процесса и позволяющую получить доступ к базе данных с использованием нестандартного варианта языка запросов SQL.

conn = sqlite3.connect('stockdata.sqlite')
df.to_sql(table_name, conn)

Полный код

Используя эти три запроса, легко начать сбор данных об акциях и опционах с помощью Ally Financial API. Помещение данных в фрейм данных Panda упрощает понимание информации JSON и сохранение данных в виде файла CSV или SQLite. Если вы хотите изучить другие API-интерфейсы для данных об акциях, посетите также Alphavantage.

Найдите шпаргалку с документацией на моем гитхабе!

import requests
from requests_oauthlib import OAuth1
from config import (api_key, secret, oath_token, oath_secret)

import pandas as pd
import sqlalchemy
import numpy as np

import sqlite3
from sqlite3 import Error

import matplotlib.pyplot as plt
import datetime as dt
#authentication 
auth = OAuth1(api_key, secret, oath_token, oath_secret)
#url 
url = 'https://api.tradeking.com/v1/market/timesales.json?symbols=MSFT&startdate=2019-05-03&interval=1min'
#api request
response = requests.get(url, auth = auth).json()
#send to data frame and format data types
df = pd.DataFrame(response["response"]["quotes"]["quote"])
df = df.sort_values(['datetime'], ascending = False)
df['date'] = pd.to_datetime(df['date'])
df['datetime'] = pd.to_datetime(df['datetime'],  utc=False).dt.tz_convert('US/Central')
df['hi'] = df["hi"].astype(float)
df['incr_vol'] = df["incr_vl"].astype(float)
df['last'] = df["last"].astype(float)
df['lo'] = df["lo"].astype(float)
df['opn'] = df["opn"].astype(float)
df['vl'] = df['vl'].astype(float)
df.head()
#resample the time value to be greater than 1 min as needed. Example: 30 min resample for last price
df.set_index(df['datetime'], inplace = True)
df.head()
df_resample30 = df.resample(rule = '30min', label = 'right').last()
df_resample30.head()
#Options Search Example
url = 'https://api.tradeking.com/v1/market/options/search.json?symbol=MSFT&query=xyear-eq%3A2019%20AND%20xmonth-eq%3A06%20AND%20strikeprice-eq%3A140' 
response = requests.get(url, auth = auth).json()
  
df = pd.DataFrame(response["response"]["quotes"]["quote"]) 
df.head()
#Extended Quote Example
url = 'https://api.tradeking.com/v1/market/ext/quotes.json?symbols=MSFT190607C00140000'
response = requests.get(url, auth = auth).json()
df = pd.DataFrame(response["response"]["quotes"]["quote"], index = [0])
df.head()

Благодарю вас!

- Эрик Клеппен

Ознакомьтесь с моими другими учебниками, чтобы узнать больше о Python и sql!