Блог им. ArhipovVladimir
О чём это.
Все нормальные расчёты (опционы, VaR, греки) либо дёргают неуправляемый C++ код, либо жрут память и GC, либо просто медленные.
Я написал свою библиотеку — QuantCore.Net. Это in-process .NET 8 ядро для финансовых вычислений. Без REST, без Python-прослоек, без боли.
Под капотом: SIMD, ArrayPool, детерминированный RNG, батч-режимы. Всё, чтобы считать сотни тысяч инструментов за миллисекунды и не ловить StopTheWorld в 3 часа ночи.
Вы пишете своих роботов на C#.
— Хотите быстро считать справедливую цену опционов или греки в реальном времени.
— Надоело дёргать Excel или самопальные функции из интернета, которые плавают на 5%.
Вы управляете портфелем и считаете риск.
— Historical VaR / ES (CVaR) за 0.4 мс на 100 000 наблюдений.
— Ни одной аллокации памяти — GC молчит.
Вы делаете factor model PnL.
— SIMD-скалярка экспозиций и факторных доходностей.
— 100 000 позиций × 32 фактора = 2.8 мс.
Вы просто устали от QuantLib.
QuantLib — это великий монстр. Но подключать его в .NET проект — тот ещё квест.
QuantCore.Net — managed, ставится через dotnet add package.
Процессор: Intel i5-11400F, .NET 8, BenchmarkDotNet.
| Операция | Размер пачки | Время | Пропускная способность |
|---|---|---|---|
| Black–Scholes Price (батч) | 100 000 | 5.1 мс | 19.5 млн опционов/сек |
| Black–Scholes Greeks (батч) | 100 000 | 10.4 мс | 9.6 млн опционов/сек |
| Monte Carlo GBM (антитетик) | 10 000 траекторий | 0.26 мс | 38 млн траекторий/сек |
| Historical VaR 99% | 100 000 | 0.44 мс | zero alloc |
| Factor PnL SIMD (32 фактора) | 100 000 | 2.77 мс | AVX2/SSE |
📌 Zero allocations — после прогрева нет ни одного объекта в Gen 1/Gen 2. Никогда.
1. Ценообразование и греки
Black–Scholes–Merton (европейские, дивидендная доходность).
Одиночный вызов: ~40 наносекунд (чувствителен к JIT, но кому это важно, когда есть батч).
PriceBatch, GreeksBatch — аллокаций нет, выходной массив вы даёте сами.
2. Монте-Карло
Европейский GBM с антитетическими переменными.
Генератор XorShift128Plus — детерминированный, сидируете один раз — получаете повторяемые результаты.
Для бэктестов и отладки — идеально.
3. Риск-метрики
Historical Value-at-Risk.
Expected Shortfall (CVaR).
Два режима: мутирующий входной массив и non-mutating (через ArrayPool, копия не создаётся, если не надо).
4. Факторные модели
FactorModelPnlFast.ComputePnL() — SIMD dot product через SlidingRank.FastOps.
Экспозиции × доходности факторов. Никаких for-циклов.
5. Статистика one-pass
Среднее, дисперсия, skewness, kurtosis.
Хранить выборку не нужно — обновляется инкрементально.
QuantCore.Net — коммерческая библиотека.
Но я не пытаюсь окупить яхту.
🔹 Оценка / некоммерческое использование — бесплатно.
Никаких таймеров, ватермарок, урезанных функций. Просто работает.
🔹 Старт — $299/мес.
1 организация, до 2 продакшен-сервисов.
🔹 Профессиональный — $1499/мес.
До 10 разработчиков, до 10 сервисов.
🔹 Enterprise — $4999/мес.
Безлимит в рамках одной организации.
📌 Нужна перпетуальная лицензия или revenue-share? — пишите, договоримся.
Math.NET — отличная библиотека… для университетских лаб.
Греки? Батч-ценообразование? Нет.
QuantLib — стандарт де-факто. Но:
Это C++, вам нужен wrapper.
Wrapper ломается при смене версии.
Deployment в контейнере — боль.
Писать самому — можно.
Я тоже так делал 10 лет. Но потом ты проводишь 2 недели, отлаживая численную устойчивость при страйк = 0.001 * S.
QuantCore.Net закрывает 80% повседневных задач проп-шопа или хедж-фонда.
Он не умеет экзотику вроде барьеров или азиатских опционов.
Он умеет считать быстро, детерминированно и без GC то, что нужно каждый день.
dotnet add package QuantCore.Net
Одна функция — одна строка:
csharpusing QuantCore.Net.Pricing;
double[] prices = new double[100_000];
BlackScholes.PriceBatch(
OptionType.Call,
s: spotPrices,
k: strikes,
r: 0.03,
q: 0.01,
sigma: vols,
t: expiries,
outPrice: prices
);19.5 миллионов опционов в секунду.
Ни одной аллокации.
Ни одного extern-вызова.
Вы перестаёте экономить на спичках.
Раньше вы могли позволить себе посчитать Greeks только для десятка позиций — иначе лаг.
Теперь считайте все. Каждый тик. Без тормозов.
Вы можете гонять Monte Carlo прямо в онлайне.
10 000 траекторий за 0.26 мс — это не бэктест, это риал-тайм оценка.
Хотите переоценивать VaR каждые 5 секунд? Легко.
Вы пишете роботов на C# — и не чувствуете боли.
Никаких мостов в Python, никаких DLL из прошлого десятилетия.
Один стек, один язык, отлаживается F12.
Вы перестаёте бояться GC.
В 24/7 системах сборка мусора — это внезапный лаг.
QuantCore.Net не создаёт мусор. Вообще.
Вы получаете инженерную базу.
Это не чёрный ящик. Вы видите код, вы можете его форкнуть, вы можете его отлаживать.
Я не прячу реализацию за obfuscation. Это честный .NET.
NuGet: https://www.nuget.org/packages/QuantCore.Net/
GitHub / документация: github.com/likeslines-maker/QuantCore.Net
Вопросы / лицензии: vipvodu@yandex.ru
Telegram: @vipvodu
На следующий новый год загадаю деду морозу, чтобы на нашей бирже появилась хотя бы сотая доля от этих 19.5 млн опционов — уже был бы праздник.
Aleksandr Chernikov, сперва прочитал голосом Йоды:
Посмотрел, это и правда здорово, что вы не спрятали код и желающие могут посмотреть как писать на C# без GC. Но тут непонятно что лицензируется, если всё видно. Саппорт?
PS А мусор с вашей либой мы и сами создадим! )
Sprite, Видимость кода ≠ отсутствие лицензирования. Лицензируется не “секрет”, а право использования и условия:
право коммерческого применения (в продукте/сервисе, внутренние прод‑системы, перепродажа/встраивание и т.д.)
“QuantCore.Net не создаёт мусор. Вообще.”
Точнее формулировка такая: мы целимся в zero/min‑alloc на критических путях (batch‑операции, переборы,Span/ArrayPool и т.п.). Но абсолютное “вообще” зависит от того, как вы вызываете API и что делаете вокруг (логирование,LINQ, создание коллекций, форматирование строк и т.д.).
“PS: мусор с вашей либой мы и сами создадим :)”
Да,100%. И это нормальная мысль. Смысл библиотеки — чтобы ядро расчёта не приносило неожиданных аллокаций/пауз, а остальное — уже дисциплина использования.
Подскажите, пожалуйста, а где можно посмотреть исходный код, в приведённой ссылке на репозиторий не увидел реализации ядра, только примеры использования.
Спасибо.