Копипаст

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

    • 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

838 | ★2

Читайте на SMART-LAB:
Фото
AUD/USD: быки пробуют раскачать ситуацию?
Австралийский доллар на недельном графике вернулся к пробитому горизонтальному уровню 0.6942, который практически совпадает с 50% уровнем Фибо...
Фото
Представляем финансовые результаты первых двух месяцев 2026 года
Фото
Россети Ленэнерго. Отчет МСФО. Считаем дивидендную базу
Компания Россети Ленэнерго опубликовала финансовый отчет за 2025г. по МСФО. Отчет МСФО и РСБУ у сетевых компаний очень похожи, а так...
Фото
X5 МСФО 2025 г. - капзатрат меньше, дивиденд больше?
Компания X5 опубликовала финансовые результаты за 2025 год. Выручка прибавила +18,8% до 4,6 трлн руб., в 4-м квартале рост на 14,9% до 1,24...

теги блога Tenant

....все тэги



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