Skip to content

Margin Calculations

qlcore provides margin calculations for leveraged trading, including initial margin, maintenance margin, and margin utilization.

Initial Margin

The collateral required to open a position:

import qlcore as qc
from decimal import Decimal

# Basic calculation
initial = qc.calculate_initial_margin(
    notional="45000",    # Position notional value
    leverage=10,         # Desired leverage
)
print(f"Initial Margin: ${initial}")  # $4500

With Custom Rate

initial = qc.calculate_initial_margin(
    notional="45000",
    rate=Decimal("0.1"),  # 10% margin rate (same as 10x leverage)
)

Maintenance Margin

The minimum margin required to keep a position open:

maintenance = qc.calculate_maintenance_margin(
    notional="45000",
    rate=Decimal("0.005"),  # 0.5% maintenance rate
)
print(f"Maintenance Margin: ${maintenance}")  # $225

Margin Schedule

For tiered margin rates based on position size:

schedule = qc.MarginSchedule(
    tiers=[
        (Decimal("100000"), Decimal("0.01")),   # 1% for first $100k
        (Decimal("500000"), Decimal("0.02")),   # 2% for $100k-$500k
        (Decimal("1000000"), Decimal("0.05")),  # 5% for $500k-$1M
        (None, Decimal("0.10")),                # 10% above $1M
    ]
)

margin = schedule.calculate_margin(notional=Decimal("750000"))

Margin Levels

Track margin status:

level = qc.MarginLevel(
    equity=Decimal("5000"),
    initial_margin=Decimal("4500"),
    maintenance_margin=Decimal("225"),
)

print(f"Margin Ratio: {level.margin_ratio:.2%}")
print(f"Is Safe: {level.is_safe}")
print(f"Is Warning: {level.is_warning}")
print(f"Is Liquidatable: {level.is_liquidatable}")

Free Margin

Available margin for new positions:

free = qc.free_margin(
    equity=Decimal("10000"),
    used_margin=Decimal("4500"),
)
print(f"Free Margin: ${free}")  # $5500

Margin Utilization

Percentage of available margin in use:

utilization = qc.margin_utilization(
    used_margin=Decimal("4500"),
    total_margin=Decimal("10000"),
)
print(f"Utilization: {utilization:.1%}")  # 45%

Isolated Margin

Track margin for individual positions:

isolated = qc.IsolatedMargin(
    initial_margin=Decimal("4500"),
    maintenance_margin=Decimal("225"),
    margin_balance=Decimal("5000"),
)

print(f"Initial: ${isolated.initial_margin}")
print(f"Maintenance: ${isolated.maintenance_margin}")
print(f"Balance: ${isolated.margin_balance}")

Margin Requirements

Complete margin calculation result:

requirements = qc.MarginRequirements(
    initial=Decimal("4500"),
    maintenance=Decimal("225"),
    max_leverage=Decimal("20"),
)

Complete Example

import qlcore as qc
from decimal import Decimal

# Position parameters
notional = Decimal("45000")
leverage = 10
mm_rate = Decimal("0.005")

# Calculate margins
initial = qc.calculate_initial_margin(notional, leverage)
maintenance = qc.calculate_maintenance_margin(notional, mm_rate)

# Check margin status
equity = Decimal("5000")
used = initial

free = qc.free_margin(equity, used)
utilization = qc.margin_utilization(used, equity)

print("Margin Summary")
print("-" * 30)
print(f"Notional:     ${notional:>10}")
print(f"Leverage:     {leverage:>10}x")
print(f"Initial:      ${initial:>10}")
print(f"Maintenance:  ${maintenance:>10}")
print(f"Equity:       ${equity:>10}")
print(f"Free Margin:  ${free:>10}")
print(f"Utilization:  {utilization:>10.1%}")

Using Namespace

import qlcore as qc

qc.margin.calculate_initial_margin("45000", leverage=10)
qc.margin.calculate_maintenance_margin("45000", rate="0.005")
qc.margin.free_margin(equity, used)
qc.margin.margin_utilization(used, total)
qc.margin.MarginRequirements(...)
qc.margin.MarginLevel(...)
qc.margin.MarginSchedule(...)
qc.margin.IsolatedMargin(...)