0Pricing
AI Agents · Урок

Интеграция с API рыночных данных

Alpha Vantage, Yahoo Finance и Polygon.io для получения данных в реальном времени и исторических данных.

«Интеграция с API рыночных данных» — бесплатный урок AI Agents на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Agents, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Agents содержит 4 уроков всего.

Рыночные данные в финансовых агентах

Агентам для финансового анализа нужен доступ к актуальным и историческим рыночным данным. К распространённым типам данных относятся OHLCV (цена открытия/максимальная цена/минимальная цена/цена закрытия/объём), даты публикации финансовых результатов, фундаментальные коэффициенты и цепочки опционов.

Эти данные предоставляют несколько API: yfinance (бесплатный сервис Yahoo Finance), Polygon.io (платный и надёжный) и Alpha Vantage (доступен бесплатный тариф).

yfinance: исторические данные о ценах

yfinance предоставляет оболочку над API Yahoo Finance и позволяет быстрее всего начать работу. Ticker.history() возвращает DataFrame библиотеки pandas с данными OHLCV.

import yfinance as yf

ticker = yf.Ticker('AAPL')

# 1 year of daily data
history = ticker.history(period='1y')
print(history.tail(3))
#                  Open        High         Low       Close    Volume
# Date
# 2026-05-27  189.1500  190.3200  188.9200  190.0500  55234000
# 2026-05-28  190.4200  191.5600  189.7800  191.1200  62345000
print(f'Rows: {len(history)}')

yfinance: произвольные диапазоны дат

Используйте параметры start и end для задания произвольных диапазонов дат или interval для внутридневных данных (1m, 5m, 1h). Учтите, что объём внутридневных данных ограничен последними 60 днями и зависит от интервала.

import yfinance as yf

ticker = yf.Ticker('MSFT')

# Custom date range
history = ticker.history(start='2024-01-01', end='2024-12-31')
print(f'Trading days in 2024: {len(history)}')

# Batch multiple tickers
tickers = yf.download(['AAPL', 'MSFT', 'GOOGL'],
                       start='2025-01-01', end='2025-12-31')
print(tickers['Close'].head())

REST API Polygon.io

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

import requests

POLYGON_KEY = 'YOUR_POLYGON_API_KEY'

def get_polygon_daily(ticker: str, from_date: str, to_date: str) -> list[dict]:
    url = f'https://api.polygon.io/v2/aggs/ticker/{ticker}/range/1/day/{from_date}/{to_date}'
    resp = requests.get(url, params={'apiKey': POLYGON_KEY, 'limit': 365})
    resp.raise_for_status()
    data = resp.json()
    return data.get('results', [])

bars = get_polygon_daily('AAPL', '2025-01-01', '2025-12-31')
print(f'Bars returned: {len(bars)}')
if bars:
    print('Latest close:', bars[-1]['c'])

TIME_SERIES_DAILY в Alpha Vantage

Alpha Vantage предоставляет бесплатный тариф (25 вызовов в день) и платный тариф. Эндпоинт TIME_SERIES_DAILY возвращает данные OHLCV с возможностью получать скорректированные цены.

import requests

ALPHA_KEY = 'YOUR_ALPHA_VANTAGE_KEY'

def get_alpha_vantage_daily(symbol: str, outputsize: str = 'compact') -> dict:
    # outputsize: 'compact' (100 days) or 'full' (20+ years)
    resp = requests.get('https://www.alphavantage.co/query', params={
        'function':   'TIME_SERIES_DAILY_ADJUSTED',
        'symbol':     symbol,
        'outputsize': outputsize,
        'apikey':     ALPHA_KEY
    })
    resp.raise_for_status()
    data = resp.json()
    series = data.get('Time Series (Daily)', {})
    return series   # dict: {date_str: {open, high, low, close, volume, ...}}

Ограничения частоты запросов и повторные попытки

Все API рыночных данных устанавливают ограничения частоты запросов. При их превышении вы получите ошибку 429 (слишком много запросов). Всегда реализуйте экспоненциальную задержку перед повторной попыткой и соблюдайте установленные ограничения.

import time, requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

def make_rate_limited_session(calls_per_minute: int = 5) -> requests.Session:
    session = requests.Session()
    retry = Retry(
        total=3,
        backoff_factor=2,         # 1s, 2s, 4s waits
        status_forcelist=[429, 500, 502, 503, 504]
    )
    adapter = HTTPAdapter(max_retries=retry)
    session.mount('https://', adapter)
    session._calls_per_min = calls_per_minute
    session._min_interval  = 60.0 / calls_per_minute
    session._last_call     = 0.0
    return session

def rate_limited_get(session, url, **kwargs):
    elapsed = time.time() - session._last_call
    if elapsed < session._min_interval:
        time.sleep(session._min_interval - elapsed)
    session._last_call = time.time()
    return session.get(url, **kwargs)

Кэширование рыночных данных

Исторические данные неизменяемы: цена закрытия за вчерашний день уже не изменится. Кэшируйте их, чтобы не выполнять повторные обращения к API. Используйте простой дисковый кэш с ключом в виде пары (тикер, date_range).

import hashlib, json, os

CACHE_DIR = '/tmp/market_cache'
os.makedirs(CACHE_DIR, exist_ok=True)

def cache_key(ticker: str, start: str, end: str) -> str:
    return hashlib.md5(f'{ticker}_{start}_{end}'.encode()).hexdigest()

def get_cached(ticker: str, start: str, end: str):
    key = cache_key(ticker, start, end)
    path = os.path.join(CACHE_DIR, f'{key}.json')
    if os.path.exists(path):
        with open(path) as f:
            return json.load(f)
    return None

def set_cached(ticker: str, start: str, end: str, data):
    key = cache_key(ticker, start, end)
    path = os.path.join(CACHE_DIR, f'{key}.json')
    with open(path, 'w') as f:
        json.dump(data, f)

if __name__ == '__main__':
    set_cached('AAPL', '2024-01-01', '2024-01-31', {'close': [150, 151, 149]})
    cached = get_cached('AAPL', '2024-01-01', '2024-01-31')
    print('Cached data for AAPL:', cached)
    print('Cache miss for MSFT:', get_cached('MSFT', '2024-01-01', '2024-01-31'))

Учёт торговых часов и пробелов в данных

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

import pandas as pd
from pandas.tseries.offsets import BDay

def detect_gaps(history: pd.DataFrame) -> list[str]:
    if history.empty:
        return []
    date_range = pd.date_range(
        start=history.index.min(),
        end=history.index.max(),
        freq=BDay()  # Business days only
    )
    missing = date_range.difference(history.index)
    return [str(d.date()) for d in missing]

import yfinance as yf
history = yf.Ticker('AAPL').history(start='2024-12-23', end='2025-01-07')
gaps = detect_gaps(history)
print('Missing business days (holidays):', gaps)

Создание инструмента рыночных данных для агентов

Зарегистрируйте средство получения рыночных данных как инструмент агента. LLM сможет вызвать его для получения данных, а затем использовать другой инструмент — инструмент анализа — для обработки результата.

import yfinance as yf, json

def get_market_data_tool(ticker: str, period: str = '1y') -> str:
    cached = get_cached(ticker, period, 'yfinance')
    if cached:
        return json.dumps(cached)
    try:
        hist = yf.Ticker(ticker).history(period=period)
        if hist.empty:
            return json.dumps({'error': f'No data for {ticker}'})
        result = {
            'ticker':     ticker,
            'period':     period,
            'start':      str(hist.index.min().date()),
            'end':        str(hist.index.max().date()),
            'latest_close': float(hist['Close'].iloc[-1]),
            'pct_change_ytd': float((hist['Close'].iloc[-1] / hist['Close'].iloc[0] - 1) * 100),
            'rows':       len(hist)
        }
        set_cached(ticker, period, 'yfinance', result)
        return json.dumps(result)
    except Exception as e:
        return json.dumps({'error': str(e)})

Фундаментальные данные из yfinance

Помимо ценовых данных, yfinance предоставляет фундаментальные данные: коэффициент P/E, прибыль на акцию, рыночную капитализацию и многое другое. Фундаментальные данные обогащают анализ агента, дополняя анализ только движения цен.

import yfinance as yf

ticker = yf.Ticker('AAPL')
info  = ticker.info

print('Market Cap:      ', info.get('marketCap'))
print('P/E Ratio:       ', info.get('trailingPE'))
print('EPS:             ', info.get('trailingEps'))
print('52-Week High:    ', info.get('fiftyTwoWeekHigh'))
print('52-Week Low:     ', info.get('fiftyTwoWeekLow'))
print('Dividend Yield:  ', info.get('dividendYield'))
print('Analyst Target:  ', info.get('targetMeanPrice'))

Обработка ошибок: исключённые из листинга и недействительные тикеры

Не все символы тикеров действительны или в данный момент участвуют в торгах. Для исключённой из листинга компании история будет пустой. Всегда проверяйте ответ перед началом анализа.

import yfinance as yf

def safe_fetch(ticker_symbol: str, period: str = '1y') -> dict:
    try:
        ticker = yf.Ticker(ticker_symbol)
        history = ticker.history(period=period)

        if history.empty:
            return {
                'error': f'No data for {ticker_symbol}. May be delisted or invalid.',
                'ticker': ticker_symbol
            }
        return {
            'ticker':       ticker_symbol,
            'latest_close': float(history['Close'].iloc[-1]),
            'data_start':   str(history.index.min().date()),
            'bars':         len(history)
        }
    except Exception as e:
        return {'error': str(e), 'ticker': ticker_symbol}

print(safe_fetch('AAPL'))    # valid
print(safe_fetch('INVALID')) # returns error dict

Что возвращает компактный размер результата в эндпоинте TIME_SERIES_DAILY Alpha Vantage?

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

Итоги интеграции API рыночных данных

Используйте yfinance для быстрого прототипирования (бесплатный вариант), Polygon.io для эксплуатации (надёжный платный вариант) и Alpha Vantage как вариант с бесплатным тарифом. Всегда реализуйте ограничение частоты запросов, кэширование исторических данных на диске и выявление пробелов, возникающих в неторговые дни.

Предоставьте получение данных как инструмент агента, чтобы LLM могла запрашивать данные при необходимости.

Часто задаваемые вопросы

Урок «Интеграция с API рыночных данных» бесплатный?

Да — полный текст урока «Интеграция с API рыночных данных» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Agents, подпишись на CoddyKit PRO. Курс AI Agents содержит 4 уроков всего.

Чему я научусь в уроке «Интеграция с API рыночных данных»?

Alpha Vantage, Yahoo Finance и Polygon.io для получения данных в реальном времени и исторических данных. Ты практикуешь AI Agents с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать AI Agents?

Предыдущий опыт не требуется. AI Agents на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Интеграция с API рыночных данных»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке AI Agents?

Да. Каждый урок AI Agents включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Интеграция с API рыночных данных
  2. Инструменты агента для анализа портфеля
  3. Ограничители риска и соответствия требованиям
  4. Бэктестинг решений агента
← Назад к AI Agents