{"spec_id":"indicator-sma","library":"plotly","language":"python","code":"\"\"\" anyplot.ai\nindicator-sma: Simple Moving Average (SMA) Indicator Chart\nLibrary: plotly 6.7.0 | Python 3.13.13\nQuality: 88/100 | Updated: 2026-05-19\n\"\"\"\n\nimport os\n\nimport numpy as np\nimport pandas as pd\nimport plotly.graph_objects as go\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\"\nGRID = \"rgba(26,26,23,0.10)\" if THEME == \"light\" else \"rgba(240,239,232,0.10)\"\n\n# Okabe-Ito palette — positions 1–4\nPRICE_COLOR = \"#009E73\"  # position 1 — first series (close price)\nSMA20_COLOR = \"#C475FD\"  # position 2\nSMA50_COLOR = \"#4467A3\"  # position 3\nSMA200_COLOR = \"#BD8233\"  # position 4\n\n# Data\nnp.random.seed(42)\n\nn_days = 300\ndates = pd.date_range(start=\"2025-01-01\", periods=n_days, freq=\"B\")\n\ninitial_price = 150.0\nreturns = np.random.normal(0.0005, 0.018, n_days)\nprice = initial_price * np.cumprod(1 + returns)\ntrend = np.sin(np.linspace(0, 3 * np.pi, n_days)) * 15\nprice = price + trend\n\ndf = pd.DataFrame({\"date\": dates, \"close\": price})\ndf[\"sma_20\"] = df[\"close\"].rolling(window=20).mean()\ndf[\"sma_50\"] = df[\"close\"].rolling(window=50).mean()\ndf[\"sma_200\"] = df[\"close\"].rolling(window=200).mean()\n\n# Plot\nfig = go.Figure()\n\nfig.add_trace(\n    go.Scatter(\n        x=df[\"date\"],\n        y=df[\"close\"],\n        mode=\"lines\",\n        name=\"Close Price\",\n        line={\"color\": PRICE_COLOR, \"width\": 3},\n        hovertemplate=\"Date: %{x|%Y-%m-%d}<br>Price: $%{y:.2f}<extra></extra>\",\n    )\n)\n\nfig.add_trace(\n    go.Scatter(\n        x=df[\"date\"],\n        y=df[\"sma_20\"],\n        mode=\"lines\",\n        name=\"SMA 20\",\n        line={\"color\": SMA20_COLOR, \"width\": 2},\n        hovertemplate=\"Date: %{x|%Y-%m-%d}<br>SMA 20: $%{y:.2f}<extra></extra>\",\n    )\n)\n\nfig.add_trace(\n    go.Scatter(\n        x=df[\"date\"],\n        y=df[\"sma_50\"],\n        mode=\"lines\",\n        name=\"SMA 50\",\n        line={\"color\": SMA50_COLOR, \"width\": 2},\n        hovertemplate=\"Date: %{x|%Y-%m-%d}<br>SMA 50: $%{y:.2f}<extra></extra>\",\n    )\n)\n\nfig.add_trace(\n    go.Scatter(\n        x=df[\"date\"],\n        y=df[\"sma_200\"],\n        mode=\"lines\",\n        name=\"SMA 200\",\n        line={\"color\": SMA200_COLOR, \"width\": 2},\n        hovertemplate=\"Date: %{x|%Y-%m-%d}<br>SMA 200: $%{y:.2f}<extra></extra>\",\n    )\n)\n\n# Style\nfig.update_layout(\n    title={\n        \"text\": \"indicator-sma · python · plotly · anyplot.ai\", \"font\": {\"size\": 28, \"color\": INK}, \"x\": 0.5, \"xanchor\": \"center\"\n    },\n    paper_bgcolor=PAGE_BG,\n    plot_bgcolor=PAGE_BG,\n    font={\"color\": INK},\n    xaxis={\n        \"title\": {\"text\": \"Date\", \"font\": {\"size\": 22, \"color\": INK}},\n        \"tickfont\": {\"size\": 18, \"color\": INK_SOFT},\n        \"showgrid\": True,\n        \"gridcolor\": GRID,\n        \"gridwidth\": 1,\n        \"linecolor\": INK_SOFT,\n        \"zerolinecolor\": INK_SOFT,\n    },\n    yaxis={\n        \"title\": {\"text\": \"Price ($)\", \"font\": {\"size\": 22, \"color\": INK}},\n        \"tickfont\": {\"size\": 18, \"color\": INK_SOFT},\n        \"showgrid\": True,\n        \"gridcolor\": GRID,\n        \"gridwidth\": 1,\n        \"tickformat\": \"$.0f\",\n        \"linecolor\": INK_SOFT,\n        \"zerolinecolor\": INK_SOFT,\n    },\n    legend={\n        \"font\": {\"size\": 18, \"color\": INK_SOFT},\n        \"x\": 0.98,\n        \"y\": 0.98,\n        \"xanchor\": \"right\",\n        \"yanchor\": \"top\",\n        \"bgcolor\": ELEVATED_BG,\n        \"bordercolor\": INK_SOFT,\n        \"borderwidth\": 1,\n    },\n    margin={\"l\": 100, \"r\": 60, \"t\": 100, \"b\": 80},\n    hovermode=\"x unified\",\n)\n\n# Save\nfig.write_image(f\"plot-{THEME}.png\", width=1600, height=900, scale=3)\nfig.write_html(f\"plot-{THEME}.html\", include_plotlyjs=\"cdn\")\n"}