Development of Risk-Based Position Sizing System
Risk-based position sizing system is the foundation of professional capital management. Instead of "buy for $1000", say "risk $100 at 5% below entry" and automatically calculate volume.
Basic Formula
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
}
Example: portfolio $50,000, risk 1% ($500), entry $45,000, stop $43,200 (4% below). Risk Per Unit = $1,800. Qty = 500/1800 = 0.278 BTC. Position value = $12,500 (25% of portfolio).
ATR-based Stop Placement
Stop size is better tied to ATR rather than arbitrary %:
def atr_based_sizing(portfolio_value, risk_pct, entry_price, atr, multiplier=2.0):
stop_distance = atr * multiplier
stop_price = entry_price - stop_distance # for long
return calculate_position_size(portfolio_value, risk_pct, entry_price, stop_price)
At ATR 2%: stop = 4% below entry. At ATR 5%: stop = 10% below. Position size automatically decreases at high volatility.
Constraints and Checks
Maximum position size cap: even if risk calculation gives 50% of portfolio, limit to maximum 20%.
Minimum position size: below certain volume fees are unjustified. Skip trade.
Available balance check: physical presence of funds on exchange.
Leverage adjustment: when using leverage: effective_qty = calculated_qty, but margin_required = position_value / leverage.
Portfolio Context
With multiple open positions, total risk should not exceed limit:
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 # no room in portfolio
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
We develop a position sizing system with ATR-based sizing, portfolio risk control, leverage support and configurable constraints.







