В современном финансовом мире доступ к историческим данным котировок — это фундамент для принятия взвешенных решений. Будь то алгоритмическая торговля, фундаментальный анализ, бэктестинг стратегий или расчет налоговой базы — без надежного архива графиков валют невозможно построить качественную аналитическую модель. В этой статье мы подробно разберем, что такое архив котировок, где его брать, в каком формате хранить и как эффективно использовать.
Что такое архив графиков валют?
Архив графиков валют (исторические котировки), это структурированная база данных, содержащая информацию об изменении цен валютных пар (или криптовалют) за определенные временные интервалы в прошлом. В отличие от текущего графика в терминале, архив предоставляет доступ к данным за годы и десятилетия.
Ключевые компоненты архивных данных:
- OHLC (Open, High, Low, Close): Цена открытия, максимум, минимум и цена закрытия за выбранный таймфрейм (минута, час, день, неделя, месяц).
- Volume (Объем): Количество контрактов или лотов, пройденных за период (на Форексе часто тиковый объем, на биржах — реальный).
- Timestamp (Временная метка): Точное время открытия свечи (важно учитывать часовой пояс: UTC, GMT+3, EET и т.д.).
- Spread / Bid-Ask: В профессиональных архивах часто хранятся отдельно цены Bid и Ask для расчета спреда в исторической перспективе.
Зачем нужен архив котировок? Основные сценарии использования
Бэктестинг торговых стратегий
Самое популярное применение. Торговые роботы (советники) и ручные стратегии тестируются на истории для оценки:
- Прибыльности (Profit Factor, Net Profit).
- Рисков (Max Drawdown, Recovery Factor).
- Стабильности на разных рыночных фазах (тренд, флет, кризис, высокая волатильность).
Важно: Качество бэктестинга на 99% зависит от качества архива (наличие тиковых данных, реальных спредов, свопов и комиссий).
Фундаментальный и статистический анализ
- Изучение реакции валют на макроэкономические новости (NFP, решения ЦБ, ВВП) за последние 10–20 лет.
- Расчет сезонностей и календарных аномалий (например, «Январский эффект» или поведение пар в период летней ликвидности).
- Корреляционный анализ между активами на длинных временных горизонтах.
Налоговый учет и отчетность
Для трейдеров и инвесторов (в т.ч. криптоинвесторов) архив необходим для определения стоимости актива на момент покупки/продажи (FIFO/LIFO методы) для расчета налога на доходы физических лиц (НДФЛ) или налога на прибыль юрлиц.
Обучение и разработка индикаторов
Исторические данные нужны для обучения нейросетей (Machine Learning), проверки гипотез и написания собственных индикаторов, требующих большой выборки для калибровки параметров.
Источники архивов: Где скачать качественные данные?
Выбор источника зависит от рынка (Форекс, Крипта, Акции/Фьючерсы) и требований к качеству.
Форекс (OTC-рынок)
На децентрализованном рынке нет единого «ленты». Данные агрегируются брокерами и ликвидностными провайдерами.
| Источник | Тип данных | Качество / Особенности | Цена |
|---|---|---|---|
| Dukascopy Bank | Тиковые (Tick) / M1 | Золотой стандарт для Форекса. Данные с 2003 года. Реальные спреды, объемы. | Бесплатно (через API/сайт) |
| HistData.com | M1, Tick | Хорошее покрытие, удобный скачиватель. Есть пробелы в старых данных. | Бесплатно / Платный про |
| TrueFX / FXCM | Тиковые | Архив от крупных маркет-мейкеров. Требует регистрации. | Бесплатно |
| Брокерские терминалы (MT4/MT5, cTrader) | M1 и выше | Зависит от брокера. Часто «дырявые», спреды зафиксированы/расширены. Только для ознакомления. | Бесплатно у брокера |
| Tick Data Suite (TDS) / Tickstory | Готовые наборы для MT | Премиум-сервисы: чистят данные, добавляют реальные спреды, свопы, комиссии. Идеально для 99% моделирования. | Платно (подписка/лицензия) |
Криптовалюты (Централизованные и DEX биржи)
- Binance / Bybit / OKX / Coinbase API: Предоставляют свечи (Klines) до глубины нескольких лет по REST API и WebSocket. Лучший источник для спотовых и фьючерсных пар.
- CryptoDataDownload / Kaggle: Готовые CSV-датасеты для популярных пар (BTCUSDT, ETHUSDT) с 2017–2018 гг.
- Kaiko / CoinAPI / CryptoCompare: Профессиональные агрегаторы (Enterprise level), объединяющие данные со всех бирж, нормализующие таймстемпы и обрабатывающие сплиты/дивиденды (для токенов).
- DEX данные (Uniswap, PancakeSwap): Доступны через The Graph (Subgraphs) или Dune Analytics. Сложнее в парсинге (нужны блоки/транзакции, а не готовые свечи).
Фондовый рынок и Фьючерсы (MOEX, CME, NYSE, NASDAQ)
- Московская биржа (MOEX): Официальный сайт -> «Данные для терминалов» -> История котировок (CSV, бесплатно для физлиц с задержкой). Есть платный доступ к Level 2 (стакан) и тикам.
- Finam / SmartLab / Investing.com: Удобные экспортеры в текстовые форматы для российских акций и фьючерсов.
- FirstRateData / Norgate / CSI Data: Профессиональные платные базы для США (с корректировкой на сплиты, дивиденды, ролловер фьючерсов).
Форматы хранения и структура данных
Правильный выбор формата экономит место на диске и ускоряет загрузку в аналитические системы (Python/Pandas, R, C++, NinjaTrader, Amibroker).
Текстовые форматы (для обмена и ручной проверки)
- CSV (Comma Separated Values): Универсальный стандарт. Колонки:
Date,Time,Open,High,Low,Close,Volume. Недостаток: медленное чтение, большой размер. - JSON / JSONL: Удобен для API и NoSQL, но избыточен для временных рядов.
Бинарные/Колоночные форматы (для продакшена и больших данных)
- Parquet (Apache Parquet): Рекомендуемый стандарт. Колончатое сжатие (Snappy/Zstd). Чтение только нужных колонок (например, только Close). Поддержка в Pandas, Polars, Spark, ClickHouse.
- Feather (Apache Arrow): Очень быстрое чтение/запись в RAM, межъязыковая совместимость (Python <-> R <-> C++).
- HDF5 / H5: Иерархическое хранение, поддержка сжатия, используется в QuantLib, PyTables.
- DuckDB / SQLite: Встраиваемые SQL-базы. Отлично подходят для хранения архива как реляционной таблицы с индексами по времени и тикеру.
Специализированные форматы терминалов
- .hst / .fxt (MetaTrader 4/5): Проприетарные форматы. Требуют конвертера для внешнего использования.
- .tds (Tick Data Suite): Защищенный формат для MT.
Критические нюансы качества данных («Подводные камни»)
Просто скачать CSV — недостаточно. Перед использованием обязательно проведите аудит данных:
- Пробелы в данных (Gaps): Выходные, праздники, технические сбои брокера. Нужно решать: заполнять ли (forward fill), оставлять NaN или удалять периоды.
- Часовые пояса (Timezone Hell): Форекс: GMT+2/3 (зимой/летом) или UTC. Крипта: строго UTC. Биржи: локальное время (МСК для Мосбиржи, EST для NYSE). Всегда конвертируйте в UTC при сохранении в архив.
- Ролловер фьючерсов (Continuous Contracts): Фьючерсы имеют срок действия. Для долгосрочных графиков нужно склеивать контракты (Back-adjusted, Ratio-adjusted, Panama method). Несклеенные данные дадут ложные провалы/скачки цены.
- Сплиты и дивиденды (Акции): Цена акции падает при выплате дивиденда или сплите. Нужен Adjusted Close (скорректированная цена закрытия) для корректного расчета доходности.
- Тиковые данные vs M1: M1 свечи скрывают внутриминутную волатильность. Для скальпинга и HFT нужны тики (Bid/Ask) или хотя бы данные Level 2.
- Спреды и слипейдж: В архиве часто только Mid-price или Bid. Реальная торговля идет по Ask (покупка) и Bid (продажа). Для реалистичного бэктеста нужно накладывать исторические спреды + комиссию + слипейдж.
Архитектура личного архива: Best Practices
Если вы серьезно занимаетесь квантовой разработкой, постройте локальное хранилище (Data Lake).
Структура каталогов (Partitioning):
/data_lake/
/market=forex/
/timeframe=1m/
/symbol=EURUSD/
/year=2023/
data.parquet
/year=2024/
data.parquet
/market=crypto/
/timeframe=1h/
/symbol=BTCUSDT/
/exchange=binance/
data.parquet
/market=moex/
/timeframe=1d/
/symbol=SBER/
data.parquet
Инструментарий для работы (Python Stack):
- Pandas / Polars: Анализ, ресемплинг, расчет индикаторов. Polars быстрее и ленивее (Lazy API).
- DuckDB: SQL-запросы к Parquet-файлам напрямую без загрузки в RAM.
SELECT * FROM 'data.parquet' WHERE time > '2024-01-01'. - VectorBT / Backtesting.py / NautilusTrader: Фреймворки для векторного и событийного бэктестинга.
- Airflow / Prefect / Dagster: Оркестрация ETL-парйплайнов: скачивание -> очистка -> валидация -> сохранение в Parquet -> уведомление.
Пример ETL-парйплайна на Python (Псевдокод)
Автоматизация обновления архива в конце торгового дня:
import polars as pl
import requests
from datetime import datetime, timedelta
import duckdb
SYMBOL = "EURUSD"
SOURCE_API = "https://api.dukascopy.com/..." # Пример
STORAGE_PATH = f"/data_lake/forex/1m/{SYMBOL}/"
def fetch_incremental_data(last_date: datetime) -> pl.DataFrame:
"""Скачивает данные с последней даты в архиве до вчера."""
# Реализация запроса к API Dukascopy / Binance / MOEX
# Важно: обработать пагинацию, рейт-лимиты, ретраи
pass
def clean_and_validate(df: pl.DataFrame) -> pl.DataFrame:
"""Чистка: удаление дублей, сортировка, проверка на NaN, выбросы (Z-score > 5)."""
return (
df.unique(subset=["timestamp"])
.sort("timestamp")
.filter(pl.col("close").is_not_null)
# Добавить проверку на аномальные свечи (High < Low и т.д.)
)
def save_partitioned(df: pl.DataFrame):
"""Сохранение в Parquet с партиционированием по году/месяцу."""
df = df.with_columns([
pl.col("timestamp").dt.year.alias("year"),
pl.col("timestamp").dt.month.alias("month")
])
df.write_parquet(
STORAGE_PATH,
partition_by=["year", "month"],
compression="zstd",
existing_data_behavior="overwrite_or_ignore" # или append
)
def main:
# 1. Узнаем последнюю дату в архиве через DuckDB (мгновенно, без чтения всего файла)
con = duckdb.connect
last_ts = con.execute(f"SELECT max(timestamp) FROM '{STORAGE_PATH}*/.parquet'").fetchone[0]
if last_ts is None:
start_date = datetime(2020, 1, 1) # Полная загрузка
else:
start_date = last_ts + timedelta(minutes=1)
# 2. Скачиваем
new_data = fetch_incremental_data(start_date)
if new_data.height > 0:
# 3. Чистим
clean_data = clean_and_validate(new_data)
# 4. Сохраняем
save_partitioned(clean_data)
print(f"Обновлено: {clean_data.height} строк.")
else:
print("Новых данных нет.")
if __name__ == "__main__":
main
Юридические аспекты и лицензирование
- Публичные данные (MOEX, Binance Public API): Обычно разрешены для личного использования и исследований. Перепродажа «сырых» данных часто запрещена ToS.
- Проприетарные данные (Bloomberg, Refinitiv, Kaiko, TickDataSuite): Строгие лицензии. Использование в коммерческих продуктах (продажа сигналов, управление чужими деньгами) требует корпоративной лицензии ($$$).
- GDPR / 152-ФЗ: Не актуально для рыночных данных (нет ПДн), но актуально, если в архиве храните свои сделки/логины.
Создание и поддержка архива графиков валют — это инженерная задача, а не разовое действие «скачал и забыл». Качество ваших торговых решений линейно зависит от чистоты, полноты и правильной структуры исторических данных.
Чек-лист для старта:
- Определите рынки и таймфреймы (Тики для HFT, M1/D1 для свинга).
- Выберите 1-2 надежных источника (Dukascopy для Форекса, Binance API для Крипты, MOEX/FINAM для РФ).
- Настройте хранилище в Parquet с партиционированием по времени.
- Напишите/настройте ETL-процесс обновления (ежедневно/еженедельно).
- Внедрите этап валидации (проверка на пропуски, аномалии, корректность таймзон).
- Используйте DuckDB / Polars для быстрого доступа к данным в исследовательских ноутбуках и бэктестерах.
Инвестиции времени в построение правильной инфраструктуры данных окупятся с первой же отсеянной нерабочей стратегией или обнаруженной ошибке в котировках брокера. Храните историю в порядке — и пусть прибыль будет с вами!