var
Calculate Value at Risk (VaR) to quantify potential portfolio losses at a specified confidence level for risk management.
Instructions
Calculates Value at Risk (VaR).
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| confidence | No |
Implementation Reference
- tools/risk_engine.py:45-60 (handler)The 'var' tool handler: computes portfolio Value at Risk (VaR) using historical returns percentile method.def var(confidence: float = 0.95) -> str: """Calculates Value at Risk (VaR).""" data, weights = _get_portfolio_data() if data is None: return "Portfolio is empty." returns = data.pct_change().dropna() # Portfolio historical returns port_returns = returns.dot(weights) # Parametric VaR mean = np.mean(port_returns) std = np.std(port_returns) var_val = np.percentile(port_returns, (1 - confidence) * 100) return f"Daily VaR ({confidence:.0%}): {var_val:.2%}"
- server.py:380-383 (registration)Registration of the 'var' tool via register_tools which applies FastMCP @mcp.tool() decorator.register_tools( [portfolio_risk, var, max_drawdown, monte_carlo_simulation], "Risk Engine" )
- tools/risk_engine.py:10-30 (helper)Shared helper function to retrieve portfolio data and compute asset weights, used by 'var' and other risk tools.def _get_portfolio_data(lookback: str = "1y"): portfolio = get_positions() positions = portfolio.get("positions", {}) if not positions: return None, None tickers = list(positions.keys()) weights = np.array(list(positions.values())) # This is qty, need value weights # Fetch data data = yf.download(tickers, period=lookback, progress=False)['Close'] if isinstance(data, pd.Series): data = data.to_frame(name=tickers[0]) # Calculate current value weights current_prices = data.iloc[-1] values = current_prices * pd.Series(positions) total_value = values.sum() weights = values / total_value return data, weights