"""Portfolio stress testing with Monte Carlo and scenario analysis."""
import horizon as hz
# ── Build portfolio ──
positions = [
hz.SimPosition(market_id="election-winner", side=hz.Side.Yes, size=100.0, entry_price=0.55),
hz.SimPosition(market_id="btc-100k", side=hz.Side.Yes, size=80.0, entry_price=0.60),
hz.SimPosition(market_id="fed-rate-cut", side=hz.Side.No, size=50.0, entry_price=0.40),
hz.SimPosition(market_id="gop-senate", side=hz.Side.Yes, size=60.0, entry_price=0.52),
hz.SimPosition(market_id="eth-10k", side=hz.Side.Yes, size=40.0, entry_price=0.15),
]
# ── Run stress test ──
result = hz.stress_test(
positions=positions,
num_simulations=10_000,
scenarios=[
hz.CORRELATION_SPIKE, # all correlations go to 1
hz.ALL_RESOLVE_NO, # every market resolves No
hz.LIQUIDITY_SHOCK, # bid-ask spreads widen 5x
hz.TAIL_RISK, # 3-sigma adverse move
],
confidence=0.95,
)
print("Stress Test Results")
print(f" Portfolio value: ${result.portfolio_value:,.2f}")
print(f" Monte Carlo VaR: ${result.mc_var:,.2f}")
print(f" Monte Carlo CVaR: ${result.mc_cvar:,.2f}")
print(f" Worst simulation: ${result.worst_case:,.2f}")
print(f" Best simulation: ${result.best_case:,.2f}")
print(f"\nScenario Results:")
for scenario in result.scenarios:
print(f" {scenario.name}:")
print(f" PnL impact: ${scenario.pnl_impact:,.2f}")
print(f" Drawdown: {scenario.drawdown_pct:.1%}")
# ── Custom scenario ──
election_shock = hz.StressScenario(
name="Election Surprise",
description="Unexpected candidate wins, all election markets move 30 cents",
price_shocks={
"election-winner": -0.30,
"gop-senate": -0.25,
},
correlation_override=0.9,
)
custom_result = hz.stress_test(
positions=positions,
num_simulations=5_000,
scenarios=[election_shock],
)
shock = custom_result.scenarios[0]
print(f"\nElection Shock:")
print(f" PnL impact: ${shock.pnl_impact:,.2f}")
print(f" Drawdown: {shock.drawdown_pct:.1%}")