Описание
Сервис исторических данных по инструментам позволяет получить обезличенные сделки и минутные свечи в виде архивных файлов. Его функционал расширяет возможности, приведенные на странице Получить исторические данные.
Сервис позволяет выгрузить:
- архивы всех сделок за день по всем инструментам;
- архивы всех сделок за день по заданному инструменту;
- архивы минутных свечей за год по заданному инструменту;
Исторические данные доступны не по всем инструментам и не с начала истории биржевых торгов. Сервис предоставляет те архивы, которые удалось собрать. Если по какому-то инструменту отсутствуют архивы, то это означает, что данные по нему недоступны в Т.
В сервисе настроены лимиты на скачивание. С одного IP адреса можно загрузить не более 30 файлов в минуту. Необходимо учитывать это ограничение при разработке скриптов.
Архивы всех сделок по дням
Раздел представляет собой упорядоченную по датам структуру с разбивкой по годам. Внутри года приведен список архивов сделок за каждый день. Для загрузки архива можно кликнуть на прямую ссылку для скачивания, либо выбрать интересующие дни и воспользоваться сгенерированным автоматически кодом в блоке "Пример кода загрузки".
Внутри каждого архива находится файл с расширением .csv
, который содержит данные в формате:
TRADE_TS,TICKER_CC,DIRECTION,PRICE,QUANTITY,TRADE_SOURCE,INSTRUMENT_UID
2018-01-23T07:02:29.315229Z,TIF_SPBXM,BUY,110.11,10,EXCHANGE,be6fac28-7e2e-448c-b29b-8fae74b4f6fb
...
Данные в файле:
TRADE_TS
— дата и время сделки по UTC;TICKER_CC
— идентификатор инструмента в форматеticker
+_
+clacc_code
;DIRECTION
— направление;PRICE
— цена;QUANTITY
— количество лотов;TRADE_SOURCE
— источник сделки, может принимать значенияEXCHANGE
илиDEALER
, подробнее о дилерской торговле;INSTRUMENT_UID
— идентификатор инструмента в форматеuuid
.
Загружать все файлы, пролистывая каждую страницу, может быть неудобно. Для этого можно воспользоваться примером скрипта и сформировать свой, который скачает все файлы за указанный период. Рекомендация относится ко всем разделам сервиса.
Архив сделок по инструментам
Структура разбита по типам инструментов. Внутри каждого типа приведен список идентификаторов инструментов в формате ticker
+_
+clacc_code
, которые
соответствуют данным, возвращаемыми методами сервиса инструментов.
Для удобства можно воспользоваться строкой поиска. Напротив каждого инструмента указано количество доступных архивов.
Каждый архив соответствует одному торговому дню и содержит обезличенные сделки. По клику на инструмент можно повалиться в список архивов по бумаге.
Как и в архиве всех сделок есть возможности прямой загрузки и использования сгенерированного кода.
Формат файла совпадает с архивом всех сделок.
Возможна ситуация, когда архив по заданному инструменту отсутствует. Это может быть по одной из причин:
- инструмент в этот день не торговался;
- нет информации о торгах за этот день;
Архив минутных свечей
Раздел по структуре схож с разделом "Архив сделок по инструментам". Внутри каждого типа инструментов приведен список идентификаторов инструментов в формате ticker
+_
+clacc_code
,
поддерживается поиск. В отличие от сделок, тут архивы собраны за год и содержат минутные свечи.
Аналогично другим разделам поддерживается непосредственная загрузка и использование сгенерированного кода.
В каждом архиве содержатся .csv
файлы, которые соответствуют дням, когда торговался инструмент. В отличие от сделок, файл не имеет заголовков. Формат файла:
e6123145-9665-43e0-8413-cd61b8aa9b13;2025-01-02T04:00:00Z;281.67;281.66;281.67;280.1;22;
e6123145-9665-43e0-8413-cd61b8aa9b13;2025-01-02T04:01:00Z;280.41;281.58;281.65;280.41;25;
...
Порядок полей в файле:
INSTRUMENT_UID
— идентификатор инструмента в форматеuuid
;UTC
— дата и время начала свечи по UTC;open
— цена открытия;close
— цена закрытия;high
— максимальная цена за интервал;low
— минимальная цена за интервал;volume
— объем в лотах.
Готовые скрипты для загрузки данных
Linux и macOS:
- Сохраните соответствующий скрипт в файл, например download_data.sh;
- Сделайте файл исполняемым: chmod +x download_data.sh;
- Запустите скрипт: ./download_data.sh
Windows:
- Сохраните скрипт в файл, например download_data.ps1;
- Откройте PowerShell и перейдите в директорию со скриптом;
- Запустите скрипт: .\download_data.ps1;
Пример скриптов
Linux
#!/bin/bash
# Список тикеров
TICKERS=("SBER_TQBR", "GAZP_TQBR", "CRZ5_SPBFUT")
# Функция для генерации списка дат с 2020 года по вчерашний день
generate_dates() {
local start_date="2020-01-01"
local yesterday=$(date -d "yesterday" +%Y-%m-%d)
local current_date=$(date -d "$start_date" +%s)
local end_date=$(date -d "$yesterday" +%s)
while [ $current_date -le $end_date ]; do
date -d "@$current_date" +%Y-%m-%d
current_date=$((current_date + 86400))
done
}
# Генерируем все даты
DATES=($(generate_dates))
# Перебираем все тикеры и даты
for ticker in "${TICKERS[@]}"; do
echo "Обработка тикера: $ticker"
for date in "${DATES[@]}"; do
echo " Загрузка данных за $date"
# Формируем URL и имя файла
URL="https://invest-public-api.tinkoff.ru/history-trades/$date?instrumentId=$ticker"
OUTPUT_FILE="data/${ticker}_${date}.csv"
# Создаем директорию, если не существует
mkdir -p "data"
# Выполняем запрос
HTTP_CODE=$(curl -s -o "$OUTPUT_FILE" -w "%{http_code}" "$URL")
case $HTTP_CODE in
200)
echo " ✓ Успешно загружено"
;;
404)
echo " ⚠ Файл не найден, пропускаем"
rm -f "$OUTPUT_FILE"
;;
429)
echo " ⏱ Превышен лимит запросов (429), ждем 60 секунд"
rm -f "$OUTPUT_FILE"
sleep 60
# Повторяем текущую итерацию
((i--))
continue
;;
*)
echo " ✗ Ошибка $HTTP_CODE"
rm -f "$OUTPUT_FILE"
;;
esac
# Небольшая пауза между запросами
sleep 0.5
done
done
echo "Загрузка завершена!"
MacOS
#!/bin/bash
# Список тикеров
TICKERS=("SBER_TQBR", "GAZP_TQBR", "CRZ5_SPBFUT")
# Функция для генерации списка дат с 2020 года по вчерашний день для macOS
generate_dates() {
local start_date="2020-01-01"
local yesterday=$(date -v-1d +%Y-%m-%d)
# Преобразуем даты в секунды с начала эпохи
local start_ts=$(date -j -f "%Y-%m-%d" "$start_date" +%s)
local end_ts=$(date -j -f "%Y-%m-%d" "$yesterday" +%s)
# Перебираем все дни
local current_ts=$start_ts
while [ $current_ts -le $end_ts ]; do
date -j -r $current_ts +%Y-%m-%d
current_ts=$((current_ts + 86400))
done
}
# Генерируем все даты
DATES=($(generate_dates))
# Перебираем все тикеры и даты
for ticker in "${TICKERS[@]}"; do
echo "Обработка тикера: $ticker"
for date in "${DATES[@]}"; do
echo " Загрузка данных за $date"
# Формируем URL и имя файла
URL="https://invest-public-api.tinkoff.ru/history-trades/${date}?instrumentId=$ticker"
OUTPUT_FILE="data/${ticker}_${date}.csv"
# Создаем директорию, если не существует
mkdir -p "data"
# Выполняем запрос
HTTP_CODE=$(curl -s -o "$OUTPUT_FILE" -w "%{http_code}" "$URL")
case $HTTP_CODE in
200)
echo " ✓ Успешно загружено"
;;
404)
echo " ⚠ Файл не найден, пропускаем"
rm -f "$OUTPUT_FILE"
;;
429)
echo " ⏱ Превышен лимит запросов (429), ждем 60 секунд"
rm -f "$OUTPUT_FILE"
sleep 60
# Повторяем текущую итерацию
((i--))
continue
;;
*)
echo " ✗ Ошибка $HTTP_CODE"
rm -f "$OUTPUT_FILE"
;;
esac
# Небольшая пауза между запросами
sleep 0.5
done
done
echo "Загрузка завершена!"
Windows
# Список тикеров
$TICKERS = @("SBER_TQBR", "GAZP_TQBR", "CRZ5_SPBFUT")
# Функция для генерации списка дат с 2020 года по вчерашний день
function Generate-Dates {
$startDate = [DateTime]::ParseExact("2020-01-01", "yyyy-MM-dd", $null)
$yesterday = (Get-Date).AddDays(-1).Date
$currentDate = $startDate
$dates = @()
while ($currentDate -le $yesterday) {
$dates += $currentDate.ToString("yyyy-MM-dd")
$currentDate = $currentDate.AddDays(1)
}
return $dates
}
# Генерируем все даты
$DATES = Generate-Dates
# Создаем директорию для данных, если не существует
if (-not (Test-Path -Path "data")) {
New-Item -ItemType Directory -Path "data" | Out-Null
}
# Перебираем все тикеры и даты
foreach ($ticker in $TICKERS) {
Write-Host "Обработка тикера: $ticker"
foreach ($date in $DATES) {
Write-Host " Загрузка данных за $date"
# Формируем URL и имя файла
$URL = "https://invest-public-api.tinkoff.ru/history-trades/${date}?instrumentId=$ticker"
$OUTPUT_FILE = "data\${ticker}_${date}.csv"
# Выполняем запрос с помощью Invoke-WebRequest
try {
$retry = $true
while ($retry) {
try {
$response = Invoke-WebRequest -Uri $URL -OutFile $OUTPUT_FILE -PassThru -ErrorAction Stop
$statusCode = $response.StatusCode
$retry = $false
}
catch {
if ($_.Exception.Response.StatusCode.value__ -eq 429) {
Write-Host " ⏱ Превышен лимит запросов (429), ждем 60 секунд"
if (Test-Path $OUTPUT_FILE) { Remove-Item $OUTPUT_FILE }
Start-Sleep -Seconds 60
}
elseif ($_.Exception.Response.StatusCode.value__ -eq 404) {
Write-Host " ⚠ Файл не найден, пропускаем"
if (Test-Path $OUTPUT_FILE) { Remove-Item $OUTPUT_FILE }
$retry = $false
}
else {
Write-Host " ✗ Ошибка $($_.Exception.Response.StatusCode.value__)"
if (Test-Path $OUTPUT_FILE) { Remove-Item $OUTPUT_FILE }
$retry = $false
}
}
}
if ($statusCode -eq 200) {
Write-Host " ✓ Успешно загружено"
}
}
catch {
Write-Host " ✗ Ошибка при выполнении запроса: $_"
if (Test-Path $OUTPUT_FILE) { Remove-Item $OUTPUT_FILE }
}
# Небольшая пауза между запросами
Start-Sleep -Milliseconds 500
}
}
Write-Host "Загрузка завершена!"