Разработка системы расчета позиции по риску
Система расчёта размера позиции по риску — основа профессионального управления капиталом. Вместо «купить на $1000» — «рискнуть $100 при стопе на 5% ниже входа» и автоматически рассчитать объём.
Базовая формула
Position Qty = Risk Amount / Risk Per Unit
Risk Amount = Portfolio Value × Risk Percent
Risk Per Unit = |Entry Price - Stop Loss Price|
def calculate_position_size(portfolio_value, risk_pct, entry_price, stop_price):
risk_amount = portfolio_value * risk_pct
risk_per_unit = abs(entry_price - stop_price)
if risk_per_unit == 0:
raise ValueError("Stop price equals entry price")
qty = risk_amount / risk_per_unit
position_value = qty * entry_price
return {
'qty': qty,
'position_value': position_value,
'position_pct': position_value / portfolio_value,
'risk_amount': risk_amount,
'risk_pct': risk_pct
}
Пример: портфель $50,000, риск 1% ($500), вход $45,000, стоп $43,200 (4% ниже). Risk Per Unit = $1,800. Qty = 500/1800 = 0.278 BTC. Position value = $12,500 (25% портфеля).
ATR-based stop placement
Размер стопа лучше привязать к ATR, а не к произвольному %:
def atr_based_sizing(portfolio_value, risk_pct, entry_price, atr, multiplier=2.0):
stop_distance = atr * multiplier
stop_price = entry_price - stop_distance # для лонга
return calculate_position_size(portfolio_value, risk_pct, entry_price, stop_price)
При ATR 2%: stop = 4% ниже входа. При ATR 5%: stop = 10% ниже. Размер позиции автоматически уменьшается при высокой волатильности.
Constraints и проверки
Maximum position size cap: даже если расчёт по риску даёт позицию 50% портфеля — ограничиваем максимум 20%.
Minimum position size: ниже определённого объёма fees не оправданы. Пропускаем сделку.
Available balance check: физическое наличие средств на бирже.
Leverage adjustment: при использовании плеча: effective_qty = calculated_qty, но margin_required = position_value / leverage.
Портфельный контекст
При нескольких открытых позициях общий риск не должен превышать лимит:
def portfolio_adjusted_size(base_size, current_total_risk, max_portfolio_risk, portfolio_value):
remaining_risk_budget = max_portfolio_risk * portfolio_value - current_total_risk
if remaining_risk_budget <= 0:
return 0 # нет места в портфеле
max_new_risk = min(base_size['risk_amount'], remaining_risk_budget)
scale_factor = max_new_risk / base_size['risk_amount']
return base_size['qty'] * scale_factor
Разрабатываем систему расчёта позиции с ATR-based sizing, portfolio risk контролем, leverage support и настраиваемыми constraints.







