{"spec_id":"frontier-efficient","library":"altair","language":"python","code":"\"\"\" anyplot.ai\nfrontier-efficient: Efficient Frontier for Portfolio Optimization\nLibrary: altair 6.1.0 | Python 3.13.13\nQuality: 92/100 | Updated: 2026-05-17\n\"\"\"\n\nimport os\n\nimport altair as alt\nimport numpy as np\nimport pandas as pd\nfrom scipy.optimize import minimize\n\n\n# Theme tokens (see prompts/default-style-guide.md)\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\"\nBRAND = \"#009E73\"  # Okabe-Ito position 1\n\n# Okabe-Ito palette\nIMPRINT = [\"#009E73\", \"#C475FD\", \"#4467A3\", \"#BD8233\", \"#AE3030\", \"#2ABCCD\"]\n\n# Data - Portfolio simulation with efficient frontier\nnp.random.seed(42)\n\n# Asset parameters (5 assets)\nn_assets = 5\nn_portfolios = 300\n\n# Expected returns and covariance (realistic annualized values)\nexpected_returns = np.array([0.08, 0.10, 0.12, 0.15, 0.18])\ncov_matrix = np.array(\n    [\n        [0.04, 0.01, 0.02, 0.01, 0.02],\n        [0.01, 0.06, 0.02, 0.03, 0.02],\n        [0.02, 0.02, 0.09, 0.04, 0.03],\n        [0.01, 0.03, 0.04, 0.12, 0.05],\n        [0.02, 0.02, 0.03, 0.05, 0.16],\n    ]\n)\nrisk_free_rate = 0.02\n\n# Generate random portfolios\nportfolio_returns = []\nportfolio_risks = []\nportfolio_sharpes = []\n\nfor _ in range(n_portfolios):\n    weights = np.random.random(n_assets)\n    weights /= np.sum(weights)\n\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\n    portfolio_returns.append(ret)\n    portfolio_risks.append(risk)\n    portfolio_sharpes.append(sharpe)\n\n# Find minimum variance portfolio first\nconstraints = ({\"type\": \"eq\", \"fun\": lambda w: np.sum(w) - 1},)\nbounds = tuple((0, 1) for _ in range(n_assets))\nresult_minvar = minimize(\n    lambda w: np.sqrt(np.dot(w.T, np.dot(cov_matrix, w))),\n    np.ones(n_assets) / n_assets,\n    method=\"SLSQP\",\n    bounds=bounds,\n    constraints=constraints,\n)\nmin_var_risk = result_minvar.fun\nmin_var_return = np.dot(result_minvar.x, expected_returns)\n\n# Calculate efficient frontier using optimization (from min variance to max return)\nfrontier_risks_opt = []\nfrontier_returns_opt = []\ntarget_returns = np.linspace(min_var_return, max(expected_returns), 50)\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: np.dot(w, expected_returns) - t},\n    )\n    bounds = tuple((0, 1) for _ in range(n_assets))\n    result = minimize(\n        lambda w: np.sqrt(np.dot(w.T, np.dot(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_returns_opt.append(target)\n        frontier_risks_opt.append(result.fun)\n\n# Maximum Sharpe ratio portfolio\nsharpe_ratios = [(r - risk_free_rate) / v for r, v in zip(frontier_returns_opt, frontier_risks_opt, strict=True)]\nmax_sharpe_idx = np.argmax(sharpe_ratios)\nmax_sharpe_risk = frontier_risks_opt[max_sharpe_idx]\nmax_sharpe_return = frontier_returns_opt[max_sharpe_idx]\n\n# Create DataFrames\nportfolios_df = pd.DataFrame(\n    {\"Risk (Std Dev)\": portfolio_risks, \"Expected Return\": portfolio_returns, \"Sharpe Ratio\": portfolio_sharpes}\n)\n\nfrontier_df = pd.DataFrame({\"Risk (Std Dev)\": frontier_risks_opt, \"Expected Return\": frontier_returns_opt})\n\nspecial_points_df = pd.DataFrame(\n    {\n        \"Risk (Std Dev)\": [min_var_risk, max_sharpe_risk],\n        \"Expected Return\": [min_var_return, max_sharpe_return],\n        \"Portfolio\": [\"Minimum Variance\", \"Maximum Sharpe Ratio\"],\n    }\n)\n\n# Capital Market Line\ncml_risk = np.array([0, max_sharpe_risk * 1.5])\ncml_return = risk_free_rate + (max_sharpe_return - risk_free_rate) / max_sharpe_risk * cml_risk\ncml_df = pd.DataFrame({\"Risk (Std Dev)\": cml_risk, \"Expected Return\": cml_return})\n\n# Risk-free rate point\nrf_df = pd.DataFrame({\"Risk (Std Dev)\": [0], \"Expected Return\": [risk_free_rate], \"Point\": [\"Risk-Free Rate\"]})\n\n# Plot\n# Scatter plot of random portfolios colored by Sharpe ratio\nscatter = (\n    alt.Chart(portfolios_df)\n    .mark_circle(size=100, opacity=0.6)\n    .encode(\n        x=alt.X(\"Risk (Std Dev):Q\", scale=alt.Scale(domain=[0, 0.45]), title=\"Risk (Standard Deviation)\"),\n        y=alt.Y(\"Expected Return:Q\", scale=alt.Scale(domain=[0, 0.22]), title=\"Expected Return\"),\n        color=alt.Color(\n            \"Sharpe Ratio:Q\",\n            scale=alt.Scale(scheme=\"viridis\"),\n            legend=alt.Legend(title=\"Sharpe Ratio\", titleFontSize=16, labelFontSize=14),\n        ),\n        tooltip=[\"Risk (Std Dev)\", \"Expected Return\", \"Sharpe Ratio\"],\n    )\n)\n\n# Efficient frontier line\nfrontier_line = (\n    alt.Chart(frontier_df).mark_line(strokeWidth=4, color=BRAND).encode(x=\"Risk (Std Dev):Q\", y=\"Expected Return:Q\")\n)\n\n# Capital market line\ncml_line = (\n    alt.Chart(cml_df)\n    .mark_line(strokeWidth=3, strokeDash=[8, 4], color=IMPRINT[1])\n    .encode(x=\"Risk (Std Dev):Q\", y=\"Expected Return:Q\")\n)\n\n# Special points\nspecial_points = (\n    alt.Chart(special_points_df)\n    .mark_point(size=400, filled=True, stroke=\"white\", strokeWidth=2)\n    .encode(\n        x=\"Risk (Std Dev):Q\",\n        y=\"Expected Return:Q\",\n        color=alt.Color(\n            \"Portfolio:N\",\n            scale=alt.Scale(domain=[\"Minimum Variance\", \"Maximum Sharpe Ratio\"], range=[IMPRINT[1], IMPRINT[2]]),\n            legend=alt.Legend(title=\"Key Portfolios\", titleFontSize=16, labelFontSize=14),\n        ),\n        tooltip=[\"Portfolio\", \"Risk (Std Dev)\", \"Expected Return\"],\n    )\n)\n\n# Risk-free rate point\nrf_point = (\n    alt.Chart(rf_df)\n    .mark_point(size=300, shape=\"diamond\", filled=True, color=INK_SOFT)\n    .encode(x=\"Risk (Std Dev):Q\", y=\"Expected Return:Q\", tooltip=[\"Point\", \"Expected Return\"])\n)\n\n# Combine all layers\nchart = (\n    alt.layer(scatter, frontier_line, cml_line, special_points, rf_point)\n    .properties(\n        width=1600,\n        height=900,\n        background=PAGE_BG,\n        title=alt.Title(\"frontier-efficient · altair · anyplot.ai\", fontSize=28, anchor=\"middle\"),\n    )\n    .configure_axis(\n        domainColor=INK_SOFT,\n        tickColor=INK_SOFT,\n        gridColor=INK,\n        gridOpacity=0.10,\n        labelColor=INK_SOFT,\n        labelFontSize=16,\n        titleColor=INK,\n        titleFontSize=20,\n    )\n    .configure_title(color=INK)\n    .configure_legend(\n        fillColor=ELEVATED_BG,\n        strokeColor=INK_SOFT,\n        labelColor=INK_SOFT,\n        titleColor=INK,\n        titleFontSize=16,\n        labelFontSize=14,\n        symbolSize=200,\n    )\n    .configure_view(fill=PAGE_BG, stroke=INK_SOFT)\n)\n\n# Save\nchart.save(f\"plot-{THEME}.png\", scale_factor=3.0)\nchart.save(f\"plot-{THEME}.html\")\n"}