Оптимизация на портфейл с cuOpt и cuML върху GX10
Научаваш как се решава портфейлна оптимизация по модела Mean-CVaR върху видеокартата: cuML генерира сценарии, cuOpt намира теглата, а готовата тетрадка на NVIDIA показва целия конвейер — на локален AI сървър от класа NVIDIA GB10. Урокът е учебен, не е финансов съвет.
01Какво ще научиш
- Каква е разликата между класическия модел „средна стойност – дисперсия“ и модела Mean-CVaR, който гледа най-лошите сценарии.
- Как cuML генерира сценарии с оценка на плътността (KDE) на видеокартата и как cuOpt решава оптимизацията.
- Какви ограничения влизат в реалния портфейл: концентрация, ливъридж, оборот, брой позиции.
- Как да пуснеш готовата тетрадка на NVIDIA на машина от класа GB10 и как да четеш резултатите.
- Какво е тест на миналите данни (backtest) и защо добър резултат върху минали данни не гарантира нищо за бъдещето.
02Преди да започнеш
- Машина от класа NVIDIA GB10 (например ASUS Ascent GX10 или DGX Spark) с NVIDIA DGX OS и работещи драйвери за NVIDIA и CUDA.
- Docker и Git. Умения с терминал, Docker, Jupyter и Python.
- Поне 40 GB свободна обща памет за контейнера и 30 GB място на диска (по плейбука на NVIDIA).
- Основно разбиране за борсата и акциите, за данни и машинно обучение. По желание: опит в количествени финанси.
- Добре е да си минал урока за CUDA-X Data Science, но не е задължително.
| Какво | Стойност (по плейбука на NVIDIA „Portfolio Optimization“) |
|---|---|
| Модел на риска | Mean-CVaR (условна стойност на риска, Conditional Value-at-Risk) |
| Инструменти | NVIDIA cuOpt (решаващи програми за линейно и цялочислено програмиране) и NVIDIA cuML (оценка на плътността с ядро, KDE) |
| Контейнер | RAPIDS 25.10 Notebooks, стартира се от скрипта на плейбука |
| Време | около 20 мин за първото пускане; пълният конвейер в тетрадката — около 7 мин |
| Последна промяна на плейбука | 21.01.2026 |
03Стъпки
-
Как се подрежда задачата
Идеята на плейбука е конвейер от три части. Защо видеокарта? При CVaR задачата става линейна програма, чийто размер расте с броя на сценариите. При хиляди сценарии и стотици активи процесорите бавно я решават — тук идва ускорението.
Част Какво прави Инструмент 1. Сценарии Оценява как се разпределят доходностите и генерира много възможни бъдещи „дни“ cuML · KDE на GPU 2. Оптимизация Намира теглата, които минимизират CVaR при зададена доходност и ограничения cuOpt · LP/MILP 3. Тест и преглед Пуска стратегията върху минали данни, сравнява подходите за презареждане на портфейла CUDA-X Data Science -
Какво е CVaR на практика
Малък пример с измислени числа, който показва двете мерки. Той е наш за илюстрация (не е от плейбука на NVIDIA) и не сме го пускали.
pythonimport numpy as np rng = np.random.default_rng(0) returns = rng.normal(0.0005, 0.01, size=10_000) # измислени дневни доходности loss = -returns # загуба = минус доходност alpha = 0.95 var = np.quantile(loss, alpha) # VaR: загуба, надвишавана в 5% от сценариите cvar = loss[loss >= var].mean() # CVaR: средна загуба в тези най-лоши 5% print(f'VaR {var:.4f} CVaR {cvar:.4f}')Четеш го така: ако
VaRе праг, който загубата надвишава само в 5% от сценариите, тоCVaRе средната стойност на тези най-лоши 5%. Тя винаги е не по-малка от VaR. Оптимизаторът търси тегла, при които тази „опашка“ е възможно най-малка.✅Ограничения от реалния святПлейбукът показва и четири вида ограничения: концентрация (най-много X% в един актив), ливъридж, оборот (колко се сменя на всяка стъпка) и брой позиции (cardinality). Последното прави задачата цялочислена (MILP) и по-тежка. -
Провери машината
Първо провери, че имаш видеокарта, Git и Docker.
bash · на машинатаnvidia-smi git --version docker --versionОчакваш таблица на видеокартата и версии на Git и Docker. Ако Docker липсва или дава грешка за права, плейбукът препраща към инструкциите на Docker за инсталиране и добавяне на потребителя в групата
docker. -
Стартирай плейбука
Скриптът сам изтегля контейнера на RAPIDS, строи средите и пуска JupyterLab. Първото пускане е най-дългото. Остави терминала отворен, докато работиш.
bash · на машинатаgit clone https://github.com/NVIDIA/dgx-spark-playbooks cd dgx-spark-playbooks/nvidia/portfolio-optimization/assets bash ./setup/start_playbook.shСкриптът
start_playbook.shпо плейбука на NVIDIA: (1) изтегля контейнера RAPIDS 25.10 Notebooks, (2) строи нужните среди чрезsetup_playbook.sh, (3) стартира JupyterLab.JupyterLab е на
http://127.0.0.1:8888, ако работиш на самата машина. Ако си на друг компютър, най-безопасно е да пренасочиш порта през SSH и да отворишhttp://127.0.0.1:8888при себе си (плейбукът показва и вариант с директен адрес в мрежата — не го препоръчваме, докато не си сигурен кой има достъп до нея):bash · на твоя компютърssh -L 8888:localhost:8888 <потребител>@<адрес-на-машината> -
Пусни тетрадката cvar_basic
В JupyterLab ще видиш
cvar_basic.ipynbи папкитеcudf,cuml,cugraphс допълнителни примери. Отвори тетрадката с двоен клик.⚠️Смени ядрото преди да пускашПреди първата клетка смени ядрото (kernel) на „Portfolio Optimization“ — както е указано в самата тетрадка. Ако не го направиш, втората клетка с код дава грешки. Ако вече си почнал: избери правилното ядро, рестартирай го и започни отново.Клетките се пускат една по една със
Shift + Enterили всички наведнъж с Run → Run All. По плейбука целият конвейер отнема около 7 минути.Папката
playbookе само за четене в контейнера без права на администратор. Когато работиш в нея, ползвай копие за собствените си промени. -
Запази работата си преди да излезеш
Контейнерът няма право да пише обратно на машината. Файловете, които искаш да пазиш, се свалят от JupyterLab (десен клик → Download).
⚠️Излизането изтрива всичко несваленоЗа да спреш плейбука, в терминала натисниCtrl + C, после потвърди сyиEnter(илиCtrl + Cпак). По думите на NVIDIA така се изтрива всичко, което не е свалено от контейнера. -
Какво е следващото: ефективна граница и презареждане
След основната тетрадка NVIDIA препраща към хранилището NVIDIA AI Blueprints: portfolio-optimization (лиценз Apache 2.0) с две допълнителни тетрадки:
efficient_frontier.ipynb— решава много задачи и чертае ефективната граница между риск и доходност.rebalancing_strategies.ipynb— тест върху минали данни на различни стратегии за презареждане (по график, по праг) и ефекта на таксите за сделки.
Честно за мащаба: хранилището препоръчва за най-добра производителност по-мощен хардуер — видеокарта от класа H100 и по-нова, 32+ процесорни ядра и 64+ GB оперативна памет. NVIDIA заявява ускорение „до 160ד при оптимизацията и „до 100ד при генерирането на сценарии спрямо процесорни решаващи програми — това е за големи задачи на този хардуер. Върху GB10 не сме мерили, затова не обещаваме тези числа.
04Проверка
nvidia-smi,git --versionиdocker --versionдават очакван изход.- JupyterLab се отваря (директно или през SSH тунела) и виждаш
cvar_basic.ipynb. - Ядрото е сменено на „Portfolio Optimization“ и тетрадката минава докрай.
- Можеш да обясниш с твои думи разликата между VaR и CVaR.
- Знаеш, че излизането от контейнера трие несвалените файлове, и си ги свалил предварително.
Тест
1. Какво измерва CVaR?
2. Защо според плейбука видеокартата е ключова при Mean-CVaR?
3. Какво трябва да направиш преди да пуснеш клетките на cvar_basic.ipynb?
4. Какво става с файловете, които не си свалил, когато спреш контейнера с Ctrl + C?
05Какво следва
06Източници
- NVIDIA: плейбук „Portfolio Optimization“ · инструкции · отстраняване на неизправности — изисквания, команди, ядро, изтриване при изход (последна промяна 21.01.2026).
- NVIDIA AI Blueprints: portfolio-optimization — тетрадки, препоръчван хардуер, заявени ускорения, лиценз Apache 2.0.
- NVIDIA cuOpt · документация — решаващи програми за LP/MILP.
- RAPIDS cuML — оценка на плътността и сценарии на GPU.
- Rockafellar, R. T., Uryasev, S. (2000). „Optimization of conditional value-at-risk“. Journal of Risk, 2, 21–42 — основата на CVaR оптимизацията.
- Markowitz, H. (1952). „Portfolio Selection“. The Journal of Finance, 7(1), 77–91 — класическият модел „средна стойност – дисперсия“.