commit 74d4e14476fc99aac72513c1a118d4080664305e Author: belikovme Date: Thu Dec 19 13:13:15 2024 +0700 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f7275bb --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +venv/ diff --git a/classes/exchange.py b/classes/exchange.py new file mode 100644 index 0000000..223401e --- /dev/null +++ b/classes/exchange.py @@ -0,0 +1,136 @@ +import yfinance as yf +from datetime import datetime, timedelta +import logging + +class ForexDataHandler: + def __init__(self): + """ + Инициализация обработчика валютных данных + """ + self.logger = logging.getLogger(__name__) + # logging.basicConfig(level=logging.INFO) + self.logger = logging.getLogger(__name__) + # logging.basicConfig(level=logging.INFO) + + # Словари с тикерами + self.russian_indices = { + 'IMOEX': 'IMOEX.ME', # Индекс МосБиржи + 'RTSI': 'RTSI.ME', # Индекс РТС + 'MOEXBC': 'MOEXBC.ME' # Индекс голубых фишек + } + self.russian_sectors = { + 'oil_gas': 'MOEXOG.ME', # Нефть и газ + 'finance': 'MOEXFN.ME', # Финансы + 'telecom': 'MOEXTL.ME', # Телекоммуникации + 'metals': 'MOEXMM.ME', # Металлы и добыча + 'consumer': 'MOEXCN.ME', # Потребительский сектор + 'transport': 'MOEXTN.ME' # Транспорт + } + self.russian_stocks = { + 'Gazprom': 'GAZP.ME', + 'Sberbank': 'SBER.ME', + 'Lukoil': 'LKOH.ME', + 'Rosneft': 'ROSN.ME', + 'VTB': 'VTBR.ME' + } + + def get_forex_rate(self, from_currency: str, to_currency: str) -> dict: + """ + Получает текущий курс валют с Yahoo Finance + + Args: + from_currency: исходная валюта (например, 'USD') + to_currency: целевая валюта (например, 'RUB') + + Returns: + dict: Словарь с данными о курсе валют + """ + try: + # Формируем тикер для валютной пары + ticker = f"{from_currency}{to_currency}=X" + self.logger.info(f"Получение данных для пары {ticker}") + + currency_pair = yf.Ticker(ticker) + + # Получаем данные за последний день + end_date = datetime.now() + start_date = end_date - timedelta(days=1) + hist = currency_pair.history(start=start_date, end=end_date) + + if hist.empty: + raise ValueError(f"Данные не получены для пары {ticker}") + + latest_data = hist.iloc[-1] + + return { + 'close': float(latest_data['Close']), + 'timestamp': latest_data.name.strftime('%Y-%m-%d %H:%M:%S'), + 'open': float(latest_data['Open']), + 'high': float(latest_data['High']), + 'low': float(latest_data['Low']), + 'volume': float(latest_data['Volume']) if 'Volume' in latest_data else None + } + + except Exception as e: + self.logger.error(f"Ошибка при получении данных для пары {from_currency}/{to_currency}: {e}") + raise + + def get_market_data(self, ticker: str, period: str = "1d") -> dict: + """ + Получает данные по указанному тикеру + + Args: + ticker: тикер инструмента + period: период данных ("1d", "5d", "1mo", "3mo", "6mo", "1y", "2y", "5y", "10y", "ytd", "max") + """ + try: + stock = yf.Ticker(ticker) + info = stock.info + hist = stock.history(period=period) + + if hist.empty: + raise ValueError(f"Данные не получены для {ticker}") + + latest_data = hist.iloc[-1] + + return { + 'close': float(latest_data['Close']), + 'open': float(latest_data['Open']), + 'high': float(latest_data['High']), + 'low': float(latest_data['Low']), + 'volume': float(latest_data['Volume']) if 'Volume' in latest_data else None, + 'timestamp': latest_data.name.strftime('%Y-%m-%d %H:%M:%S'), + 'name': info.get('longName', None), + 'sector': info.get('sector', None), + 'market_cap': info.get('marketCap', None), + 'pe_ratio': info.get('trailingPE', None), + 'dividend_yield': info.get('dividendYield', None), + 'currency': info.get('currency', None) + } + except Exception as e: + self.logger.error(f"Ошибка при получении данных для {ticker}: {e}") + raise + + def get_sector_performance(self, sector: str) -> dict: + """ + Получает данные по определенному сектору + + Args: + sector: ключ сектора из словаря russian_sectors + """ + if sector not in self.russian_sectors: + raise ValueError(f"Неизвестный сектор: {sector}") + + return self.get_market_data(self.russian_sectors[sector]) + + def get_index_data(self, index: str) -> dict: + """ + Получает данные по индексу + + Args: + index: ключ индекса из словаря russian_indices + """ + if index not in self.russian_indices: + raise ValueError(f"Неизвестный индекс: {index}") + + return self.get_market_data(self.russian_indices[index]) diff --git a/get/currency.py b/get/currency.py new file mode 100644 index 0000000..bcce1db --- /dev/null +++ b/get/currency.py @@ -0,0 +1,54 @@ +import sqlite3 +from exchange import ForexDataHandler + +# Создаем или подключаемся к базе данных +conn = sqlite3.connect('currency_rates.db') +cursor = conn.cursor() + +# Создаем таблицу, если она не существует +cursor.execute(''' +CREATE TABLE IF NOT EXISTS currency_rates ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + base_currency TEXT NOT NULL, + quote_currency TEXT NOT NULL, + rate REAL NOT NULL, + timestamp TEXT NOT NULL +) +''') + +forex_handler = ForexDataHandler() +currency_pairs = [ + ('CNY', 'RUB'), # Китайский юань + ('USD', 'RUB'), # Доллар США + ('EUR', 'RUB'), # Евро + ('GBP', 'RUB'), # Фунт стерлингов + ('JPY', 'RUB'), # Японская йена + ('KZT', 'RUB'), # Казахстанский тенге + ('UAH', 'RUB'), # Украинская гривна + ('BYN', 'RUB'), # Белорусский рубль +] + +try: + print("\nТекущие курсы валют:") + for base_currency, quote_currency in currency_pairs: + try: + rate = forex_handler.get_forex_rate(base_currency, quote_currency) + print(f"\nКурс {base_currency}/{quote_currency}:") + print(f"Текущий: {rate['close']:.4f}") + print(f"Дата: {rate['timestamp']}") + + # Вставляем данные в базу данных + cursor.execute(''' + INSERT INTO currency_rates (base_currency, quote_currency, rate, timestamp) + VALUES (?, ?, ?, ?) + ''', (base_currency, quote_currency, rate['close'], rate['timestamp'])) + + except Exception as pair_error: + print(f"Ошибка при получении курса {base_currency}/{quote_currency}: {pair_error}") + +except Exception as e: + print(f"Произошла ошибка: {e}") + +# Сохраняем изменения и закрываем соединение +conn.commit() +conn.close() \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..60cbf61 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,18 @@ +pandas +plotly +requests +apimoex +aiohttp +requests +httpx +pybit +aiohttp +altair +pymc +scikit-learn +numpy +seaborn +statsmodels +xgboost +lightgbm +groq \ No newline at end of file