Розробка AI-системи розрахунку оптимального розміру позиції

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
Розробка AI-системи розрахунку оптимального розміру позиції
Середній
~2-3 дні
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1284
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1196
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    901
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1119
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    853

Розробка AI-системи розрахунку оптимального розміру позиції

Розмір позиції визначає, скільки капіталу вкласти в кожну угоду. Це не менш важливо, ніж якість торговельних сигналів: навіть хороша стратегія розпадеться при надто агресивному sizing, та заробить менше потенціалу при надто консервативному. AI-система адаптує розмір позиції до поточних умов ринку та впевненості сигналу.

Класичні методи sizing

Fixed Fractional:

Position_Size = Account_Size × f

Найпростіший підхід. f = 1-2% ризику за угоду — стандарт для retail. Не адаптується до якості сигналу.

Kelly Criterion:

def kelly_fraction(win_rate, win_loss_ratio):
    """
    f* = W - (1-W)/R
    W: вірогідність виграшу, R: середній_виграш / середній_програш
    """
    return win_rate - (1 - win_rate) / win_loss_ratio

kelly_f = kelly_fraction(win_rate=0.55, win_loss_ratio=2.0)
# kelly_f = 0.55 - 0.45/2.0 = 0.325 (32.5% капіталу!)
# Це повний Келі — надто агресивно
half_kelly = kelly_f * 0.5  # Практика: 25-50% від Kelly

Проблема Kelly: потребує точних оцінок win rate та R. Помилка в оцінці → overbet → прискорене розорення.

ML для dynamic position sizing

Confidence-Adjusted Sizing: Розмір позиції пропорційний впевненості ML-сигналу:

def ml_position_size(model_proba, base_size, min_prob=0.55, max_prob=0.80):
    """
    При probability 0.55 → base_size × 0.5 (мінімум)
    При probability 0.80 → base_size × 2.0 (максимум)
    """
    if model_proba < min_prob:
        return 0  # не торгуємо
    scale = (model_proba - min_prob) / (max_prob - min_prob)
    return base_size * (0.5 + 1.5 * min(scale, 1.0))

Volatility-Adjusted Sizing: Нормалізація розміру позиції на волатильність інструменту:

def vol_normalized_size(target_risk_pct, price, volatility_daily, account_size):
    """
    Розмір позиції: такий, щоб 1σ денний рух = target_risk_pct капіталу
    """
    dollar_risk = account_size * target_risk_pct
    position_value = dollar_risk / volatility_daily
    n_shares = position_value / price
    return n_shares

ATR (Average True Range) як проксі волатильності: чим вище ATR, тим менший лот.

RL для adaptive sizing

RL-агент вчиться оптимальному sizing в залежності від контексту:

Стан агента:

  • Впевненість ML-сигналу (probability score)
  • Поточна волатильність (ATR/10-day realized vol)
  • Drawdown від піку (якщо вже в просадці — менше ризику)
  • Macro режим (expansion vs. contraction)
  • Portfolio кореляція: якщо позиція сильно корелює з вже відкритими — зменшити

Дії: дискретний простір [0%, 0.5%, 1%, 1.5%, 2%, 3%] ризику за угоду.

Награда:

Reward = PnL / max_drawdown_penalty

Агент вчиться не лише максимізувати return, але й обмежувати drawdown.

Risk Parity Sizing для портфеля

При одночасному управлінні кількома позиціями:

def risk_parity_position_sizes(signals, volatilities, correlations, target_portfolio_vol):
    """
    Розміри позицій такі, щоб кожна вносила рівний вклад в ризик портфеля
    """
    n = len(signals)
    w = np.ones(n) / n  # початкове рівне розподіл

    for _ in range(100):  # ітеративна оптимізація
        cov = np.diag(volatilities) @ correlations @ np.diag(volatilities)
        portfolio_vol = np.sqrt(w @ cov @ w)
        marginal_risk = cov @ w / portfolio_vol
        risk_contributions = w * marginal_risk

        # Скорегувати в сторону рівного вкладу
        w = w * (1 / risk_contributions)
        w = w / w.sum()  # нормувати

    # Масштабувати для цільової волатильності
    portfolio_vol = np.sqrt(w @ cov @ w) * np.sqrt(252)
    w = w * (target_portfolio_vol / portfolio_vol)
    return w

Drawdown-Adjusted Sizing (Anti-Martingale)

При зростанні портфеля — збільшувати ризик (compound growth). При просадці — знижувати:

def drawdown_adjusted_size(base_risk, current_equity, peak_equity, max_drawdown=0.20):
    """
    При drawdown > max_drawdown: повна зупинка торгівлі
    При drawdown 0-10%: лінійне зниження ризику
    """
    drawdown = (peak_equity - current_equity) / peak_equity
    if drawdown > max_drawdown:
        return 0  # circuit breaker
    reduction_factor = 1 - (drawdown / max_drawdown)
    return base_risk * reduction_factor

Симуляція та оцінка sizing стратегій

# Порівняння різних підходів
strategies = {
    'fixed_1pct': lambda signal, vol, eq: fixed_fractional(1.0),
    'fixed_kelly': lambda signal, vol, eq: half_kelly_sizing(signal),
    'vol_normalized': lambda signal, vol, eq: vol_normalized(vol, target_risk=1.0),
    'ml_adaptive': lambda signal, vol, eq: ml_size(signal.probability, vol, eq.drawdown),
}

for name, size_fn in strategies.items():
    equity_curve = simulate_strategy(trades, size_fn)
    print(f"{name}: Sharpe={sharpe(equity_curve):.2f}, MaxDD={max_drawdown(equity_curve):.1%}")

Monte Carlo симуляція 10,000 шляхів для кожного sizing методу — порівняння distribution результатів.

Типовий результат: ML adaptive sizing покращує Sharpe на 15-30% та зменшує max drawdown на 20-40% vs. fixed fractional при тій же стратегії входів.

Часовая шкала: volatility-adjusted sizing + drawdown adjustment — 2-3 тижні. RL adaptive sizing з risk parity та full simulation — 6-8 тижнів.