← Files Public Equity InvestingARCHIVED FILE

tests/test_portfolio_risk_management_sizing_logic.py

3.42 KB · Oct 2, 2026 · 00:03 UTC

↓ Download file

"""Executable PM sizing-constraint tests for portfolio-risk-management."""

from __future__ import annotations

import sys
import unittest
from pathlib import Path

ROOT = Path(__file__).resolve().parents[1]
SCRIPT_DIR = ROOT / "skills" / "portfolio-risk-management" / "scripts"
sys.path.insert(0, str(SCRIPT_DIR))

from position_sizing_core import sizing_rows  # noqa: E402


class PortfolioRiskSizingLogicTests(unittest.TestCase):
    def test_short_borrow_squeeze_constraint_can_bind_below_loss_vol_liquidity(self) -> None:
        rows, summary = sizing_rows(
            {
                "portfolio": {
                    "nav": 100_000_000,
                    "max_loss_bps_nav": 150,
                    "target_position_vol_contribution_bps": 500,
                    "max_single_name_pct_nav": 10,
                    "borrow_squeeze_capacity_pct_nav": 1.25,
                },
                "position": {
                    "security": "Crowded Short Co",
                    "ticker": "CSC",
                    "instrument_type": "common equity",
                    "direction": "short",
                    "entry_price": 50,
                    "downside_price": 65,
                    "stress_price": 80,
                    "annualized_volatility_pct": 40,
                    "confidence": "high",
                    "short_interest_pct_float": 35,
                    "days_to_cover": 8,
                    "borrow_cost_pct": 12,
                },
                "liquidity": {"adv_shares": 2_000_000, "price": 50, "required_exit_days": 5},
            }
        )
        lenses = {row["sizing_lens"]: row for row in rows}
        self.assertIn("borrow_squeeze_capacity", lenses)
        self.assertEqual("borrow_squeeze_capacity", summary["raw_binding_constraint"])
        self.assertAlmostEqual(1.25, summary["recommended_size_pct_nav"])

    def test_benchmark_factor_constraint_can_bind_below_simple_limits(self) -> None:
        rows, summary = sizing_rows(
            {
                "portfolio": {
                    "nav": 100_000_000,
                    "max_loss_bps_nav": 200,
                    "target_position_vol_contribution_bps": 500,
                    "max_single_name_pct_nav": 10,
                    "benchmark_active_weight_limit_pct": 2.0,
                    "factor_limit_pct_nav": 1.0,
                },
                "position": {
                    "security": "Benchmark Risk Co",
                    "ticker": "BRC",
                    "instrument_type": "common equity",
                    "direction": "long",
                    "entry_price": 40,
                    "downside_price": 30,
                    "stress_price": 24,
                    "annualized_volatility_pct": 35,
                    "confidence": "high",
                    "current_active_weight_pct": 0.5,
                    "current_factor_exposure_pct_nav": 0.4,
                    "factor_exposure_per_1pct_position": 1.0,
                },
                "liquidity": {"adv_shares": 2_000_000, "price": 40, "required_exit_days": 5},
            }
        )
        lenses = {row["sizing_lens"]: row for row in rows}
        self.assertIn("benchmark_active_weight_capacity", lenses)
        self.assertIn("factor_limit_capacity", lenses)
        self.assertEqual("factor_limit_capacity", summary["raw_binding_constraint"])
        self.assertAlmostEqual(0.6, summary["recommended_size_pct_nav"])


if __name__ == "__main__":
    unittest.main()

SHA-256: 8250112a91d95278f659f424266da4b641a0ebd3ef9465908b8c81ea6f707637