Финансы

Stock Downloader API с Alpha Vantage

Скачать исторические данные о запасах за последние 20 лет

Полный код доступен в моем репозитории GitHub.

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

  • До даты
  • Предлагает рабочий API, который еще не устарел
  • Бесплатно (по крайней мере, для небольших объемов данных)
  • Не имеет лишних ограничений на запросы

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

Мое злоключение

К сожалению, после поиска в Интернете надежных API-интерфейсов я обнаружил:

  • Yahoo Finance; устарел
  • Google Финансы; устарел

Даже если они все еще работают, это не лучшие инструменты для загрузки данных.

  • Quandl; Похоже, что не обновляет всю информацию о запасах.
  • Квантопический; вы можете использовать только их IDE для загрузки данных
  • Finnhub; вы можете загружать только ежедневную или свежую информацию

Мне были нужны исторические данные, по крайней мере, за последний год.

Alpha Vantage

Среди инструментов я нашел Alpha Vantage. Мой код адаптирован для загрузки данных с использованием их коллекции API.

Что тебе нужно:

  • Ваш API-ключ
  • Записная книжка для запуска вашего кода (или на локальном компьютере, если вы эксперт)

Ограничение загрузки управляемое: ограничение в 5 запросов в минуту и ​​ограничение в 500 запросов в день.

Настройка алгоритма

Вам нужно будет установить альфа-пакет. Поскольку я использую блокнот Google Collaboratory, я могу просто сделать это, используя следующую строку кода. Если вы работаете на местном уровне, возможно, вам придется попробовать другую методологию.

!pip install alpha_vantage

Создание связи

Используя созданную мной функцию download_stock, вы можете подключиться к базе данных и загрузить все данные о запасах за последние 20 лет. Будьте осторожны, чтобы правильно использовать выходной размер:

  • outputize = ‘compact’: загружает только цену одной акции за последние 100 дней.
  • outputize = ‘full’: загружает цену одной акции за последние 20 лет.

Я буду использовать бирку акций, чтобы определить, какие акции я хочу загрузить, например, «GOOG»:

from alpha_vantage.timeseries import TimeSeries
empty = pd.DataFrame()
def download_stock(tag):
  key = ‘your key’
  ts = TimeSeries(key)
  stock, meta = ts.get_daily(symbol=tag, outputsize=’full’)
  return stock, meta

Создание DataFrame

Поскольку я загрузил акции в виде массива с ценами за последние 20 лет, в зависимости от моих потребностей мне нужно будет внести изменения в:

  • Сохранять только последние 365 дней
  • Преобразуйте все данные из строки (тип, в котором информация изначально закодирована) в float
import pandas as pd
import time
#converting array to DataFrame
def stock(tag, df_to_add):
  df_, _ = download_stock(tag)
  df_ = pd.DataFrame(df_)
  df_ = df_.transpose()
  df_ = df_.loc[‘2020–05–22’:’2019–04–22']
  df_ = df_[‘1. open’]
  df_ = pd.DataFrame(df_)
  df_.columns = [tag]
  df_ = df_[tag].values.astype(float)
  df_ = pd.concat([df_to_add, pd.DataFrame(df_)], axis=1)
  return df_

Я буду использовать этот алгоритм в последний раз, когда мне нужно будет повторно прикрепить индекс даты к коллекции акций в одном уникальном файле .csv.

def get_index(tag):
  df_, _ = download_stock(tag)
  df_ = pd.DataFrame(df_)
  df_ = df_.transpose()
  df_ = df_.loc[‘2020–05–22’:’2019–04–22']
  df_ = df_[‘1. open’]
  df_ = pd.DataFrame(df_)
  #extract index and return it as series
  df_ = df_.reset_index()
  return df_[‘index’]

Список акций для скачивания

Для одновременной загрузки нескольких акций я буду использовать их теги, собранные в один список:

tag_list = [‘AAPL’, ‘ABBV’, ‘GOOG’, ‘NFLX’, ‘MDLZ’, ‘FANG’, ‘VAR’, ‘UPS’, ‘UDR’]

Алгоритм загрузки

Наконец-то мы можем начать загрузку данных. Я разобью алгоритм загрузки на несколько частей и объясню их индивидуально.

Показатель

Сначала я просто запустил get_index, чтобы сохранить весь временной ряд в одном столбце. После объединения цен акций я применю индекс к DataFrame:

#index
index = get_index(tag_list[0])
index = pd.DataFrame(index) #conta come 1 richiesta

Скачивание первой акции

Поскольку нам нужно будет создать DataFrame для присоединения других столбцов, мы будем использовать один пустой DataFrame, созданный в начале сообщения, который называется empty. С помощью этого кода мы загружаем наш первый столбец цен и помещаем его в DataFrame с именем df.

#csv of stocks
df = pd.DataFrame()
#csv of remaining stocks
#we run the first one once
df = stock(tag_list[0], empty)

Скачивание остальных стоков

Для каждой из оставшихся акций нам просто нужно добавить их в исходный df в качестве дополнительного столбца. Поскольку мы не можем делать более 5 запросов в минуту, мы будем перебирать список и для каждых 4 запросов мы будем делать паузу на 70 секунд.

for k in range(1, len(tag_list)):
  print(k, tag_list[k])
  df = stock(tag_list[k], df)
  if k%4 == 0:
  time.sleep(70)

После запуска алгоритма мы увидим следующий результат:

ABBV 
GOOG 
NFLX 
MDLZ 
FANG 
VAR 
UPS 
UDR

Первый тег отсутствует, потому что мы скачали его отдельно. Все остальные стоки добавлены в df.

Сейчас я сделаю копию, чтобы избежать перезагрузки данных с самого начала, в случае ошибок редактирования:

df1 = df.copy()

Переименование столбцов

#rename columns
df1.columns = tag_list
df1

Создание индекса даты

#reattach index
total = pd.concat([index, df1], axis=1)
total = total.set_index(‘index’)
total

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

Матрица корреляции

import matplotlib.pyplot as plt
import seaborn as sns
corr = total.corr()
fig, ax = plt.subplots(figsize=(15,15))
ax = sns.heatmap(
corr,
vmin=-1, vmax=1, center=0,
cmap=sns.diverging_palette(0, 256, n=200),
square=True,
ax=ax,
annot=True
)

Единая корреляция между двумя акциями

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

#single correlation
import numpy as np
print(np.corrcoef(total[‘GOOG’], total[‘AAPL’]))
[[1.         0.88737511]  
[0.88737511 1.        ]]

Парный сюжет

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

import seaborn as sns
import matplotlib.pyplot as plt
sns.pairplot(total, corner=True)
#they are scaled automatically

Заключение

Довольны ли вы инструментами Alpha Vantage? Вы предлагаете другие, более надежные API?