Как получить исторические данные по акциям

444 прочитали

Если задаетесь вопросом: Зачем мне это? То обычно это нужно, когда вы хотите написать торгового робота или провести некую аналитику по эмитенту.

Есть множество решений как загрузить исторические данные по акциям.

- Можно скачать с Финам - Экспорт котировок

- Можно скачать с Yahoo Finance - Historical Data -> Экспорт

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

Есть способ, как это немного автоматизировать, для этого я написал небольшой код на Python для скачивания котировок акций/фьючерсов.

Нам потребуется установленный Python и Metatrader от любого брокера.

Код выложен на github, доступен по этой ссылке.

Для его запуска нужно установить дополнительные компоненты, следующей командой:

pip install opencv-python mysqlclient MetaTrader5 pandas pytz

Запускаемый файл main.py.

Сам код очень короткий, давайте ниже его разберем:

...

import os
from core.get_shares_data_processor import SharesDataLoader
import MetaTrader5 as mt5 # импортируем модуль для подключения к MetaTrader5
import datetime
from threading import Thread # для поточной закачки разных датафреймов
import cv2
import pandas as pd
pd.set_option('display.max_columns', 500) # сколько столбцов показываем
pd.set_option('display.width', 1500) # макс. ширина таблицы для показа

def main():
current_dir = os.path.dirname(os.path.abspath(__file__))
how_many_bars = 70000

utc_till = datetime.datetime.now() + datetime.timedelta(days=1) # получим данные по завтрашний день
timeframes = {mt5.TIMEFRAME_M5, mt5.TIMEFRAME_M10, mt5.TIMEFRAME_M15, mt5.TIMEFRAME_M30, mt5.TIMEFRAME_H1, mt5.TIMEFRAME_H4, mt5.TIMEFRAME_D1, mt5.TIMEFRAME_W1, mt5.TIMEFRAME_MN1}
tickers = {"VTBR", "GMKN", "SBER", "LKOH", "GAZP", "CHMF", "AFLT", "PLZL"}

for timeframe in timeframes:
for ticket in tickers:
load_data = SharesDataLoader(ticket)
load_data.connect_to_metatrader5(path=f"C:\Program Files\FINAM MetaTrader 5\terminal64.exe")
data = load_data.get_share_data(ticket=ticket, timeframe=timeframe, utc_till=utc_till, how_many_bars=how_many_bars)
load_data.export_to_csv_from_df(ticket=ticket, timeframe=timeframe, data=data, export_dir=os.path.join(current_dir, "csv_export"))
load_data.disconnect_from_metatrader5()

# Press the green button in the gutter to run the script.
if __name__ == '__main__':
main()

...

Импорт необходимых библиотек:

import os
from core.get_shares_data_processor import SharesDataLoader
import MetaTrader5 as mt5 # импортируем модуль для подключения к MetaTrader5
import datetime
from threading import Thread # для поточной закачки разных датафреймов
import cv2
import pandas as pd

Устанавливаем сколько на экране показываем для таблицы pandas:

pd.set_option('display.max_columns', 500) # сколько столбцов показываем
pd.set_option('display.width', 1500) # макс. ширина таблицы для показа

Считываем текущую директорию и сколько баров скачать:

current_dir = os.path.dirname(os.path.abspath(__file__))
how_many_bars = 70000

Определяем по какую дату скачивать исторические данные, по каким тайм-фреймам и по каким тикерам:

utc_till = datetime.datetime.now() + datetime.timedelta(days=1) # получим данные по завтрашний день
timeframes = {mt5.TIMEFRAME_M5, mt5.TIMEFRAME_M10, mt5.TIMEFRAME_M15, mt5.TIMEFRAME_M30, mt5.TIMEFRAME_H1, mt5.TIMEFRAME_H4, mt5.TIMEFRAME_D1, mt5.TIMEFRAME_W1, mt5.TIMEFRAME_MN1}
tickers = {"VTBR", "GMKN", "SBER", "LKOH", "GAZP", "CHMF", "AFLT", "PLZL"}

И потом в цикле, просто скачиваем эти исторические данные по тикерам использую MetaTrader 5:

for timeframe in timeframes:
for ticket in tickers:
load_data = SharesDataLoader(ticket)
load_data.connect_to_metatrader5(path=f"C:\Program Files\FINAM MetaTrader 5\terminal64.exe")
data = load_data.get_share_data(ticket=ticket, timeframe=timeframe, utc_till=utc_till, how_many_bars=how_many_bars)
load_data.export_to_csv_from_df(ticket=ticket, timeframe=timeframe, data=data, export_dir=os.path.join(current_dir, "csv_export"))
load_data.disconnect_from_metatrader5()

Экспорт в dataframe идет командой:

load_data.export_to_csv_from_df(ticket=ticket, timeframe=timeframe, data=data, export_dir=os.path.join(current_dir, "csv_export"))

Если у вас установлено несколько MetaTrader 5, то в этой строке можно указать какой именно нужно использовать для скачивания исторических данных:

load_data.connect_to_metatrader5(path=f"C:\Program Files\FINAM MetaTrader 5\terminal64.exe")

Это бывает нужно, когда например у разных брокеров - есть разные инструменты - например есть склейка фьючерсов у одного, а другого её нет.

В принципе всё интуитивно именовано и есть комментарии по коду.

При запуске main.py выгрузка исторических данных происходит в папку csv_export.

экспорт исторических данных по акциям и фьючерсам
экспорт исторических данных по акциям и фьючерсам

Делюсь этим кодом, т.к. сам намучался с этим и пока не написал это решение, которое мне теперь существенно экономит время для получения котировок акций и склеек по фьючерсам.

Надеюсь оно будет и вам полезно.