globalsy_mvp/classes/moex_class.py
belikovme 61b6f03e26 Обновление зависимостей и игнорируемых файлов
- Добавлен yfinance в requirements.txt
- Расширен .gitignore для исключения служебных файлов Python
- Исправлен импорт в currency.py для корректной работы с модулями
2025-03-12 14:49:12 +07:00

71 lines
2.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)