{"spec_id":"frontier-efficient","library":"plotnine","language":"python","code":"\"\"\" anyplot.ai\nfrontier-efficient: Efficient Frontier for Portfolio Optimization\nLibrary: plotnine 0.15.4 | Python 3.13.13\nQuality: 94/100 | Updated: 2026-05-17\n\"\"\"\n\nimport os\n\nimport numpy as np\nimport pandas as pd\nfrom plotnine import (\n    aes,\n    annotate,\n    element_line,\n    element_rect,\n    element_text,\n    geom_line,\n    geom_point,\n    ggplot,\n    ggsave,\n    labs,\n    scale_color_cmap,\n    theme,\n    theme_minimal,\n)\nfrom scipy.optimize import minimize\n\n\n# Theme tokens\nTHEME = os.getenv(\"ANYPLOT_THEME\", \"light\")\nPAGE_BG = \"#FAF8F1\" if THEME == \"light\" else \"#1A1A17\"\nELEVATED_BG = \"#FFFDF6\" if THEME == \"light\" else \"#242420\"\nINK = \"#1A1A17\" if THEME == \"light\" else \"#F0EFE8\"\nINK_SOFT = \"#4A4A44\" if THEME == \"light\" else \"#B8B7B0\"\nIMPRINT = [\"#009E73\", \"#C475FD\", \"#4467A3\", \"#BD8233\", \"#AE3030\", \"#2ABCCD\", \"#954477\"]\n\n# Data\nnp.random.seed(42)\n\nn_assets = 5\nn_portfolios = 300\n\nexpected_returns = np.array([0.08, 0.12, 0.15, 0.10, 0.18])\ncov_matrix = np.array(\n    [\n        [0.04, 0.01, 0.02, 0.01, 0.02],\n        [0.01, 0.09, 0.03, 0.02, 0.04],\n        [0.02, 0.03, 0.16, 0.04, 0.06],\n        [0.01, 0.02, 0.04, 0.06, 0.03],\n        [0.02, 0.04, 0.06, 0.03, 0.25],\n    ]\n)\n\nweights = np.random.dirichlet(np.ones(n_assets), size=n_portfolios)\n\nportfolio_returns = weights @ expected_returns\nportfolio_risks = np.sqrt(np.diag(weights @ cov_matrix @ weights.T))\n\nrisk_free_rate = 0.03\nsharpe_ratios = (portfolio_returns - risk_free_rate) / portfolio_risks\n\ntarget_returns = np.linspace(min(expected_returns) + 0.01, max(expected_returns) - 0.01, 100)\nfrontier_risks = []\nfrontier_returns = []\n\nfor target in target_returns:\n    constraints = [\n        {\"type\": \"eq\", \"fun\": lambda w: np.sum(w) - 1},\n        {\"type\": \"eq\", \"fun\": lambda w, t=target: w @ expected_returns - t},\n    ]\n    bounds = tuple((0, 1) for _ in range(n_assets))\n    result = minimize(\n        lambda w: w @ cov_matrix @ w,\n        np.ones(n_assets) / n_assets,\n        method=\"SLSQP\",\n        bounds=bounds,\n        constraints=constraints,\n    )\n    if result.success:\n        frontier_risks.append(np.sqrt(result.fun))\n        frontier_returns.append(target)\n\nmin_var_idx = np.argmin(frontier_risks)\nmin_var_risk = frontier_risks[min_var_idx]\nmin_var_return = frontier_returns[min_var_idx]\n\nfrontier_sharpe = [(r - risk_free_rate) / s for r, s in zip(frontier_returns, frontier_risks, strict=True)]\nmax_sharpe_idx = np.argmax(frontier_sharpe)\nmax_sharpe_risk = frontier_risks[max_sharpe_idx]\nmax_sharpe_return = frontier_returns[max_sharpe_idx]\n\ndf_portfolios = pd.DataFrame({\"risk\": portfolio_risks, \"return\": portfolio_returns, \"sharpe\": sharpe_ratios})\n\ndf_frontier = pd.DataFrame({\"risk\": frontier_risks, \"return\": frontier_returns})\n\n# Plot\nplot = (\n    ggplot()\n    + geom_point(df_portfolios, aes(x=\"risk\", y=\"return\", color=\"sharpe\"), size=3, alpha=0.6)\n    + geom_line(df_frontier, aes(x=\"risk\", y=\"return\"), color=IMPRINT[0], size=2.5)\n    + annotate(\"point\", x=min_var_risk, y=min_var_return, color=IMPRINT[4], size=6, shape=\"s\")\n    + annotate(\"point\", x=max_sharpe_risk, y=max_sharpe_return, color=IMPRINT[4], size=6, shape=\"D\")\n    + annotate(\"text\", x=min_var_risk + 0.012, y=min_var_return, label=\"Min Var\", size=14, ha=\"left\", color=INK)\n    + annotate(\n        \"text\", x=max_sharpe_risk + 0.012, y=max_sharpe_return, label=\"Max Sharpe\", size=14, ha=\"left\", color=INK\n    )\n    + scale_color_cmap(cmap_name=\"viridis\", name=\"Sharpe Ratio\")\n    + labs(x=\"Risk (Standard Deviation)\", y=\"Expected Return\", title=\"frontier-efficient · plotnine · anyplot.ai\")\n    + theme_minimal()\n    + theme(\n        plot_background=element_rect(fill=PAGE_BG, color=PAGE_BG),\n        panel_background=element_rect(fill=PAGE_BG),\n        panel_grid_major=element_line(color=INK, size=0.3, alpha=0.10),\n        panel_grid_minor=element_line(color=INK, size=0.2, alpha=0.05),\n        panel_border=element_rect(color=INK_SOFT, fill=None),\n        axis_title=element_text(size=20, color=INK),\n        axis_text=element_text(size=16, color=INK_SOFT),\n        axis_line=element_line(color=INK_SOFT),\n        plot_title=element_text(size=24, color=INK),\n        legend_background=element_rect(fill=ELEVATED_BG, color=INK_SOFT),\n        legend_text=element_text(size=16, color=INK_SOFT),\n        legend_title=element_text(size=18, color=INK),\n        figure_size=(16, 9),\n    )\n)\n\n# Save\nggsave(plot, filename=f\"plot-{THEME}.png\", dpi=300, width=16, height=9)\n"}