Копипаст

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

    • 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:
Фото
EUR/USD: продавцы накопили силы для очередного рывка
Евро продолжает консолидироваться, разнонаправленно колеблясь вблизи своих локальных минимумов на фоне противоречивых факторов, связанных с...
Фото
Итоги недели на рынках сырьевых товаров
Если вас интересуют другие аналитические и информационные материалы от банка АО АКБ «ЦентроКредит», смотрите их на нашем сайте в...
Фото
2 фишки круче рынка
Индекс МосБиржи за неделю отскочил на 15%. Разберем кейсы двух ликвидных акций, кратно обогнавших бенчмарк на подъеме. Ралли после обвала
Фото
Модельный портфель рублевых облигаций: итоги, состав, планы
В условиях повышенной волатильности долгового публичного российского рынка в этом году, модельный портфель рублевых облигаций в целом показывает...

теги блога Tenant

....все тэги



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