portfolio-optimization
Этот навык предназначен для построения и анализа количественных портфелей с использованием пакета portfolio_optimization и ускоренных NVIDIA методов Mean-CVaR и Mean-Variance. Он подходит, когда нужно распределить веса между тикерами с контролем downside-риска, решить задачу Markowitz с ограничением дисперсии или волатильности, исследовать efficient frontier, получить таблицу весов при разных уровнях risk aversion, сравнить портфель с бенчмарками или выполнить плановое ребалансирование. В исходной инструкции отдельно названы сценарии для S&P 500, S&P 100, Dow 30 и пользовательского набора цен. Для общих финансовых сводок, прогноза цен, обучения нейросетей, маршрутизации транспорта и задач, не относящихся к портфелю, этот навык не предназначен. Рабочий процесс начинается с проверки входных данных. По умолчанию используется исторический файл data/stock_data/sp500.csv; если его нет, источник предлагает загрузить публичные данные через download_data, но первый сетевой fetch должен быть осознанным шагом. Пользовательский CSV должен иметь индекс или первый столбец с датами, числовые колонки цен тикеров, как минимум 60 строк после фильтрации и хотя бы один запрошенный тикер. Диапазон дат применяется до расчёта доходностей, отсутствующие тикеры нужно явно сообщить, а regime_dict принимает имя и диапазон режима, но не список тикеров. До оптимизации рассчитываются LOG-доходности через utils.calculate_returns. Для Mean-CVaR инструкция использует генерацию сценариев KDE на GPU с KDESettings(device=GPU), параметры CvarParameters с явными границами весов, нулевым диапазоном cash для полностью инвестированного результата, risk_aversion и confidence, а затем cvar_optimizer.CVaR. Для Mean-Variance, Markowitz, SOCP или QCQP сценарии CVaR не нужны: используется covariance из returns_dict и MeanVarianceParameters с положительным var_limit, long-only ограничениями и api=cuopt_python. Ограничение волатильности передаётся как квадрат волатильности. Solver должен быть именно cuOpt: для CVaR проверяется наличие cp.CUOPT, для SOCP — импорт cuopt; CPU-солверы не являются допустимой заменой. Cardinality вместе с SOCP считается неподдержанным, пока пакет явно не предоставит mixed-integer conic support. Пакет предоставляет отдельные API для CVaR и Mean-Variance, построения frontier, backtest и rebalance. Efficient frontier возвращает таблицу метрик, словари weights и cash; для неё в источнике приведён пример с 25 точками. Для backtest создаются оптимизированный и equal-weight портфели, после чего сравниваются mean return, Sharpe, Sortino и max drawdown. Ребалансировщик принимает путь к CSV, а не DataFrame, и возвращает результаты, даты re-optimize и накопленную стоимость. Ускорение требует NVIDIA GPU, cuOpt и, для KDE CVaR, cuML; SOCP требует сборку cuOpt с QCQP/SOCP, например линии 26.06 или новее. Исторический snapshot цен может не содержать текущие constituents, загрузка зависит от сети, а infeasible-задачи требуют проверки границ, числа тикеров и длины периода. Навык описывает воспроизводимый запуск solver-а и отчёт о фактических ограничениях, но не подменяет проверку данных и не гарантирует инвестиционный результат.
Для чего подходит
- Оптимизация портфеля по Mean-CVaR
- Построение efficient frontier
- Backtesting и планирование ребалансировки
Установка
Сначала прочитайте SKILL.md и scripts в исходном репозитории. Затем выполните команду в каталоге проекта:
npx skills add https://github.com/NVIDIA/skills/tree/main/skills/portfolio-optimization