Знакът на КАГАМИ КАГАМИ
kagami.bg/academy · lesson · machine-readable viewUPDATED 2026-10-03
IDENTITY
module
GX10-04-36 · Portfolio optimization with cuOpt and cuML (Mean-CVaR)
series
GX10 (local AI server class: NVIDIA GB10, e.g. ASUS Ascent GX10 / DGX Spark)
level
Intermediate
duration
30–45 min (NVIDIA playbook: about 20 min first run, about 7 min for the full notebook pipeline)
prerequisites
GB10-class machine with DGX OS and working NVIDIA/CUDA drivers, Docker, Git, at least 40 GB free unified memory and 30 GB disk, basic Python and Jupyter skills
trust_label
UPDATED 2026-10-03 (checked against NVIDIA's Portfolio Optimization playbook, last updated 2026-01-21, and the NVIDIA AI Blueprints repository) · NOT RUN: no command from this lesson was executed on a GB10 machine
disclaimer
NOT FINANCIAL ADVICE. Educational lesson about solving an optimisation problem; not an investment recommendation. Models rely on past data and assumptions; investing carries a risk of loss. Consult a licensed adviser before real decisions.
versions
playbook container: RAPIDS 25.10 Notebooks · blueprint repository (Apache 2.0): cuda13 extra tracks cuOpt/cuML 26.04, cuda12 extra uses 26.06; recommended hardware for best performance is H100-class or newer, 32+ cores, 64+ GB RAM
language
human view: bg · english edition: /en/academy/gx10/ (same file name)
previous / next
04-35_CUDA_X_Data_Science.html / 04-37_Single_Cell_RNA.html
PURPOSE

Run NVIDIA's end-to-end GPU portfolio optimisation playbook on a GB10-class machine: scenario generation with cuML kernel density estimation, Mean-CVaR optimisation with cuOpt LP/MILP solvers, real-world constraints and backtesting. Educational only, not financial advice.

KEY CONCEPTS
COMMANDS / PATHS
CHECKLIST
NEXT MODULE

04-37 · Single-Cell RNA (04-37_Single_Cell_RNA.html) · related: 04-35 CUDA-X Data Science · series index: kagami.bg/academy/gx10/ · offer: Quick experiment (kagami.bg/stalbata/)

SOURCES
TAGS
gx10nvidia-gb10cuoptcumlportfolio-optimizationcvardockerjupyterlabnot-financial-advice
ОБНОВЕНО · 03.10.2026

Оптимизация на портфейл с cuOpt и cuML върху GX10

Научаваш как се решава портфейлна оптимизация по модела Mean-CVaR върху видеокартата: cuML генерира сценарии, cuOpt намира теглата, а готовата тетрадка на NVIDIA показва целия конвейер — на локален AI сървър от класа NVIDIA GB10. Урокът е учебен, не е финансов съвет.

⏱ 30–45 мин Средно GX10 NVIDIA GB10 · cuOpt · cuML Mean-CVaR · Docker · JupyterLab
Docker · контейнер RAPIDS 25.10🔒 локално cuOpt · cuML · JupyterLab🔒 локално
🔄
ОБНОВЕНО · 03.10.2026 — какво
Урокът е преработен изцяло по плейбука на NVIDIA „Portfolio Optimization“ (последна промяна 21.01.2026) и хранилището NVIDIA AI Blueprints. Предишният вариант описваше друг подход (библиотеката PyPortfolioOpt, модел на Блек–Литерман, оценка с езиков модел и агент с обучение с подкрепление) — тези части махнахме: не са в плейбука на NVIDIA, примерният код не беше сверен, а част от него смесваше доходности с цени. Махнахме и вътрешния контекст (конкретни портфейли, срокове и суми в стари левове). Добавихме: модела Mean-CVaR с cuOpt и cuML, обяснение на VaR и CVaR с малък наш пример, ограниченията от реалния свят, точните стъпки на плейбука (ядрото, изтриването при изход), и честна бележка за мащаба и хардуера. Урокът е само учебен — виж кутията „Не е финансов съвет“.
⚠️
Какво не сме пускали сами
Не сме пускали нито една команда от урока — нямахме машина от класа GB10, затова няма етикет „ТЕСТВАНО“ и „ПРОВЕРЕНО“. Командите са сверени с официалните страници на NVIDIA към 03.10.2026. Не сме проверявали колко време и памет отнема на твоята машина, нито резултатите на тетрадката. Заявените от NVIDIA ускорения („до 160ד и „до 100ד) са за по-мощен хардуер и не са мерени от нас на GB10. Малкият пример за CVaR е наш и също не е пускан.
⚖️
Не е финансов съвет
Този урок е само учебен: показва как се решава математическа задача за оптимизация. Той не е финансов съвет, инвестиционна препоръка или покана за търгуване и не взема предвид твоето положение. Моделите се градят върху минали данни и допускания, които може да не се сбъднат; всяко инвестиране носи риск от загуба. Преди реални решения се консултирай с лицензиран консултант.

01Какво ще научиш

02Преди да започнеш

КаквоСтойност (по плейбука на NVIDIA „Portfolio Optimization“)
Модел на рискаMean-CVaR (условна стойност на риска, Conditional Value-at-Risk)
ИнструментиNVIDIA cuOpt (решаващи програми за линейно и цялочислено програмиране) и NVIDIA cuML (оценка на плътността с ядро, KDE)
КонтейнерRAPIDS 25.10 Notebooks, стартира се от скрипта на плейбука
Времеоколо 20 мин за първото пускане; пълният конвейер в тетрадката — около 7 мин
Последна промяна на плейбука21.01.2026
💡
Две думи за риска
VaR казва: „в 95 от 100 сценария загубата не надвишава X“. CVaR отива по-нататък: „ако попаднем в лошите 5 сценария, каква е средната загуба?“ По-голямо внимание към „опашката“ — редките, но тежки събития — е причината CVaR да се ползва при оценка на риска.

03Стъпки

  1. Как се подрежда задачата

    Идеята на плейбука е конвейер от три части. Защо видеокарта? При CVaR задачата става линейна програма, чийто размер расте с броя на сценариите. При хиляди сценарии и стотици активи процесорите бавно я решават — тук идва ускорението.

    ЧастКакво правиИнструмент
    1. СценарииОценява как се разпределят доходностите и генерира много възможни бъдещи „дни“cuML · KDE на GPU
    2. ОптимизацияНамира теглата, които минимизират CVaR при зададена доходност и ограниченияcuOpt · LP/MILP
    3. Тест и прегледПуска стратегията върху минали данни, сравнява подходите за презареждане на портфейлаCUDA-X Data Science
  2. Какво е CVaR на практика

    Малък пример с измислени числа, който показва двете мерки. Той е наш за илюстрация (не е от плейбука на NVIDIA) и не сме го пускали.

    python
    import 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) и по-тежка.
  3. Провери машината

    Първо провери, че имаш видеокарта, Git и Docker.

    bash · на машината
    nvidia-smi
    git --version
    docker --version

    Очакваш таблица на видеокартата и версии на Git и Docker. Ако Docker липсва или дава грешка за права, плейбукът препраща към инструкциите на Docker за инсталиране и добавяне на потребителя в групата docker.

  4. Стартирай плейбука

    Скриптът сам изтегля контейнера на 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 <потребител>@<адрес-на-машината>
  5. Пусни тетрадката cvar_basic

    В JupyterLab ще видиш cvar_basic.ipynb и папките cudf, cuml, cugraph с допълнителни примери. Отвори тетрадката с двоен клик.

    ⚠️
    Смени ядрото преди да пускаш
    Преди първата клетка смени ядрото (kernel) на „Portfolio Optimization“ — както е указано в самата тетрадка. Ако не го направиш, втората клетка с код дава грешки. Ако вече си почнал: избери правилното ядро, рестартирай го и започни отново.

    Клетките се пускат една по една със Shift + Enter или всички наведнъж с Run → Run All. По плейбука целият конвейер отнема около 7 минути.

    Папката playbook е само за четене в контейнера без права на администратор. Когато работиш в нея, ползвай копие за собствените си промени.

  6. Запази работата си преди да излезеш

    Контейнерът няма право да пише обратно на машината. Файловете, които искаш да пазиш, се свалят от JupyterLab (десен клик → Download).

    ⚠️
    Излизането изтрива всичко несвалено
    За да спреш плейбука, в терминала натисни Ctrl + C, после потвърди с y и Enter (или Ctrl + C пак). По думите на NVIDIA така се изтрива всичко, което не е свалено от контейнера.
  7. Какво е следващото: ефективна граница и презареждане

    След основната тетрадка NVIDIA препраща към хранилището NVIDIA AI Blueprints: portfolio-optimization (лиценз Apache 2.0) с две допълнителни тетрадки:

    • efficient_frontier.ipynb — решава много задачи и чертае ефективната граница между риск и доходност.
    • rebalancing_strategies.ipynb — тест върху минали данни на различни стратегии за презареждане (по график, по праг) и ефекта на таксите за сделки.

    Честно за мащаба: хранилището препоръчва за най-добра производителност по-мощен хардуер — видеокарта от класа H100 и по-нова, 32+ процесорни ядра и 64+ GB оперативна памет. NVIDIA заявява ускорение „до 160ד при оптимизацията и „до 100ד при генерирането на сценарии спрямо процесорни решаващи програми — това е за големи задачи на този хардуер. Върху GB10 не сме мерили, затова не обещаваме тези числа.

04Проверка

Тест

1. Какво измерва CVaR?

2. Защо според плейбука видеокартата е ключова при Mean-CVaR?

3. Какво трябва да направиш преди да пуснеш клетките на cvar_basic.ipynb?

4. Какво става с файловете, които не си свалил, когато спреш контейнера с Ctrl + C?

05Какво следва

06Източници

  1. NVIDIA: плейбук „Portfolio Optimization“ · инструкции · отстраняване на неизправности — изисквания, команди, ядро, изтриване при изход (последна промяна 21.01.2026).
  2. NVIDIA AI Blueprints: portfolio-optimization — тетрадки, препоръчван хардуер, заявени ускорения, лиценз Apache 2.0.
  3. NVIDIA cuOpt · документация — решаващи програми за LP/MILP.
  4. RAPIDS cuML — оценка на плътността и сценарии на GPU.
  5. Rockafellar, R. T., Uryasev, S. (2000). „Optimization of conditional value-at-risk“. Journal of Risk, 2, 21–42 — основата на CVaR оптимизацията.
  6. Markowitz, H. (1952). „Portfolio Selection“. The Journal of Finance, 7(1), 77–91 — класическият модел „средна стойност – дисперсия“.