- Position Sizer
- Overview
- Calculate the optimal number of shares to buy for a long stock trade based on risk management principles. Supports three sizing methods:
- Fixed Fractional
-
- Risk a fixed percentage of account equity per trade (default: 1%)
- ATR-Based
-
- Use Average True Range to set volatility-adjusted stop distances
- Kelly Criterion
-
- Calculate mathematically optimal risk allocation from historical win/loss statistics
- All methods apply portfolio constraints (max position %, max sector %) and output a final recommended share count with full risk breakdown.
- When to Use
- User asks "how many shares should I buy?"
- User wants to calculate position size for a specific trade setup
- User mentions risk per trade, stop-loss sizing, or portfolio allocation
- User asks about Kelly Criterion or ATR-based position sizing
- User wants to check if a position fits within portfolio concentration limits
- Prerequisites
- No API keys required
- Python 3.9+ with standard library only
- Workflow
- Step 1: Gather Trade Parameters
- Collect from the user:
- Required
-
- Account size (total equity)
- Mode A (Fixed Fractional)
-
- Entry price, stop price, risk percentage (default 1%)
- Mode B (ATR-Based)
-
- Entry price, ATR value, ATR multiplier (default 2.0x), risk percentage
- Mode C (Kelly Criterion)
-
- Win rate, average win, average loss; optionally entry and stop for share calculation
- Optional constraints
- Max position % of account, max sector %, current sector exposure If the user provides a stock ticker but not specific prices, use available tools to look up the current price and suggest entry/stop levels based on technical analysis. Step 2: Execute Position Sizer Script Run the position sizing calculation:
Fixed Fractional (most common)
python3 skills/position-sizer/scripts/position_sizer.py \ --account-size 100000 \ --entry 155 \ --stop 148.50 \ --risk-pct 1.0 \ --output-dir reports/
ATR-Based
python3 skills/position-sizer/scripts/position_sizer.py \ --account-size 100000 \ --entry 155 \ --atr 3.20 \ --atr-multiplier 2.0 \ --risk-pct 1.0 \ --output-dir reports/
Kelly Criterion (budget mode - no entry)
python3 skills/position-sizer/scripts/position_sizer.py \ --account-size 100000 \ --win-rate 0.55 \ --avg-win 2.5 \ --avg-loss 1.0 \ --output-dir reports/
Kelly Criterion (shares mode - with entry/stop)
- python3 skills/position-sizer/scripts/position_sizer.py
- \
- --account-size
- 100000
- \
- --entry
- 155
- \
- --stop
- 148.50
- \
- --win-rate
- 0.55
- \
- --avg-win
- 2.5
- \
- --avg-loss
- 1.0
- \
- --output-dir reports/
- Step 3: Load Methodology Reference
- Read
- references/sizing_methodologies.md
- to provide context on the chosen method, risk guidelines, and portfolio constraint best practices.
- Step 4: Calculate Multiple Scenarios
- If the user has not specified a single method, run multiple scenarios for comparison:
- Fixed Fractional at 0.5%, 1.0%, and 1.5% risk
- ATR-based at 1.5x, 2.0x, and 3.0x multipliers
- Present a comparison table showing shares, position value, and dollar risk for each
- Step 5: Apply Portfolio Constraints and Determine Final Size
- Add constraints if the user has portfolio context:
- python3 skills/position-sizer/scripts/position_sizer.py
- \
- --account-size
- 100000
- \
- --entry
- 155
- \
- --stop
- 148.50
- \
- --risk-pct
- 1.0
- \
- --max-position-pct
- 10
- \
- --max-sector-pct
- 30
- \
- --current-sector-exposure
- 22
- \
- --output-dir reports/
- Explain which constraint is binding and why it limits the position.
- Step 6: Generate Position Report
- Present the final recommendation including:
- Method used and rationale
- Exact share count and position value
- Dollar risk and percentage of account
- Stop-loss price
- Any binding constraints
- Risk management reminders (portfolio heat, loss-cutting discipline)
- Output Format
- JSON Report
- {
- "schema_version"
- :
- "1.0"
- ,
- "mode"
- :
- "shares"
- ,
- "parameters"
- :
- {
- "entry_price"
- :
- 155.0
- ,
- "account_size"
- :
- 100000
- ,
- "stop_price"
- :
- 148.50
- ,
- "risk_pct"
- :
- 1.0
- }
- ,
- "calculations"
- :
- {
- "fixed_fractional"
- :
- {
- "method"
- :
- "fixed_fractional"
- ,
- "shares"
- :
- 153
- ,
- "risk_per_share"
- :
- 6.50
- ,
- "dollar_risk"
- :
- 1000.0
- ,
- "stop_price"
- :
- 148.50
- }
- ,
- "atr_based"
- :
- null
- ,
- "kelly"
- :
- null
- }
- ,
- "constraints_applied"
- :
- [
- ]
- ,
- "final_recommended_shares"
- :
- 153
- ,
- "final_position_value"
- :
- 23715.0
- ,
- "final_risk_dollars"
- :
- 994.50
- ,
- "final_risk_pct"
- :
- 0.99
- ,
- "binding_constraint"
- :
- null
- }
- Markdown Report
- Generated automatically alongside the JSON report. Contains:
- Parameters summary
- Calculation details for the active method
- Constraints analysis (if any)
- Final recommendation with shares, value, and risk
- Reports are saved to
- reports/
- with filenames
- position_sizer_YYYY-MM-DD_HHMMSS.json
- and
- .md
- .
- Resources
- references/sizing_methodologies.md
-
- Comprehensive guide to Fixed Fractional, ATR-based, and Kelly Criterion methods with examples, comparison table, and risk management principles
- scripts/position_sizer.py
-
- Main calculation script (CLI interface)
- Key Principles
- Survival first
-
- Position sizing is about surviving losing streaks, not maximizing winners
- The 1% rule
-
- Default to 1% risk per trade; never exceed 2% without exceptional reason
- Round down
-
- Always round shares down to whole numbers (never round up)
- Strictest constraint wins
-
- When multiple limits apply, the tightest one determines final size
- Half Kelly
-
- Never use full Kelly in practice; half Kelly captures 75% of growth with far less risk
- Portfolio heat
-
- Total open risk should not exceed 6-8% of account equity
- Asymmetry of losses
- A 50% loss requires a 100% gain to recover; size accordingly