Краткая шпаргалка
Попытка торговать
Какое-то время я был одержим финансовыми рынками и хотел быть внутридневным трейдером. Я работал по ночам, поэтому было легко проводить утро в окружении компьютерных мониторов, отображающих все, от акций, опционов, новостей и торговых чатов. Предупреждение о спойлере… Я отказался от внутридневной торговли, но не от инвестирования. В конце концов, я понял, что мне нравится анализировать данные больше, чем торговать, а затем я встал на путь, чтобы научиться анализу данных и заняться наукой о данных.
Когда я изучал способы сбора данных об акциях и опционах, я проверил 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()
Благодарю вас!
- Если вам понравилось, подписывайтесь на меня на Medium, чтобы узнать больше
- Получите ПОЛНЫЙ ДОСТУП и помогите поддержать мой контент, подписавшись
- Давайте подключимся к LinkedIn
- Анализировать данные с помощью Python? Загляните на мой сайт
Ознакомьтесь с моими другими учебниками, чтобы узнать больше о Python и sql!