Копипаст

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

    • 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

749 | ★2

Читайте на SMART-LAB:
Серебро обновляет рекорды на фоне эскалации вокруг Венесуэлы
Серебро на спотовом рынке обновило исторический максимум и поднималось выше $66 за тройскую унцию, прибавляя до 4,5% за сессию. Золото также...
Фото
Инвестиции с защитой от инфляции: реальные активы в портфеле МГКЛ
📈 Когда цены растут, особенно важно понимать, что лежит в основе бизнеса. В МГКЛ эта основа — реальные активы: товары, техника, залоги, золото. Это...
Фото
Российский сектор здравоохранения: два перспективных эмитента
«МД Медикал Груп» «МД Медикал» — один из ведущих игроков на рынке частных услуг здравоохранения в РФ. Группа компаний «МД Медикал»...

теги блога Tenant

....все тэги



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