Skip to content

trading_agent.risk.margin_estimator

Estimates the margin an order blocks, with the rules UBI's own broker selector uses.

UBI has no route that returns an order's margin, but its documentation (architecture/broker-selection.md) states the rules its selector uses and how close they came to the brokers' calculators on 2026-09-30. The rates are deliberately high, because an estimate that is too high only refuses an order that could have gone through, while one that is too low lets through an order that is too large.

Typical usage example:

margin = MarginEstimator(margin_configuration).margin(request)

MarginEstimator

MarginEstimator(rates)

Estimates margin from quantity, price, product and segment.

Creates the estimator.

Parameters:

Name Type Description Default
rates MarginRatesConfiguration

The margin rates per kind of instrument.

required
Source code in src/trading_agent/risk/margin_estimator.py
def __init__(self, rates: agent_configuration.MarginRatesConfiguration):
    """Creates the estimator.

    Args:
        rates (agent_configuration.MarginRatesConfiguration): The margin rates per kind of instrument.
    """
    self._rates = rates

margin

margin(request)

Estimates the margin one order blocks.

Parameters:

Name Type Description Default
request OrderRequest

The order.

required

Returns:

Type Description
float

The estimated margin in rupees.

Source code in src/trading_agent/risk/margin_estimator.py
def margin(self, request: order_request_module.OrderRequest) -> float:
    """Estimates the margin one order blocks.

    Args:
        request (order_request_module.OrderRequest): The order.

    Returns:
        float: The estimated margin in rupees.
    """
    value = request.quantity * request.price
    if request.is_option and request.transaction_type == 'buy':
        return value
    if request.is_option or request.is_future:
        return value * self.derivative_rate(request.segment)
    if request.product == 'mis':
        return value * self._rates.intraday_rate
    return value

derivative_rate

derivative_rate(segment)

The margin rate for a future, or for a sold option, by kind of underlying.

Parameters:

Name Type Description Default
segment str

UBI's segment.

required

Returns:

Type Description
float

The rate, such as 0.15 for index derivatives.

Source code in src/trading_agent/risk/margin_estimator.py
def derivative_rate(self, segment: str) -> float:
    """The margin rate for a future, or for a sold option, by kind of underlying.

    Args:
        segment (str): UBI's segment.

    Returns:
        float: The rate, such as 0.15 for index derivatives.
    """
    if 'commodity' in segment or segment.startswith('mcx'):
        return self._rates.commodity_derivative_rate
    if 'currency' in segment or segment.startswith('cds'):
        return self._rates.currency_derivative_rate
    if 'index' in segment:
        return self._rates.index_derivative_rate
    return self._rates.stock_derivative_rate