- Добавлен yfinance в requirements.txt - Расширен .gitignore для исключения служебных файлов Python - Исправлен импорт в currency.py для корректной работы с модулями
71 lines
2.8 KiB
Python
71 lines
2.8 KiB
Python
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)
|