Как автоматически отслеживать новости компаний по своему портфелю?
Как частный инвестор, я всегда ищу способы упростить управление своим портфелем. Особенно меня интересуют высокодоходные облигации. Да, они немного "мусорные", но я не стремлюсь быть финансовым аналитиком в этом или детально изучать каждого эмитента.
Моя цель проста: купить бумаги и получать купоны, то есть стабильный доход. Однако, чтобы избежать неприятных сюрпризов, важно вовремя узнавать новости о компаниях-эмитентах.
Если бы у меня было всего 3–5 облигаций, я могу просто периодически пробивать названия эмитентов в поисковике и смотреть, что о них пишут. Но когда в портфеле 10 и более бумаг, такой подход превращается в рутину, на которую жалко тратить время. Автоматизация здесь может существенно упростить задачу.
Почему не использовать готовые решения?
Да, существуют профессиональные сервисы вроде Cbonds или Bloomberg Terminal, которые позволяют отслеживать новости по эмитентам.
На скриншоте выше новости с Cbonds по эмитенту Домодедово Фьюэл Фасилитис - кажется у них всё не очень хорошо - стоит ли такие облигации покупать?
Но проблема в том, что такие готовые решения либо дорогие, либо предназначены для институциональных инвесторов. Чаще всего частный инвестор просто не готов платить за такую аналитику.
Блумберг терминал стоит около $2000 в месяц и они ушли из России, фото выше еле удалось выпросить через знакомых.
Как автоматизировать сбор новостей по облигациям?
Идея простая: мы берём список облигаций, вытаскиваем названия эмитентов и ищем свежие новости о них через Google Новости. Причём делаем это через их RSS-канал, потому что так проще работать со структурированными данными.
Как протестировать идею вручную?
Прежде чем писать скрипт, можно проверить, насколько рабочий такой подход:
Открываем поиск в Гугле, вкладка Новости.
Вбиваем название компании-эмитента.
Фильтруем поиск за последний год.
Анализируем, сколько релевантных новостей появляется.
Если информации достаточно, значит, автоматизация действительно имеет смысл.
В данном случае видно что "Борец Капитал" испытывает трудности и причиной стал иск к компании от прокуратуры - стоит ли такие покупать такие облигации?
Пошаговый алгоритм работы скрипта
Автоматизация поиска новостей об эмитентах позволяет частному инвестору сэкономить время и оперативно получать важную информацию. Таким образом, даже если в портфеле 20+ облигаций, вся информация собирается автоматически без лишних телодвижений.
Рассмотрим пошаговый процесс работы скрипта:
Получаем список облигаций — скрипт берет коды ценных бумаг Московской биржи из файла bonds.xlsx, в этом файле Вы можете записать как облигации которые уже находятся в нашем портфеле, так и интересующие Вас к покупке.
Определяем название компании-эмитента — для каждой облигации через API Московской биржи получаем название выпустившей её компании. Это ключевой этап, поскольку именно по названиям мы будем искать новости.
Ищем новости — формируем запрос к RSS-каналу Google Новостей, используя название компании как ключевое слово. Несмотря на то, что сам news.google.com может требовать VPN для работы из России, результаты полностью соответствуют обычной вкладке "Новости" в Google.
Собираем данные — из полученных результатов извлекаем заголовки статей, даты публикации и ссылки на источники, уделяя внимание только свежим новостям.
Выводим результат — все собранные новости структурированно записываются в текстовые файлы для удобного просмотра и анализа.
Актуальная версия всегда на GitHub. Скрипт является open-source проектом. Это означает что любой человек может не только свободно посмотреть его код, но и предложить свои улучшения через отправку pull request (PR) на GitHub.
Результат работы скрипта - лично мне удобно просматривать через Visual Studio Code, но можно и через обычный блокнот смотреть:
Полный код скрипта:
# 📊 Поиск информации об эмитентах и новостей о компаниях 📊
#
# Этот Python-скрипт автоматически загружает данные об облигациях из Excel-файла,
# получает названия эмитентов через API Московской биржи, затем ищет
# новости по этим компаниям в Google News и сохраняет их в файлы.
#
# Установка зависимостей перед использованием: pip install pandas requests openpyxl feedparser beautifulsoup4 emoji
#
# Автор: Михаил Шардин https://shardin.name/
# Дата создания: 11.02.2025
# Версия: 1.0
#
# Актуальная версия скрипта всегда здесь: https://github.com/empenoso/moex-bond-search-and-analysis
#
import os
import time
import re
import requests
import pandas as pd
import feedparser
import urllib.parse
from datetime import datetime
from bs4 import BeautifulSoup
import emoji
# Настройка кодировки для корректного вывода русского текста
import sys
sys.stdout.reconfigure(encoding='utf-8')
# 📂 Глобальная переменная для пути к файлу Excel
EXCEL_FILE = "bonds.xlsx"
def load_excel_data():
"""📂 Загружает данные из Excel и возвращает DataFrame."""
print("📂 Загружаем данные из Excel...")
df = pd.read_excel(EXCEL_FILE, sheet_name="Исходные данные")
print(f"✅ Найдено {len(df)} записей\n")
return df
def fetch_company_names(df):
"""🔄 Получает названия компаний по тикерам облигаций."""
company_names = []
for ticker in df.iloc[:, 0]:
url = f"https://iss.moex.com/iss/securities.json?q={ticker}&iss.meta=off"
print(f"🔍 Обрабатываем тикер: {ticker}")
try:
response = requests.get(url)
response.raise_for_status()
data = response.json()
if not data["securities"]["data"]:
print(f"⚠️ Данные не найдены для {ticker}\n")
continue
emitent_title = data["securities"]["data"][0][8]
match = re.search(r'"([^"]+)"', emitent_title)
company_name = match.group(1) if match else emitent_title
company_names.append(company_name)
print(f"✅ {emitent_title} → {company_name}\n")
except (requests.RequestException, IndexError, KeyError) as e:
print(f"❌ Ошибка при обработке {ticker}: {e}\n")
time.sleep(0.5)
# 🔄 Удаляем дубликаты, сохраняя порядок
company_names = list(dict.fromkeys(company_names))
return company_names
def create_folder():
"""📂 Создаёт папку для сохранения новостей."""
current_date = datetime.now().strftime('%Y-%m-%d')
folder_path = f"news_{current_date}"
if not os.path.exists(folder_path):
os.makedirs(folder_path)
return folder_path
def search_news(company):
"""🔍 Выполняет поиск новостей по компании."""
print(emoji.emojize(f"🔍 Поиск новостей: {company}"))
query = urllib.parse.quote(company)
url = f"https://news.google.com/rss/search?q={query}+when:1y&hl=ru&gl=RU&ceid=RU:ru"
print(f"📌 Сформирован URL запроса: {url}")
feed = feedparser.parse(url)
news_items = [
{
"source": entry.source.title if 'source' in entry else "Google News",
"title": entry.title,
"date": datetime.strptime(entry.published, "%a, %d %b %Y %H:%M:%S %Z").strftime("%Y-%m-%d %H:%M"),
"url": entry.link
}
for entry in feed.entries
]
time.sleep(3)
print(f"✅ Найдено {len(news_items)} новостей")
return news_items
def write_news_to_file(folder_path, company, news):
"""✍️ Записывает новости в файл."""
filename = os.path.join(folder_path, f"{company.replace(' ', '_')}.txt")
with open(filename, 'w', encoding='utf-8') as f:
f.write(f"📰 Новости для компании {company}\n")
f.write("=" * 50 + "\n\n")
for item in sorted(news, key=lambda x: x['date'], reverse=True):
f.write(f"📅 Дата: {item['date']}\n")
f.write(f"📰 Источник: {item['source']}\n")
f.write(f"📌 Заголовок: {item['title']}\n")
f.write(f"🔗 URL: {item['url']}\n")
f.write("-" * 30 + "\n\n")
def main():
"""🚀 Основная логика выполнения программы."""
df = load_excel_data()
company_names = fetch_company_names(df)
folder_path = create_folder()
for company in company_names:
news = search_news(company)
write_news_to_file(folder_path, company, news)
print(emoji.emojize(f"✍️ Сохранено новостей: {len(news)} для {company}\n"))
# В конце скрипта
input("Нажмите любую клавишу для выхода...")
if __name__ == "__main__":
main()
Как Вам воспользоваться этим скриптом?
Чтобы использовать скрипт, скачайте его с GitHub, нажав кнопку < > Code / Download ZIP.
Файл 3_bonds_news_search.py содержит весь код. Его можно открыть в блокноте перед запуском. Несмотря на номер «3» в названии, это самостоятельный скрипт.
Статья про скрипт под номером «2»:
Установка Python и библиотек
Установите Python с официального сайта.
Откройте Командную строку или Терминал и введите:
pip install pandas requests openpyxl feedparser beautifulsoup4 emoji
pandas — обработка таблиц Excel
requests — работа с API и сайтами
openpyxl — чтение и запись Excel-файлов
feedparser — работа с RSS-каналами
beautifulsoup4 — парсинг HTML
emoji — поддержка эмодзи в тексте
Подготовка данных
Заполните bonds.xlsx своими облигациями (название вкладок менять нельзя).
Убедитесь, что файл закрыт перед запуском.
Запуск скрипта
Найдите 3_bonds_news_search.py в проводнике и запустите двойным кликом. Работа с сайтом news.google.com может требовать VPN для работы из России - если нет соединения файлы создадутся пустые!
Скрипт создаст папку с текущей датой и сохранит туда файлы с новостями по эмитентам.
Теперь вы всегда будете в курсе событий!
Итог
Автоматический мониторинг новостей по эмитентам — это простой и эффективный способ минимизировать риски при вложениях в облигации. Готовые сервисы слишком дорогие, а ручной поиск - слишком трудозатратен. Скрипт же позволяет оперативно узнавать обо всех значимых событиях и вовремя принимать решения.
Автор: Михаил Шардин
🔗 Моя онлайн-визитка
📢 Telegram «Умный Дом Инвестора»
27 февраля 2025 г.