{"spec_id":"frontier-efficient","library":"matplotlib","language":"python","code":"\"\"\" anyplot.ai\nfrontier-efficient: Efficient Frontier for Portfolio Optimization\nLibrary: matplotlib 3.10.9 | Python 3.13.13\nQuality: 85/100 | Updated: 2026-05-17\n\"\"\"\n\nimport matplotlib.pyplot as plt\nimport numpy as np\n\n\n# Data - Simulating portfolios from a 5-asset universe\nnp.random.seed(42)\n\n# Asset parameters (annualized returns and covariance matrix)\nn_assets = 5\nexpected_returns = np.array([0.12, 0.10, 0.14, 0.08, 0.16])  # Annual returns\nasset_volatilities = np.array([0.18, 0.12, 0.25, 0.10, 0.30])\n\n# Create realistic correlation matrix\ncorrelations = np.array(\n    [\n        [1.00, 0.30, 0.50, 0.20, 0.40],\n        [0.30, 1.00, 0.25, 0.60, 0.35],\n        [0.50, 0.25, 1.00, 0.15, 0.55],\n        [0.20, 0.60, 0.15, 1.00, 0.25],\n        [0.40, 0.35, 0.55, 0.25, 1.00],\n    ]\n)\ncov_matrix = np.outer(asset_volatilities, asset_volatilities) * correlations\nrisk_free_rate = 0.03\n\n# Generate many random portfolios to approximate efficient frontier\nn_portfolios = 5000\nall_returns = []\nall_risks = []\nall_sharpes = []\nall_weights = []\n\nfor _ in range(n_portfolios):\n    weights = np.random.random(n_assets)\n    weights /= weights.sum()\n    ret = np.dot(weights, expected_returns)\n    risk = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights)))\n    sharpe = (ret - risk_free_rate) / risk\n    all_returns.append(ret)\n    all_risks.append(risk)\n    all_sharpes.append(sharpe)\n    all_weights.append(weights)\n\nall_returns = np.array(all_returns)\nall_risks = np.array(all_risks)\nall_sharpes = np.array(all_sharpes)\n\n# Extract efficient frontier points (highest return for each risk level)\n# Bin by risk and find max return in each bin\nrisk_bins = np.linspace(all_risks.min(), all_risks.max(), 50)\nefficient_returns = []\nefficient_risks = []\n\nfor i in range(len(risk_bins) - 1):\n    mask = (all_risks >= risk_bins[i]) & (all_risks < risk_bins[i + 1])\n    if mask.sum() > 0:\n        max_return_idx = np.argmax(all_returns[mask])\n        idx = np.where(mask)[0][max_return_idx]\n        efficient_returns.append(all_returns[idx])\n        efficient_risks.append(all_risks[idx])\n\nefficient_returns = np.array(efficient_returns)\nefficient_risks = np.array(efficient_risks)\n\n# Sort by risk for smooth curve\nsort_idx = np.argsort(efficient_risks)\nefficient_risks = efficient_risks[sort_idx]\nefficient_returns = efficient_returns[sort_idx]\n\n# Find minimum variance portfolio (lowest risk)\nmin_var_idx = np.argmin(all_risks)\nmin_var_return = all_returns[min_var_idx]\nmin_var_risk = all_risks[min_var_idx]\n\n# Find maximum Sharpe ratio portfolio\nmax_sharpe_idx = np.argmax(all_sharpes)\nmax_sharpe_return = all_returns[max_sharpe_idx]\nmax_sharpe_risk = all_risks[max_sharpe_idx]\n\n# Filter efficient frontier to points above minimum variance\nfrontier_mask = efficient_returns >= min_var_return - 0.005\nefficient_risks = efficient_risks[frontier_mask]\nefficient_returns = efficient_returns[frontier_mask]\n\n# Sample portfolios for scatter plot (subset for visibility)\nsample_idx = np.random.choice(len(all_returns), size=300, replace=False)\nsample_returns = all_returns[sample_idx]\nsample_risks = all_risks[sample_idx]\nsample_sharpes = all_sharpes[sample_idx]\n\n# Plot\nfig, ax = plt.subplots(figsize=(16, 9))\n\n# Random portfolios colored by Sharpe ratio\nscatter = ax.scatter(\n    sample_risks * 100, sample_returns * 100, c=sample_sharpes, cmap=\"viridis\", s=80, alpha=0.6, edgecolors=\"none\"\n)\n\n# Efficient frontier curve\nax.plot(\n    efficient_risks * 100, efficient_returns * 100, color=\"#306998\", linewidth=4, label=\"Efficient Frontier\", zorder=5\n)\n\n# Minimum variance portfolio\nax.scatter(\n    min_var_risk * 100,\n    min_var_return * 100,\n    color=\"#FFD43B\",\n    s=400,\n    marker=\"D\",\n    edgecolors=\"#306998\",\n    linewidth=2,\n    label=\"Minimum Variance Portfolio\",\n    zorder=6,\n)\n\n# Maximum Sharpe ratio portfolio\nax.scatter(\n    max_sharpe_risk * 100,\n    max_sharpe_return * 100,\n    color=\"#FF6B6B\",\n    s=400,\n    marker=\"*\",\n    edgecolors=\"#306998\",\n    linewidth=2,\n    label=\"Maximum Sharpe Ratio Portfolio\",\n    zorder=6,\n)\n\n# Capital Market Line\ncml_x_end = max_sharpe_risk * 1.6\ncml_slope = (max_sharpe_return - risk_free_rate) / max_sharpe_risk\ncml_x = np.array([0, cml_x_end]) * 100\ncml_y = (risk_free_rate + cml_slope * np.array([0, cml_x_end])) * 100\nax.plot(cml_x, cml_y, color=\"#888888\", linewidth=2, linestyle=\"--\", label=\"Capital Market Line\", zorder=4)\n\n# Risk-free rate point\nax.scatter(0, risk_free_rate * 100, color=\"#888888\", s=200, marker=\"o\", zorder=6, label=\"Risk-Free Rate\")\n\n# Colorbar for Sharpe ratio\ncbar = plt.colorbar(scatter, ax=ax, shrink=0.8, pad=0.02)\ncbar.set_label(\"Sharpe Ratio\", fontsize=18)\ncbar.ax.tick_params(labelsize=14)\n\n# Labels and styling\nax.set_xlabel(\"Risk (Standard Deviation, %)\", fontsize=20)\nax.set_ylabel(\"Expected Return (%)\", fontsize=20)\nax.set_title(\"frontier-efficient · matplotlib · pyplots.ai\", fontsize=24)\nax.tick_params(axis=\"both\", labelsize=16)\nax.grid(True, alpha=0.3, linestyle=\"--\")\nax.legend(fontsize=14, loc=\"upper left\", framealpha=0.9)\nax.set_xlim(left=0)\nax.set_ylim(bottom=0)\n\nplt.tight_layout()\nplt.savefig(\"plot.png\", dpi=300, bbox_inches=\"tight\")\n"}