Веб-приложение для просмотра портфеля, прогнозов и риск-сценариев по инструментам Московской биржи. Проект использует Java 17, Spring Boot, Gradle и Apache Ignite как хранилище рыночных данных, портфелей, истории и расчетных снимков.
Подробное описание актуальной архитектуры вынесено в docs/architecture/architecture.md. В этом README оставлены сценарии использования и настройка решения под свой портфель.
MODEL для демо и fallback-сценариев.Требования:
MOEX_ISS.Запуск:
.\gradlew.bat :backend-api:bootRun
После старта откройте:
Основные страницы:
/ - легкий обзор портфеля без прогнозных и риск-расчетов;/forecasts - прогнозы, базовые методы и денежные потоки;/risk - риск-анализ портфеля;/system - техническое состояние системы.Портфели лежат в:
config-loader/src/main/resources/config/portfolios/
Создайте новый файл, например:
config-loader/src/main/resources/config/portfolios/my-portfolio.tsv
Формат простой: количество и тикер через табуляцию.
10 SBER
5 LKOH
20 SU26248RMFS3
100 USD
Имя файла без .tsv становится portfolioId. В примере это my-portfolio; он появится в выпадающем списке портфелей.
Поддерживается и расширенный формат с явным portfolioId в первой колонке:
my-portfolio 10 SBER
my-portfolio 5 LKOH
Количество может быть дробным. Для десятичных дробей можно использовать запятую, как в русской локали:
1,35 CNY
После изменения файла приложение перечитает конфиг автоматически. Если нужно гарантированно начать с чистого состояния, перезапустите backend.
Прогнозы читаются из:
config-loader/src/main/resources/config/shares.tsv
Базовый пример для тикера:
SBER forecast 340 360 390
forecast.weight 0.3 0.4 0.3
forecast.comment Conservative Base Upside
dividend.forecast 28 32 36
dividend.forecast.weight 0.3 0.4 0.3
dividend.forecast.comment Low case Base case High case
Что это значит:
forecast - прогнозные цены;forecast.weight - веса прогнозных цен;forecast.comment - подписи сценариев;dividend.forecast - ожидаемый годовой поток на одну бумагу;dividend.forecast.weight - веса прогнозов потока;dividend.forecast.comment - подписи сценариев потока.Система использует эти данные для:
Файл:
config-loader/src/main/resources/config/volatility.conf
В секции [volatility] задается базовая годовая волатильность по классам активов:
STOCK 0.38
BOND 0.14
FX 0.20
FUND 0.28
В секции [covariance] задается матрица корреляций между классами активов.
В секции [simulation-reference-weights] задаются веса базовых источников цены для смешанного прогноза:
current_price 1
moving_average_120 1
analyst_forecast 1
Если для инструмента накоплена достаточная история, система также может использовать реализованную волатильность по самому инструменту. Слишком экстремальные значения помечаются как исключенные и заменяются классовым fallback.
На главной и странице риска есть выбор источника рынка.
MOEX_ISS - реальные данные MOEX ISS;MODEL - модельный snapshot из файла.Модельный snapshot лежит здесь:
config-loader/src/main/resources/config/market-snapshots/model-market-snapshot.tsv
Его удобно использовать, когда нужен воспроизводимый демо-прогон без зависимости от внешнего API.
Главная страница:
Прогнозы:
Риски:
Карточка актива:
Технический раздел:
GET /portfolio/holdings?portfolioId=... - легкий состав портфеля без прогнозов и риска.GET /portfolio/analytics?portfolioId=... - прогнозная таблица портфеля.GET /portfolio/volatility?portfolioId=... - волатильность по позициям.GET /risk/{portfolioId} - последний риск-снимок.POST /risk/{portfolioId}?mode=... - принудительный пересчет риска.GET /market/current - текущий нормализованный рынок.POST /market/source/{source} - переключение источника данных.GET /api/assets/{ticker} - карточка инструмента.GET /api/stats - техническая статистика.GET /api/performance/requests - статистика HTTP-запросов.BLENDED_REFERENCES - смешивает текущую цену, аналитику и 120-дневную среднюю.MEAN_REVERSION_120 - тянет цену к 120-дневной средней.INDEPENDENT - независимые шоки по позициям.ASSET_CLASS_CORRELATED - шоки с корреляциями по классам активов.ANALYST_TARGET_ONLY - старт сценариев от аналитической цены.CVaR / Expected Shortfall пока не выделен отдельной метрикой.