Копипаст

Копипаст | Выгрузка данных о бескупонных доходностях гособлигаций с сайта ЦБ

    • 16 июля 2025, 16:44
    • |
    • Tenant
  • Еще
Python код для получения данных о бескупонных доходностях с сайта ЦБ РФ.

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

import pandas as pd
from datetime import datetime, timedelta

def get_cbr_data(start_date, end_date):
    """Получение данных с сайта ЦБ для указанного диапазона"""
    url = f'http://www.cbr.ru/hd_base/zcyc_params/?UniDbQuery.Posted=True&UniDbQuery.From={start_date}&UniDbQuery.To={end_date}'
    try:
        tables = pd.read_html(url, decimal=',', thousands=' ')
        df = tables[0]
        
        # Обработка заголовков
        df.columns = [col[1].replace(',', '.').replace('Дата', 'Date') if isinstance(col, tuple) 
                    else col.replace(',', '.').replace('Дата', 'Date') for col in df.columns]
        
        # Преобразование данных
        for col in df.columns[1:]:
            df[col] = df[col]. <a name="cut"></a> astype(str).str.replace(',', '.').astype(float) / 100
        
        df['Date'] = pd.to_datetime(df['Date'], dayfirst=True)
        return df
    
    except Exception as e:
        print(f"Ошибка при получении данных с {start_date} по {end_date}: {str(e)}")
        return pd.DataFrame()

# Разбиваем диапазон на 5-летние интервалы
start_date = "01.01.2010"
end_date = "27.06.2025"

date_ranges = []
current_start = datetime.strptime(start_date, "%d.%m.%Y")
final_end = datetime.strptime(end_date, "%d.%m.%Y")

while current_start < final_end:
    current_end = min(current_start + timedelta(days=5*365), final_end)
    date_ranges.append((
        current_start.strftime("%d.%m.%Y"),
        current_end.strftime("%d.%m.%Y")
    ))
    current_start = current_end + timedelta(days=1)

# Собираем данные из всех диапазонов
all_data = []
for start, end in date_ranges:
    data = get_cbr_data(start, end)
    if not data.empty:
        all_data.append(data)

# Объединяем данные, удаляя дубликаты
if all_data:
    final_df = pd.concat(all_data).drop_duplicates().sort_values('Date')
    final_df.to_csv('yield_curve_full.txt', sep='\t', index=False, float_format='%.4f')
    print("Данные успешно сохранены в yield_curve_full.txt")
    print(final_df.tail())
else:
    print("Не удалось получить данные ни для одного диапазона")


Пример файла данных за период 2010-2025 гг.:

disk.yandex.ru/d/pBFjTjElGu-pLA

Файл с кодом:

disk.yandex.ru/d/ut25Pn2N-H7qEA

Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.
892 | ★2

Читайте на SMART-LAB:
Фото
Эмитент допустил дефолт: что делать инвесторам в таком случае?
Дефолт по облигациям не всегда означает полную потерю вложений. Даже если эмитент перестал платить купоны или не погасил долг, инвестор...
Ключевые тезисы менеджмента Норникеля по итогам раскрытия финансовых результатов за 1П 2026 г.
Сегодня мы раскрыли финансовые результаты за 1П 2026 г. по МСФО. Все наши материалы доступны на сайте...
Обновление кредитных рейтингов в ВДО и розничных облигациях (АО СПМК подтвержен ruB+, ООО ПКО АйДи Коллект подтвержден ruBBB-, ООО "Кронос" понижен B.ru)
🟢 АО СПМК Эксперт РА подтвердил рейтинг кредитоспособности АО СПМК на уровне ruB+, прогноз по рейтингу стабильный АО СПМК...
Фото
ГМК Норникель: Прибыль иксанула, а котировки упали - обзор отчета по МСФО за 1-е полугодие 2026
ГМК Норникель отчитался сегодня по МСФО за 1- е полугодие Чистая прибыль выросла в 2 раза по сравнению с прошлым годом...

теги блога Tenant

....все тэги



UPDONW
Новый дизайн