Копипаст

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

    • 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

846 | ★2

Читайте на SMART-LAB:
«Акцент 5» стал лидером по оборотам среди биржевых фондов недвижимости
Рынок ЗПИФов недвижимости долго оставался довольно тихим с точки зрения вторичной торговли. Формально инструменты есть, но активного рынка внутри...
Фото
XAU/USD: обвал развеял иллюзию защитного актива из-за страхов перед инфляцией
Золото в рассматриваемый период прошло через резкую коррекцию с последующим частичным восстановлением, при этом динамика носила не разовый, а...
Фото
Банк ДОМ.РФ начал продажи в своих отделениях новых полисов страхования загородных домов «Ренессанс страхования»
Ее особенность в том, что программа объединяет страховую защиту и сервисное сопровождение, связанное с проверкой и эксплуатацией загородного...
Фото
Как Астра теряет денежный поток по пути по сравнению с Аренадатой
Продолжаем разговор о нездорово низкий дебиторке Аренадаты на фоне сравнения с Астрой. Чтобы вы понимали разницу между Астрой и Датой, я...

теги блога Tenant

....все тэги



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