понедельник, 10 января 2022 г.

AVStockParser — модуль python для работы с сервисом Alpha Vantage и получения данных с биржи NASDAQ

AVStockParser

Build Status pypi license

Ссылка на проект: https://github.com/Tim55667757/AVStockParser

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

Для автоматизации работы с историческими данными есть множество онлайн-сервисов, которые предоставляют API для этого бесплатно, но с некоторой задержкой. Например, Alpha Vantage. Основной источник данных для этого сервиса — биржа NASDAQ. Если вам нужна автоматизация работы с этой американской биржей и вы используете python, то далее расскажу, как это можно сделать с помощью Alpha Vantage API и библиотеки AVStockParser.

Подробная документация по работе с Alpha Vantage API здесь: https://www.alphavantage.co/documentation/

AVStockParser это простая библиотека, которую можно использовать как python-модуль или запускать из командной строки и получать данные от Alpha Vantage сервера с историей котировок произвольных инструментов по их тикеру. Причём не нужно разбираться в тонкостях API сервера, модуль всё сделает сам.

Модуль AVStockParser запрашивает историю цен по доступным инструментам (акциям и валютам) в формате .json с сайта www.alphavantage.co и конвертирует их в Pandas dataframe или в .csv-файл, которые содержат OHLCV-свечи в каждой строке. Вы получаете таблицу, которая содержит колонки данных в следующей последовательности: "date", "time", "open", "high", "low", "close", "volume". Одна строка — это набор данных для построения одной "японской свечи" (candlestick). Дополнительно можно отобразить данные на простом интерактивном свечном графике.

Как установить

Проще всего использовать установку через PyPI:

pip install avstockparser

После этого можно проверить установку командой:

pip show avstockparser

Аутентификация

Сервис Alpha Vantage использует для аутентификации апи-кей. Запросить бесплатный ключ можно тут: https://www.alphavantage.co/support/#api-key

Апи-кейэто алфавитно-цифровой токен. Этот токен необходимо отправлять на сервер с каждым запросом. Для этого, при работе с библиотекой AVStockParser, просто используйте ключ --api-key "your token here" или указывайте апи-кей при вызове метода: AVParseToPD(apiKey="your token here").

Примеры использования

Из командной строки

Внутренняя справка по ключам:

avstockparser --help

Вывод:

Запуск: python AVStockParser.py [параметры] [одна или несколько команд]

Получение данных о ценах акций через сервис Alpha Vantage. Можно получить
и сохранить исторические данные по ценам акций в .csv-файл или в виде
Pandas dataframe. Примеры: https://tim55667757.github.io/AVStockParser

Возможные параметры командной строки:
  -h, --help            Показать эту подсказку и выйти
  --api-key API_KEY     Параметр (обязательный): апи-кей для сервиса Alpha Vantage.
                        Запросить ключ для бесплатного доступа можно тут:
                        https://www.alphavantage.co/support/#api-key
  --ticker TICKER       Параметр (обязательный): тикер акции, например,
                        'GOOGL' или 'YNDX'.
  --output OUTPUT       Параметр: полный путь до .csv-файла. По умолчанию None
                        означает, что будет получен только Pandas dataframe.
  --period PERIOD       Параметр: можно использовать значения 'TIME_SERIES_INTRADAY',
                        'TIME_SERIES_DAILY', 'TIME_SERIES_WEEKLY' или
                        'TIME_SERIES_MONTHLY'. По умолчанию: 'TIME_SERIES_INTRADAY',
                        что означает, что api вернёт внутридневную историю цен для
                        предопределённого интервала. Больше примеров здесь:
                        https://www.alphavantage.co/documentation/
  --interval INTERVAL   Параметр: '1min', '5min', '15min', '30min' или '60min'.
                        Интервал используется только для внутридневной истории цен
                        для ключа --period='TIME_SERIES_INTRADAY'. По умолчанию: '60min',
                        что означает, что api вернёт внутридневную историю цен
                        и каждая свеча будет иметь интервал в 60 минут.
  --size SIZE           Параметр: сколько исторических свечей нужно скачать.
                        Значения могут быть 'full' или 'compact'. Этот параметр
                        использует сервис AV для параметра запроса 'outputsize'.
                        По умолчанию: 'compact' означает, что api вернёт 100 свечей.
  --retry RETRY         Параметр: количество попыток подключения к сервису AV.
                        По умолчанию: 3.
  --debug-level DEBUG_LEVEL
                        Параметр: уровень логирования для STDOUT,
                        например, 10 = DEBUG, 20 = INFO, 30 = WARNING,
                        40 = ERROR, 50 = CRITICAL.
  --parse               Команда: скачать историю цен как Pandas dataframe
                        или как .csv-файл (если ключ --output будет задан).
  --render              Команда: использовать библиотеку PriceGenerator для отрисовки
                        интерактивного графика цен после парсинга истории. Этот ключ
                        можно использовать только с ключом --parse.

Давайте попробуем получить дневные свечи по акциям Яндекса (тикер YNDX) и сохранить их в файл YNDX1440.csv. Команда может выглядеть как-то так:

avstockparser --debug-level 10 --api-key "your token here" --ticker YNDX --period TIME_SERIES_DAILY --size full --output YNDX1440.csv --parse

В случае успеха вы должны получить вывод логов примерно следующего содержания:

AVStockParser.py    L:184  DEBUG   [2020-12-25 01:03:13,459] Alpha Vantage data parser started: 2020-12-25 01:03:13
AVStockParser.py    L:51   DEBUG   [2020-12-25 01:03:13,459] Request to Alpha Vantage: [https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=YNDX&outputsize=full&apikey=***]
AVStockParser.py    L:55   DEBUG   [2020-12-25 01:03:13,459] Trying (1) to send request...
AVStockParser.py    L:119  INFO    [2020-12-25 01:03:15,013] It was received 2415 candlesticks data from Alpha Vantage service
AVStockParser.py    L:120  INFO    [2020-12-25 01:03:15,013] Showing last 3 rows with Time Zone: 'US/Eastern':
AVStockParser.py    L:123  INFO    [2020-12-25 01:03:15,018]             date   time     open     high      low    close   volume
AVStockParser.py    L:123  INFO    [2020-12-25 01:03:15,018] 2412  2020.12.22  00:00  67.2800  67.4400  66.3000  67.1100  1002761
AVStockParser.py    L:123  INFO    [2020-12-25 01:03:15,018] 2413  2020.12.23  00:00  67.7300  68.7700  67.6400  67.6900   822039
AVStockParser.py    L:123  INFO    [2020-12-25 01:03:15,018] 2414  2020.12.24  00:00  68.1800  68.2900  67.1700  67.6500   359133
AVStockParser.py    L:127  INFO    [2020-12-25 01:03:15,027] Stock history saved to .csv-formatted file [./YNDX1440.csv]
AVStockParser.py    L:229  DEBUG   [2020-12-25 01:03:15,027] All Alpha Vantage data parser operations are finished success (summary code is 0).
AVStockParser.py    L:234  DEBUG   [2020-12-25 01:03:15,028] Alpha Vantage data parser work duration: 0:00:01.568581
AVStockParser.py    L:235  DEBUG   [2020-12-25 01:03:15,028] Alpha Vantage data parser finished: 2020-12-25 01:03:15

Для консольного ключа --period вы можете указывать значения: TIME_SERIES_DAILYTIME_SERIES_WEEKLY и TIME_SERIES_MONTHLY для получения дневных, недельных и месячных свечей соответственно. По умолчанию используется значение TIME_SERIES_INTRADAY.

В следующем примере давайте попробуем получить внутридневные часовые свечи по акциям 3M (тикер MMM) и сохранить их в файл MMM60.csv. Команда может быть примерно такой:

avstockparser --debug-level 10 --api-key "your token here" --ticker MMM --period TIME_SERIES_INTRADAY --interval 60min --size compact --output MMM60.csv --parse

В случае успеха вы получите вывод, похожий на этот:

AVStockParser.py    L:184  DEBUG   [2020-12-25 01:09:44,601] Alpha Vantage data parser started: 2020-12-25 01:09:44
AVStockParser.py    L:51   DEBUG   [2020-12-25 01:09:44,601] Request to Alpha Vantage: [https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol=MMM&interval=60min&outputsize=compact&apikey=***]
AVStockParser.py    L:55   DEBUG   [2020-12-25 01:09:44,601] Trying (1) to send request...
AVStockParser.py    L:119  INFO    [2020-12-25 01:09:45,542] It was received 100 candlesticks data from Alpha Vantage service
AVStockParser.py    L:120  INFO    [2020-12-25 01:09:45,542] Showing last 3 rows with Time Zone: 'US/Eastern':
AVStockParser.py    L:123  INFO    [2020-12-25 01:09:45,551]           date   time      open      high       low     close  volume
AVStockParser.py    L:123  INFO    [2020-12-25 01:09:45,551] 97  2020.12.23  16:00  174.5700  175.0200  173.9550  174.0200  332340
AVStockParser.py    L:123  INFO    [2020-12-25 01:09:45,551] 98  2020.12.23  17:00  173.9900  173.9900  173.9600  173.9600  316682
AVStockParser.py    L:123  INFO    [2020-12-25 01:09:45,551] 99  2020.12.23  18:00  173.9900  173.9900  173.9900  173.9900    1410
AVStockParser.py    L:127  INFO    [2020-12-25 01:09:45,555] Stock history saved to .csv-formatted file [./MMM60.csv]
AVStockParser.py    L:229  DEBUG   [2020-12-25 01:09:45,555] All Alpha Vantage data parser operations are finished success (summary code is 0).
AVStockParser.py    L:234  DEBUG   [2020-12-25 01:09:45,555] Alpha Vantage data parser work duration: 0:00:00.953904
AVStockParser.py    L:235  DEBUG   [2020-12-25 01:09:45,555] Alpha Vantage data parser finished: 2020-12-25 01:09:45

Файл ./MMM60.csv из этого примера будет содержать похожие данные по часовым свечам и столбцы: "date", "time", "open", "high", "low", "close", "volume":

2020.12.11,09:00,171.9100,171.9100,171.5500,171.8300,1663
2020.12.11,10:00,172.0100,173.6800,172.0100,173.5900,214065
2020.12.11,11:00,173.5800,173.9770,172.6700,173.0800,268294
...
2020.12.23,16:00,174.5700,175.0200,173.9550,174.0200,332340
2020.12.23,17:00,173.9900,173.9900,173.9600,173.9600,316682
2020.12.23,18:00,173.9900,173.9900,173.9900,173.9900,1410

Ключ --size может принимать значение full (Alpha Vantage сервис отправит всю доступную историческую информацию по свечам) или compact (будут отправлены только последние 100 свечей).

Ключ --interval используется только с ключом и значением --period TIME_SERIES_INTRADAY. Интервалы для внутридневных свечей могут принимать значения: 1min5min15min30min или 60min.

Кроме того, вы можете построить интерактивный график цен (используя библиотеку PriceGenerator). Для этого укажите ключ --render после ключа --parse:

avstockparser --debug-level 10 --api-key "your token here" --ticker YNDX --period TIME_SERIES_DAILY --size compact --output YNDX1440.csv --parse --render

После выполнения команды выше вы получите три файла:

  • YNDX1440.csv — файл в формате .csv, который содержит цены (пример: ./media/YNDX1440.csv);
  • index.html — график цен и статистику, отрисованные при помощи библиотеки Bokeh и сохранённые в .html-файл (пример: ./media/index.html);
  • index.html.md — статистика в текстовом виде, сохранённая в маркдаун-формате (пример: ./media/index.html.md).

Через импорт модуля

Давайте рассмотрим один простой пример запроса исторических данных по акциям IBM и как их можно сохранить их в Pandas dataframe:

from avstockparser.AVStockParser import AVParseToPD as Parser

# Запрашиваем исторические данные по свечам и сохраняем их в переменную Pandas dataframe.
# Если переменная output не указана, то метод AVParseToPD не будет сохранять текстовый файл,
# а только вернёт данные в формате Pandas dataframe.
df = Parser(
    reqURL=r"https://www.alphavantage.co/query?",
    apiKey="demo",
    output=None,
    ticker="IBM",
    period="TIME_SERIES_INTRADAY",
    interval="5min",
    size="full",
    retry=2,
)
print(df)

При запуске получим вывод, похожий на следующий:

AVStockParser.py    L:119  INFO    [2020-12-25 01:49:51,612] It was received 2001 candlesticks data from Alpha Vantage service
AVStockParser.py    L:120  INFO    [2020-12-25 01:49:51,612] Showing last 3 rows with Time Zone: 'US/Eastern':
AVStockParser.py    L:123  INFO    [2020-12-25 01:49:51,616]             date   time      open      high       low     close volume
AVStockParser.py    L:123  INFO    [2020-12-25 01:49:51,616] 1998  2020.12.23  17:35  124.1000  124.1000  124.1000  124.1000   1571
AVStockParser.py    L:123  INFO    [2020-12-25 01:49:51,617] 1999  2020.12.23  18:45  124.0500  124.0500  124.0000  124.0000    278
AVStockParser.py    L:123  INFO    [2020-12-25 01:49:51,617] 2000  2020.12.23  20:00  123.9100  123.9100  123.9100  123.9100    225
            date   time      open      high       low     close volume
0     2020.11.25  06:50  124.3500  124.3500  124.2000  124.2000   1218
1     2020.11.25  07:05  124.2000  124.2000  124.2000  124.2000    150
2     2020.11.25  07:10  124.1000  124.1000  124.1000  124.1000    100
3     2020.11.25  07:35  124.0000  124.0000  124.0000  124.0000    510
4     2020.11.25  08:05  123.8201  124.2000  123.8200  123.8200   1414
...          ...    ...       ...       ...       ...       ...    ...
1996  2020.12.23  17:05  123.9100  123.9100  123.9100  123.9100    100
1997  2020.12.23  17:20  123.9000  123.9000  123.9000  123.9000   1146
1998  2020.12.23  17:35  124.1000  124.1000  124.1000  124.1000   1571
1999  2020.12.23  18:45  124.0500  124.0500  124.0000  124.0000    278
2000  2020.12.23  20:00  123.9100  123.9100  123.9100  123.9100    225

[2001 rows x 7 columns]

После этого переменную df вы можете передать в любую вашу любимую библиотеку (NumPy, SciPy, Matplotlib, TensorFlow, Keras, Pandas etc) и использовать для дальнейших манипуляций с данными.




Успехов вам в автоматизации биржевой торговли! ;-)