Розробка алгоритму dynamic position sizing
Dynamic position sizing — адаптація розміру кожної позиції на основі поточних ринкових умов та стану портфеля. Замість торговлі фіксованим лотом, алгоритм розраховує оптимальний розмір для кожної конкретної угоди.
Fixed Fractional (Kelly-inspired)
Базовий підхід: ризикуємо фіксованим відсотком капіталу на кожну угоду.
def fixed_fractional_size(capital, risk_pct, entry_price, stop_price):
risk_amount = capital * risk_pct
risk_per_unit = abs(entry_price - stop_price)
qty = risk_amount / risk_per_unit
return qty
Стандартний risk_pct: 1–2% на угоду. При 20 угодах підряд з повним стопом: збиток (0.98)^20 = 33% депозиту. Управляємо.
Volatility-Adjusted Sizing
Розмір позиції обернено пропорційна волатильності: вища волатильність → менша позиція.
def volatility_adjusted_size(capital, target_risk_pct, atr, entry_price, atr_multiplier=2.0):
risk_amount = capital * target_risk_pct
stop_distance = atr * atr_multiplier # стоп на 2×ATR
position_value = risk_amount / (stop_distance / entry_price)
return position_value / entry_price # у одиницях активу
ATR 3% → стоп 6% → розмір X. ATR 1% → стоп 2% → розмір 3X. Результат: однаковий грошовий ризик при різних рівнях волатильності.
Kelly Criterion
Математично оптимальний розмір позиції для максимізації довгострокового зростання капіталу:
Kelly % = W - (1-W)/R
де W = win rate, R = середній win/середній loss
W=55%, R=1.5: Kelly = 0.55 - 0.45/1.5 = 0.25 = 25% капіталу.
Занадто агресивно. Зазвичай Half Kelly (12.5%) або Quarter Kelly. Повний Kelly спричиняє величезний drawdown попри теоретичну оптимальність.
Drawdown-Based Scaling
Зменшуємо позиції при наближенні до max drawdown:
def drawdown_scaled_size(base_size, current_equity, peak_equity,
max_drawdown=0.20):
current_dd = (peak_equity - current_equity) / peak_equity
if current_dd > max_drawdown * 0.75:
# При 75% від max drawdown — зменшуємо до 50% розміру
return base_size * 0.5
elif current_dd > max_drawdown * 0.5:
# При 50% від max drawdown — зменшуємо до 75% розміру
return base_size * 0.75
return base_size
Correlation Adjustment
Якщо портфель вже утримує декілька корельованих позицій — нова додає менше диверсифікації. Розмір нової позиції зменшується пропорційно:
def correlation_adjusted_size(base_size, correlation_with_portfolio):
# Кореляція 0.8 → зменшуємо до 20% від базового
diversity_factor = 1 - abs(correlation_with_portfolio)
return base_size * max(diversity_factor, 0.2) # мінімум 20%
Розробляємо систему dynamic position sizing з конфігурованою комбінацією методів: fixed fractional + volatility adjustment + drawdown scaling + correlation adjustment. Єдиний модуль, інтегрується в будь-яку торговельну стратегію.







