import pandas as pd import requests from datetime import datetime, timedelta class RussianMarketData: def __init__(self): self.moex_base_url = "https://iss.moex.com/iss" # Словарь с индексами self.indices = { 'oil_gas': 'MOEXOG', # Нефть и газ 'finance': 'MOEXFN', # Финансы 'telecom': 'MOEXTL', # Телекоммуникации 'metals': 'MOEXMM', # Металлы и добыча 'consumer': 'MOEXCN', # Потребительский сектор 'transport': 'MOEXTN' # Транспорт } def get_moex_index_history(self, index_code='MOEXOG', start_date=None, end_date=None): """ Получение исторических данных индекса MOEX. """ if start_date is None: start_date = (datetime.now() - timedelta(days=365)).strftime('%Y-%m-%d') if end_date is None: end_date = datetime.now().strftime('%Y-%m-%d') all_data = [] start = 0 while True: url = f"{self.moex_base_url}/history/engines/stock/markets/index/securities/{index_code}.json" params = { 'from': start_date, 'till': end_date, 'start': start } response = requests.get(url, params=params) data = response.json() # Проверка наличия данных if 'history' not in data or len(data['history']['data']) == 0: break # Добавление данных в общий список all_data.extend(data['history']['data']) start += 100 # Увеличиваем смещение на 100 для следующего запроса # Преобразование данных в DataFrame columns = data['history']['columns'] df = pd.DataFrame(all_data, columns=columns) # Обработка данных df['TRADEDATE'] = pd.to_datetime(df['TRADEDATE']) df = df.set_index('TRADEDATE') return df[['CLOSE', 'VOLUME']] def get_historical_data(self, sector: str, start_date=None, end_date=None): """ Получает исторические данные для указанного сектора. Args: sector: ключ сектора из словаря indices """ if sector not in self.indices: raise ValueError(f"Неизвестный сектор: {sector}") index_code = self.indices[sector] return self.get_moex_index_history(index_code, start_date, end_date)