Финансы
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?