<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://druce.ai/feed.xml" rel="self" type="application/atom+xml" /><link href="https://druce.ai/" rel="alternate" type="text/html" /><updated>2026-03-05T00:17:37+00:00</updated><id>https://druce.ai/feed.xml</id><title type="html">Druce.ai</title><subtitle>A Blog on AI, Tech, Markets and Random Stuff, by Druce Vertes</subtitle><author><name>Druce Vertes</name></author><entry><title type="html">Speedrunning the Claude Code learning curve</title><link href="https://druce.ai/2026/02/claude-code" rel="alternate" type="text/html" title="Speedrunning the Claude Code learning curve" /><published>2026-02-16T01:01:01+00:00</published><updated>2026-02-16T01:01:01+00:00</updated><id>https://druce.ai/2026/02/claude_code</id><content type="html" xml:base="https://druce.ai/2026/02/claude-code"><![CDATA[<blockquote>
  <p>Claude Code, Anthropic’s agentic coding command-line interface (CLI) tool, has been a growing phenomenon.</p>

  <p>What we will cover:</p>

  <ul>
    <li>A quick start for those who haven’t tried it</li>
    <li>Best practices and how to climb the ladder to being a Claude Code AI coding expert</li>
  </ul>
</blockquote>
<figure>
<picture>
  <source srcset="/assets/2025/Claude_code.png" type="image/png" />
  <img src="/assets/2025/Claude_code.png" alt="Claude Code" fetchpriority="high" style="width: 100%; height: auto;" />
</picture>
</figure>

<!--more-->

<p>One year ago, on February 24, 2025. Anthropic released Claude Code. Today, everyone can be a 10x developer, and it is causing enterprises to rethink dev toolchains, pipelines, and stacks, and markets to rethink valuations.</p>

<p>Claude Code is Anthropic’s agentic coding tool — a command-line interface (CLI) that lets you delegate coding tasks directly to Claude AI to automate development tasks. It understands your entire codebase and can work for extended periods across multiple files and tools to get tasks done.</p>

<h2 id="levels-of-coding-assistance">Levels of Coding Assistance</h2>

<table>
  <thead>
    <tr>
      <th>Level</th>
      <th>Description</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>0</td>
      <td><strong>Spicy autocomplete</strong>: Tab-completion on steroids</td>
    </tr>
    <tr>
      <td>1</td>
      <td><strong>Intern</strong>: Code boilerplate, comments, etc.</td>
    </tr>
    <tr>
      <td>2</td>
      <td><strong>Junior dev / pair programmer</strong>: Review each other’s code, delegate boring stuff</td>
    </tr>
    <tr>
      <td>3</td>
      <td><strong>Senior dev</strong>: You are its manager and guide; it does most of the work</td>
    </tr>
    <tr>
      <td>4</td>
      <td><strong>Engineering team</strong>: You work out longer tasks; it can work for hours</td>
    </tr>
    <tr>
      <td>5</td>
      <td><strong>Lights-out software factory</strong>: You give it plain language; it goes and executes</td>
    </tr>
  </tbody>
</table>

<p>Source: <a href="https://www.danshapiro.com/blog/2026/01/the-five-levels-from-spicy-autocomplete-to-the-software-factory/">The Five Levels from Spicy Autocomplete to the Software Factory</a> — Dan Shapiro</p>

<p>This guide should get you to level 2–3 and provide a roadmap to get to 4–5.</p>

<h2 id="why-is-claude-code-innovative-is-it-really-this-time-is-different">Why is Claude Code innovative, is it really ‘this time is different’?</h2>

<ul>
  <li><strong>Excellent models</strong>: Sonnet and Opus, multi-model to ‘see’ output, tool-calling, long 200k context window (1m for Opus and Sonnet with extra charges). <a href="https://arena.ai/leaderboard/code">Curretnly rated significantly better than competitors for coding.</a></li>
  <li><strong>A simple, effective harness with a ReAct control loop</strong>: Plan → code → test → iterate as necessary. (<a href=""></a>)</li>
  <li><strong>Plan-driven long-term memory</strong>: It writes plans in <code class="language-plaintext highlighter-rouge">.md</code> files and uses them to stay on task. The ability to think and plan before acting, and then stay on plan, enables far longer and more complex work compared to vanilla single-turn LLM chat. It’s why ‘this time is different.’</li>
  <li><strong>Rich internal tooling</strong>: A plethora of internal tools and subagents to understand, find, and edit code — plus MCP tool integrations. Good tools that look up exact function signatures or retrieve precise documentation outperform generic web searches  or putting full code files in context, or large doc pages. (ChatGPT would often give answers from an outdated API due to training data cutoff; if you have a tool that fetches the exact doc or code you need, and patches a specific line of code, everything works better.) Along with the way it makes plans and notes to aid memory, this helps <em>context management</em>, Claude Code is carefully designed to have exactly what it needs in the context at all times.</li>
  <li><strong>Integration</strong>: The CLI can do anything you can do on your computer from the command line, and control a browser. There is a growing community of skills, MCP servers and plugins, with strong third-party integration support for many SaaS platforms. (OpenAI’s Codex is good and adopting MCP and skills, but their strategy seems to be to push you toward their walled garden.)</li>
  <li><strong>Multi-tasking subagents</strong>: Spawn isolated agents for parallel work.</li>
  <li><strong>Continuous improvement</strong>: Anthropic can collect traces and up/down votes from Claude Code usage and integrate them into RLHF training, they have a flywheel going. More mature than OpenAI Codex and Gemini CLI which are closest comparisons. IDEs like Cursor, Windsurf, GitHub Copilot in VS Code are also developing agentic coding assistants. Combining Claude Code with your favorite IDE is most typical best practice.</li>
  <li><strong>Autonomous operation</strong>: Can even run autonomously for many hours if you have the token quota and the right hooks (like <a href="https://github.com/snarktank/ralph">Ralph</a>).</li>
  <li><strong>Real-world reliability</strong>: Claude Code can now solve complex problems and refactors, run for 30+ minutes on a complex plan without getting off track, understand brownfield codebases, produce minimal slop, get things 90%+ right, and fix most remaining issues iteratively.</li>
  <li><a href="https://crawshaw.io/blog/eight-more-months-of-agents">Usable code output has climbed from &lt; 50% to &gt; 90%</a></li>
  <li><a href="https://code.claude.com/docs/en/how-claude-code-works">Anthropic: How Claude Code Works</a></li>
  <li><a href="https://www.youtube.com/watch?v=RFKCzGlAU6Q">YouTube: How Claude Code Works</a></li>
</ul>

<p>With Claude Code, instead of being a developer with an assistant, you get promoted to the team lead of a team of agents planning and building stuff for you. You become more of a conductor leading an orchestra, and they do more of the work than was the case with GitHub Copilot, Cursor, Windsurf etc. And hopefully this makes you more productive. It’s getting closer to the autonomous engineer we were promised with e.g. Devin.</p>

<p>Claude Code’s power comes with a bit of a learning curve, but it’s well worth it; let’s get started.</p>

<h2 id="getting-started">Getting Started</h2>

<h3 id="install">Install</h3>

<ul>
  <li><a href="https://code.claude.com/docs/en/setup">Set up Claude Code</a></li>
  <li>Pricing: <a href="https://claude.com/pricing">Pro</a>, <a href="https://claude.com/pricing/max">$100 and $200 Max plans</a>. Start with Pro to learn, once you do real work you will run out of tokens from time to time, Pro gives you limited tokens in a 4-5 hour window. Use <code class="language-plaintext highlighter-rouge">/status</code> to see where you are with usage and when it resets. Once you start developing big plans that code for 30 minutes, you will run out very fast in Pro, need a $100 Max plan. The $200 plan is if you have multiple sessions and sub-agents running at once, or otherwise are running out in the $100 plan.</li>
  <li>Launch in a terminal window with command <code class="language-plaintext highlighter-rouge">claude</code>.</li>
  <li>This post is about the CLI. You can also use Claude Code within the desktop app and Web UI, but it is much more sandboxed out of the box. As a CLI running in your terminal without explicit permission restrictions and sandboxing, Claude Code can do anything you can do (so be careful!).</li>
</ul>

<h3 id="essential-commands-and-navigation">Essential Commands and Navigation</h3>

<ul>
  <li>Start <code class="language-plaintext highlighter-rouge">claude</code> in the root of your project, Claude.md and other files are typically project-specific.</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/</code> commands</strong> — Type <code class="language-plaintext highlighter-rouge">/</code> to see all available commands.</li>
  <li>tab - Autocomplete commands and file paths</li>
  <li><code class="language-plaintext highlighter-rouge">Up</code> / <code class="language-plaintext highlighter-rouge">Down</code>Navigate prompt history (works across sessions)</li>
  <li>! run a shell command</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/status</code></strong> — Show current session status.</li>
  <li><strong>Status line</strong> — Customizable; you can display context usage %, etc. using <code class="language-plaintext highlighter-rouge">/statusline</code>. Try <code class="language-plaintext highlighter-rouge">/statusline what can I display?</code>, <code class="language-plaintext highlighter-rouge">/statusline set up a status line showing cwd, model, context percentage, with a progress bar</code> . It’s a shell script, can access any environment variables, commands like <code class="language-plaintext highlighter-rouge">git status</code>, etc. Docs: <a href="https://code.claude.com/docs/en/statusline">Status Line</a></li>
  <li><strong><code class="language-plaintext highlighter-rouge">[Shift+Tab]</code></strong> — Toggle between Plan mode (don’t code, just plan), and Default mode (prompt before code edits), and Auto-accept mode (accept all code edits).</li>
  <li><strong><code class="language-plaintext highlighter-rouge">@</code> files</strong> — Reference specific files in prompts with <code class="language-plaintext highlighter-rouge">@myfile.txt</code>.</li>
  <li><strong>Drag and drop</strong> images, or paste with <strong>Ctrl+V</strong> (not Cmd+V on Mac). Claude Code can read screenshots, images, diagrams. Paste a screenshot of a bug to fix. Or prompt it how to create an image output with Figma or Playwright, then check it, and iterate on it.</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/model</code></strong> — Switch between Sonnet and Opus.</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/ide</code></strong> — Claude can integrate with your IDE, see what you selected in IDE, read IDE listing errors etc., put proposed changes inline with diffs</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/vim</code></strong> — can use emacs (default) or vim keybindings in editor. <code class="language-plaintext highlighter-rouge">/keybindings</code> or open <code class="language-plaintext highlighter-rouge">~/.claude/keybindings.json</code> to customize all keybindings.</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/config</code></strong> — Many configuration options.</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/copy</code></strong> — Copy last response to clipboard.</li>
  <li><code class="language-plaintext highlighter-rouge">Ctrl+R</code>Search prompt history</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/resume</code></strong> or <strong><code class="language-plaintext highlighter-rouge">claude --resume</code></strong> and <strong><code class="language-plaintext highlighter-rouge">claude --continue</code></strong> — Resume work in a previous conversation thread where you left off.</li>
  <li><strong><code class="language-plaintext highlighter-rouge">[escape]</code></strong> — stop what it’s doing if you forget to tell it something or it’s going off the rails</li>
  <li><strong><code class="language-plaintext highlighter-rouge">[escape] [escape]</code></strong> or <strong><code class="language-plaintext highlighter-rouge">/rewind</code></strong> — return to earlier point in conversation, get rid of digressive context</li>
  <li><code class="language-plaintext highlighter-rouge">Ctrl+D Ctrl+D</code> Exit Claude Code</li>
  <li>Scan through all the commands with <code class="language-plaintext highlighter-rouge">/</code>. If you don’t know something, ask Claude — it has built-in tools to look up its own docs for you.</li>
  <li><a href="https://code.claude.com/docs/en/interactive-mode">Command line reference</a></li>
  <li><a href="https://code.claude.com/docs/en/cli-reference">Startup options</a>. If you find yourself always running commands at startup you can probably do them with startup options.</li>
</ul>

<h3 id="claudemd---super-important">Claude.md - super important</h3>

<ul>
  <li><strong><code class="language-plaintext highlighter-rouge">/init</code></strong> — Sets up <code class="language-plaintext highlighter-rouge">CLAUDE.md</code> file at project level, analyzes an existing project and saves what it thinks it needs to know to work in the project.</li>
  <li><strong>Project-level</strong> - <code class="language-plaintext highlighter-rouge">CLAUDE.md</code> in repo root or <code class="language-plaintext highlighter-rouge">./.claude/CLAUDE.md</code> - Shared team instructions committed to git. Rules, conventions, and context about how the repo works that every contributor (human or AI) should follow.</li>
  <li><strong>User global</strong> - <code class="language-plaintext highlighter-rouge">~/.claude/CLAUDE.md</code> - Your preferences in your home directory that apply across all projects. Style preferences, default behaviors, and personal rules that follow you everywhere.</li>
  <li><strong>Project memory (local)</strong> - <code class="language-plaintext highlighter-rouge">CLAUDE.local.md</code> - Personal project-specific preferences, not committed to git, each dev has their own.</li>
  <li><strong>Managed</strong> System directory like : <code class="language-plaintext highlighter-rouge">/etc/claude-code/CLAUDE.md</code> (or similar system directory on other OSes). IT administrators can set up preferences for all users.</li>
  <li><strong><code class="language-plaintext highlighter-rouge">Add to CLAUDE.md: ...</code></strong> — puts it in the project instructions file</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/memory</code></strong> — helps you manage memory. Claude.md should generally be rules about the project that you curate carefully. Auto memory is facts and context about the project that Claude discovers and stores automatically, my understanding is, not persistent between sessions, more like working memory scratchpad.</li>
  <li>Keep <code class="language-plaintext highlighter-rouge">CLAUDE.md</code> short: definitely under 150 lines, ideally ~50. Longer files risk Claude forgetting items within them.</li>
  <li><a href="https://github.com/abhishekray07/claude-md-templates">claude.md starter kit</a> — Point Claude at this repo and say: <em>“Improve CLAUDE.md based on these criteria.”</em></li>
  <li>You can do multiple passes of <em>“check my repo changes and update CLAUDE.md”</em> — and update it regularly. It’s a living document describing how your repo works and how you like to develop.</li>
  <li>You can have it reference other files. For instance, say “When building skills, follow patterns and best practices in @CLAUDE_SKILLS_BEST_PRACTICES.md”</li>
  <li><a href="https://code.claude.com/docs/en/memory">Memory</a></li>
</ul>

<h2 id="dev-loop-spec-driven-development">Dev Loop: Spec-Driven Development</h2>

<h3 id="recommended-plugins">Recommended Plugins</h3>

<ul>
  <li>
    <p>install via <code class="language-plaintext highlighter-rouge">/plugin</code>, I can’t recommend these plugins strongly enough</p>
  </li>
  <li>
    <p><strong>context7</strong> — Look up docs for any Python module (or other languages).</p>
  </li>
  <li>
    <p><strong>Superpowers</strong> — Test-driven development workflow. Started as an open-source community project, now in the Anthropic plugin marketplace. Other similar plugins (these are not recommended, but give you a flavor of what people are doing):</p>

    <ul>
      <li>
        <p><strong>BMAD/Spec Kit</strong>: Persona-based agents (Business Analyst, Architect, Developer, etc.), full PRD workflows — very heavyweight.</p>
      </li>
      <li>
        <p><strong>OpenSpec</strong>: Document-driven planning: Requirements → Design → Tasks → Changes (audit trail).</p>
      </li>
    </ul>
  </li>
  <li><strong>Python-oriented</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">pyright-lsp</code></li>
      <li><code class="language-plaintext highlighter-rouge">code-review</code></li>
    </ul>
  </li>
  <li><strong>Front-end</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">frontend-design</code></li>
      <li><code class="language-plaintext highlighter-rouge">playwright</code> — browser so Claude can visually check its work (or use the Chrome plugin; put your preference in <code class="language-plaintext highlighter-rouge">CLAUDE.md</code>, e.g., <em>“Always check changes using Playwright”</em>).</li>
    </ul>
  </li>
  <li><a href="https://github.com/anthropics/claude-code/tree/main/plugins">Official plugins</a></li>
  <li><a href="https://claudemarketplaces.com/">Plugin marketplaces</a></li>
</ul>

<h3 id="the-development-workflow">The Development Workflow</h3>

<pre><code class="language-mermaid">flowchart TD
    A[Brainstorm] --&gt; B[Plan]
    B --&gt; C{Plan Critic-Optimizer Loop}
    C --&gt; D[Evaluate Plan]
    D --&gt; E[Improve Plan]
    E --&gt; C
    E --&gt; G[Code]
    G --&gt; H{Code Test-Evaluate-Optimize Loop}
    H --&gt; I[Test]
    I --&gt; J[Evaluate Test Results]
    J --&gt; K[Improve Code]
    K --&gt; H
    K --&gt; L[Complete]

    style A fill:#e6f3ff,stroke:#4a90d9
    style B fill:#ffe6f0,stroke:#d94a90
    style C fill:#fff2e6,stroke:#d9a04a
    style D fill:#fff2e6,stroke:#d9a04a
    style E fill:#fff2e6,stroke:#d9a04a
    style G fill:#e6fdff,stroke:#4ac8d9
    style H fill:#e6ffe6,stroke:#4ad94a
    style I fill:#e6ffe6,stroke:#4ad94a
    style J fill:#e6ffe6,stroke:#4ad94a
    style K fill:#e6ffe6,stroke:#4ad94a
    style L fill:#f0e6ff,stroke:#9a4ad9
</code></pre>

<ol>
  <li><strong>Start in Plan mode</strong> — Don’t write code yet. Go back and forth with the LLM to critique and improve the plan.</li>
  <li><strong>Shift+Tab</strong> to toggle between Plan mode (blocks code writing), Default mode (prompts for changes), and Auto-accept mode (makes all changes).</li>
  <li><strong>Pre-approve permissions</strong> — You’ll find you have to approve a lot of bash commands (reading the codebase, looking up docs). Use <code class="language-plaintext highlighter-rouge">/permissions</code> to pre-approve non-destructive commands like <code class="language-plaintext highlighter-rouge">ls</code>. You can also create an alias:
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">alias </span><span class="nv">claudeyolo</span><span class="o">=</span><span class="s1">'claude --dangerously-skip-permissions'</span>
</code></pre></div>    </div>
    <p>But only use this in an environment where it can do no harm, like a throwaway VPC or container. Also consider adding hooks to block destructive commands like <code class="language-plaintext highlighter-rouge">rm</code> and <code class="language-plaintext highlighter-rouge">git</code>.</p>
  </li>
  <li><strong>Brainstorm the plan</strong> — Say: <em>“I would like to brainstorm and create a plan to build [high-level intention].”</em> Then provide detailed info about what you want. The Superpowers plugin will ask questions to help write a plan.</li>
  <li><strong>Read and edit the plan</strong> — It’s your project, not Claude’s, especially at the planning stage. Ctrl-G opens the plan in the editor.</li>
  <li><strong>Cross-check with another AI</strong> — Use e.g. OpenAI Codex to review: <em>“What details and edge cases might I have missed?”</em> Iterate a few times. See: <a href="https://steve-yegge.medium.com/six-new-tips-for-better-coding-with-agents-d4e9c86e42a9">Rule of 5 Passes over Design, Code, etc.</a></li>
  <li><strong>Visual aids welcome</strong> — Give it a sketch, put ASCII art in the plan, or hook up the Figma plugin to mock up a UI.</li>
  <li><strong>Ask questions</strong> — e.g., <em>“What are the tradeoffs between storing data in JSON vs. SQLite vs. Markdown files?”</em></li>
  <li><strong>When the plan looks good, tell it to write the code.</strong></li>
  <li><strong>Error recovery patterns</strong> — If it goes off the rails, keeps producing broken code, or misunderstands the task (interrupt → clarify → <code class="language-plaintext highlighter-rouge">/rewind</code> → retry).</li>
  <li><strong>Important: Include acceptance tests in the plan</strong> — Give Claude a way to verify output: pytest, npm test, Playwright for UI, or rendering a PNG for graphical artifacts. Testable plans let it iterate, easily double the quality of the output. If you don’t have tests, you don’t have a full feedback loop, you are the ‘test’ part of the feedback loop.</li>
  <li><strong>Do several passes of code review</strong> — <a href="https://www.reddit.com/r/ClaudeAI/comments/1q5a90l/so_i_stumbled_across_this_prompt_hack_a_couple/">Example prompt</a>: <em>“Do a git diff and pretend you’re a senior dev doing a code review and you HATE this implementation. What would you criticize? What edge cases am I missing?”</em> Go back and forth with OpenAI for diversity. Use the <code class="language-plaintext highlighter-rouge">code-review</code> plugin or <a href="https://github.com/turingmindai/turingmind-code-review">Turing Skill</a>.</li>
  <li><strong>Fix what you missed</strong> — You’ll probably notice gaps; ask Claude to fix them.</li>
  <li><strong>Don’t be afraid to start over</strong> — It’s cheap. When you realize the architecture is wrong, tell it to write a detailed plan describing everything it did, then build a whole new version in a parallel directory. As Claude Code creator <a href="https://www.reddit.com/r/ClaudeAI/comments/1q2c0ne/claude_code_creator_boris_shares_his_setup_with/">Boris Cherny</a> puts it: <em>“Knowing everything you know, design a more elegant solution.”</em></li>
  <li>A big unlock comes when you use an agentic loop to not just code, but to write detailed plans and specs, and have good tests so Claude Code can test that its code works against the spec. That’s when it starts coding for 30 minutes straight autonomously on a long implementation plan. The other (smaller) unlock is <code class="language-plaintext highlighter-rouge">/ide</code> integration, open Claude Code in the terminal pane in e.g. Cursor, you can see code as it writes it, can select something and ask a question about it.</li>
</ol>

<p>Do what works for you — different people have different workflows. If people can build C compilers and operating systems with these tools, you can probably build most CRUD GUIs. The key is good specs and a way to verify.</p>

<h2 id="context-management-is-the-key">Context Management Is The Key</h2>

<p>Context management is the single most important skill for effective Claude Code usage.</p>

<ul>
  <li><strong>Too little context</strong>: Claude may not know APIs and will hallucinate, focus on the wrong things, or write overly defensive code.</li>
  <li><strong>Too much context</strong>: Claude may forget or fail to retrieve important details.</li>
  <li><strong>Bad context</strong>: Outdated or incorrect information leads to wrong answers.</li>
  <li><strong>Context rot</strong>: Quality tends to fall when context reaches ~50% full.</li>
</ul>

<p>Effective use of Claude Code is about giving it the right context at the right time, including using skills and Claude.md .</p>

<h3 id="essential-context-commands">Essential Context Commands</h3>

<ul>
  <li><strong><code class="language-plaintext highlighter-rouge">/clear</code></strong> — Do one task, then clear context. The 200K token context window (or 1m if enabled with <code class="language-plaintext highlighter-rouge">/model</code>) is large but not all equally usable. <code class="language-plaintext highlighter-rouge">/clear</code> also saves on tokens, and time.</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/context</code></strong> — Shows what Claude is currently tracking: system prompt, <code class="language-plaintext highlighter-rouge">CLAUDE.md</code>, MCP servers, skills, and messages.</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/compact</code></strong> — Summarizes context, but it’s somewhat of a black box. Prefer <code class="language-plaintext highlighter-rouge">/clear</code> and explicit, mindful context management over implicit <code class="language-plaintext highlighter-rouge">/compact</code> or auto-compact.</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/rewind</code></strong> (or <strong>Esc Esc</strong>) — If you had a digression to figure something out, rewind to an earlier point to “forget” useless context.</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/export</code></strong> — Save your context. Helpful if you want to review why Claude did what it did. Some people save at key checkpoints and even commit them to git.</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/resume</code></strong> — Scroll previous conversations and pick up where you left off.</li>
  <li><strong>Escape</strong> — Anytime Claude is going off track, hit Escape to interrupt and redirect.</li>
</ul>

<h2 id="extensions">Extensions</h2>

<h3 id="skills">Skills</h3>

<ul>
  <li><strong>Procedural knowledge</strong> about how to do something with tools and subagents.</li>
  <li>Custom slash commands and skills have been merged, same thing now.</li>
  <li>Any boilerplate task — setting up a project, plan review, code review, security review — you can set up a skill so Claude does it the way you want.</li>
  <li>A skill is a <code class="language-plaintext highlighter-rouge">.md</code> file describing how to do something, with metadata (frontmatter), optionally with <em>scripts</em> and <em>context</em> file data. Importantly, skills always have access to a shell to run commands, that is their native ‘tool’.</li>
  <li><a href="https://resources.anthropic.com/hubfs/The-Complete-Guide-to-Building-Skill-for-Claude.pdf?hsLang=en">Anthropic: Complete Guide to Building Skills</a></li>
  <li><a href="https://code.claude.com/docs/en/skills">Anthropic Docs: Skills</a></li>
  <li>Very easy to build — there’s a built-in skill-builder skill. Just ask Claude to help.</li>
</ul>

<h3 id="mcp-servers">MCP Servers</h3>

<ul>
  <li>An MCP server is a Web server with REST tools Claude Code and AI generally can call as necessary, plus some metadata about when to use them. You configure Claude to say it has access to these tools and here’s when to call them, just like skills. Anytime you ask Claude to do something, if it thinks the tool will help, it calls the tool and uses the output to respond.</li>
  <li>Use the <strong><code class="language-plaintext highlighter-rouge">/mcp</code></strong> command to manage servers.</li>
  <li>A couple of MCP servers is fine; 10+ might be too many. When MCP tool descriptions exceed 10% of your context, Claude automatically defers them and loads tool details on demand (“MCP Tool Search”). But it’s better to start lean.</li>
  <li>A little harder to build than skills, but there’s an MCP builder — ask Claude to help you create an MCP server as e.g. a Python script with FastMCP and tool decorators.</li>
  <li><a href="https://claude.com/connectors">Connectors</a>: Third-party MCP integrations</li>
  <li><a href="https://modelcontextprotocol.io/docs/learn/server-concepts">MCP Documentation</a></li>
</ul>

<h3 id="tools-vs-skills-when-to-use-what">Tools vs. Skills: When to Use What</h3>

<p>It sounds like MCP is similar to skills, but code and a server are mandatory, whereas skills just use prompts and the shell out of the box. There is some overlap. In general, <strong>prefer skills</strong> if they are available. Skills are currently more context-efficient and performant. They use progressive disclosure: by default, only a small metadata summary is loaded; the full instructions load only when needed. MCP servers consume more context; if there are too many, Claude puts them into a meta-tool search index (search for the tool first, then load its details).</p>

<p>If a third party wants to expose functionality that lives on their server, they might host an MCP server you can connect to. But if they have a CLI that exposes the same functionality, packaging it as a skill will generally work better.</p>

<p>In both cases, if prompts aren’t calling the tool/skill when you expect, you may need to improve the descriptive metadata or explicitly tell Claude to use it. If context gets large, Claude forgets things. If an MCP server has many tools, consider making a simpler version.</p>

<p><strong>CLIs are free context for skills.</strong> Claude already knows how to shell out to <code class="language-plaintext highlighter-rouge">gh</code>, <code class="language-plaintext highlighter-rouge">aws</code>, <code class="language-plaintext highlighter-rouge">docker</code>, <code class="language-plaintext highlighter-rouge">psql</code>, <code class="language-plaintext highlighter-rouge">stripe</code>, etc. No tool definitions get loaded. No startup cost.</p>

<table>
  <thead>
    <tr>
      <th>Task</th>
      <th>CLI (preferred)</th>
      <th>MCP (only if needed)</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>GitHub operations</td>
      <td><code class="language-plaintext highlighter-rouge">gh pr create</code>, <code class="language-plaintext highlighter-rouge">gh issue list</code></td>
      <td>GitHub MCP</td>
    </tr>
    <tr>
      <td>AWS operations</td>
      <td><code class="language-plaintext highlighter-rouge">aws s3 ls</code>, <code class="language-plaintext highlighter-rouge">aws ecs describe</code></td>
      <td>AWS MCP</td>
    </tr>
    <tr>
      <td>Database queries</td>
      <td><code class="language-plaintext highlighter-rouge">psql -c "SELECT..."</code></td>
      <td>Postgres MCP</td>
    </tr>
    <tr>
      <td>Docker management</td>
      <td><code class="language-plaintext highlighter-rouge">docker ps</code>, <code class="language-plaintext highlighter-rouge">docker logs</code></td>
      <td>Docker MCP</td>
    </tr>
  </tbody>
</table>

<p><strong>Skill-related tips:</strong></p>

<ul>
  <li>Skills use progressive disclosure and can scale to many — only frontmatter/metadata loads by default.</li>
  <li>If a skill isn’t triggering correctly, improve the frontmatter or prompt Claude explicitly to use it.</li>
  <li>Skills can include context data and accept arguments.</li>
  <li>Use MCP only for external integrations where a skill can’t work.</li>
  <li>Useful meta-skills: <code class="language-plaintext highlighter-rouge">writing-skills</code>, <code class="language-plaintext highlighter-rouge">skill-creator</code> (Anthropic built-in skill).</li>
</ul>

<h3 id="plugins">Plugins</h3>

<ul>
  <li>A plugin is a <strong>packaging mechanism</strong> to distribute skills, MCP servers, hooks, sub-agents, and their associated artifacts.</li>
  <li>Bundles skills (including definitions, scripts and data artifacts), hooks, subagents, MCP servers, into a single installable unit.</li>
</ul>

<h3 id="hooks">Hooks</h3>

<p>Hooks let you run something before or after a chat turn or tool executes.</p>

<ul>
  <li>Use cases: formatters, linters, testers, guardrails.</li>
  <li>14+ hook trigger points (and growing):  SessionStart, UserPromptSubmit, PreToolUse, PermissionRequest, PostToolUse, PostToolUseFailure, Notification, SubagentStart, SubagentStop, Stop, TeammateIdle, TaskCompleted, ConfigChange, PreCompact, SessionEnd.</li>
  <li>Run in YOLO mode (<code class="language-plaintext highlighter-rouge">alias claudeyolo='claude --dangerously-skip-permissions'</code>) but add a hook for destructive commands (<code class="language-plaintext highlighter-rouge">rm</code>, <code class="language-plaintext highlighter-rouge">git</code>, etc.).</li>
  <li>Put guidance in <code class="language-plaintext highlighter-rouge">CLAUDE.md</code> too, but a hook <em>guarantees</em> code will run when something happens.</li>
  <li><strong>Ralph Wiggum plugin</strong>: A hook that intercepts the “stop” event, lets you test when a prompt completes to ensure it met spec, and resumes if necessary. You create a test/promise; on exit, it runs the test. If the desired result hasn’t been achieved, it keeps going — enabling long-running prompts that perpetually find issues and fix them.</li>
  <li><strong>Hook Ideas</strong>
    <ul>
      <li>PreToolUse — File Protection Guard to block edits on certain files</li>
      <li>PostToolUse — Log tool use</li>
      <li>SessionStart — Fetch some real-time stuff you always want initially in context</li>
    </ul>
  </li>
</ul>

<h3 id="cicd-integration">CI/CD Integration</h3>

<ul>
  <li>PR review — Analyzes diffs, finds bugs, flags security issues (often catches logic errors humans miss while humans nitpick variable names).</li>
  <li>Code implementation — Comment “@claude implement this” on an issue, and it creates a PR with working code.</li>
  <li>Bug fixes — “@claude fix this bug” generates a fix PR.</li>
  <li>PR summaries — Generates human-readable summaries of large PRs for easier review.</li>
  <li>Release notes — Trigger on tag push to summarize all PRs in a release.</li>
  <li>CI debugging — Reads workflow logs and diagnoses failures.</li>
  <li>Resources
    <ul>
      <li><a href="https://github.com/anthropics/claude-code-action">Official GitHub Action</a></li>
      <li><a href="https://code.claude.com/docs/en/github-actions">Anthropic docs: GitHub Actions</a></li>
      <li><a href="https://github.com/marketplace/actions/claude-code-action-official">GitHub Marketplace listing</a></li>
    </ul>
  </li>
</ul>

<h3 id="security">Security</h3>

<ul>
  <li>Claude Code CLI runs by default with all the permissions of the user and access to bash, which is too much for many enterprise environments. For instance my Docker was hung, I asked Claude Code to troubleshoot, it fixed it by deleting the troublesome container which was annoying because it had Postgres with some data (Langfuse). Claude Code CLI is <a href="https://www.gartner.com/en/documents/7211030">agentic browsers on steroids and crack</a>.</li>
  <li>To lock down the CLI
    <ul>
      <li>Claude Code has <a href="https://code.claude.com/docs/en/settings">managed settings</a> that override command line arguments, local, project, and user settings. These scopes are parsed in order of precedence:
        <ul>
          <li>Managed settings (highest priority)</li>
          <li>Command line arguments</li>
          <li>Local settings</li>
          <li>Project settings</li>
          <li>User settings (lowest priority)</li>
        </ul>
      </li>
      <li><code class="language-plaintext highlighter-rouge">/sandbox</code> command will let you configure a sandbox to run bash commands in a more restricted container environment.</li>
      <li><code class="language-plaintext highlighter-rouge">/permissions</code> command lets you set permissions regarding what tools Claude Code can access.</li>
      <li>Set up hooks, always intercept some calls you might not like like <code class="language-plaintext highlighter-rouge">rm -rf /</code>.</li>
      <li>Log everything via hooks</li>
      <li>Connect to LLM via proxy and log what it’s doing there. You could even have Claude Code point to a local model and never hit Anthropic using e.g. OpenRouter</li>
      <li>Or consider running in a container with network allowlist to e.g. internal MCPs and select external websites. Can then sandbox at container level, only connect to internal-only MCP tools, some websites.</li>
      <li>After writing some agents and skills, package into a web app that runs by spawning a Claude Code process with headless <code class="language-plaintext highlighter-rouge">claude -p &lt;prompt&gt;</code> (uses monthly Claude Code subsription, or using Claude Agent SDK which is essentially running Claude Code headless via the API (burns API tokens).</li>
      <li>The desktop client and web UI are more locked down out of the box.</li>
    </ul>
  </li>
</ul>

<table>
  <thead>
    <tr>
      <th> </th>
      <th><strong>Claude Code CLI</strong></th>
      <th><strong>Claude.ai (Desktop &amp; Web)</strong></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Where Skills bash tool runs</strong></td>
      <td>Your local machine</td>
      <td>Anthropic cloud container</td>
    </tr>
    <tr>
      <td><strong>OS</strong></td>
      <td>Your OS (macOS/Linux/WSL)</td>
      <td>Ubuntu 24 (sandboxed)</td>
    </tr>
    <tr>
      <td><strong>Working directory</strong></td>
      <td>Your project directory</td>
      <td><code class="language-plaintext highlighter-rouge">/home/claude</code></td>
    </tr>
    <tr>
      <td><strong>Filesystem</strong></td>
      <td>Your real filesystem</td>
      <td>Ephemeral (resets between tasks)</td>
    </tr>
    <tr>
      <td><strong>User files</strong></td>
      <td>Direct access in project</td>
      <td><code class="language-plaintext highlighter-rouge">/mnt/user-data/uploads</code> (read-only)</td>
    </tr>
    <tr>
      <td><strong>Output files</strong></td>
      <td>Written in place</td>
      <td><code class="language-plaintext highlighter-rouge">/mnt/user-data/outputs</code></td>
    </tr>
    <tr>
      <td><strong>Skills system</strong> (<code class="language-plaintext highlighter-rouge">/mnt/skills/</code>)</td>
      <td>❌ Not available</td>
      <td>✅ Yes</td>
    </tr>
    <tr>
      <td><strong>Network access</strong></td>
      <td>Full (your network)</td>
      <td>Restricted allowlist</td>
    </tr>
    <tr>
      <td><strong>Persistence</strong></td>
      <td>Persistent (your disk)</td>
      <td>Resets per session</td>
    </tr>
    <tr>
      <td><strong>MCP servers</strong></td>
      <td>✅ Local config (e.g. <code class="language-plaintext highlighter-rouge">claude_desktop_config.json</code>)</td>
      <td>Web: Internet MCP connectors only. Desktop: Web and local connectors in <code class="language-plaintext highlighter-rouge">claude_desktop_config.json</code></td>
    </tr>
    <tr>
      <td><strong>Package install</strong></td>
      <td>Normal (<code class="language-plaintext highlighter-rouge">pip</code>, <code class="language-plaintext highlighter-rouge">npm</code>)</td>
      <td><code class="language-plaintext highlighter-rouge">pip --break-system-packages</code>, <code class="language-plaintext highlighter-rouge">npm</code></td>
    </tr>
    <tr>
      <td><strong>Desktop MCP Extensions</strong></td>
      <td>✅</td>
      <td>✅ Desktop app only; Install MCP servers with one click, admin-controlled permissions</td>
    </tr>
    <tr>
      <td><strong>Cowork mode</strong></td>
      <td>❌ No Cowork CLI</td>
      <td>✅ Mac / Windows Claude desktop app)</td>
    </tr>
  </tbody>
</table>

<h2 id="advanced-topics">Advanced Topics</h2>

<h3 id="worktrees">Worktrees</h3>

<p>A lot of time is spent waiting for Claude — what do you do? Work on multiple things simultaneously without them clobbering each other.</p>

<ul>
  <li>Git worktrees share the same <code class="language-plaintext highlighter-rouge">.git</code> subfolder.</li>
  <li>Can be annoying if they conflict on npm ports; you can pre-warm 5 worktrees with dependencies.</li>
  <li><a href="https://github.com/max-sixty/worktrunk">worktrunk</a> — A CLI for making worktrees easy.</li>
  <li><a href="https://www.conductor.build/">conductor.build</a> — Mac GUI for managing multiple Claude Code sessions; takes away the complexity of working with worktrees and multiple sessions.</li>
  <li>Can also use multiple terminals / tmux</li>
</ul>

<h3 id="tasks">Tasks</h3>

<p><em>Tasks</em> are like job control in bash, but more.</p>

<ul>
  <li>The simplest use is</li>
</ul>

<p><code class="language-plaintext highlighter-rouge">apply the prompt below to each of the files in the "input" subdirectory. Run using concurrent tasks and save the results as  {filename}.output in the output subdirectory. Prompt: read @{filename} and determine the top 5 most important actionable recommendations</code></p>

<ul>
  <li>
    <p>This should launch 5 background tasks. Use <code class="language-plaintext highlighter-rouge">ctrl-b</code> to make the current task a background task.</p>
  </li>
  <li>
    <p>Use <code class="language-plaintext highlighter-rouge">/tasks</code> to view a list of the running tasks, and select any of them to view their output.</p>
  </li>
</ul>

<p><a href="https://x.com/trq212/status/2014480496013803643">Tasks are the replacement for deprecated todos</a>. <em>Unlike todos</em> and the processes you can manage with job control in bash, tasks add persistent storage and explicit dependencies. See also <a href="https://pub.spillwave.com/claude-code-todos-to-tasks-5a1b0e351a1c">this article</a>.</p>

<p>As a more complex pattern, you can create a <a href="/assets/2025/plan.md"><code class="language-plaintext highlighter-rouge">plan.md</code></a> with a dependency graph expressed as markdown, then run a prompt like:</p>

<p><code class="language-plaintext highlighter-rouge">Read plan.md. Create tasks with TaskCreate for each incomplete item, 
wiring blockedBy dependencies from the file. Skip completed tasks — 
treat them as resolved preconditions only.</code></p>

<p><code class="language-plaintext highlighter-rouge">Start with all tasks that have no unresolved blockers and run them 
in parallel where possible, sequentially where blocked. Delegate each 
task to a subagent.</code></p>

<p><code class="language-plaintext highlighter-rouge">After each task completes, update plan.md to reflect the new status 
before starting the next wave. Continue until all tasks are complete.</code></p>

<h3 id="subagents">Subagents</h3>

<p><strong>Multi-agent orchestration pattern.</strong> Each subagent runs in its own isolated context with its own tools, model, and permissions — like spinning up a fresh Claude session for a specific task. This keeps the main context clean. In contrast, skills are called in the current context.</p>

<p><strong>Note</strong>: Subagents use the Task tool to run concurrently in their own execution context. Subagents <em>cannot</em> spawn other subagents. If you need nested delegation, chain subagents from the main conversation, or use skills.</p>

<h5 id="built-in-agents">Built-in agents</h5>

<p>Claude Code ships with several built-in subagents it uses automatically:</p>

<table>
  <thead>
    <tr>
      <th>Agent</th>
      <th>Model</th>
      <th>Role</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Explore</strong></td>
      <td>Haiku</td>
      <td>Codebase search and exploration (read-only)</td>
    </tr>
    <tr>
      <td><strong>Plan</strong></td>
      <td>Inherits</td>
      <td>Gathers context before presenting a plan (read-only)</td>
    </tr>
    <tr>
      <td><strong>General-purpose</strong></td>
      <td>Inherits</td>
      <td>Complex research + code modifications</td>
    </tr>
    <tr>
      <td><strong>Bash</strong></td>
      <td>Inherits</td>
      <td>Terminal commands in a separate context</td>
    </tr>
    <tr>
      <td><strong>statusline-setup</strong></td>
      <td>Sonnet</td>
      <td>Configures your <code class="language-plaintext highlighter-rouge">/statusline</code></td>
    </tr>
    <tr>
      <td><strong>Claude Code Guide</strong></td>
      <td>Haiku</td>
      <td>Answers questions about Claude Code itself</td>
    </tr>
  </tbody>
</table>

<h5 id="managing-agents">Managing agents</h5>

<ul>
  <li><strong><code class="language-plaintext highlighter-rouge">/agents</code></strong> — browse, create, and manage agents interactively. Select <em>Create new agent</em>, describe what it does, pick tools, model, and background color.</li>
  <li><strong>Explicit invocation</strong>: <em>“Use the code-reviewer subagent to look at my recent changes”</em> — Claude delegates to a specific agent on request.</li>
  <li><strong>Auto-delegation</strong>: Claude automatically picks the right subagent based on your request and each agent’s <code class="language-plaintext highlighter-rouge">description</code> field.</li>
</ul>

<h5 id="creating-custom-subagents">Creating custom subagents</h5>

<p>A subagent is a <code class="language-plaintext highlighter-rouge">.md</code> file with YAML frontmatter + a system prompt. Two scopes:</p>

<ul>
  <li><strong>Project</strong>: <code class="language-plaintext highlighter-rouge">.claude/agents/name.md</code> — committed to git, team-shared</li>
  <li><strong>User</strong>: <code class="language-plaintext highlighter-rouge">~/.claude/agents/name.md</code> — personal, available in all projects</li>
</ul>

<p>Example:</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">name</span><span class="pi">:</span> <span class="s">code-reviewer</span>
<span class="na">description</span><span class="pi">:</span> <span class="s">Expert code review. Use proactively after writing or modifying code.</span>
<span class="na">tools</span><span class="pi">:</span> <span class="s">Read, Grep, Glob, Bash</span>
<span class="na">model</span><span class="pi">:</span> <span class="s">sonnet</span>
<span class="nn">---</span>

You are a senior code reviewer. Run git diff, review modified files, and report:
<span class="p">-</span> Critical issues (must fix)
<span class="p">-</span> Warnings (should fix)
<span class="p">-</span> Suggestions (consider improving)
</code></pre></div></div>

<p>Key frontmatter fields:</p>

<table>
  <thead>
    <tr>
      <th>Field</th>
      <th>Description</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">name</code></td>
      <td>Unique identifier (lowercase, hyphens)</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">description</code></td>
      <td>When Claude should delegate to this agent — write this carefully</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">tools</code></td>
      <td>Allowlist of tools; inherits all if omitted</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">disallowedTools</code></td>
      <td>Denylist of tools</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">model</code></td>
      <td><code class="language-plaintext highlighter-rouge">sonnet</code>, <code class="language-plaintext highlighter-rouge">opus</code>, <code class="language-plaintext highlighter-rouge">haiku</code>, or <code class="language-plaintext highlighter-rouge">inherit</code> (default)</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">permissionMode</code></td>
      <td><code class="language-plaintext highlighter-rouge">default</code>, <code class="language-plaintext highlighter-rouge">acceptEdits</code>, <code class="language-plaintext highlighter-rouge">dontAsk</code>, <code class="language-plaintext highlighter-rouge">bypassPermissions</code>, or <code class="language-plaintext highlighter-rouge">plan</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">maxTurns</code></td>
      <td>Max agentic turns before stopping</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">skills</code></td>
      <td>Skills to inject at startup (full content, not lazy-loaded)</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">mcpServers</code></td>
      <td>MCP servers available to this agent</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">memory</code></td>
      <td><code class="language-plaintext highlighter-rouge">user</code>, <code class="language-plaintext highlighter-rouge">project</code>, or <code class="language-plaintext highlighter-rouge">local</code> — enables persistent cross-session learning</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">background</code></td>
      <td><code class="language-plaintext highlighter-rouge">true</code> to always run as a background task</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">isolation</code></td>
      <td><code class="language-plaintext highlighter-rouge">worktree</code> — runs in a temporary git worktree, cleaned up after</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">hooks</code></td>
      <td>Scoped lifecycle hooks (<code class="language-plaintext highlighter-rouge">PreToolUse</code>, <code class="language-plaintext highlighter-rouge">PostToolUse</code>, <code class="language-plaintext highlighter-rouge">Stop</code>)</td>
    </tr>
  </tbody>
</table>

<p>You can also define session-only agents at launch:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>claude <span class="nt">--agents</span> <span class="s1">'{"code-reviewer": {"description": "...", "prompt": "...", "tools": ["Read", "Grep"]}}'</span>
</code></pre></div></div>

<h5 id="foreground-vs-background">Foreground vs. background</h5>

<ul>
  <li><strong>Foreground</strong> (default): blocks the main conversation, permission prompts pass through to you.</li>
  <li><strong>Background</strong>: runs concurrently while you keep working. Claude asks for tool permissions upfront, then auto-denies anything not pre-approved. Press <strong>Ctrl+B</strong> to background a running task, or ask: <em>“run this in the background.”</em> MCP tools are not available to background agents.</li>
</ul>

<h4 id="persistent-memory">Persistent memory</h4>

<p>Give a subagent memory that builds up over time across sessions:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">memory</span><span class="pi">:</span> <span class="s">user</span>      <span class="c1"># ~/.claude/agent-memory/&lt;name&gt;/ — all projects</span>
<span class="na">memory</span><span class="pi">:</span> <span class="s">project</span>   <span class="c1"># .claude/agent-memory/&lt;name&gt;/ — project-specific, shared via git</span>
<span class="na">memory</span><span class="pi">:</span> <span class="s">local</span>     <span class="c1"># .claude/agent-memory-local/&lt;name&gt;/ — project-specific, gitignored</span>
</code></pre></div></div>

<p>First 200 lines of the agent’s <code class="language-plaintext highlighter-rouge">MEMORY.md</code> load into every session. Prompt it: <em>“Check your memory before starting, and update it when done.”</em></p>

<h5 id="worktree-isolation">Worktree isolation</h5>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">isolation</span><span class="pi">:</span> <span class="s">worktree</span>
</code></pre></div></div>

<p>Runs the agent in a temporary git worktree — a clean copy of the repo. Great for risky experiments. The worktree is automatically deleted if no changes are made.</p>

<h5 id="resuming-subagents">Resuming subagents</h5>

<p>Each invocation starts fresh. To continue a previous run: <em>“Continue that code review and now analyze the authorization module.”</em> Claude resumes with full conversation history. Transcripts live at <code class="language-plaintext highlighter-rouge">~/.claude/projects/{project}/{sessionId}/subagents/</code>.</p>

<h5 id="good-use-cases">Good use cases</h5>

<ul>
  <li><strong>Code review</strong>: isolated context, read-only tools — <em>“Have the code-reviewer check my recent changes”</em></li>
  <li><strong>Deep research</strong>: send it to gather findings without polluting the main context</li>
  <li><strong>Parallel work</strong>: multiple background agents on independent tasks</li>
  <li><strong>Risky experiments</strong>: use <code class="language-plaintext highlighter-rouge">isolation: worktree</code> so it can’t break your working tree</li>
  <li>
    <p><strong>Persistent specialists</strong>: a <code class="language-plaintext highlighter-rouge">debugger</code> or <code class="language-plaintext highlighter-rouge">data-scientist</code> agent that builds domain knowledge over time via <code class="language-plaintext highlighter-rouge">memory</code></p>
  </li>
  <li><a href="https://code.claude.com/docs/en/sub-agents#create-custom-subagents">Docs: Creating Custom Subagents</a></li>
  <li><a href="https://github.com/VoltAgent/awesome-claude-code-subagents">Awesome Claude Code Subagents</a></li>
</ul>

<h3 id="agent-teams">Agent Teams</h3>

<p>Agent teams let you coordinate multiple Claude Code instances working together. One session acts as the <strong>team lead</strong>, coordinating work and assigning tasks. <strong>Teammates</strong> work independently, each in its own context window, and can communicate directly with each other — not just with the lead.</p>

<blockquote>
  <p><strong>Status</strong>: Experimental. Enable by adding to <code class="language-plaintext highlighter-rouge">settings.json</code>:</p>
  <div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w"> </span><span class="nl">"env"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS"</span><span class="p">:</span><span class="w"> </span><span class="s2">"1"</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span><span class="w">
</span></code></pre></div>  </div>
</blockquote>

<p>####@ Subagents vs. Agent Teams</p>

<table>
  <thead>
    <tr>
      <th> </th>
      <th>Subagents</th>
      <th>Agent Teams</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Context</strong></td>
      <td>Own window; results return to caller</td>
      <td>Own window; fully independent</td>
    </tr>
    <tr>
      <td><strong>Communication</strong></td>
      <td>Report back to main agent only</td>
      <td>Teammates message each other directly</td>
    </tr>
    <tr>
      <td><strong>Coordination</strong></td>
      <td>Main agent manages all work</td>
      <td>Shared task list, self-coordinating</td>
    </tr>
    <tr>
      <td><strong>Best for</strong></td>
      <td>Focused tasks where only result matters</td>
      <td>Complex work needing discussion and collaboration</td>
    </tr>
    <tr>
      <td><strong>Token cost</strong></td>
      <td>Lower</td>
      <td>Higher (each teammate is a full Claude instance)</td>
    </tr>
  </tbody>
</table>

<p>Use <strong>agent teams</strong> when workers need to talk to each other: share findings, challenge each other, and coordinate on their own. Use <strong>subagents</strong> when you workers that just report results back to the caller. Agent teams add complexity and burn more tokens.</p>

<h5 id="starting-a-team">Starting a Team</h5>

<p>Tell Claude what you want in natural language — it creates the team, spawns teammates, and coordinates based on your prompt. This works well because the three roles are independent:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Create an agent team to design a CLI TODO tracker: one teammate on UX,
one on technical architecture, one playing devil's advocate.
</code></pre></div></div>

<p>Or be explicit about size and models:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Create a team with 4 teammates to refactor these modules in parallel.
Use Sonnet for each teammate.
</code></pre></div></div>

<h5 id="architecture">Architecture</h5>

<table>
  <thead>
    <tr>
      <th>Component</th>
      <th>Role</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Team lead</strong></td>
      <td>Main session that creates the team, spawns teammates, coordinates work</td>
    </tr>
    <tr>
      <td><strong>Teammates</strong></td>
      <td>Separate Claude Code instances, each working on assigned tasks</td>
    </tr>
    <tr>
      <td><strong>Task list</strong></td>
      <td>Shared list of work items teammates claim and complete (with dependency tracking)</td>
    </tr>
    <tr>
      <td><strong>Mailbox</strong></td>
      <td>Messaging system for direct agent-to-agent communication</td>
    </tr>
  </tbody>
</table>

<p>Team config and tasks are stored locally:</p>
<ul>
  <li><code class="language-plaintext highlighter-rouge">~/.claude/teams/{team-name}/config.json</code></li>
  <li><code class="language-plaintext highlighter-rouge">~/.claude/tasks/{team-name}/</code></li>
</ul>

<h5 id="display-modes">Display Modes</h5>

<ul>
  <li><strong>In-process</strong> (default): all teammates run inside your terminal. Use <code class="language-plaintext highlighter-rouge">Shift+Down</code> to cycle through teammates and talk to them. Press <code class="language-plaintext highlighter-rouge">Ctrl+T</code> to toggle the task list.</li>
  <li><strong>Split panes</strong>: each teammate gets its own pane. Requires <code class="language-plaintext highlighter-rouge">tmux</code> or iTerm2 with the <code class="language-plaintext highlighter-rouge">it2</code> CLI.</li>
</ul>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w"> </span><span class="nl">"teammateMode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"in-process"</span><span class="w"> </span><span class="p">}</span><span class="w">   </span><span class="err">//</span><span class="w"> </span><span class="err">settings.json</span><span class="w">
</span></code></pre></div></div>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>claude <span class="nt">--teammate-mode</span> <span class="k">in</span><span class="nt">-process</span>  // override per session
</code></pre></div></div>

<p>The default <code class="language-plaintext highlighter-rouge">"auto"</code> uses split panes if already inside <code class="language-plaintext highlighter-rouge">tmux</code>, otherwise in-process.</p>

<h5 id="controlling-the-team">Controlling the Team</h5>

<p><strong>Assign tasks</strong>: tell the lead to assign specific work to specific teammates, or let teammates self-claim from the shared task list after finishing.</p>

<p><strong>Plan approval</strong>: require teammates to plan before implementing:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Spawn an architect teammate to refactor auth. Require plan approval before they make changes.
</code></pre></div></div>
<p>Teammates stay in read-only plan mode until the lead approves; the lead can reject with feedback.</p>

<p><strong>Talk directly to teammates</strong>: in in-process mode, <code class="language-plaintext highlighter-rouge">Shift+Down</code> cycles to any teammate — type to send them a message or hit <code class="language-plaintext highlighter-rouge">Escape</code> to interrupt their turn.</p>

<p><strong>Shut down teammates</strong>:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Ask the researcher teammate to shut down.
</code></pre></div></div>

<p><strong>Clean up</strong> (always do this from the lead, not a teammate):</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Clean up the team.
</code></pre></div></div>

<h5 id="quality-gates-via-hooks">Quality Gates via Hooks</h5>

<ul>
  <li><strong><code class="language-plaintext highlighter-rouge">TeammateIdle</code></strong> — runs when a teammate finishes; exit code 2 keeps the teammate working with feedback.</li>
  <li><strong><code class="language-plaintext highlighter-rouge">TaskCompleted</code></strong> — runs when a task is being marked complete; exit code 2 blocks completion and sends feedback.</li>
</ul>

<h5 id="best-use-cases">Best Use Cases</h5>

<ul>
  <li><strong>Parallel code review</strong>: spawn a security reviewer, a performance reviewer, and a test-coverage reviewer simultaneously — each applies a different lens to the same PR.</li>
  <li><strong>Competing hypotheses for debugging</strong>: each teammate investigates a different root cause theory and actively tries to disprove the others’.</li>
  <li><strong>New features across layers</strong>: frontend teammate, backend teammate, test teammate each own their piece without stepping on each other.</li>
  <li><strong>Research with multiple angles</strong>: explore a design space in parallel (UX, architecture, devil’s advocate) and synthesize findings.</li>
</ul>

<h5 id="best-practices">Best Practices</h5>

<ul>
  <li><strong>Give teammates enough context in the spawn prompt</strong> — they don’t inherit the lead’s conversation history.</li>
  <li><strong>Size tasks right</strong>: too small and coordination overhead exceeds the benefit; too large and mates work too long without check-ins. Aim for 5–6 tasks per teammate.</li>
  <li><strong>Avoid file conflicts</strong> — break work so each teammate owns different files.</li>
  <li><strong>Start with research/review tasks</strong> to get comfortable before attempting parallel implementation.</li>
  <li><strong>Monitor and steer</strong> — check in on teammates, redirect failing approaches early.</li>
  <li><strong>Start with research and review</strong> — less coordination risk than parallel implementation.</li>
</ul>

<h5 id="limitations">Limitations</h5>

<ul>
  <li><code class="language-plaintext highlighter-rouge">/resume</code> and <code class="language-plaintext highlighter-rouge">/rewind</code> don’t restore in-process teammates.</li>
  <li>Task status can lag — teammates sometimes fail to mark tasks complete.</li>
  <li>One team per session; teammates can’t spawn sub-teams.</li>
  <li>
    <p>Split panes require <code class="language-plaintext highlighter-rouge">tmux</code> or iTerm2 — not supported in VS Code terminal, Windows Terminal, or Ghostty.</p>
  </li>
  <li><a href="https://code.claude.com/docs/en/agent-teams">Docs: Agent Teams</a></li>
</ul>

<h3 id="ralph">Ralph</h3>

<p>The <a href="https://ghuntley.com/loop/">Ralph Wiggum technique, created by Geoffrey Huntley</a>, is a method for running Claude Code in autonomous loops that iterate until a task is complete — named after the lovably persistent Simpsons character. You have a prompt completion hook that checks the previous task and continues if something is not totally right, and queues the next task. It’s now in the officially maintained Anthropic marketplace directory.</p>
<ul>
  <li><a href="https://github.com/frankbria/ralph-claude-code">Claude plugin</a></li>
  <li><a href="https://github.com/ghuntley/how-to-ralph-wiggum">How to Ralph Wiggum</a></li>
</ul>

<h3 id="frontier-stuff">Frontier stuff</h3>

<ul>
  <li><a href="https://steve-yegge.medium.com/welcome-to-gas-town-4f25ee16dd04">Steve Yegge’s Gas Town</a> , multiple instances of agents that share memory and  talk to each other</li>
  <li><a href="https://agent-flywheel.com/">Jeff Emanuel’s Agent Flywheel</a> . Similar, can spread work across multiple Claude Code, OpenAI Codex, Gemini CLI instances so you are never rate-limited.</li>
</ul>

<h2 id="other-best-practices--recap">Other Best Practices / Recap</h2>
<ul>
  <li><strong>Terminal apps</strong> like <a href="https://sw.kovidgoyal.net/kitty/">kitty</a>, <a href="https://ghostty.org/">ghostty</a>, <a href="https://wezterm.org/index.html">wezterm</a>,  <a href="https://iterm2.com/">iterm2</a>, have advanced features that let claude show images, links, split panes etc., and are recommended over default native terminals. (also running in your ide terminal pane)</li>
  <li><strong>Keep asking questions</strong> — Claude Code can tell you how to use itself, how to write prompts, and how to build things. If you want to learn subagents, ask: <em>“I do this task a lot; I’d like to make a custom subagent that can accomplish it.”</em></li>
  <li><strong>Get the right plugins for your task</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">context7</code> — Pull in all the docs.</li>
      <li>Front-end: <code class="language-plaintext highlighter-rouge">frontend-design</code>, Playwright (so Claude can see its output).</li>
      <li>Python: <code class="language-plaintext highlighter-rouge">pyright-lsp</code> for parse tree understanding, <code class="language-plaintext highlighter-rouge">code-review</code> for code review and simplification.</li>
    </ul>
  </li>
  <li><strong>Use the Superpowers plugin for brainstorming</strong>, or OpenSpec for document-driven plans.</li>
  <li><strong>Always start in Plan mode.</strong></li>
  <li><strong>Be as specific as possible</strong> when telling Claude Code what do do, but try not to clutter the context with irrelevant details, or Claude may forget important details. It can help to specify skills and tools you want Claude to use, like: check the latest Claude docs with <code class="language-plaintext highlighter-rouge">claude-code-guide</code>.</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/clear</code> context often</strong>, saves tokens and works faster and better without confusing Claude. Docs: <a href="https://code.claude.com/docs/en/costs#reduce-token-usage">Reducing token usage</a></li>
  <li><strong>Git integration</strong> — Claude Code has native awareness of <code class="language-plaintext highlighter-rouge">git diff</code>, branch context, and how to leverage it for PR descriptions, commit messages, and changelog generation. There is a github plugin. <strong>Commit often.</strong></li>
  <li><code class="language-plaintext highlighter-rouge">/doctor</code> for info about config, current v. stable version. Some way wish to keep people on the latest stable version. Update version with <code class="language-plaintext highlighter-rouge">claude update</code></li>
  <li>Opus for complex planning and complex tasks, can usually use Sonnet for coding (managing token cost); switch with <code class="language-plaintext highlighter-rouge">/model</code>.</li>
  <li><strong>Multiple plan iterations for complex work</strong> — Tell Claude to write the plan to an <code class="language-plaintext highlighter-rouge">.md</code> file, edit it yourself, ask a different AI (like Codex) to review.</li>
  <li><strong>The dev loop</strong>: Plan → Code (with tests) → Code review → Iterate.</li>
  <li><strong>The “god prompt”</strong>: <em>“You’re a cranky senior developer who hates me and my code. Tell me everything that’s wrong — all the edge cases I missed.”</em></li>
  <li><strong>It’s cheap to throw away and start over</strong> — Say: <em>“Write a new version that does the same thing but structures it like this.”</em> The previous version functions as a spec. You may do this 2–3 times, because the first build reveals what you were missing, then you add the kitchen sink (<a href="https://en.wikipedia.org/wiki/Second-system_effect">Brooks’s Second-System Syndrome</a>), then you realize much of the additions are unnecessary or simpler approaches can be generalized.</li>
  <li><strong>Sandbox as thoroughly as possible</strong> — You might be tempted to develop with access to a production resource like a database or API — don’t. All bets are off. YOLO in a sandbox, then PR into a feature branch when something works.</li>
  <li><strong>Voice input</strong> — Some people swear by Wispr Flow voice keyboard for talking to Claude Code.</li>
  <li><strong>Give logs and screenshots</strong> of what happened to help troubleshoot.</li>
  <li><strong>Headless/CI mode</strong> — Running Claude Code in CI pipelines (<code class="language-plaintext highlighter-rouge">claude -p "prompt" --output-format json</code>) for automated code review, test generation, or migration tasks. Can use <strong><code class="language-plaintext highlighter-rouge">--max-turns</code></strong> to control how many autonomous steps Claude takes before stopping for human review. Example: Pipe a log file to Claude:
<code class="language-plaintext highlighter-rouge">cat build-error.txt | claude -p 'concisely explain the root cause of this build error' &gt; output.txt</code>
<code class="language-plaintext highlighter-rouge">cat code.py | claude -p 'analyze this code for bugs' --output-format json &gt; analysis.json</code>
<code class="language-plaintext highlighter-rouge">find --help | claude -p 'read this and find all .py files modified in the last 7 days larger than 10kb'</code>
<code class="language-plaintext highlighter-rouge">ffmpeg --help full | claude -p 'read this and give me the command to extract audio from input.mp4 as 128kbps mp3'</code></li>
  <li><strong>SDK/library mode</strong> — Use <a href="https://platform.claude.com/docs/en/agent-sdk/overview">Claude Code as a module</a> from other scripts or a UI, building custom agentic workflows.</li>
</ul>

<h2 id="concluding-remarks">Concluding remarks</h2>

<h3 id="the-daily-standup-loop-a-weeks-work-every-day">The Daily Standup Loop: A Week’s Work Every Day</h3>

<p>With a workflow based on Ralph, you can run a continuous development cycle that produces a small team’s weekly output every day:</p>

<ul>
  <li>
    <p>Morning standup: Review the PRs and diffs your agents produced overnight. Approve, reject, leave comments — you’re the tech lead now, not the coder.</p>
  </li>
  <li>
    <p>Queue up work: Add tasks to the shared queue with clear specs and tests which AI helped you write.</p>
  </li>
  <li>
    <p>Agents work all day: Agent Teams claim tasks and code in isolated worktrees. In Ralph, loops keep them iterating until tests pass.</p>
  </li>
  <li>
    <p>Evening review: Review PRs, merge what’s good, queue overnight tasks. Agents keep working while you sleep.</p>
  </li>
  <li>
    <p>Repeat: 2–3 hours of reviews and specs per day, continuous output the rest of the time.</p>
  </li>
</ul>

<p>This is not science fiction, early adopters are doing this today. Coding resources are abundant now. Everyone is a 10x coder now. Knowing what to build, cognitive resources for specs and review are the bottleneck, and of course human change management in the org which was always most of the work.</p>

<p>The gap between “Claude as autocomplete” and “24/7 autonomous dev team” is mostly scaffolding: good specs, good tests, good task decomposition, and the discipline to review rather than write.</p>

<p>Go forth and vibe code!</p>

<p><img src="/assets/2025/combined_arrow3.png" alt="From artisanal to industrial" /></p>

<p>Further reading:</p>

<ul>
  <li><a href="https://code.claude.com/docs/en/overview">The documentation is excellent</a>.
    <ul>
      <li><a href="https://code.claude.com/docs/en/common-workflows">Common workflows</a></li>
      <li><a href="https://code.claude.com/docs/en/best-practices">Best practices</a>.</li>
      <li><a href="https://code.claude.com/docs/en/best-practices#avoid-common-failure-patterns">Failure patterns</a></li>
      <li><a href="https://code.claude.com/docs/en/how-claude-code-works">How Claude Code Works</a></li>
    </ul>
  </li>
  <li>Coding Agent Internals:
    <ul>
      <li><a href="https://cline.bot/blog/what-makes-a-coding-agent">What Makes a Coding Agent? (Cline)</a></li>
      <li><a href="https://cefboud.com/posts/coding-agents-internals-opencode-deepdive/">How Coding Agents Actually Work: Inside OpenCode</a></li>
    </ul>
  </li>
  <li>Courses:
    <ul>
      <li><a href="https://anthropic.skilljar.com/claude-code-in-action">Claude Code in Action</a></li>
      <li><a href="https://www.deeplearning.ai/short-courses/claude-code-a-highly-agentic-coding-assistant/">Claude Code: A Highly Agentic Coding Assistant (older)</a></li>
      <li><a href="https://www.sabrina.dev/p/claude-code-full-course-for-beginners">Sabrina.dev</a></li>
    </ul>
  </li>
  <li>Best Practices, tips etc.
    <ul>
      <li><a href="https://github.com/ykdojo/claude-code-tips">Claude Code Tips</a></li>
      <li><a href="https://roadmap.sh/claude-code">Roadmap.sh Step-by-Step guide to becoming a Claude Code expert in 2026</a></li>
      <li><a href="https://github.com/trailofbits/claude-code-config">Trail of Bits</a></li>
      <li><a href="https://simonwillison.net/guides/agentic-engineering-patterns/">Simon Willison: Agentic engineering patterns</a></li>
    </ul>
  </li>
  <li>Extensions
    <ul>
      <li><a href="https://x.com/bcherny/status/2009450715081789767">Code simplifier</a></li>
      <li><a href="MCP for multi-language LSP, utility tools, JetBrains integration">Serena</a></li>
    </ul>
  </li>
  <li>
    <p>Blog posts and recent discussion:</p>

    <ul>
      <li>
        <p><a href="https://crawshaw.io/blog/eight-more-months-of-agents">David Crawshaw: Usable output has climbed from &lt; 50% to &gt; 90%.</a></p>
      </li>
      <li>
        <p><a href="https://x.com/stevesi/status/2019167552794948020">Steven Sinofsky: Software has to move up the value chain or be squeezed — and then presumably humans too.</a></p>
      </li>
      <li>
        <p><a href="https://bsky.app/profile/charity.wtf/post/3md5arapjjc2g">Charity Majors: Humans shift to high ambiguity, high-stakes from low-ambiguity, low-stakes, high volume grunt work.</a></p>
      </li>
      <li>
        <p><a href="https://www.reddit.com/r/singularity/comments/1qnsa0f/andrej_karpathy_on_agentic_programming/">Andrej Karpathy: Moving from vibe coding to agentic engineering </a></p>
      </li>
      <li>
        <p><a href="">Federico Pereiro: LLMs as the new high-level programming language, devs move from code monkey to prompt zookeeper.</a></p>
      </li>
      <li>
        <p><a href="https://simonwillison.net/2026/Feb/9/ai-intensifies-work/">Simon Willison: AI doesn’t reduce work, it intensifies it .</a></p>
      </li>
      <li>
        <p><a href="https://margaretstorey.com/blog/2026/02/09/cognitive-debt/">Margaret-Anne Storey: How Generative and Agentic AI Shift Concern from Technical Debt to Cognitive Debt.</a></p>
      </li>
      <li>
        <p><a href="https://steve-yegge.medium.com/the-ai-vampire-eda6e4f07163">Steve Yegge: Dracula effect, more productivity more exhaustion, need naps </a></p>
      </li>
    </ul>
  </li>
</ul>]]></content><author><name>Druce Vertes</name></author><category term="tech," /><category term="AI" /><category term="AI" /><summary type="html"><![CDATA[A quickstart to Claude Code, Anthropic's agentic coding command-line interface (CLI) tool, and roadmap to being an expert.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://druce.ai/assets/2025/Claude_code.png" /><media:content medium="image" url="https://druce.ai/assets/2025/Claude_code.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Asset Allocation for Midwits: Everything You Always Wanted to Know About Portfolio Optimization But Were Afraid to Ask</title><link href="https://druce.ai/2026/01/portfolio-optimization" rel="alternate" type="text/html" title="Asset Allocation for Midwits: Everything You Always Wanted to Know About Portfolio Optimization But Were Afraid to Ask" /><published>2026-01-31T01:01:01+00:00</published><updated>2026-01-31T01:01:01+00:00</updated><id>https://druce.ai/2026/01/portfolio_optimization</id><content type="html" xml:base="https://druce.ai/2026/01/portfolio-optimization"><![CDATA[<blockquote>
  <p><em>You don’t need to be a rocket scientist. Investing is not a game where the guy with the 160 IQ beats the guy with 130 IQ. Success in investing doesn’t correlate with IQ once you’re above the level of 120. What you need is the temperament to control the urges that get other people into trouble in investing. If your IQ is 150, sell 30 points; it won’t hurt. - Warren Buffett</em></p>

</blockquote>
<figure>
<picture>
  <source srcset="/assets/2025/efrontier.png" type="image/png" />
  <img src="/assets/2025/efrontier.png" alt="Efficient frontier using US asset classes, 1928-2025" fetchpriority="high" style="width: 100%; height: auto;" />
</picture>
  <figcaption>Efficient Frontier using US Asset classes, 1928-2025</figcaption>
</figure>
<!--more-->

<p>Today we will revisit portfolio theory, which I have posted about in the past, and try to present a coherent introduction to portfolio optimization and asset allocation, with data through 2025 and vibe-coded illustrations.</p>

<p>I would like to explain some things that were not explicitly made clear to me when I first encountered portfolio theory, and build a reasonably robust long term allocation from data and first principles.</p>

<p>The capital asset pricing model was popularized by <a href="https://en.wikipedia.org/wiki/Harry_Markowitz">Harry Markowitz</a> and <a href="https://en.wikipedia.org/wiki/William_F._Sharpe">William Sharpe</a>, although <a href="https://en.wikipedia.org/wiki/Modern_portfolio_theory">several people</a> came up with versions of it independently. It lets you identify optimal risk/reward portfolios, if you make some (not 100% realistic) assumptions about how asset prices behave.</p>

<p>Ultimately we want to get to a useful version of the charts below.</p>

<p>This efficient frontier chart shows feasible combinations of risk and reward.</p>

<div>                        <script type="text/javascript">window.PlotlyConfig = {MathJaxConfig: 'local'};</script>
        <script charset="utf-8" src="https://cdn.plot.ly/plotly-3.2.0.min.js" integrity="sha256-iZ2u/oU2wf/vDbl/ChcX93WgbBRSBvUO6N413hDz7xM=" crossorigin="anonymous"></script>                <div id="1b08e519-c1cc-42d1-9f9b-5840ae7be516" class="plotly-graph-div" style="height:450px; width:800px;"></div>            <script type="text/javascript">                window.PLOTLYENV=window.PLOTLYENV || {};                                if (document.getElementById("1b08e519-c1cc-42d1-9f9b-5840ae7be516")) {                    Plotly.newPlot(                        "1b08e519-c1cc-42d1-9f9b-5840ae7be516",                        [{"hovertemplate":"Std: %{x:.4f}\u003cbr\u003eReturn: %{y:.4f}\u003cextra\u003e\u003c\u002fextra\u003e","line":{"color":"#636EFA","width":2},"mode":"lines","name":"Efficient frontier","x":{"dtype":"f8","bdata":"f3LkpmKMnT\u002fS0AN8mFGfP07ztCZni6A\u002frSfWDwJuoT+DDwkKnVCiP8iD0uQ3M6M\u002f64TH09IVpD8Y8eezbfikP3NSLJ8I26U\u002faljvh6O9pj8tOaRxPqCnPwW4H1rZgqg\u002fVjSKQ3RlqT8uNXQtD0iqP\u002f4mLBaqKqs\u002fVMzU\u002f0QNrD9hxuzo3++sPwDTKdJ60q0\u002fTh59uRW1rj8Lt+2ksJevP\u002f2BOsYlPbA\u002f\u002fJGxO3OusD+BFEqwwB+xP\u002foppCQOkbE\u002fZk4xmlsCsj\u002fwlDEPqXOyP11N44P25LI\u002f3CX39UNWsz8QIA1qkcezP+ERL+HeOLQ\u002fc6bZVSyqtD\u002fxQRLKeRu1P2IKFDzHjLU\u002f\u002fmSdsRT+tT8aVy0oYm+2Py0t05yv4LY\u002fpuuqEf1Rtz84IVeGSsO3P+UYAPuXNLg\u002fehD5b+WluD8QCkXkMhe5PzjaPVmAiLk\u002fLQDjzc35uT86+35CG2u6P6QlP7do3Lo\u002fRtjtK7ZNuz81OG2gA7+7P\u002fgW1xRRMLw\u002f9TXwiZ6hvD+FCJv+6xK9P880vXI5hL0\u002fmuja54b1vT+DdTFc1Ga+P25cx9Ah2L4\u002fkGZmRW9Jvz+NaAO6vLq\u002fP7WgFxcFFsA\u002fw8kb0atOwD\u002f5WAeLUofAP7RMHUX5v8A\u002fHK71\u002f5\u002f4wD\u002fdeoO6RjHBPyMLrXTtacE\u002ftirWLZSiwT+zOprpOtvBP+KHHKThE8I\u002fyJ6fXohMwj\u002fkkBwZL4XCP29QgNPVvcI\u002fyYfSjXz2wj\u002f6ABNIIy\u002fDP1OwdgLKZ8M\u002f46XvvHCgwz8HYvp2F9nDP3D\u002fYzG+EcQ\u002frKXL62RKxD8JWv2lC4PEP1xXmGCyu8Q\u002ffm\u002f+Gln0xD+46fvU\u002fyzFP6Rrf46mZcU\u002fQ2veSE2exT8LuigD9NbFP\u002fPeX72aD8Y\u002ftrUIeUFIxj94SmAz6IDGP+LRje2OucY\u002fB66mpzXyxj+CEEli3CrHP2fq3BuDY8c\u002fAhjy1Smcxz8q5QKQ0NTHP3kL6Up3Dcg\u002fqDezBB5GyD++7Bi\u002fxH7IP4et+Hhrt8g\u002fszPINBLwyD9EVBPuuCjJP9PvFqhfYck\u002fWOYSYgaayT\u002fbfuAbrdLJPxOZK9VTC8o\u002fWu3kkvpDyj+AHCZNoXzKP1XOcwdItco\u002flWLkwe7tyj+eaUt8lSbLP5pdjDI8X8s\u002fKAZk7eKXyz\u002fG9uCnidDLP9I9P2IwCcw\u002fvsiBHNdBzD\u002fIQqTWfXrMP9oRn5Aks8w\u002f5L9jSsvrzD9YAdkDciTNP1232rwYXc0\u002fbF3gfb+VzT+EqBU4Zs7NP92DOPIMB84\u002fnPw\u002frLM\u002fzj8f8iBmWnjOPwKLzx8Bsc4\u002fBPdB2afpzj\u002f913OSTiLPP+gpaUv1Ws8\u002fvPYvBJyTzz+IxTnEQszPP2h6Ir90AtA\u002fLvM1HMge0D9l5U95GzvQP6DjddZuV9A\u002f826uM8Jz0D8neZGNFZDQP8EU9utorNA\u002fTcSASrzI0D8EwcKoD+XQPyjTeQVjAdE\u002fyUhBY7Yd0T\u002f1X03ACTrRP483LhxdVtE\u002fE91YeLBy0T+HOv3UA4\u002fRP2EvryxXq9E\u002fqz4GkqrH0T+x7tzY\u002fePRPyzsRetPANI\u002fyEQ\u002fdWUC0j8="},"y":{"dtype":"f8","bdata":"gD3xIv5cgD8Aja\u002f45\u002f6JPwCdFs+BlY4\u002fwHX4fh4mkT9AAYiVJceSPwBqbg1qQ5Q\u002fwKeYdxOmlT8AXzSwvPWWP0CDnjOpNpg\u002fwOoFO8ZrmT+A+QNDLZeaP4A+lMZtups\u002fQMK9B7nWnD9A1RV\u002f\u002feydPwDa9QH5\u002fZ4\u002fwDdCoCIFoD+g0ewcMImgPyC8bzlZC6E\u002fQM+ZjZGLoT8ge3+6GwiiPwDsCE8CgaI\u002fYNhgJbv2oj9AmSTbpGmjPwAdjcEM2qM\u002fgNtpTDNIpD8gKs8ITrSkP4AQN6KKHqU\u002fwHi7ExCHpT9AeLPX\u002f+2lP8B70ut2U6Y\u002fAJPwyI63pj\u002fgGW6oXRqnP6D4ZkD3e6c\u002fwA8nvmzcpz8AYWGkzTuoPwAs8fQnmqg\u002fQHx+Coj3qD\u002fAnckW+VOpP8BPOzKFr6k\u002fwEToijUKqj+gy648EmSqP6ClrjMjvao\u002fwIHwIm8Vqz+Ajnde\u002fGyrPyDzad7Qw6s\u002fAEBSiEwZrD9A0PMjR2ysP4BGk3zxvKw\u002fQKEgWH0LrT\u002fAkbMOFFitPyDBeNraoq0\u002fwNBzqPHrrT9AJ43LdDOuP+Ba4hN9ea4\u002fQEqhriC+rj+gVVxYcwGvPyA3KdiGQ68\u002fQCfZDGuErz8Aby1cLsSvPwDmHeRuAbA\u002fcF0fjEIgsD8An\u002fOelz6wP+Cl5RBzXLA\u002fEOBEetl5sD9Q3fafzpawPyBRitxWs7A\u002fUFfHgXXPsD8wihXSLeuwPzAYkM+CBrE\u002f8H6OV3chsT9QJj8nDjyxP0CyHK9JVrE\u002fEFmiKSxwsT\u002fA3Edbt4mxP4BnxgHuorE\u002fcB\u002fbeNG7sT9gunpSY9SxP5Aw3y2l7LE\u002fEMPJ45gEsj\u002fQKJvWPxyyP4DbzgOcM7I\u002f4BahYK1Ksj+w32\u002fPdWGyP3DZx1v2d7I\u002f8GV+zS+Osj+wf5G9I6SyP4AxJvTSubI\u002fYOcIYj7Psj\u002fQKRlCZ+SyP5BKDx9O+bI\u002fgHOW5A0Osz8Qa5CQ9SKzP1C0wpdnN7M\u002fcHlIB2hLsz\u002fQVsyC+l6zPzBGVJsicrM\u002foBt6eeSEsz8Andg8QpezP8B\u002fYRA+qbM\u002fcJJZHtu6sz9wTb7UG8yzPwD73nkC3bM\u002f0J2vLpHtsz8wVzz1yf2zP\u002fCeeK6uDbQ\u002fQEXeHkEdtD\u002fg28zwgiy0P7Din8B1O7Q\u002fQB\u002fi9RpKtD\u002fgHl3\u002fc1i0P6DNNS+CZrQ\u002fwLwbxUZ0tD9weI3vwoG0P6DV7Mz3jrQ\u002fwK6HbOabtD9ACorPj6i0PxDM2en0tLQ\u002fQMzwnBbBtD9wW1DS9cy0PzDgsVKT2LQ\u002f8HUg5O\u002fjtD8A48NCDO+0P\u002fDhaCHp+bQ\u002fYFoAKocEtT\u002fArhb+5g61PzC5QzcJGbU\u002fkO+TZ+4itT\u002fwHIYblyy1PyDyxNQDNrU\u002fUKuqETU\u002ftT9guIRJK0i1P5BgvO3mULU\u002f8CQTamhZtT+wiGYisGG1P2Cujn2+abU\u002fgDqT1JNxtT\u002fwtq9+MHm1P1CqHvSUgLU\u002fcFQTPMGHtT\u002fQws3stY61P8DV4xlzlbU\u002fQFZc2fibtT9ga6qQR6K1P9DQjnFfqLU\u002fIFKk70CutT+Qh8Up7LO1P9Co0QRhubU\u002f4GlVr8W5tT8="},"type":"scatter"},{"hovertemplate":"%{text}\u003cbr\u003eStd: %{x:.4f}\u003cbr\u003eReturn: %{y:.4f}\u003cextra\u003e\u003c\u002fextra\u003e","marker":{"color":"#636EFA","size":10},"mode":"markers+text","name":"Assets","text":["S&P","Small Caps","T-Bills","T-Notes","Baa Corps","Real Estate","Gold"],"textposition":"middle left","x":[0.19303644117881866,0.3728989577242455,0.03816960316613568,0.08859208039753139,0.08800526278329274,0.04973518491464826,0.19429640061941703],"y":{"dtype":"f8","bdata":"kFxzg+NYsT8wWaxCJTq2PwDwKCNotGo\u002fABXG1rTKjT8gDQRUttuhP4B9Br\u002fKGYc\u002fwN2YSDiTmT8="},"type":"scatter"},{"hovertemplate":"Max Sharpe\u003cbr\u003eStd: %{x:.4f}\u003cbr\u003eReturn: %{y:.4f}\u003cbr\u003eSharpe: 0.563\u003cextra\u003e\u003c\u002fextra\u003e","marker":{"color":"red","size":15,"symbol":"star"},"mode":"markers+text","name":"Max Sharpe","text":["Max Sharpe"],"textposition":"middle left","x":[0.07034847750156245],"y":[0.039613345220394613],"type":"scatter"},{"hovertemplate":"EF Avg Wts\u003cbr\u003eStd: %{x:.4f}\u003cbr\u003eReturn: %{y:.4f}\u003cextra\u003e\u003c\u002fextra\u003e","marker":{"color":"green","size":15,"symbol":"star"},"mode":"markers","name":"EF Avg Wts","text":["EF Avg Wts"],"textposition":"middle left","x":[0.15091755722747593],"y":[0.06555479995294888],"type":"scatter"},{"hovertemplate":"CML\u003cbr\u003eStd: %{x:.4f}\u003cbr\u003eReturn: %{y:.4f}\u003cextra\u003e\u003c\u002fextra\u003e","line":{"color":"red","dash":"dash","width":1.5},"mode":"lines","name":"Capital Market Line","x":[0,0.17758782327058836],"y":[0,0.1],"type":"scatter"}],                        {"height":450,"hovermode":"closest","showlegend":true,"template":{"data":{"barpolar":[{"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"type":"carpet"}],"choropleth":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"choropleth"}],"contourcarpet":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"contourcarpet"}],"contour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"contour"}],"heatmap":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"heatmap"}],"histogram2dcontour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2dcontour"}],"histogram2d":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2d"}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"mesh3d":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"mesh3d"}],"parcoords":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"parcoords"}],"pie":[{"automargin":true,"type":"pie"}],"scatter3d":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatter3d"}],"scattercarpet":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattercarpet"}],"scattergeo":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergeo"}],"scattergl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergl"}],"scattermapbox":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermapbox"}],"scattermap":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermap"}],"scatterpolargl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolargl"}],"scatterpolar":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolar"}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"scatterternary":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterternary"}],"surface":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"surface"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}]},"layout":{"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"autotypenumbers":"strict","coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]],"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]},"colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"geo":{"bgcolor":"white","lakecolor":"white","landcolor":"#E5ECF6","showlakes":true,"showland":true,"subunitcolor":"white"},"hoverlabel":{"align":"left"},"hovermode":"closest","mapbox":{"style":"light"},"paper_bgcolor":"white","plot_bgcolor":"#E5ECF6","polar":{"angularaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"bgcolor":"#E5ECF6","radialaxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"scene":{"xaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","gridwidth":2,"linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white"},"yaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","gridwidth":2,"linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white"},"zaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","gridwidth":2,"linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white"}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"ternary":{"aaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"baxis":{"gridcolor":"white","linecolor":"white","ticks":""},"bgcolor":"#E5ECF6","caxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"title":{"x":0.05},"xaxis":{"automargin":true,"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","zerolinewidth":2},"yaxis":{"automargin":true,"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","zerolinewidth":2}}},"title":{"text":"Risk vs. Real Return"},"width":800,"xaxis":{"range":[0,0.39154390561045777],"showgrid":true,"title":{"text":"Standard Deviation of Real Returns"}},"yaxis":{"range":[0,0.1],"showgrid":true,"title":{"text":"Real Return"}}},                        {"responsive": true}                    )                };            </script>        </div>

<p>This transition map shows the composition of efficient portfolios at different levels of risk. Mouse over to see historical returns and asset composition:</p>
<div>                        <script type="text/javascript">window.PlotlyConfig = {MathJaxConfig: 'local'};</script>
        <script charset="utf-8" src="https://cdn.plot.ly/plotly-3.2.0.min.js" integrity="sha256-iZ2u/oU2wf/vDbl/ChcX93WgbBRSBvUO6N413hDz7xM=" crossorigin="anonymous"></script>                <div id="c63169e3-d48e-46a2-81ea-cb0e877813dc" class="plotly-graph-div" style="height:450px; width:800px;"></div>            <script type="text/javascript">                window.PLOTLYENV=window.PLOTLYENV || {};                                if (document.getElementById("c63169e3-d48e-46a2-81ea-cb0e877813dc")) {                    Plotly.newPlot(                        "c63169e3-d48e-46a2-81ea-cb0e877813dc",                        [{"customdata":{"dtype":"f8","bdata":"\u002fldwDuGsXT51oDsajlzaPzIn6hIZquA\u002fSVqPNVmA4z\u002fqZ9hvmAHmPw1MQ0ydTug\u002fO0gIcqpp6j\u002fmQAuZKX\u002fsP2mDKMiVdO4\u002f8mG965Yv8D9\u002f3gsp+hzxP21X6Q8JA\u002fI\u002f7UfRotHm8j\u002fJhIN\u002fGMXzP4N1\u002fNuGoPQ\u002f7j2AgDR59T+TIq7qBk\u002f2P4SckSEfJPc\u002frN0\u002fFmVb+T97xeaj7Wf9P4cWH4qurABAiUXpuISbAkBN0BGxmYAEQOHzZdoeXAZAEUa0Y+c0CEAW5ViKLwUKQOrK1RpGzwtAAO+RDxSUDUAMtqR1w1QPQAXoOy4fiRBA1hLVWHtlEUACOIHjAEASQDFv9UF2GBNAs0s0UxTwE0B6HqhHl8YUQNTb3Fh\u002fmxVABDIe4mpvFkDxgUKeM0IXQM2\u002fkIECFBhAJ8nR0B7lGEALuHKK47UZQAgWFFwIhBpAZb7vtWFSG0Cb4dJ77h8cQMPHVVvY7BxA6KRYVFidHkCH6d\u002fFpUUgQCG6L7YiOCFAXmhX+egmIkAkPxmjhhEjQHLzlkPT+CNAsazmmcPcJEDENzBm570lQF66FMhInCZALhh92C54J0C\u002frT7rwlEoQMM8l4dHKSlAJlN23Mr+KUDDgpH5cNIqQOxravRMpCtATtBh3GJ0LEC+sBgC90ItQBFMYZomEC5AaMjSzCvcLkA\u002fGFcBRaYvQEbZpt7BNzBAMSJL2cqbMEBeJYrSQv8wQAl1TEAsYjFA8zXmxJLEMUDF7K6XkSYyQKsgD3AxiDJA\u002f0bjjXDpMkA9SBKBGkozQGOhcrirqjNAZeJ91tYKNEB7aAybh2o0QB4NQxzCyTRAxmd8PLYoNUBkcq6SX4c1QE2y8mAe5jVAYsWgkjNENkAcxOc\u002fAqI2QMGGcF+C\u002fzZAd3tJnYxcN0AfoMQweLk3QLU9TcwtFjhAI0yoILNyOEAaBQNLOc84QOw9H3iiKzlAGNS0\u002fZuVOUAAJGxffUY6QDPVilnm9TpA4kJ7QeujO0CaMXCil1A8QMQsr2EE\u002fDxAH00tKICmPUC2AMMM3U8+QPG\u002fXnr\u002f9z5AfqhY8hmfP0AXCQDwmyJAQDIfdP8xdUBAOVH5k1PHQEBsDg9fBhlBQBhbM2dOakFAKfL2zi+7QUDIkdyPrgtCQHV7Bc7PW0JABQTtVpSrQkCrPTbZAPtCQOyoIH0YSkNAqJioRN6YQ0DDFCsMVedDQGN1q4t\u002fNURAIly0WWCDREB\u002f2+Tt+dBEQBW08KJOHkVAOWiB1F9rRUDTVJWEMbhFQPigWb3EBEZANrgUcRtRRkC3jxd8N51GQOjSz6Ua6UZAkMTOocY0R0DGVtcQPYBHQLS\u002f\u002fIF\u002fy0dA3zPPc48WSEA6sKkxbmFIQHCf62sdrEhAbgNWS572SEA8\u002fdYV8kBJQCpSygQai0lAfhmeRRfVSUDwnsL26h5KQB1U9DWWaEpARuPxDhqySkBqRvCEd\u002ftKQDRt5wWyREtA+CNCssWNS0BFinZruNZLQICt292HH0xAcHkVPTJoTECRh1DDurBMQAJZjcgh+UxA+sFrbmtBTUB7fpFPl4lNQCfuD\u002fSh0U1ASJHrDO7WTUA=","shape":"148, 1"},"fill":"tonexty","fillcolor":"#ff9896","hovertemplate":"%{customdata[0]:.2f}%\u003cextra\u003eSmall Caps\u003c\u002fextra\u003e","line":{"color":"#ff9896","width":0},"mode":"lines","name":"Small Caps","stackgroup":"one","x":{"dtype":"f8","bdata":"gD3xIv5cgD8Aja\u002f45\u002f6JPwCdFs+BlY4\u002fwHX4fh4mkT9AAYiVJceSPwBqbg1qQ5Q\u002fwKeYdxOmlT8AXzSwvPWWP0CDnjOpNpg\u002fwOoFO8ZrmT+A+QNDLZeaP4A+lMZtups\u002fQMK9B7nWnD9A1RV\u002f\u002feydPwDa9QH5\u002fZ4\u002fwDdCoCIFoD+g0ewcMImgPyC8bzlZC6E\u002fQM+ZjZGLoT8ge3+6GwiiPwDsCE8CgaI\u002fYNhgJbv2oj9AmSTbpGmjPwAdjcEM2qM\u002fgNtpTDNIpD8gKs8ITrSkP4AQN6KKHqU\u002fwHi7ExCHpT9AeLPX\u002f+2lP8B70ut2U6Y\u002fAJPwyI63pj\u002fgGW6oXRqnP6D4ZkD3e6c\u002fwA8nvmzcpz8AYWGkzTuoPwAs8fQnmqg\u002fQHx+Coj3qD\u002fAnckW+VOpP8BPOzKFr6k\u002fwEToijUKqj+gy648EmSqP6ClrjMjvao\u002fwIHwIm8Vqz+Ajnde\u002fGyrPyDzad7Qw6s\u002fAEBSiEwZrD9A0PMjR2ysP4BGk3zxvKw\u002fQKEgWH0LrT\u002fAkbMOFFitPyDBeNraoq0\u002fwNBzqPHrrT9AJ43LdDOuP+Ba4hN9ea4\u002fQEqhriC+rj+gVVxYcwGvPyA3KdiGQ68\u002fQCfZDGuErz8Aby1cLsSvPwDmHeRuAbA\u002fcF0fjEIgsD8An\u002fOelz6wP+Cl5RBzXLA\u002fEOBEetl5sD9Q3fafzpawPyBRitxWs7A\u002fUFfHgXXPsD8wihXSLeuwPzAYkM+CBrE\u002f8H6OV3chsT9QJj8nDjyxP0CyHK9JVrE\u002fEFmiKSxwsT\u002fA3Edbt4mxP4BnxgHuorE\u002fcB\u002fbeNG7sT9gunpSY9SxP5Aw3y2l7LE\u002fEMPJ45gEsj\u002fQKJvWPxyyP4DbzgOcM7I\u002f4BahYK1Ksj+w32\u002fPdWGyP3DZx1v2d7I\u002f8GV+zS+Osj+wf5G9I6SyP4AxJvTSubI\u002fYOcIYj7Psj\u002fQKRlCZ+SyP5BKDx9O+bI\u002fgHOW5A0Osz8Qa5CQ9SKzP1C0wpdnN7M\u002fcHlIB2hLsz\u002fQVsyC+l6zPzBGVJsicrM\u002foBt6eeSEsz8Andg8QpezP8B\u002fYRA+qbM\u002fcJJZHtu6sz9wTb7UG8yzPwD73nkC3bM\u002f0J2vLpHtsz8wVzz1yf2zP\u002fCeeK6uDbQ\u002fQEXeHkEdtD\u002fg28zwgiy0P7Din8B1O7Q\u002fQB\u002fi9RpKtD\u002fgHl3\u002fc1i0P6DNNS+CZrQ\u002fwLwbxUZ0tD9weI3vwoG0P6DV7Mz3jrQ\u002fwK6HbOabtD9ACorPj6i0PxDM2en0tLQ\u002fQMzwnBbBtD9wW1DS9cy0PzDgsVKT2LQ\u002f8HUg5O\u002fjtD8A48NCDO+0P\u002fDhaCHp+bQ\u002fYFoAKocEtT\u002fArhb+5g61PzC5QzcJGbU\u002fkO+TZ+4itT\u002fwHIYblyy1PyDyxNQDNrU\u002fUKuqETU\u002ftT9guIRJK0i1P5BgvO3mULU\u002f8CQTamhZtT+wiGYisGG1P2Cujn2+abU\u002fgDqT1JNxtT\u002fwtq9+MHm1P1CqHvSUgLU\u002fcFQTPMGHtT\u002fQws3stY61P8DV4xlzlbU\u002fQFZc2fibtT9ga6qQR6K1P9DQjnFfqLU\u002fIFKk70CutT+Qh8Up7LO1P9Co0QRhubU\u002f4GlVr8W5tT8="},"y":{"dtype":"f8","bdata":"MrMUrQD+8j1+M\u002f1DE99wP9CiffmaVHU\u002fus9vvzT2eD\u002fFeimPACt8P7XwIk3yHH8\u002fJoA4U3fngD+JKTBs5zyCP7TtGYDQfYM\u002fiNkva8u3hD\u002f0ePCapueFP4zgXRQgDoc\u002f6P+QLLAxiD9o52rWM06JPwQwGgUTZ4o\u002f3+iZKWx8iz\u002fbxVlVHY6MP5TS9yrgno0\u002f8zu4In46kD\u002fekg7F39GSP1ExjqbpV5U\u002f94F8uU3Rlz8HcYddNT6aP86o3s\u002ffnpw\u002fXqFhdQn8nj8tVXaqKKegP\u002fwGvNNVzKE\u002f1xOlUSHuoj+NS+TkSQ2kP7RH5lllKqU\u002frNqV7HREpj\u002fuUfcYKlynPzQJtTU7cag\u002fBOZrvDiFqT9AMdfgy5eqP0OUlRVRqKs\u002fOHPzDJO3rD\u002fYkZLKYMWtPwfhUrru0a4\u002f4GeHFZjdrz8w3IaqaHSwPziTK0VX+LA\u002ffuqtfmd8sT9jkCDK9P+xP33wDdQZg7I\u002fOLFhnOaXsz+3961jB9S0PyBp9d5pCrY\u002fg9eYfAs8tz92wV1qWmi4P89q9JNqkLk\u002ffBrLkS20uj9CwhRkW9S7PyeIGgAB8bw\u002fWYUGZ3kKvj95jAh\u002f+SC\u002fPzXfDjhrGsA\u002fYJHvMBGjwD9em3G+hSrBP41ZThfVsME\u002fE3u51AE2wj889muvN7rCP68wkFiJPcM\u002fJPs0CBzAwz8U0uXXc0HEP0VyUNU\u002fwsQ\u002f916TU0tCxT8IY3M2ncHFP7rnOKQ4QMY\u002fdKsmgSy+xj+LQ2+jmzvHPzeQRjORuMc\u002fW28O8wo1yD\u002fycO7DxbDIP9HYF+xgLMk\u002fByx4ZHmnyT\u002f5j1dB9SHKPzB3xr3Zm8o\u002fZEd2JGQVyz+zczvQjo7LPyU2+fbUB8w\u002fnCVdA0KAzD\u002fSx63MVPjMPzTLhQkDcM0\u002f1mrtYhrnzT\u002fq9dx7Cl7OP1jeYoC11M4\u002fN1cpuSJLzz\u002fP59oDkcHPP0WYrRntG9A\u002f0jWI\u002fr9f0D8AQBwU9NDQP5ENjEM3QdE\u002fIONOkJaw0T+qcbhdGR\u002fSP0qNrZrPjNI\u002fFFDVnuv50j+84SoIUGbTP8PMmC\u002fr0dM\u002fPNLmZ9081D+iCwAALqfUPysyV9bjENU\u002ffFNylAR61T\u002fmT+qDl+LVPwDbxsuhStY\u002fm6b+tiiy1j\u002fhm\u002ftbMRnXP2MtY0\u002fCf9c\u002fv545mNzl1z\u002fvTsA0hkvYP\u002fH2hS\u002fDsNg\u002fuHsfYpcV2T8ttPl1BnrZP9sv+uUT3tk\u002faYouAsNB2j8edRDzFqXaP2NhFbwSCNs\u002fuj0\u002fGrhq2z\u002fHn9MuDM3bP3A0h04QL9w\u002f1MIk98aQ3D88mVuKMvLcP5l+Hk9VU90\u002fzS70cjG03T\u002fpElELyRTePxkUBhcedd4\u002fE4rBfzLV3j9KAKbtBzXfP3BbI4qglN8\u002f6e8R0f3z3z\u002fpRdGxkCngP9M+d2kGWeA\u002fCS9l0GCI4D+FMu2doLfgP1BK7ojG5uA\u002fqMTDPNMV4T+WGFJfx0ThPw2ifyKlc+E\u002fLnOvC2qi4T9+WGDeGdHhP81kWR2z\u002f+E\u002fe0P5oTQu4j\u002fDVgB9oFziP87cwOb2iuI\u002fRAEchDq54j\u002f9JzQUa+fiP\u002fCDwl6GFeM\u002fs3u1ReoY4z8="},"type":"scatter"},{"customdata":{"dtype":"f8","bdata":"N7M6No2MbD7Z6E9Y3sIJQH1rsYP\u002fzRBAQPOuGa4AFEAWIGLXadMWQAJJU4hVaRlA0r+DbCvYG0DW6FEsxiQeQD+fK5YELiBA8EOpqNk\u002fIUBIz8adcEoiQLBgwGEyTyNAVmuKAmpOJEDDuSvcSUklQK05H3R5QCZAC9XGP2A0J0DsTh0ehSUoQORc3vbKEylA0I36nKIqKkAfpOoY23ErQNZjkSiasixAlWHZAw\u002fsLUCe1Lx\u002fpR8vQAH0gdl1JzBAclMu1AG8MEDQKZYT+k4xQDHWlc804DFAkYEZzrdvMkB+ycB20\u002f0yQADyas\u002fLijNAhDURA28WNEAtuaQG7aA0QA61iUsrKjVA0vObcL+yNUDFTsS8rjo2QCufdEeowTZAt10GI+hHN0DTPNctcs03QD2+xOZVUjhAKOcNnInWOECgNchRgFo5QOSLnM3F3TlALsHeoIhgOkD8MhrF5uI6QOlBWFmoZDtAW1Fpl1QAPEDk9qXOZqE8QI8F13dKPz1A92178ujZPUDmRaQudnI+QDB1S2qZCD9A5rlGSN+cP0CzCBATkBdAQO6nVKnaX0BASSXa4FWnQEC26MJiE+5AQEGSrSsTNEFAe9VtwG15QUB4qe\u002fQLL5BQJe26W1gAkJAfygwVR5GQkAR3gy7V4lCQDxaZfMQzEJAxkG9Oz0OQ0Ce5XdAVVBDQFeeRvbUkUNABO5vf\u002ffSQ0AmCnJhxBNEQMlToUVFVERA\u002fN9hlHiUREDfZSZUS9REQOKpkWW+E0VA9O+pKt1SRUCixWp\u002f6ZFFQAgYysVj0EVAxT\u002fL6qcORkApfiY500xGQG8dI\u002fvnikZAQkg8E7jIRkADMBlmTgZHQHKHV39IQ0dA8AkbpnqAR0CVL3YRfr1HQITjzGFg+kdAmr2UXFA3SEBR2EhM9HNIQDzWmGRpsEhA44+3Sq3sSECuZ+e\u002fjihJQBgqN9cxZElAck2D++yQSUCgkJwcq3BJQHGzc\u002fazUElAHM79CgIxSUA0e+7EmBFJQBtByTRr8khAVZGvVC7TSEDRInGII7RIQBbNuZF2lUhAobJ5svl2SECk8NnRqlhIQAmGBfGHOkhA+1JiopAcSEA5QsDmwP5HQP\u002fcqxsY4UdAS5nm2pTDR0C8WtGnNaZHQFb7GOv1iEdAVE45pdprR0ALyB6J305HQI1K2HcDMkdAjUpCWUUVR0DK22ogpPhGQMw\u002foM0e3EZAljxfbLS\u002fRkAdvKERZKNGQBOPI9ssh0ZAiO9tCxBrRkBsEZZwCE9GQFplg6AXM0ZAK3vE4zwXRkD5vRKLd\u002ftFQL4ETO\u002fG30VA4+ldcSrERUBvsvp5oahFQCnFAnkrjUVAuAup5MdxRUBBjuSddlZFQJuL4Es2O0VArWDl4wYgRUBIPfvu5wRFQKbRCfvY6URA+M5VmtnOREBe1VRZ6bNEQDoeWu0HmURAnFsB4DR+RED00qnQb2NEQDRuuMqySERAjpaOdQguREAo1VcmZRNEQDQ\u002fKtDP+ENA9RtzLU7eQ0Dt+y562sNDQCjJeVV1qUNAHa6\u002fLRePQ0Cd3jx6wXRDQHLFKzd4WkNAe7uNTolYQ0A=","shape":"148, 1"},"fill":"tonexty","fillcolor":"#d62728","hovertemplate":"%{customdata[0]:.2f}%\u003cextra\u003eS&P\u003c\u002fextra\u003e","line":{"color":"#d62728","width":0},"mode":"lines","name":"S&P","stackgroup":"one","x":{"dtype":"f8","bdata":"gD3xIv5cgD8Aja\u002f45\u002f6JPwCdFs+BlY4\u002fwHX4fh4mkT9AAYiVJceSPwBqbg1qQ5Q\u002fwKeYdxOmlT8AXzSwvPWWP0CDnjOpNpg\u002fwOoFO8ZrmT+A+QNDLZeaP4A+lMZtups\u002fQMK9B7nWnD9A1RV\u002f\u002feydPwDa9QH5\u002fZ4\u002fwDdCoCIFoD+g0ewcMImgPyC8bzlZC6E\u002fQM+ZjZGLoT8ge3+6GwiiPwDsCE8CgaI\u002fYNhgJbv2oj9AmSTbpGmjPwAdjcEM2qM\u002fgNtpTDNIpD8gKs8ITrSkP4AQN6KKHqU\u002fwHi7ExCHpT9AeLPX\u002f+2lP8B70ut2U6Y\u002fAJPwyI63pj\u002fgGW6oXRqnP6D4ZkD3e6c\u002fwA8nvmzcpz8AYWGkzTuoPwAs8fQnmqg\u002fQHx+Coj3qD\u002fAnckW+VOpP8BPOzKFr6k\u002fwEToijUKqj+gy648EmSqP6ClrjMjvao\u002fwIHwIm8Vqz+Ajnde\u002fGyrPyDzad7Qw6s\u002fAEBSiEwZrD9A0PMjR2ysP4BGk3zxvKw\u002fQKEgWH0LrT\u002fAkbMOFFitPyDBeNraoq0\u002fwNBzqPHrrT9AJ43LdDOuP+Ba4hN9ea4\u002fQEqhriC+rj+gVVxYcwGvPyA3KdiGQ68\u002fQCfZDGuErz8Aby1cLsSvPwDmHeRuAbA\u002fcF0fjEIgsD8An\u002fOelz6wP+Cl5RBzXLA\u002fEOBEetl5sD9Q3fafzpawPyBRitxWs7A\u002fUFfHgXXPsD8wihXSLeuwPzAYkM+CBrE\u002f8H6OV3chsT9QJj8nDjyxP0CyHK9JVrE\u002fEFmiKSxwsT\u002fA3Edbt4mxP4BnxgHuorE\u002fcB\u002fbeNG7sT9gunpSY9SxP5Aw3y2l7LE\u002fEMPJ45gEsj\u002fQKJvWPxyyP4DbzgOcM7I\u002f4BahYK1Ksj+w32\u002fPdWGyP3DZx1v2d7I\u002f8GV+zS+Osj+wf5G9I6SyP4AxJvTSubI\u002fYOcIYj7Psj\u002fQKRlCZ+SyP5BKDx9O+bI\u002fgHOW5A0Osz8Qa5CQ9SKzP1C0wpdnN7M\u002fcHlIB2hLsz\u002fQVsyC+l6zPzBGVJsicrM\u002foBt6eeSEsz8Andg8QpezP8B\u002fYRA+qbM\u002fcJJZHtu6sz9wTb7UG8yzPwD73nkC3bM\u002f0J2vLpHtsz8wVzz1yf2zP\u002fCeeK6uDbQ\u002fQEXeHkEdtD\u002fg28zwgiy0P7Din8B1O7Q\u002fQB\u002fi9RpKtD\u002fgHl3\u002fc1i0P6DNNS+CZrQ\u002fwLwbxUZ0tD9weI3vwoG0P6DV7Mz3jrQ\u002fwK6HbOabtD9ACorPj6i0PxDM2en0tLQ\u002fQMzwnBbBtD9wW1DS9cy0PzDgsVKT2LQ\u002f8HUg5O\u002fjtD8A48NCDO+0P\u002fDhaCHp+bQ\u002fYFoAKocEtT\u002fArhb+5g61PzC5QzcJGbU\u002fkO+TZ+4itT\u002fwHIYblyy1PyDyxNQDNrU\u002fUKuqETU\u002ftT9guIRJK0i1P5BgvO3mULU\u002f8CQTamhZtT+wiGYisGG1P2Cujn2+abU\u002fgDqT1JNxtT\u002fwtq9+MHm1P1CqHvSUgLU\u002fcFQTPMGHtT\u002fQws3stY61P8DV4xlzlbU\u002fQFZc2fibtT9ga6qQR6K1P9DQjnFfqLU\u002fIFKk70CutT+Qh8Up7LO1P9Co0QRhubU\u002f4GlVr8W5tT8="},"y":{"dtype":"f8","bdata":"8Hx3GHlFAj6LgMJCt3ygP7UODL2OgqU\u002fzXTLcniaqT8n14e3kTetP3wk2fBpQ7A\u002fxHqwTwfSsT9gJFNFvEqzP\u002fRQTG7ItbQ\u002frnWlzUkUtj9wjqzohWm3P+zXj7pKt7g\u002fgg4sVfj9uT\u002fH7WDcFj+7P7+bmL18e7w\u002fqDkdZq6zvT9Db3d4WOi+P5yXb9uqDMA\u002fAGV3ZCC\u002fwD8eF+g4jJDBP3\u002fZKU3TXcI\u002f2qR2AnAmwz8oNggzS+vDP14PxaVjrcQ\u002fc9v9dYdrxT9wh3h\u002fpifGP+IwJkeL4cY\u002f43zEMD2Zxz\u002ffKl0nI0\u002fIP5nZsTyUA8k\u002fihvEp1C2yT8vSRDLlWfKP2RYXqhBF8s\u002fp\u002fpWwxPGyz\u002fdOyTdEnTMP+\u002f+s2XXIM0\u002fHdRPQa7MzT833aJjnHfOP96CQ6K1Ic8\u002fAK2MlO3Kzz\u002fh5HW56znQP0pP6TvvjdA\u002fCeJGH5\u002fh0D+hIKCSDjXRP0PYx9IZiNE\u002fY+wuQrvr0T8XTBgo0VLSP\u002fVpVr3dt9I\u002fGWW1htIa0z8EDruYdHzTP1IDTyWL3NM\u002fqL5BLnA71D9gFddVCpnUP09mQ8SS9dQ\u002fIJamwxFR1T+r9g3vnavVP+3ZJUI3BdY\u002fS+hEH\u002f1d1j8p47fs+7XWP8HAxDpIDdc\u002fUUiu3f1j1z+5MC\u002flCbrXP9wCY9txD9g\u002fWrAvayVk2D946NYKv7jYP6LzHLaVDNk\u002f++j\u002fHfVf2T+rVCHj5rLZP+PbXWN3Bdo\u002f8Sj4lKRX2j8doUUuVqnaP+7tzk6N+to\u002fipmHiFhL2z+IvzYoDJzbP1LhNdQE7Ns\u002fBrjGNrg73D80wEXOS4vcPwm1IonC2tw\u002fSilNYOEp3T\u002fG9T5FtnjdP6aOWzLDxt0\u002fAO7a3hcV3j+\u002f4DC6MGPePzgjgTUfsd4\u002fNt7SLh\u002f\u002f3j\u002f3wkjSvUzfP5Whw4Agmt8\u002f+YStNkTn3z+30bL19BngP4Dd5eUfQOA\u002fpd\u002f3oMBc4D8KcW6XG0jgP3EMSmCmM+A\u002f36ysd10f4D+SbWUNQwvgPzfONLSd7t8\u002fOu0TtKHG3z80nV3N5Z7fP2SBNQKid98\u002fP366xZtQ3z8PC8Vo0CnfP861d109A98\u002fSxiIF+Lc3j\u002fYAkh5ubbeP0aBx7LCkN4\u002fIxZ5+ftq3j+VsSpmY0XeP43lcRjzH94\u002fdpdTd7H63T+JFG8BmdXdP7VAe0eosN0\u002fdzbk4t2L3T8XD2p7OGfdPwXhwsm2Qt0\u002fbsj0lFce3T85LiuwGfrcP4kdx\u002fn71dw\u002fmTKhDgCy3D\u002fIKm5IH47cP7CqvK5batw\u002fTA6+VrRG3D9o\u002fRdgKCPcPwgv3PS2\u002f9s\u002fLfhtSV\u002fc2z8TLCKcILnbPwFtfjT6lds\u002fAA8gYuty2z\u002fjgk3980\u002fbP7yJpEwSLds\u002fi0htQkYK2z9wTmBGj+faP9\u002f3csbsxNo\u002fFWUwNl6i2j9QRLQB43\u002faP3Mcacl6Xdo\u002fTUzE9SQ72j+U0BYL4RjaP73U4Wmn9tk\u002fjWQxtYXU2T\u002fXEOH9bLLZPwXWKylmkNk\u002ftHUYjHhu2T8R3FrFnEzZP8Lim6DTKtk\u002fjCbCbRMJ2T+MthoNXufYP37yiZi4xdg\u002fnmDeHD\u002fD2D8="},"type":"scatter"},{"customdata":{"dtype":"f8","bdata":"vwNtkhPNTUAQ2C5QJYlJQIdG1GQc7EZA+th3S9DKREBBy5Mhi+lCQBrhAMiRMEFAtzbganklP0C2mQ2CABQ8QGIpQ2y4IDlAzCaLwolGNkAQ+vIn\u002f38zQB2IXxezyTBALyfHCLtCLEC5ZdWE+wgnQB+G9vDK4yFABF9h0dqgGUAuF7\u002fNCjQPQP6PB64lsvY\u002fRj9g\u002f1FI7D6\u002fNS6sjcdEPlcYER1tnb8+yW7w5a7zxz6uT2XTypa5Po8cemXhyKU+IWqKSxw6pD50pE1hYBSwPgUrY2KwF7k+T34g2uTJsz59808JRp+mPu\u002fK9nl98QU+VhtAsfHtET6Gi3OkG9BmPoDVbqcFApk+naF6kcRbkz7DzvsSq5Z7PpCVDNiz14A+fq3wqjjPfD5ZIV71Aj15PkdZCYGdqnw+JtCQwpQ3iD6kdRg9\u002fTikPr9U5jwZQww+0jEDMrg4HT4ctSv\u002f1nBvPuKPqkaprns+BspqGMXYYD6yAn+RSyuAPr4cVUaLP7g+ODYME2vmYD4\u002fXowHoGd+PomcYoChUZQ+1TPVXY6KUT55Gc\u002fCp6djPpuFoe2qWWI+0geR5q7aWj7+4cnbOwpUPh07BuX6gFk+hRI4bEF8XT72UiuK+2BgPoow0MIQhl0+KNgohr\u002fYUT4GNeeF1AFLPnp8Z5G6NVE+IeXMr\u002fVmfT52GCqdQh9xPgKztCwoXWs+q8Ms78\u002f6Yz4U0RHHSiRcPozYVLITLWI+hrrOrNzHYj5cxvdt4SpZPmyPPrw7gVQ+uLPPvLgkUT57a\u002ftOCmqBPgzAQ8SfIoI+dd+zqUksgD6IHvqqNBKEPhaikFVin3I+42Ts+5+LXT6fkNtxTJd\u002fPgOUK7I3toQ+v9YzUBaTcT6WmqAoX9ZqPkQX7mQYI3w+rhTGehbJST4aTGpp3PdTPmW5gYaLyVk+w7MnSZwxZj7DS+i3RXJrPju8Lm85Co0+A50nqNA7mj7QJRBfTuKSPgEACw1cqYc+7F8Csv8jkj4sxOcq6zCJPnJYJlJKY4o+H388mlD\u002faz5\u002fp5Eiy8yKPrZiRyq+jo8++x\u002f1Qoctkj5kxT8IFOGVPjTP8PSEZJ0+RtbTHUR2Zz4hol0ToFluPqZu4K\u002fezm8+wgpL6729ZD45rakGZ\u002f9bPi5R5n\u002fOHpo+LDSqnCn9lT7iqo+QGDqUPu95KVyYQZM+4qQTtyDakj5x6PNINwaTPgiO3hHw05M++ZudqxJplT4t6wSB7RWYPlF3dZ9ua5w+Ek73T9x2Wz7\u002fvqF9PTVjPheeN0VYfms+e\u002f3M47Tbcz5nOLFOZox8Po\u002fAeFnxKIQ+i0Lalwetiz7lfZercFOSPsoaU1S8Tpc+VJQK+2tonD7f77bNXQ9oPgdMfG0A1Gs+5DYBHxQ3bT4geYEao3dtPrQhXStpG2w+mE4VER+6aD6jsA\u002f68maVPm2pgeXN0os+9wOyuR00ez7B3AjtdA9fPs72+5mZ+Y8+1Nzab9CmZz7tPPLaS+tdPoZ21\u002f7Rn3U+g1RbZ6KreD4lfVa9vA1xPkQhhHdm2nY+x6YInl\u002fWIz6wT1HQKdJYPqkpBvfNHj4+eOo9jT9DYz4=","shape":"148, 1"},"fill":"tonexty","fillcolor":"#1f77b4","hovertemplate":"%{customdata[0]:.2f}%\u003cextra\u003eT-Bills\u003c\u002fextra\u003e","line":{"color":"#1f77b4","width":0},"mode":"lines","name":"T-Bills","stackgroup":"one","x":{"dtype":"f8","bdata":"gD3xIv5cgD8Aja\u002f45\u002f6JPwCdFs+BlY4\u002fwHX4fh4mkT9AAYiVJceSPwBqbg1qQ5Q\u002fwKeYdxOmlT8AXzSwvPWWP0CDnjOpNpg\u002fwOoFO8ZrmT+A+QNDLZeaP4A+lMZtups\u002fQMK9B7nWnD9A1RV\u002f\u002feydPwDa9QH5\u002fZ4\u002fwDdCoCIFoD+g0ewcMImgPyC8bzlZC6E\u002fQM+ZjZGLoT8ge3+6GwiiPwDsCE8CgaI\u002fYNhgJbv2oj9AmSTbpGmjPwAdjcEM2qM\u002fgNtpTDNIpD8gKs8ITrSkP4AQN6KKHqU\u002fwHi7ExCHpT9AeLPX\u002f+2lP8B70ut2U6Y\u002fAJPwyI63pj\u002fgGW6oXRqnP6D4ZkD3e6c\u002fwA8nvmzcpz8AYWGkzTuoPwAs8fQnmqg\u002fQHx+Coj3qD\u002fAnckW+VOpP8BPOzKFr6k\u002fwEToijUKqj+gy648EmSqP6ClrjMjvao\u002fwIHwIm8Vqz+Ajnde\u002fGyrPyDzad7Qw6s\u002fAEBSiEwZrD9A0PMjR2ysP4BGk3zxvKw\u002fQKEgWH0LrT\u002fAkbMOFFitPyDBeNraoq0\u002fwNBzqPHrrT9AJ43LdDOuP+Ba4hN9ea4\u002fQEqhriC+rj+gVVxYcwGvPyA3KdiGQ68\u002fQCfZDGuErz8Aby1cLsSvPwDmHeRuAbA\u002fcF0fjEIgsD8An\u002fOelz6wP+Cl5RBzXLA\u002fEOBEetl5sD9Q3fafzpawPyBRitxWs7A\u002fUFfHgXXPsD8wihXSLeuwPzAYkM+CBrE\u002f8H6OV3chsT9QJj8nDjyxP0CyHK9JVrE\u002fEFmiKSxwsT\u002fA3Edbt4mxP4BnxgHuorE\u002fcB\u002fbeNG7sT9gunpSY9SxP5Aw3y2l7LE\u002fEMPJ45gEsj\u002fQKJvWPxyyP4DbzgOcM7I\u002f4BahYK1Ksj+w32\u002fPdWGyP3DZx1v2d7I\u002f8GV+zS+Osj+wf5G9I6SyP4AxJvTSubI\u002fYOcIYj7Psj\u002fQKRlCZ+SyP5BKDx9O+bI\u002fgHOW5A0Osz8Qa5CQ9SKzP1C0wpdnN7M\u002fcHlIB2hLsz\u002fQVsyC+l6zPzBGVJsicrM\u002foBt6eeSEsz8Andg8QpezP8B\u002fYRA+qbM\u002fcJJZHtu6sz9wTb7UG8yzPwD73nkC3bM\u002f0J2vLpHtsz8wVzz1yf2zP\u002fCeeK6uDbQ\u002fQEXeHkEdtD\u002fg28zwgiy0P7Din8B1O7Q\u002fQB\u002fi9RpKtD\u002fgHl3\u002fc1i0P6DNNS+CZrQ\u002fwLwbxUZ0tD9weI3vwoG0P6DV7Mz3jrQ\u002fwK6HbOabtD9ACorPj6i0PxDM2en0tLQ\u002fQMzwnBbBtD9wW1DS9cy0PzDgsVKT2LQ\u002f8HUg5O\u002fjtD8A48NCDO+0P\u002fDhaCHp+bQ\u002fYFoAKocEtT\u002fArhb+5g61PzC5QzcJGbU\u002fkO+TZ+4itT\u002fwHIYblyy1PyDyxNQDNrU\u002fUKuqETU\u002ftT9guIRJK0i1P5BgvO3mULU\u002f8CQTamhZtT+wiGYisGG1P2Cujn2+abU\u002fgDqT1JNxtT\u002fwtq9+MHm1P1CqHvSUgLU\u002fcFQTPMGHtT\u002fQws3stY61P8DV4xlzlbU\u002fQFZc2fibtT9ga6qQR6K1P9DQjnFfqLU\u002fIFKk70CutT+Qh8Up7LO1P9Co0QRhubU\u002f4GlVr8W5tT8="},"y":{"dtype":"f8","bdata":"HiHV4psS4z9IiuD1xVfgP7eXipUuV90\u002f2prMkzOd2j+Rasf3LDXYP7u5mpm6ANY\u002flOX1Bgbv0z83BsE+UvjRP1O+IOnwFNA\u002fOPRVsT+DzD89nNB6wfXIP\u002fLMZTIOfcU\u002fZtEOQzoWwj+REWM5I3y9P6LUHHwi5rY\u002fX\u002f+FcfJmsD+YBJnVWPijP43Ctwf9DI0\u002fYKMUFM4Zgj48gspCB5naPRn74fPKO1Q+IEYf842oXj7BKPnOgWBQPnp2+C9o4js+xNn4QfvjOT7Isxs\u002f9pREPvlYujQpD1A+hEVxIVhUST7JvMyG1PQ8Pq1VeStjFpw9rGrh4iDzpj0Sxw6VVjP9Pc3kb0xLATA+6KXkAWLHKD41\u002f0SRG6gRPnuWJK76jhU+4BJxRCRwEj5swyciDCcQPkK++7i2WBI+CKSau3b\u002fHj4ZglLTi+I5Pj02YI12FqI9xJrEFamzsj22QP3qQR8EPhZcoJN2txE+tocscViQ9T275Fo\u002fTLIUPhIGGwioCU8+Upc4vNCh9T0eCY0jhXUTPmif5GYWAio+\u002fLLdbelz5j1TP2XQhCj5PWoRh78Dffc9U72uGMwv8T0wc9kEs6bpPVoRsheMUvA977nHMOLe8j3piOWHBPf0PejCcHIp5fI9H1ILZP\u002fX5j3lSkzv2UjhPadX\u002fzRVB+Y9PixaFEHREj4nw7C0kuoFPlNoaelMgwE+LRkGrfWS+T2Se7k3vwLyPU2abEDwQ\u002fc9WohaORAK+D1FNw+OcRvwPTgo\u002fscEP+o9majWTZDx5T1Wf4miSkoWPlfhsg+PNhc+gTIPfZGzFD4VJ0BB57AZPjDuhW1A1gc+upxPT7jo8j2PXDAB3zcUPhgunqbWgho+owiK4dR+Bj6J\u002fJmzCS0BPuQO4CH7ARI+KF8YOrKA4D0sV2mbLo\u002fpPSxi4iL9gPA9ndEyIHZo\u002fD2wY7N10JABPjCXZVHnlSI+fWTwIx\u002fKMD491HBv6SsoPtij0JVrSR4+nx6xh1E4Jz7Kh8fTTh8gPsSU78Ni4yA+mVuX3RTrAT56TAto6CYhPmpJxzllMiQ+QeG+LIREJz6fJT1SYQEsPjYemkCxzzI+\u002fjDmRAUI\u002fj1n2I1oj2wDPryYuMxvWwQ+NktqN3iM+j1D1XY3I+vxPYT2VWaOtzA+DyS7+1MlLD6nLJl79uMpPsy6pb3hpSg+2p8tjnEhKD6HKWFd4FkoPlKhEkozYSk+AVdj+sVnKz4HLYE0Y9QuPmcjdMxGMDI+m6ItM8CT8T0yE6ZEEZb4PfoxvWmKmAE+x\u002fyf+iRrCT7m8FwyYEUSPq0pNLoBzhk+1DR3Qmu2IT5Y1BMZC3UnPsU2DvFr1S0+uyttllkuMj7BUUYw\u002fcv+Pb3eB29czwE+xZPNPJyyAj72ipqB7dsCPmm5wBsQ\u002fQE+hbZYKo6m\u002fz0Y4uAMDmUrPtXS9kCYziE+lNnDyAhpET7DoS6s7uDzPQlMeLTIdiQ+JC\u002fvhClG\u002fj30T3wb8yXzPVkIHpjZrQs+QRqoEwOUDz46d2TJJNQFPtI0VyiDQA0+zI0fblFkuT3rt9g9VMXvPS8GsjfqRtM9Zw0cbf+n+D0="},"type":"scatter"},{"customdata":{"dtype":"f8","bdata":"YjCJk2AfOT6zO90jxrunPrEz2QLQT7E+\u002fT6IXQzNgj4xD4CUnhTuPjef5OEFCcY+Wzx\u002fs5x37D47ULJtUKG0Pk7JPpkxWLg+fFd02O\u002fAqT7dKyXASRDSPgegnEyiubs+hdp1tt6yiz4W7lzJacaxPr7XIQDvUMA+luHtldcCrz7CUH28lqyRPpJQpBPfNYE+\u002f1rC2wr80D6PQLMKdpQzPpzrVGlUELo+2wp+MXcSyj7M+hbBoinBPjCebYQbFqo+q+bFK1pZrD5hcAXzLsC3Pg\u002fis4pchMM+vu6qdejCvT7SWmyFd\u002fawPjairLyPXxA+XNZhG4XyGz7co4jtPelxPlU10WnlRaQ+sditpPCWoz46zQYkLjqIPvOD7keLmYk+wmssFWO8hj5qS2ufGreEPiVwsxIuPoc+oHXJGCW1kj6CEta2A52tPtNFyeNtzhQ+nvtb+8bfJD72YLKHdKt7PhWX0\u002fRZ8os+2Gs5grGwcD7TE5B3CzOPPmovFYxMZcg+2DdrWOKgcj6o1oWoHSSRPkDQ81NKIKc+1cFiAg3RYz5m6qXjQmB2Pg9BxP9RQ3U+Fn5sEEg8cD5JhNWQBi5pPueJglmJhW0+6ovKb5ylbj5S8ef49PBuPqot6idwiWs+bp8nN1ojYj4XhZXm4mRiPs9Kuimzz28+Hl75x8qvlj6K3Eye6mKJPo7nbwWgAIU+fTnE4JHRfz6\u002f4Obnklp3PrwnHJz1u38+ext2UC\u002fugD7CqO9Jvel1Ps+wemIxJXE+rlSSuqpFaj6VTeq0OV2WPmQAkeCiMZc+MVSELh6olD5Vr8ym5tuZPua9bsHYQ4g+k4eiLidccz7R4LRlrMWUPpSkJqOlF5w+ePM2iym6jD7PLE0eykyKPrqZKk\u002fbpZs+1mCHIPJTZz7sqoT3jT1xPjX0LYLHgnU+EGsBQMMcgj7kjJNRicaDPuPDb6zWaaQ+c6rYHUY4sT5AkM+zVu+nPqpV7yBgaZ4+rbsuY1hApT4MXLdB5qSbPg7D6H9Xc5o+ub1Ri4ODeT4F2dxyT\u002fSdPlOs9JFrWqE+\u002fabyrzSyoz70BID6EWKnPjbap2NGA68+\u002fa\u002f5fF12eD61lhDuJ0p\u002fPtOq3ogNOoA+3sinL8v3dD53KDVRiQ5sPsYq4jgm9ak+qGSu4batpT7bEZZmksmjPvl5\u002fkR7sqI+H0tLebUsoj7F0ymjYDeiPqbQipHg3KI+OPQ\u002fM\u002fI9pD6OP6PceaKmPjJz0r56jKo+9IeJ\u002fyOCaT4cgMHlZb1xPkfaLCbQQHk+dq4zeYgkgj7IRIcDQfKJPiJPLr+pOpI+PMyvE5rmmD4HAFkveGigPpAHX7jMxKQ+AS19ZNoxqT75vaf3qE11PlaadhZchng+QlDrloqgeT7XFNZV6Ll5PmP88x6Ca3g+kLLTTBxgdT4g1bKBEl6iPqIPkRJfv5c+S79d3UkThz5OkxiSwihqPtQLsRBl+Jk+UnJjPfzdcj7XwRXWY5ZnPiJr9TxZyoA+RnDuOqb7gj7d53C97QJ6PnDfJqFjMIE+bX61Sk6yLT7UzSv4yIpiPvRRHBJVe0Y+KAhiFtjbbD4=","shape":"148, 1"},"fill":"tonexty","fillcolor":"#aec7e8","hovertemplate":"%{customdata[0]:.2f}%\u003cextra\u003eT-Notes\u003c\u002fextra\u003e","line":{"color":"#aec7e8","width":0},"mode":"lines","name":"T-Notes","stackgroup":"one","x":{"dtype":"f8","bdata":"gD3xIv5cgD8Aja\u002f45\u002f6JPwCdFs+BlY4\u002fwHX4fh4mkT9AAYiVJceSPwBqbg1qQ5Q\u002fwKeYdxOmlT8AXzSwvPWWP0CDnjOpNpg\u002fwOoFO8ZrmT+A+QNDLZeaP4A+lMZtups\u002fQMK9B7nWnD9A1RV\u002f\u002feydPwDa9QH5\u002fZ4\u002fwDdCoCIFoD+g0ewcMImgPyC8bzlZC6E\u002fQM+ZjZGLoT8ge3+6GwiiPwDsCE8CgaI\u002fYNhgJbv2oj9AmSTbpGmjPwAdjcEM2qM\u002fgNtpTDNIpD8gKs8ITrSkP4AQN6KKHqU\u002fwHi7ExCHpT9AeLPX\u002f+2lP8B70ut2U6Y\u002fAJPwyI63pj\u002fgGW6oXRqnP6D4ZkD3e6c\u002fwA8nvmzcpz8AYWGkzTuoPwAs8fQnmqg\u002fQHx+Coj3qD\u002fAnckW+VOpP8BPOzKFr6k\u002fwEToijUKqj+gy648EmSqP6ClrjMjvao\u002fwIHwIm8Vqz+Ajnde\u002fGyrPyDzad7Qw6s\u002fAEBSiEwZrD9A0PMjR2ysP4BGk3zxvKw\u002fQKEgWH0LrT\u002fAkbMOFFitPyDBeNraoq0\u002fwNBzqPHrrT9AJ43LdDOuP+Ba4hN9ea4\u002fQEqhriC+rj+gVVxYcwGvPyA3KdiGQ68\u002fQCfZDGuErz8Aby1cLsSvPwDmHeRuAbA\u002fcF0fjEIgsD8An\u002fOelz6wP+Cl5RBzXLA\u002fEOBEetl5sD9Q3fafzpawPyBRitxWs7A\u002fUFfHgXXPsD8wihXSLeuwPzAYkM+CBrE\u002f8H6OV3chsT9QJj8nDjyxP0CyHK9JVrE\u002fEFmiKSxwsT\u002fA3Edbt4mxP4BnxgHuorE\u002fcB\u002fbeNG7sT9gunpSY9SxP5Aw3y2l7LE\u002fEMPJ45gEsj\u002fQKJvWPxyyP4DbzgOcM7I\u002f4BahYK1Ksj+w32\u002fPdWGyP3DZx1v2d7I\u002f8GV+zS+Osj+wf5G9I6SyP4AxJvTSubI\u002fYOcIYj7Psj\u002fQKRlCZ+SyP5BKDx9O+bI\u002fgHOW5A0Osz8Qa5CQ9SKzP1C0wpdnN7M\u002fcHlIB2hLsz\u002fQVsyC+l6zPzBGVJsicrM\u002foBt6eeSEsz8Andg8QpezP8B\u002fYRA+qbM\u002fcJJZHtu6sz9wTb7UG8yzPwD73nkC3bM\u002f0J2vLpHtsz8wVzz1yf2zP\u002fCeeK6uDbQ\u002fQEXeHkEdtD\u002fg28zwgiy0P7Din8B1O7Q\u002fQB\u002fi9RpKtD\u002fgHl3\u002fc1i0P6DNNS+CZrQ\u002fwLwbxUZ0tD9weI3vwoG0P6DV7Mz3jrQ\u002fwK6HbOabtD9ACorPj6i0PxDM2en0tLQ\u002fQMzwnBbBtD9wW1DS9cy0PzDgsVKT2LQ\u002f8HUg5O\u002fjtD8A48NCDO+0P\u002fDhaCHp+bQ\u002fYFoAKocEtT\u002fArhb+5g61PzC5QzcJGbU\u002fkO+TZ+4itT\u002fwHIYblyy1PyDyxNQDNrU\u002fUKuqETU\u002ftT9guIRJK0i1P5BgvO3mULU\u002f8CQTamhZtT+wiGYisGG1P2Cujn2+abU\u002fgDqT1JNxtT\u002fwtq9+MHm1P1CqHvSUgLU\u002fcFQTPMGHtT\u002fQws3stY61P8DV4xlzlbU\u002fQFZc2fibtT9ga6qQR6K1P9DQjnFfqLU\u002fIFKk70CutT+Qh8Up7LO1P9Co0QRhubU\u002f4GlVr8W5tT8="},"y":{"dtype":"f8","bdata":"m49N2RQU0D2J0Yue\u002fWA+PgHmkFW4KEY+v9XrqrMQGD4VmcJ9ZUCDPlG30miCNFw+MOllXhI4gj4ipEoHFWhKPsCvCD81KU8+6Yn4x3p7QD7Tf4G4Fh9nPg\u002fX\u002fVl8vlE+S8naIii6IT7KByVoh8BGPjHrxJl54lQ+vB8T5dvYQz6Iwy9DeZ8mPpx7LvCDBxY+9IjuiX69ZT5bceVA8w\u002fJPWQw2oBKrlA+3liYcaivYD4FQcGQ2vdVPuHVjSH9sUA+gg7llrQkQj4qSL9+omZOPsGHx7tX+1g+4Ebo5BkMUz5p0A+MW7ZFPlnuBd0y9aQ9bpNnjOTisT1DvVIRHO0GPgc6SSsR8zk+pfYbix8TOT5+041rygIfPuOR6qhEYiA+p6gFbRgaHT4h+vkd+YMaPsmZN\u002fk6wB0+Pt4BARvyJz4\u002fcsZq2fNCPmowxFbUoao96eXR7wi4uj1WH5tMabURPtDlm+7I4iE+hZ7OKwxdBT5UfT1rtfcjPkD\u002flZT7OV8+msxL9ivYBz4AHXjNyfAlPpAKYb34mT0+Ytm7SoFd+T22c4KoLKQMPq255jJzNws+82N2UgrIBD4G5JLXdB0APvp2pcjS5AI+6Ohi6zCdAz7EUg+Vac0DPsnflfCjnwE+CPU8t3039z2YtHffX4v3PaMlycj3WwQ+1QfjUfkJLT6Wysp5Tj8gPvPq1oEU4ho+\u002fldzKSpdFD5HuVoUk+QNPhxhoYJVTxQ+S6irrsGrFT4C2OBodwwMPvVSfrsq8gU+E7E0RG3QAD4v3lTdSaAsPlekkKQssC0+C037eMpwKj7GMraTvIwwPqyMWu0pDx8+YFGxO+DHCD7EH4E6n5YqPmkXqHKn+jE+V4ey8qliIj4eWlo8\u002fNQgPkTdtAnUsTE+83vgMxfc\u002fT1sS76OWREGPmMFbnOtiAs+HzdoZg4vFz4ZqontC1AZPrIjPcgSITo+BH5xMJcKRj7DPcxW\u002fqI+Pk5LHuyjdjM+3WD+VaQzOz7fY0w0N7ExPuoqyKOo7TA+GsFxOitUED4ilZf3tyszPmqA8T9MNjY+Oeru\u002fwU2OT44gRR+K+49Ptu+I88i2UM+tB4r09NPDz4sf4X0fwYUPkF0WgswxRQ+1B9mo8bWCj6eOFXD0vQBPmAbIEPlnEA+pE2NaKK\u002fOz5MVMqX7lM5PgEX1UOy7jc+eRh\u002fpXdDNz6BTCuJH1E3Pqyk2nz2JDg+9sejGOToOT6XWzfn7fg8Pj81cjK\u002f\u002fUA+5NEkPUpTAD4ZKQxP\u002fbQGPkJOtvl6KRA+rG4jmwA5Fz6fxYnjCpsgPg1b6SdUVSc++8fWiX3fLz7qejTWmQA1PgDC\u002fuuAlTo+r5dk7ucfQD7EjHpRr0QLPlqSjelMZA8+SYXoGL9mED6UFzcY+3YQPvqUGTzuQQ8+63MjL01cCz6PBmoMp4I3Pixwr2mYZS4++nmMTlSJHT4TK00q7b0APkBPcQD5njA+A9pBlmEmCD56h2OhIzH+PX4YY93ifRU+yj0I5VlMGD5va6TftqUQPj4omIZ\u002fABY+g+ppyXkBwz0FylaF4rv3PZSwYUrTxtw9ir0+YDh4Aj4="},"type":"scatter"},{"customdata":{"dtype":"f8","bdata":"ISCKNIJ1QkCngmOtp9ZCQJxMAb5BDENAvaGCBOs3Q0DR9UeSoV5DQKzQN4LIgUNAZgFJFySjQ0ArBwXbVsJDQFJzBc6o4ENAaExiBMX9Q0AjuP9WOhpEQOAShiQZNkRA6LWO6nBRREBmp4GdUmxEQKZJzLTGhkRABEL7bMmgREAcVHo3SbpEQOfoRwzQ00RAX3qqod19REB7tuF705RDQHmjA16XsUJAuFp++gfTQUCs6UOXc\u002fhAQATTGeh8IUBAtue8XB2cPkDWeGpWn\u002fo8QPSEiUwKXjtAnzWfj7zFOUB0i0+A6zE4QDSabbKxojZAOfyrmSUWNUDSDQdViYwzQI6sewHeBDJAy5loKvaAMEA7R2jxQwAuQD4PMdDCAStAOL4LTdEHKEDp\u002fokghxElQCDwPIHZHiJAj2pM+lNfHkBnw8UZuosYQDgw1ryKtRJAFt8\u002fmjHRCUAiVRXZBoT8P2QWExa50tU\u002fnShEqFdwnz7HzgNdPyalPmcnrb3E19E+r5eEXgJUeD6nGsguBumTPpOqPq3okKk+STTkdlXXbj4qoWuxc1iAPjpWrwUXSXs+UjE6l6+Hcj7qqoS4IX1oPtelJpphsGo+FoLLHhh9az46V4vV0R1sPtofHsgcGmg+BZ8dClk6XD5NXdyjUalVPqAthqHdIlo+oCBaBZtuhz7mKaKiXNF3PiZKbAbvI3M+i7wL\u002fsAwbD70tC5pDAxkPoNqwJ+UK2o+HK9PrPQNaz7eMCDCILBhPrDp5jjfvFc+Ge8G+\u002fXoUz53sH+ieH2FPpzVPg134IY+muU1xfiQhT6E8S4YBcGLPnuIE+c9Jno+n1xNSrnUZD5V926SlzSGPiqmUUIWJYw+7+WS8MJWeD4L0eHevhxzPo\u002fnCbwpT4Q+Gpf1z+x0Uj6BlVDtNFZcPhUqv3U5IGI+5oHXLNz0bj6oGShj2KZyPvaRS0AkkpM+NO5USOtvoT45+3P4z+mYPhmTOZ1hQ48+gzN0J2eOlz7q8PAjBxuQPuD9PWLxlZA+T6k6HdxkcT7z+xJOY0SRPjqO0MCePpQ+6yV\u002fmpk6lz4eYma8udqbPsoyt777pKI+d+x8M8SqbT7Om2yuxyBzPm6\u002ffv\u002fl\u002fHM+ShI0j1n\u002faT6cjTlPTYBhPtaeMTV7SaA+xD3bizdbmz56r5bSGRuZPlkn50ns2Jc+DR5Bj+VLlz4C1Zbc5XWXPhsiNm8YZ5g+8a5Kt7ZMmj71t\u002fd8zYedPiDwdXbhY6E+oZv7d5HGYD7xEk4Sn2xnPllXOG5fvHA+edzlPMwieD4TBirnGlKBPsY7cARebIg+YJ1EMOG8kD6DvIS1ryGWPtsNIsmgGpw+tt8SZLsZoT6bc\u002fNctu9sPiY4tFpDtXA+W01czmGDcT5sjIVqy6JxPtrdmmEyy3A+RtjUURx\u002fbT7qOWjI\u002f3iZPlQlmdghhpA+\u002f\u002fwST00egD7dGpPnplpiPoshTF2pspI+0BrTTRaRaz4SdJo7cGNhPghP4f4h+ng+zTMp4EJnfD568YcN3ZRzPpGPpW3QIXo+Hc\u002fAVxGlJj4spfpFGE9cPrDTGhcQK0E+Ue6T\u002fPL5ZT4=","shape":"148, 1"},"fill":"tonexty","fillcolor":"#2ca02c","hovertemplate":"%{customdata[0]:.2f}%\u003cextra\u003eReal Estate\u003c\u002fextra\u003e","line":{"color":"#2ca02c","width":0},"mode":"lines","name":"Real Estate","stackgroup":"one","x":{"dtype":"f8","bdata":"gD3xIv5cgD8Aja\u002f45\u002f6JPwCdFs+BlY4\u002fwHX4fh4mkT9AAYiVJceSPwBqbg1qQ5Q\u002fwKeYdxOmlT8AXzSwvPWWP0CDnjOpNpg\u002fwOoFO8ZrmT+A+QNDLZeaP4A+lMZtups\u002fQMK9B7nWnD9A1RV\u002f\u002feydPwDa9QH5\u002fZ4\u002fwDdCoCIFoD+g0ewcMImgPyC8bzlZC6E\u002fQM+ZjZGLoT8ge3+6GwiiPwDsCE8CgaI\u002fYNhgJbv2oj9AmSTbpGmjPwAdjcEM2qM\u002fgNtpTDNIpD8gKs8ITrSkP4AQN6KKHqU\u002fwHi7ExCHpT9AeLPX\u002f+2lP8B70ut2U6Y\u002fAJPwyI63pj\u002fgGW6oXRqnP6D4ZkD3e6c\u002fwA8nvmzcpz8AYWGkzTuoPwAs8fQnmqg\u002fQHx+Coj3qD\u002fAnckW+VOpP8BPOzKFr6k\u002fwEToijUKqj+gy648EmSqP6ClrjMjvao\u002fwIHwIm8Vqz+Ajnde\u002fGyrPyDzad7Qw6s\u002fAEBSiEwZrD9A0PMjR2ysP4BGk3zxvKw\u002fQKEgWH0LrT\u002fAkbMOFFitPyDBeNraoq0\u002fwNBzqPHrrT9AJ43LdDOuP+Ba4hN9ea4\u002fQEqhriC+rj+gVVxYcwGvPyA3KdiGQ68\u002fQCfZDGuErz8Aby1cLsSvPwDmHeRuAbA\u002fcF0fjEIgsD8An\u002fOelz6wP+Cl5RBzXLA\u002fEOBEetl5sD9Q3fafzpawPyBRitxWs7A\u002fUFfHgXXPsD8wihXSLeuwPzAYkM+CBrE\u002f8H6OV3chsT9QJj8nDjyxP0CyHK9JVrE\u002fEFmiKSxwsT\u002fA3Edbt4mxP4BnxgHuorE\u002fcB\u002fbeNG7sT9gunpSY9SxP5Aw3y2l7LE\u002fEMPJ45gEsj\u002fQKJvWPxyyP4DbzgOcM7I\u002f4BahYK1Ksj+w32\u002fPdWGyP3DZx1v2d7I\u002f8GV+zS+Osj+wf5G9I6SyP4AxJvTSubI\u002fYOcIYj7Psj\u002fQKRlCZ+SyP5BKDx9O+bI\u002fgHOW5A0Osz8Qa5CQ9SKzP1C0wpdnN7M\u002fcHlIB2hLsz\u002fQVsyC+l6zPzBGVJsicrM\u002foBt6eeSEsz8Andg8QpezP8B\u002fYRA+qbM\u002fcJJZHtu6sz9wTb7UG8yzPwD73nkC3bM\u002f0J2vLpHtsz8wVzz1yf2zP\u002fCeeK6uDbQ\u002fQEXeHkEdtD\u002fg28zwgiy0P7Din8B1O7Q\u002fQB\u002fi9RpKtD\u002fgHl3\u002fc1i0P6DNNS+CZrQ\u002fwLwbxUZ0tD9weI3vwoG0P6DV7Mz3jrQ\u002fwK6HbOabtD9ACorPj6i0PxDM2en0tLQ\u002fQMzwnBbBtD9wW1DS9cy0PzDgsVKT2LQ\u002f8HUg5O\u002fjtD8A48NCDO+0P\u002fDhaCHp+bQ\u002fYFoAKocEtT\u002fArhb+5g61PzC5QzcJGbU\u002fkO+TZ+4itT\u002fwHIYblyy1PyDyxNQDNrU\u002fUKuqETU\u002ftT9guIRJK0i1P5BgvO3mULU\u002f8CQTamhZtT+wiGYisGG1P2Cujn2+abU\u002fgDqT1JNxtT\u002fwtq9+MHm1P1CqHvSUgLU\u002fcFQTPMGHtT\u002fQws3stY61P8DV4xlzlbU\u002fQFZc2fibtT9ga6qQR6K1P9DQjnFfqLU\u002fIFKk70CutT+Qh8Up7LO1P9Co0QRhubU\u002f4GlVr8W5tT8="},"y":{"dtype":"f8","bdata":"h4+mqaag1z\u002fq7kGW\u002fxzYPwWLfNSbYdg\u002fRNkXvn6Z2D\u002ftG1xADMvYP717HuQK+Ng\u002fT+1xjr0i2T9qE3edrErZP5K8\u002fOh7cdk\u002fSHbuvb6W2T9LhXr0K7vZP0idq4DY3tk\u002fwzp5NtgB2j+Nt5vJQCTaP\u002fOlYRAdRto\u002fs4eTOWhn2j9XsyHMC4jaP3m5o2G4qNo\u002fy\u002fjPSbU62j9BMQLcahDZPxZ10YyO7dc\u002fmYhuDa7Q1j+p7Vbg5bjVP7Onupm+pdQ\u002fsvomCB2X0z\u002flD5YY64vSP0Cxn6Hdg9E\u002fZtC3KI1+0D8aTHquN\u002fjOP2ucRF81+cw\u002fXS6zxKD9yj+ItVCBzgXJP7aA0VN4EMc\u002fI6Z7afMfxT\u002feDvuuXjPDP4T\u002fuJnOSME\u002fUpfRlVPCvj+l1eMzt\u002fe6PxVSBj+6Mbc\u002f9TnpvjVwsz9l2xumK2uvP9fCqxqd8qc\u002fk1s9TuKFoD8\u002fLPlhBECSP9J472MB72s\u002f1b2wa\u002fAeND633wSgPBI7Pjz\u002fbGO+1mY+CT2VEtojDz4JdLjfMHwpPjVEhN+9XEA+515KfwO9Az5UpQQ1GewUPk68WyJ1dhE+fs4C\u002f+q3Bz7QsSQVfVj\u002fPZSnali5FAE+BElZhL2XAT7yvBvGmv4BPjZmynC+2f49VShG09wQ8j2L\u002fGsZArrrPdeNnXEnuvA9ADQXETf+HT5Fpn2In3wOPqxUqUXqfwg+MGSC9LgKAj44gVqlBan5PeNihUe7vwA+3zw9l5xQAT7VH3v4AKT2Pez3jWdlYu49STyYIhx86T2trq0X4oEbPgWrWndGSB0+VWOrBtiaGz6SmuB1NsMhPoyK45NQvBA+y4B37uKp+j13t9UhR2wcPoHGH3JBAyI+USZB7F8nDz5\u002fXdnftnYIPltRfb3t\u002fhk++IOWcOef5z2asbg7sSLyPaoCrb98M\u002fc923F1EunPAz7CcrhLzd8HPgjukzP7DCk+BbZsANFRNj66nfCPmeMvPudTOf4pAiQ+x+Xwb+omLj74zZrHeZ0kPpDeOpLOOiU+1l0sG6lDBj4Y3Nq1GBomPtqCzfbA6Sk+I8p55KW7LT6YCy0SqtMxPn1VjjFr3Tc+8DBah6b8Aj7KVkPf4HsIPhyjCEehlQk+qjSchGyjAD6z8ipbyWb2PaGDP6Dv2DQ+kv7TEQ+CMT6WUds0WBEwPhZRZStNhi4+dyYgrcnRLT6SYnmfjAcuPiNAbjxIPC8+NHp30e\u002fUMD5VD4oSRuYyPj2utUVoQjY+urKyHgx59T2G+TrkrPv9PTXWZkX\u002fawU+ScjodtzkDj43RUqOpysWPt\u002fbwrMHQx8+ccmAXKVsJT68LosbFFQsPjqY4tyP\u002fDE+HBRqOH\u002fjNT6MDKaX74QCPmQz0pLlYgU+qNO9obpqBj5s+4Hk75IGPpK12s74fgU+5Z7u9rXgAj5ttEKAcE0wPlfyFbmRJiU+PKqnoqqhFD6\u002fsSJHRn73Pdt8OETt7ic+11iRJ4mkAT6nQohW10H2PQrgNG99+A8+ojW+cJstEj6SSY8bdxAJPuwydCd7uRA+JeCkKD\u002f8vD3pnNMDJB7yPcLbDTKu+dU9UxLcBTch\u002fD0="},"type":"scatter"},{"customdata":{"dtype":"f8","bdata":"NygSHtL2PD4g7u1xVUoCQA5PMv8aUxVA76+vZM9AH0BHiHQlSgEkQDK+0iJ4BShAaZa0eTDJK0AnzKd0IV0vQAJy98JyZjFAlsfhUgoQM0B+pclM\u002fq00QIfnlSNfQjZAfQsDypbON0B5fM+wQFQ5QJqqMUzT0zpAwLf+fEtOPEDaZ8izVcQ9QCB7h3NaNj9AHDfx2kMmQEAJdwtIL3RAQMY\u002fk77sv0BAlr8L9zMKQUDbz2XdOVNBQJptWQfRmkFA6FKq2EXhQUD+oyPC4yZCQGntUD7Ka0JAi83aDzCwQkAwjR4pkvNCQAI5VtymNUNAvHe4tcV3Q0AAm3++hLlDQMw2VhWB+0NAwQwexi08REC7pKmN73tEQPdDp6nWu0RAPMVz9j\u002f7REAkgpVybTpFQIgYbddQeUVAbO8FKPO3RUAX20uthPVFQEhTwpIcNEZABfMF0ftxRkCO5ZuSma9GQB7ATtc57UZAQ6ZHnnSCRkCsyoPEOeZFQEoVMA0ETUVAu6N\u002fGWy2RECOQoacOiJEQCGblfBVkENABsBaYE0AQ0D0ekkcM3JCQGXZsZW\u002f5UFA3vU9s95aQUC3JnYZcNFAQKG4V9FpSUBA+Von7kmFP0AZwVk2HHo+QOQrI44UcT1AdPVcMvBpPEB\u002fDWxoymQ7QJlNU\u002f6PYTpAsLj9al1gOUBd8ApJ\u002fl84QEX+hGiOYTdAMjqO4ZFkNkAre3b88Wg1QMKUu++RbjRAqDPYNVl1M0D5c95oYH0yQMhntdqvhjFALZJciDORMEBn4JLP4DgvQAOy2aB3Ui1AB81CytdtK0BdsT8\u002fk4opQJwVmW+YqCdAl31S12nIJUAFx3j94ekjQKt5TkOfDiJABbqTLjYzIEDS+iTTObIcQG5TcPFMABlAYWRNN+ROFUBfydGnMaERQGp0KSBe7AtAdxgtx8abBEBV7a7YQaj6P4YDLKkHTug\u002ffCrIiWWmJj8ww4WmeFryPkhnius0AuE+mXwPVFmEuD5x6FD1hS6kPpNsnbYcl5k+gtNhqsDddT6Ixg8nNfvAPkfGyFYQL8I+mPePbKpMwz4U+olF6Z\u002fFPon1hDTyQ8s+5lleRm+SlD6YS2QBIkqZPj7bbS78UJk+f8ndJU61jz7A0WawnaGEPinxCzewnMI+uACbUb9hvj5BLtaFnCW7PteigLpVJrk+c38YODEBuD6df3EMzae3PiVYOsKCHLg+no+7wMx+uT6PYLEUvx28Pnx7GE\u002fCRcA+7JtTRKrhfj5DNibzHzmFPkiaxLFd340+usZPO0s7lT4YMF40pw2ePppG+Pt+6KQ+m6JsuwlLrD7aE58b+HmyPvKiATSoL7c+z6F6EV3luz494Lo5n3iHPv7WghH1z4o+Z4xvyNvOiz6y1H86IbaLPoniy9tuHYo+NJOKlg6yhj4NnOaez1SzPg7V8cSQ0ag+stz5kw7wlz6VJvU8sep6PtenXAT3xao+Bn\u002fW7uxfgz7Z0TLBp993PhH28ggACJE+FlZfmg8Rkz4EZ2RP1MSJPhT4dTz6upA+6ZMTuIKAPD51WTk6Wp1xPtLl8\u002fBfOlU+oi5iW8JAez4=","shape":"148, 1"},"fill":"tonexty","fillcolor":"#98df8a","hovertemplate":"%{customdata[0]:.2f}%\u003cextra\u003eBaa Corps\u003c\u002fextra\u003e","line":{"color":"#98df8a","width":0},"mode":"lines","name":"Baa Corps","stackgroup":"one","x":{"dtype":"f8","bdata":"gD3xIv5cgD8Aja\u002f45\u002f6JPwCdFs+BlY4\u002fwHX4fh4mkT9AAYiVJceSPwBqbg1qQ5Q\u002fwKeYdxOmlT8AXzSwvPWWP0CDnjOpNpg\u002fwOoFO8ZrmT+A+QNDLZeaP4A+lMZtups\u002fQMK9B7nWnD9A1RV\u002f\u002feydPwDa9QH5\u002fZ4\u002fwDdCoCIFoD+g0ewcMImgPyC8bzlZC6E\u002fQM+ZjZGLoT8ge3+6GwiiPwDsCE8CgaI\u002fYNhgJbv2oj9AmSTbpGmjPwAdjcEM2qM\u002fgNtpTDNIpD8gKs8ITrSkP4AQN6KKHqU\u002fwHi7ExCHpT9AeLPX\u002f+2lP8B70ut2U6Y\u002fAJPwyI63pj\u002fgGW6oXRqnP6D4ZkD3e6c\u002fwA8nvmzcpz8AYWGkzTuoPwAs8fQnmqg\u002fQHx+Coj3qD\u002fAnckW+VOpP8BPOzKFr6k\u002fwEToijUKqj+gy648EmSqP6ClrjMjvao\u002fwIHwIm8Vqz+Ajnde\u002fGyrPyDzad7Qw6s\u002fAEBSiEwZrD9A0PMjR2ysP4BGk3zxvKw\u002fQKEgWH0LrT\u002fAkbMOFFitPyDBeNraoq0\u002fwNBzqPHrrT9AJ43LdDOuP+Ba4hN9ea4\u002fQEqhriC+rj+gVVxYcwGvPyA3KdiGQ68\u002fQCfZDGuErz8Aby1cLsSvPwDmHeRuAbA\u002fcF0fjEIgsD8An\u002fOelz6wP+Cl5RBzXLA\u002fEOBEetl5sD9Q3fafzpawPyBRitxWs7A\u002fUFfHgXXPsD8wihXSLeuwPzAYkM+CBrE\u002f8H6OV3chsT9QJj8nDjyxP0CyHK9JVrE\u002fEFmiKSxwsT\u002fA3Edbt4mxP4BnxgHuorE\u002fcB\u002fbeNG7sT9gunpSY9SxP5Aw3y2l7LE\u002fEMPJ45gEsj\u002fQKJvWPxyyP4DbzgOcM7I\u002f4BahYK1Ksj+w32\u002fPdWGyP3DZx1v2d7I\u002f8GV+zS+Osj+wf5G9I6SyP4AxJvTSubI\u002fYOcIYj7Psj\u002fQKRlCZ+SyP5BKDx9O+bI\u002fgHOW5A0Osz8Qa5CQ9SKzP1C0wpdnN7M\u002fcHlIB2hLsz\u002fQVsyC+l6zPzBGVJsicrM\u002foBt6eeSEsz8Andg8QpezP8B\u002fYRA+qbM\u002fcJJZHtu6sz9wTb7UG8yzPwD73nkC3bM\u002f0J2vLpHtsz8wVzz1yf2zP\u002fCeeK6uDbQ\u002fQEXeHkEdtD\u002fg28zwgiy0P7Din8B1O7Q\u002fQB\u002fi9RpKtD\u002fgHl3\u002fc1i0P6DNNS+CZrQ\u002fwLwbxUZ0tD9weI3vwoG0P6DV7Mz3jrQ\u002fwK6HbOabtD9ACorPj6i0PxDM2en0tLQ\u002fQMzwnBbBtD9wW1DS9cy0PzDgsVKT2LQ\u002f8HUg5O\u002fjtD8A48NCDO+0P\u002fDhaCHp+bQ\u002fYFoAKocEtT\u002fArhb+5g61PzC5QzcJGbU\u002fkO+TZ+4itT\u002fwHIYblyy1PyDyxNQDNrU\u002fUKuqETU\u002ftT9guIRJK0i1P5BgvO3mULU\u002f8CQTamhZtT+wiGYisGG1P2Cujn2+abU\u002fgDqT1JNxtT\u002fwtq9+MHm1P1CqHvSUgLU\u002fcFQTPMGHtT\u002fQws3stY61P8DV4xlzlbU\u002fQFZc2fibtT9ga6qQR6K1P9DQjnFfqLU\u002fIFKk70CutT+Qh8Up7LO1P9Co0QRhubU\u002f4GlVr8W5tT8="},"y":{"dtype":"f8","bdata":"npQ0PHyJ0j32jDAhY2mXP\u002f0xDa2nS6s\u002fR7hRu4QAtD9GUvEvQJu5P7H9FxhSv74\u002fi0G78XDIwT9CHIrFpBLEP6awZZ2xRcY\u002fO\u002fVJnXNmyD9Zv3K+T3jKP1FR\u002fWrqfcw\u002foGAY7hJ5zj\u002fnWUf26zXQP4Elr4JoK9E\u002fKTjW86Ad0j\u002fT0UKmAw3TPwCCI33T+dM\u002f8KyG+dur1D+5JyOumA\u002fVP6FRYDGLcNU\u002fg9bbrJ7P1T+T9fLdFi3WP\u002fjTAaO5iNY\u002f4V9pw+ji1j+sx4nPBDzXP2gbUxI2lNc\u002ff22no8Lr1z9cJf7DAkLYP7BnRSSYltg\u002fdswzgjrr2D9wnYQ7Yj\u002fZP2wnO23Yk9k\u002fkRqX\u002faDm2T+dyEnePDjaP\u002fR\u002fPIcIito\u002fEJb6JjPb2j9C7oE2ESzbP3vN52+QfNs\u002fn44wXLzM2z8dYEIbixvcP4+TnLGpa9w\u002fRGrU7Nu63D+DbUJVugndPzuu3\u002fSbWN0\u002f+jBwbvHP3D\u002fSaccF+AfcP34l1zncQ9s\u002fifo8uhmD2j8mfhy+acXZP+1VY3GrCtk\u002f81HQj05S2D8ZvKVhapzXP4Eg+E6j6NY\u002fCPO\u002fnd821j\u002f0lybj9YbVP1Ps4F3Z2NQ\u002fYpZ\u002fRlgs1D8aZ2K8WYHTP0B4Pzy719I\u002fF53AC1Iv0j9Hef2eL4jRPy8dAq1H4tA\u002fhS5vbaw90D+LrlUBMTPPP4EcJRWD7c0\u002f0ALffLCpzD8jsm4knGfLP7Cf2zIhJ8o\u002fPsfrRCDoyD\u002fY+ibYuKrHPwq405L1bsY\u002fG7uA17w0xT\u002fH668ocfvDP8\u002fsJJojxMI\u002flBLjvvqNwT\u002f0rnoosFjAP9J3rzJxSL4\u002f\u002f6oXKM\u002fhuz\u002fyMTQ6Sn25P9FJCNH0HLc\u002fBkAZUG68tD8gOtqllV2yP1teXD4xALA\u002fNZ8l1kJGqz8yPytm45CmP+iwdo\u002f03qE\u002f4OGVb\u002f5gmj\u002fawDxNhg+RP6xgD8QyHH8\u002fEH7hm\u002fL9vD5nvJYSC36HPlIJLHVixXU+AYsyBbphTz5ye7lYJtU5Ps\u002f9bje2YDA+z7xokh\u002f9Cz4+g8z+bLxVPsEmXVB7Rlc+mYTCVw20WD5s+D9j961bPvFpDV8qc2E+8+3UTwlVKj4kJmnscS8wPmU6mJjUMzA+RzlvSxNLJD6Qugjsd2gaPl58QhPN0lc+n1y\u002fH8JxUz6vy6dVwF9RPkwWSMmIGFA+DvW4mdi5Tj7yPLrcbEdOPoyPxVTQ3E4+E7i\u002f4SZRUD7MPZDFjv5RPgXHXOor1FQ+O6G6K6DDEz6oePNVZiobPnaBxXFQHiM+nAi4GC0tKz7S9YMh8DszPlSDXOYxwzo+WUk7WYsbQj5AvVBMXKZHPtqxmxmkrU0+FFPyAHnaUT5thac\u002fCQsePv\u002fvhsPuKCE+lHj1xxHMIT5oaes5PrwhPhA\u002feFmttiA+yEsDed8MHT5jOP5ker5IPgjJP1iQxD8+7lcrs+mjLj75+UoICzoRPnVCZJyJIkE+WZjpZLTMGD7j7bs0644OPvc6QdjMzCU+l9RGDcJnKD42I7uE+H0gPg8p8w82aiU+bFTZTMQ90j0GXnKc+IsGPiFPvez\u002fK+s9zkZ8OiBxET4="},"type":"scatter"},{"customdata":{"dtype":"f8","bdata":"P1AEhKPWC0CT+DIdNVUVQGkn0\u002f6wBhhAmhW10Zw4GkA650duZSgcQMkTcYYT7x1A8I0VXTSZH0BxmixCLJcgQE9xFka4WSFAkRG7I\u002fcVIkA8Rx1HC80iQP8EzDzjfyNAPZ4mew8vJEDaBdyTS9skQLl5khLphCVAkCSL+k4sJkB7u8wCx9EmQPZrslJ3dSdAxjlpgWgZKED8hWkiHL0oQIjGL08pXClAfkurPx\u002f4KUCFsIPJfZEqQJ+btqjUKCtAELb\u002fMXC9K0DD0jDx8U8sQG1Oh8eG4CxAH0UlnlFvLUDFvm9XCP0tQGdjyvPZiS5A7UMiQwIVL0CKQD\u002fZ\u002f54vQN9gbefWEzBAftxPtelXMEATjIlYqpswQHTyniHp3jBARyxgjNQhMUB0a\u002f1wYmQxQBL5qwSbpjFANXFqWXPoMUDc9KbRDioyQAGAm0acazJAP68\u002fHMGsMkAttnEGqu0yQLtJo\u002fdiLjNAt1GDDWxTM0BtlOO0Um8zQHa7R4KbijNAxBSjWsqlM0Bw0pg7UcAzQPDYUPVQ2jNAZgI1KCT0M0DxjCbqhQ00QEUMTRqnJjRAY5P5aH8\u002fNEAXCBGQF1g0QJQYAkBicDRAzsl6IHWINECDrKKoUaA0QEz8wBkEuDRAOGrIs6HPNED2DU6fCuc0QO53Bcw6\u002fjRAHiquLBIVNUACUZ6vNCw1QJavmccFQzVA8FHIQrRZNUBssJRrQnA1QAHKVkG3hjVA+mHx2CKdNUApC9VUd7M1QETYVOihyTVA3+IFk6HfNUCDfdoNovU1QPqJn+BQCzZAs4foZO0gNkClYZVGiDY2QB1Y1a8hTDZALzIPr6RhNkBFV3GYEnc2QM2ulfEAjDZA+WapAzyhNkDUhRAjc7Y2QMkPZJWpyzZAzqqBmhnhNkDCK+DKUvY2QNqSK6RzCzdA4CQWbXkgN0DYayQTJTU3QCxSbomJSTdANJySl35IN0BtfcgqK9g2QNQsBCOxaDZApQH4ehD6NUBDfIW7Now1QFvOSSAlHzVApzOHKSOzNEBFiTyx20c0QPjPICwT3TNA1HrnbfJyM0CTPew4cgkzQNSOV8iLoDJArq3zijc4MkA\u002fWvVpcdAxQLzJp+8yaTFA4dmIpXYCMUDxfjOMN5wwQKmt4kx0NjBAglBJpEOiL0CMhOwVftguQA3Jj9GPDy5AG1gSMXFHLUB+NOP2GoAsQO3AnUGGuStAwCybiKzzKkD9yziYhy4qQJnWcYwRailAcSnmeECmKEB4VCIhGOMnQNGDHHqOICdAmJr0l55eJkDgUe3FQ50lQKJ5ZYJ53CRA8DxFezscJECT4iCLhVwjQOcgKbdTnSJAwHvULaLeIUDyN++1bCAhQJWiNhOxYiBAuZPNadZKH0Dy+Qy9L9EdQN4Pf+ZnWBxAfobo6HjgGkBUB1XeXGkZQORjun0O8xdAQycQVoh9FkBSJPNExQgVQIxbzQjZlBNAaLmrrI4hEkBqK5dkE68QQG7hedWEeg5AjnHPA\u002fmXC0DyL\u002fDuq7YIQKNpadSN1gVAlUNEO9b3AkDVpgRPcxoAQCI7ZIy6fPo\u002fsR+JUhQR+j8=","shape":"148, 1"},"fill":"tonexty","fillcolor":"#FECB52","hovertemplate":"%{customdata[0]:.2f}%\u003cextra\u003eGold\u003c\u002fextra\u003e","line":{"color":"#FECB52","width":0},"mode":"lines","name":"Gold","stackgroup":"one","x":{"dtype":"f8","bdata":"gD3xIv5cgD8Aja\u002f45\u002f6JPwCdFs+BlY4\u002fwHX4fh4mkT9AAYiVJceSPwBqbg1qQ5Q\u002fwKeYdxOmlT8AXzSwvPWWP0CDnjOpNpg\u002fwOoFO8ZrmT+A+QNDLZeaP4A+lMZtups\u002fQMK9B7nWnD9A1RV\u002f\u002feydPwDa9QH5\u002fZ4\u002fwDdCoCIFoD+g0ewcMImgPyC8bzlZC6E\u002fQM+ZjZGLoT8ge3+6GwiiPwDsCE8CgaI\u002fYNhgJbv2oj9AmSTbpGmjPwAdjcEM2qM\u002fgNtpTDNIpD8gKs8ITrSkP4AQN6KKHqU\u002fwHi7ExCHpT9AeLPX\u002f+2lP8B70ut2U6Y\u002fAJPwyI63pj\u002fgGW6oXRqnP6D4ZkD3e6c\u002fwA8nvmzcpz8AYWGkzTuoPwAs8fQnmqg\u002fQHx+Coj3qD\u002fAnckW+VOpP8BPOzKFr6k\u002fwEToijUKqj+gy648EmSqP6ClrjMjvao\u002fwIHwIm8Vqz+Ajnde\u002fGyrPyDzad7Qw6s\u002fAEBSiEwZrD9A0PMjR2ysP4BGk3zxvKw\u002fQKEgWH0LrT\u002fAkbMOFFitPyDBeNraoq0\u002fwNBzqPHrrT9AJ43LdDOuP+Ba4hN9ea4\u002fQEqhriC+rj+gVVxYcwGvPyA3KdiGQ68\u002fQCfZDGuErz8Aby1cLsSvPwDmHeRuAbA\u002fcF0fjEIgsD8An\u002fOelz6wP+Cl5RBzXLA\u002fEOBEetl5sD9Q3fafzpawPyBRitxWs7A\u002fUFfHgXXPsD8wihXSLeuwPzAYkM+CBrE\u002f8H6OV3chsT9QJj8nDjyxP0CyHK9JVrE\u002fEFmiKSxwsT\u002fA3Edbt4mxP4BnxgHuorE\u002fcB\u002fbeNG7sT9gunpSY9SxP5Aw3y2l7LE\u002fEMPJ45gEsj\u002fQKJvWPxyyP4DbzgOcM7I\u002f4BahYK1Ksj+w32\u002fPdWGyP3DZx1v2d7I\u002f8GV+zS+Osj+wf5G9I6SyP4AxJvTSubI\u002fYOcIYj7Psj\u002fQKRlCZ+SyP5BKDx9O+bI\u002fgHOW5A0Osz8Qa5CQ9SKzP1C0wpdnN7M\u002fcHlIB2hLsz\u002fQVsyC+l6zPzBGVJsicrM\u002foBt6eeSEsz8Andg8QpezP8B\u002fYRA+qbM\u002fcJJZHtu6sz9wTb7UG8yzPwD73nkC3bM\u002f0J2vLpHtsz8wVzz1yf2zP\u002fCeeK6uDbQ\u002fQEXeHkEdtD\u002fg28zwgiy0P7Din8B1O7Q\u002fQB\u002fi9RpKtD\u002fgHl3\u002fc1i0P6DNNS+CZrQ\u002fwLwbxUZ0tD9weI3vwoG0P6DV7Mz3jrQ\u002fwK6HbOabtD9ACorPj6i0PxDM2en0tLQ\u002fQMzwnBbBtD9wW1DS9cy0PzDgsVKT2LQ\u002f8HUg5O\u002fjtD8A48NCDO+0P\u002fDhaCHp+bQ\u002fYFoAKocEtT\u002fArhb+5g61PzC5QzcJGbU\u002fkO+TZ+4itT\u002fwHIYblyy1PyDyxNQDNrU\u002fUKuqETU\u002ftT9guIRJK0i1P5BgvO3mULU\u002f8CQTamhZtT+wiGYisGG1P2Cujn2+abU\u002fgDqT1JNxtT\u002fwtq9+MHm1P1CqHvSUgLU\u002fcFQTPMGHtT\u002fQws3stY61P8DV4xlzlbU\u002fQFZc2fibtT9ga6qQR6K1P9DQjnFfqLU\u002fIFKk70CutT+Qh8Up7LO1P9Co0QRhubU\u002f4GlVr8W5tT8="},"y":{"dtype":"f8","bdata":"j2ZzfQzRoT+ee0t3WE6rP7kT243iwK4\u002f8pK7cRLIsD\u002fJYL2iXwWyPznPhWpeKLM\u002f11rQRRc5tD9eDWKcYTy1P\u002f+5HMBmNbY\u002fh+0DD1smtz9N4ItGshC4P\u002fTIdb6d9bg\u002fY24xYNbVuT8rT2FCTLK6P2g12sVni7s\u002fpNLQxaxhvD90BC+deTW9P08PLCL\u002fBr4\u002fT9nir9fYvj8ZRbpzYaq\u002fPwWozLf7OsA\u002fCU+1UcyewD9+XAJY9ADBP\u002fXyIsjPYcE\u002fAIkepevAwT9em65Srx7CPzEy8Ik3e8I\u002fejanoprWwj+dZcIETTHDP5Ro\u002fMRsi8M\u002fRvjsU3zkwz93hf+zzDzEP4Rn8kZGlMQ\u002fT8golmjrxD\u002f6+gG5IULFPxos6qU0mMU\u002ftw+k3NztxT9XVm1dDUPGP6fi0anQl8Y\u002fOUlfxBjsxj+98d\u002f3EkDHP+1RqDv7k8c\u002fb2XMlF3nxz+11HI7czrIP9GbanpLjcg\u002f6iB\u002fRLO8yD8bQ0zdaeDIP8qTUWlWA8k\u002fGQayuyEmyT+ZF9gOFkjJPz7Y9mJdack\u002focWVuGuKyT\u002fY8crZ6KrJP1iA3VQTy8k\u002fSy1ehuDqyT+EZq+ZWwrKPyRnIYVzKco\u002fRSudAERIyj+yV1XszmbKP\u002fFCAfgjhco\u002fUhfDVl6jyj9QT8pGVcHKPzHhgZQD38o\u002fwNkwOUD8yj+wZ8AJ3RnLP\u002fMTVKMRN8s\u002fwuMU7xlUyz8kmp\u002fb+HDLP+O63123jcs\u002f7mhyC2qqyz9evOck\u002f8bLP4ozBppe48s\u002f9OSWIof\u002fyz8tjJK1sBvMP+SRW8NxN8w\u002fiVFxYhtTzD\u002fe97Tpwm7MP4GPJY9oisw\u002frX3qg\u002fGlzD85W3J7X8HMP7UI\u002fSoq3Mw\u002fm1DtDlf3zD+A3jPlfhLNPwu48N2lLc0\u002f1Q1UiBZJzT99TK4DQWTNP6cDQldMf80\u002fkL6CBjWazT\u002fhLfFVqrTNP2Gc84bEzs0\u002flDh+1m7NzT\u002fJqtfkpz3NP4qVDzf3rsw\u002fEStcxlwhzD90BQfwwJTLP0GNDEglCcs\u002fHULgU+V+yj\u002feCxAWlPXJP2c9NFflbMk\u002f0jZ6WQ3lyD+8oDjYAl7IP4rVZSm918c\u002fUN5gnTJSxz+OSkT4Xc3GPw+mUfU2ScY\u002furpxlrbFxT+HeQR21kLFP7kbS92UwMQ\u002fm+FXnOM+xD9kF7ZVwb3DP0YaCtgoPcM\u002fYzggPhW9wj+YIbDlgT3CP8szb2dqvsE\u002fHzHelMo\u002fwT\u002f06OZ1nsHAP5WTZ0XiQ8A\u002fkSASUx+Nvz+ZgO4VUpO+P0lrdvhPmr0\u002fmeQFrhKivD\u002fr7YswlKq7Pw0rY7vOs7o\u002fUga\u002fxry9uT8EIgEEWci4P63sFVue07c\u002fCg++6Ifftj9fPQlFEOy1PwYieZM0+bQ\u002ftLrfn+8GtD9o3cpFPRWzP2UUR4kZJLI\u002fPLIPlYAzsT9Ax8WibkOwP1eU7qDAp64\u002fdGUzRaTJrD+miu+fgeyqP\u002fFqyfZxEKk\u002fmc7bgDE1pz\u002faGFsa+lqlP\u002f+ulbGcgaM\u002fKF0eSvGooT+ScDPBI6KfP3WR973o85s\u002flgTInXhHmD8lbxqOvJyUP0ljSpeq85A\u002fkPWKU8WukD8="},"type":"scatter"},{"customdata":{"dtype":"f8","bdata":"GPCYFk2R6T9zeWISrRUHQCgmSTolT\u002fQ\u002fJPviIL93CECoqslpzeT3Pyq8eizR2QlA\u002fDdkpo\u002fL+j\u002f+nb444zsLQPSBpLkqV\u002f0\u002fPSiuX\u002fWdDECghfy0Van\u002fP+jtiFUHAA5ADkNvNb\u002fpAECvv+dqGWIPQDjqqGn77wFAWzSNtBViEECK1lMwtOoCQGqgWrweExFAZp8c3jLcA0AT\u002fTLCJ8QRQOwaW1wbxgRAq0zIyDB1EkDU0CPDpakFQMTHaM45JhNAwj8MjsCHBkDj+MPUQtcTQJoOSQsmYQdAjMmC20uIFEBQEoiJajYIQHZ+UuFUORVAHHdnGgYICUCiP97nXeoVQIoHMi1b1glA\u002fPr47WabFkDylb5pu6EKQNisMPRvTBdA1FNAbRNqC0Ctv+n4eP0XQGIwZ1OrLAxAAbfZAIKuGEDA8H2bk+kMQBtruwWLXxlAFlJnaoShDUAadEUNlBAaQHQvaZYRVQ5ACsBzE53BGkBQfWzuswQPQJeBQBmmchtA+GZlJ9CwD0B\u002fCu0gryMcQOnY4fbcLBBAt3i9J7jUHEDkBLtO3H8QQOEoEy7BhR1AVnZqj4TREEAoK1IwyjYeQPI1hODvIRFAGYK0NdPnHkCucDzoNHERQPCL2T\u002fcmB9A2PL7jGe\u002fEUAKChKj8iQgQDcEliuZDBJAhEPeJXd9IEA9clAq2VgSQB2o76b71SBAToSO9DSkEkDm9sIqgC4hQMgTbKi47hJADGxjrwSHIUBgalw3bzgTQEv7hDKJ3yFAEtEySGKBE0AaiM21DTgiQD6DzZmayRNA9BH0OJKQIkBOVj4PIBEUQHMTGLwW6SJAtnWF1PlXFEDflHo\u002fm0EjQBWPaD8unhRA3O9Vwh+aI0BlcWCAw+MUQHxSuEWk8iNAXuVL074oFUAjWNnIKEskQFRnzSklbRVARTTzS62jJEDxxcIt+7AVQGhVKc8x\u002fCRAAEKAysPzFUD30FFStlQlQLJ6FpSXNBZA6VNV1TqtJUAUD1OpnHMWQPIJSFi\u002fBSZA+n3Z7PmwFkAnqsPbQ14mQN5JfKvP7BZAqB7pXsi2JkDhVq76OicXQELRo+FMDydAFnuay1RgF0C4BSNl0WcnQKpGBj8zmBdAzqMG6FXAJ0D\u002f1oi36c4XQDbAG2vaGChAAgJuiIkEGEAgADjuXnEoQOUiCB0iORhArqlScePJKEARM+BYwWwYQBvrFPRnIilAqqYJonOfGEBBa7t27HopQLh+AzhE0RhABXs7+XDTKUBgt25EPQIZQNnH\u002fXv1KypA\u002fwHx+mcyGUAM4O\u002f\u002feYQqQHCoXOjMYRlA+W9tg\u002f7cKkAu02bKc5AZQGdhTgaDNStAGZ4Lz2O+GUC8op6HB44rQM258dmi6xlAuPsADYzmK0DCHpi4NxgaQFGUbJAQPyxAbXjHmidEGkAYaNkTlZcsQOunQZh3bxpAZKI8lxnwLEDLJVFkLJoaQK19eBqeSC1AV6bOeErEGkAq9JidIqEtQN2rUh3W7RpAh7GdIKf5LUCE1pwh0xYbQIJz2aMrUi5AKasNAUU\u002fG0AzczYnsKouQOxIoH4uZxtAKznnqTQDL0C4Acbik44bQB8\u002fLC25Wy9AH2HWTHe1G0DdMm6wPbQvQDbD3zDb2xtAV+6tGWEGMEDhu6wXwgEcQEAEd1ujMjBAyUDr4y4nHEAaxxad5V4wQMVvUr8jTBxAmM5k3ieLMED4NvPFo3AcQBiMUx9qtzBAvrP75q6UHEDMw+1grOMwQIPNHhRIuBxAWdF3ou4PMUC\u002fQ2jvcNscQC7m8uMwPDFAR38VsSr+HED2zY4mc2gxQINXM9h3IB1ALjojaLWUMUBYrXudWUIdQPnLlqn3wDFAhuktedFjHUD1N\u002frqOe0xQFVRR1fhhB1A5hTJLHwZMkCB5IcQiqUdQCCXxG2+RTJAeBQrtfXFHUDCIiWvAHIyQEmn4bGf5h1ACUOC8EKeMkC9OSDdkQYeQPcQhjKFyjJAvz1hi9IlHkB7A6xzx\u002fYyQKVHX2xnRB5A9HhLtQkjM0CrrbMSVmIeQJFHgvZLTzNAKsvO\u002faR\u002fHkBkaDw5jnszQFB1En9XnB5A1Rn\u002fedCnM0CcV5j5cLgeQF3rUbsS1DNAz\u002fRrX\u002fbTHkD1w578VAA0QP9YaXzr7h5AG2PHPZcsNEAwaGzeUwkfQJcPin7ZWDRAlWby2DIjH0Bu2cLCG4U0QDtILo+LPB9ARMZFBF6xNEBXeJzwYFUfQDJ50kWg3TRANEw7wLVtH0AEbXqH4gk1QI4XQJiMhR9Ag+oaySQ2NUAz0vn855wfQCCpfQdnYjVA1FAxIMqzH0DPJHZJqY41QD6AAT81yh9Ay8Ani+u6NUBKEcRpK+AfQExowcwt5zVA7Fb7k671H0DUZEUOcBM2QBiGJktgBSBALFSwT7I\u002fNkDlBhmYsQ8gQPJF\u002fJD0azZAhgDKBMwZIEDq7R3SNpg2QALYI1qwIyBADYkBE3nENkBsJ7JWXy0gQEHfilO78DZAkh+cqtk2IED8SFea\u002fRw3QHDHTgwgQCBAp+vQ2z9JN0Am95oYM0kgQAUnPB2CdTdAJFw5ahNSIEBa\u002fZFexKE3QFgJKZTBWiBAKL3JnwbON0CE8BkiPmMgQJok2uBI+jdAm0bQmIlrIED7iLshiyY4QIa4gXakcyBAvoBqYs1SOECu6Cwzj3sgQL0o6qIPfzhAKJPrQEqDIEDDeEXjUas4QJzGgA3WiiBAUiJNKZTXOEAp3Tn+MpIgQELfpWrWAzlA1lXNdWGZIED4SxSsGDA5QAuwb9FhoCBAbtaM7VpcOUBwK7tpNKcgQKozGC+diDlA3PTektmtIEBcjcBw37Q5QMoa4JpRtCBATU0zrSHhOUA7eBfSnLogQG6AsPBjDTpAtAUTfrvAIEC4Mmk0pjk6QOxG+eKtxiBAlk2wd+hlOkAO9bdedMwgQO5ZjrgqkjpA+Bnv9g7SIEC6ARb7bL46QDLAACF+1yBA7+V4PK\u002fqOkD+\u002fjnswdwgQM82CHzxFjtAYiPQadrhIEBu2Qq8M0M7QOMjBenH5iBAc6vL\u002fHVvO0Aik7eQiusgQAi60TW4mztAKWA4uyLwIEDrwSmE+sc7QOhRooCQ9CBA9TTZojz0O0Diy8PL0\u002fggQAVBnd98IDxAt7r6cCL5IEB42zKHviM8QA==","shape":"148, 2"},"hovertemplate":"Return: %{customdata[0]:.2f}%\u003cbr\u003eVol: %{customdata[1]:.2f}%\u003cextra\u003e\u003c\u002fextra\u003e","line":{"color":"rgba(0,0,0,0)","width":0},"mode":"lines","showlegend":false,"x":{"dtype":"f8","bdata":"gD3xIv5cgD8Aja\u002f45\u002f6JPwCdFs+BlY4\u002fwHX4fh4mkT9AAYiVJceSPwBqbg1qQ5Q\u002fwKeYdxOmlT8AXzSwvPWWP0CDnjOpNpg\u002fwOoFO8ZrmT+A+QNDLZeaP4A+lMZtups\u002fQMK9B7nWnD9A1RV\u002f\u002feydPwDa9QH5\u002fZ4\u002fwDdCoCIFoD+g0ewcMImgPyC8bzlZC6E\u002fQM+ZjZGLoT8ge3+6GwiiPwDsCE8CgaI\u002fYNhgJbv2oj9AmSTbpGmjPwAdjcEM2qM\u002fgNtpTDNIpD8gKs8ITrSkP4AQN6KKHqU\u002fwHi7ExCHpT9AeLPX\u002f+2lP8B70ut2U6Y\u002fAJPwyI63pj\u002fgGW6oXRqnP6D4ZkD3e6c\u002fwA8nvmzcpz8AYWGkzTuoPwAs8fQnmqg\u002fQHx+Coj3qD\u002fAnckW+VOpP8BPOzKFr6k\u002fwEToijUKqj+gy648EmSqP6ClrjMjvao\u002fwIHwIm8Vqz+Ajnde\u002fGyrPyDzad7Qw6s\u002fAEBSiEwZrD9A0PMjR2ysP4BGk3zxvKw\u002fQKEgWH0LrT\u002fAkbMOFFitPyDBeNraoq0\u002fwNBzqPHrrT9AJ43LdDOuP+Ba4hN9ea4\u002fQEqhriC+rj+gVVxYcwGvPyA3KdiGQ68\u002fQCfZDGuErz8Aby1cLsSvPwDmHeRuAbA\u002fcF0fjEIgsD8An\u002fOelz6wP+Cl5RBzXLA\u002fEOBEetl5sD9Q3fafzpawPyBRitxWs7A\u002fUFfHgXXPsD8wihXSLeuwPzAYkM+CBrE\u002f8H6OV3chsT9QJj8nDjyxP0CyHK9JVrE\u002fEFmiKSxwsT\u002fA3Edbt4mxP4BnxgHuorE\u002fcB\u002fbeNG7sT9gunpSY9SxP5Aw3y2l7LE\u002fEMPJ45gEsj\u002fQKJvWPxyyP4DbzgOcM7I\u002f4BahYK1Ksj+w32\u002fPdWGyP3DZx1v2d7I\u002f8GV+zS+Osj+wf5G9I6SyP4AxJvTSubI\u002fYOcIYj7Psj\u002fQKRlCZ+SyP5BKDx9O+bI\u002fgHOW5A0Osz8Qa5CQ9SKzP1C0wpdnN7M\u002fcHlIB2hLsz\u002fQVsyC+l6zPzBGVJsicrM\u002foBt6eeSEsz8Andg8QpezP8B\u002fYRA+qbM\u002fcJJZHtu6sz9wTb7UG8yzPwD73nkC3bM\u002f0J2vLpHtsz8wVzz1yf2zP\u002fCeeK6uDbQ\u002fQEXeHkEdtD\u002fg28zwgiy0P7Din8B1O7Q\u002fQB\u002fi9RpKtD\u002fgHl3\u002fc1i0P6DNNS+CZrQ\u002fwLwbxUZ0tD9weI3vwoG0P6DV7Mz3jrQ\u002fwK6HbOabtD9ACorPj6i0PxDM2en0tLQ\u002fQMzwnBbBtD9wW1DS9cy0PzDgsVKT2LQ\u002f8HUg5O\u002fjtD8A48NCDO+0P\u002fDhaCHp+bQ\u002fYFoAKocEtT\u002fArhb+5g61PzC5QzcJGbU\u002fkO+TZ+4itT\u002fwHIYblyy1PyDyxNQDNrU\u002fUKuqETU\u002ftT9guIRJK0i1P5BgvO3mULU\u002f8CQTamhZtT+wiGYisGG1P2Cujn2+abU\u002fgDqT1JNxtT\u002fwtq9+MHm1P1CqHvSUgLU\u002fcFQTPMGHtT\u002fQws3stY61P8DV4xlzlbU\u002fQFZc2fibtT9ga6qQR6K1P9DQjnFfqLU\u002fIFKk70CutT+Qh8Up7LO1P9Co0QRhubU\u002f4GlVr8W5tT8="},"y":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"type":"scatter"}],                        {"height":450,"hovermode":"x unified","legend":{"x":1.05,"y":0},"shapes":[{"line":{"color":"red","dash":"dash","width":1},"type":"line","x0":0.039613345220394613,"x1":0.039613345220394613,"xref":"x","y0":0,"y1":1,"yref":"y domain"},{"line":{"color":"green","dash":"dash","width":1},"type":"line","x0":0.06555479995294888,"x1":0.06555479995294888,"xref":"x","y0":0,"y1":1,"yref":"y domain"}],"showlegend":true,"template":{"data":{"barpolar":[{"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"type":"carpet"}],"choropleth":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"choropleth"}],"contourcarpet":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"contourcarpet"}],"contour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"contour"}],"heatmap":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"heatmap"}],"histogram2dcontour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2dcontour"}],"histogram2d":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2d"}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"mesh3d":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"mesh3d"}],"parcoords":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"parcoords"}],"pie":[{"automargin":true,"type":"pie"}],"scatter3d":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatter3d"}],"scattercarpet":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattercarpet"}],"scattergeo":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergeo"}],"scattergl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergl"}],"scattermapbox":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermapbox"}],"scattermap":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermap"}],"scatterpolargl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolargl"}],"scatterpolar":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolar"}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"scatterternary":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterternary"}],"surface":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"surface"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}]},"layout":{"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"autotypenumbers":"strict","coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]],"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]},"colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"geo":{"bgcolor":"white","lakecolor":"white","landcolor":"#E5ECF6","showlakes":true,"showland":true,"subunitcolor":"white"},"hoverlabel":{"align":"left"},"hovermode":"closest","mapbox":{"style":"light"},"paper_bgcolor":"white","plot_bgcolor":"#E5ECF6","polar":{"angularaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"bgcolor":"#E5ECF6","radialaxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"scene":{"xaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","gridwidth":2,"linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white"},"yaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","gridwidth":2,"linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white"},"zaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","gridwidth":2,"linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white"}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"ternary":{"aaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"baxis":{"gridcolor":"white","linecolor":"white","ticks":""},"bgcolor":"#E5ECF6","caxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"title":{"x":0.05},"xaxis":{"automargin":true,"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","zerolinewidth":2},"yaxis":{"automargin":true,"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","zerolinewidth":2}}},"title":{"text":"Optimal Portfolio Transition Map, 1928-2025"},"width":800,"xaxis":{"title":{"text":"Portfolio Real Return"}},"yaxis":{"range":[0,1],"title":{"text":"Portfolio Weight"}}},                        {"responsive": true}                    )                };            </script>        </div>

<p>We’ll proceed as follows:</p>

<ol>
  <li>Why volatility is a proxy for risk.</li>
  <li>Why volatility is an imperfect proxy for risk.</li>
  <li>Visualizing volatility math with pictures of triangles.</li>
  <li>Visualizing optimal portfolios with efficient frontiers.</li>
  <li>Picking an optimal portfolio.</li>
  <li>Regularization and backoff - a midwit way.</li>
  <li>Various scientific alternatives.</li>
  <li>Conclusion: the data is sparse and ill-behaved, the math is not super realistic, but this gives us a reasonable starting point.</li>
</ol>

<p>I hope you’ll have a better understanding of how to make reasonable decisions about allocations based on past market behavior and a little math.</p>

<p>Disclaimer: this is educational material, not financial advice.</p>

<h2 id="1-why-volatility">1. Why volatility?</h2>

<p>Suppose you are watching a peaceful ocean, and suddenly a shark eats a lone swimmer. That’s a bad outcome. The risk was probably there all along, but we didn’t perceive the risk because we weren’t aware of the possibility of a very bad outcome.</p>

<p>On the other hand, if you are watching <em>Jaws</em>, and you see the shark’s fin gliding toward unsuspecting swimmers, bad stuff <em>could</em> happen. Either the lifeguard will blow his whistle and they will narrowly escape being attacked, or someone will meet a grisly fate. We sense the danger. Suspense mounts, and our pulse quickens.</p>

<p>Risk means the future <em>can</em> follow many paths, including good and bad ones, but only one path <em>will</em> happen.</p>

<p>We can represent this as a probability distribution of possible outcomes. Less risky portfolios have narrow distributions clustered around the mean, with some better and some worse outcomes. Riskier portfolios have a wider confidence interval, with some extremely bad and some extremely good outcomes.</p>

<p>What this looks like in the market is this:</p>

<div>                        <script type="text/javascript">window.PlotlyConfig = {MathJaxConfig: 'local'};</script>
        <script charset="utf-8" src="https://cdn.plot.ly/plotly-3.2.0.min.js" integrity="sha256-iZ2u/oU2wf/vDbl/ChcX93WgbBRSBvUO6N413hDz7xM=" crossorigin="anonymous"></script>                <div id="e3b3cd35-b241-4d59-ae48-93e554a059a1" class="plotly-graph-div" style="height:600px; width:100%;"></div>            <script type="text/javascript">                window.PLOTLYENV=window.PLOTLYENV || {};                                if (document.getElementById("e3b3cd35-b241-4d59-ae48-93e554a059a1")) {                    Plotly.newPlot(                        "e3b3cd35-b241-4d59-ae48-93e554a059a1",                        [{"hovertemplate":"Return Range: %{x}\u003cbr\u003eCount: %{y}\u003cextra\u003e\u003c\u002fextra\u003e","marker":{"color":"lightblue","line":{"color":"darkblue","width":1}},"name":"S&P Returns","nbinsx":10,"opacity":0.7,"showlegend":false,"x":{"dtype":"f8","bdata":"OMR3V5kd3T+wx8EcjZu2v6Bxv9ssnMm\u002fqvUa6vdc2L\u002fArb4H6J6SPwiI5IHtQt8\u002foPww1NdFm7+0kVVgFTHbPxwWus3IPNM\u002fbsAC7dvD17\u002fUHHlx3BrVP8A+NWNmeoa\u002fEJzomcPxvL\u002fIBYRUpW7Kv7CEDFPAz7c\u002fSAm+UoB6yz9o87eKeu\u002fEP+SFJPPZA9U\u002f1ChdOKDHzL\u002fw47ssRRyhv0AG9r62+Zo\u002fqIsO6ueiyj+4bWN2EQ7OP4C\u002fc9\u002f6WMU\u002foM4YnrUZxj\u002fA4GRltOSTv7pu4MaaL+E\u002fqAJMTK+L1D\u002fASM8tSyWmP7x6txkvncC\u002fSDWzdrBj2j+AuftxY\u002fy5PwCWDp2rsIS\u002fHJgAPQCC0D+QGEaPAqG5vygoQKRaZ8o\u002fQDNdQjiUwz9g0b3uHVC6P8QsbuygncC\u002fmNlliRHLyT8gbIsn6MytP9iDksIhZ8G\u002fwGY4QPR8k79gvCldRCi7P+Ad+BPk\u002f8I\u002fQBpoMkEZy79+DogdEsnVv1istEtf\u002fdE\u002fkIw7E4Imxz\u002fAyfo1XmnAv4D+MP\u002fCj5e\u002fYLYJ14qdpz8Ixs7WHN3FP7AIFzHYAsC\u002f2BsvkHZzxD8AqBlsPd\u002fGPwBf4IW3pZU\u002fmJYyNK\u002fq0D8IAOcYowbGPwDwIAKWB4s\u002fIFhpgGW1vT8QDt3iR2jQPwjGxXw+ILa\u002f5BjiQEXf0D+g1QUdidqmPyB9SspD\u002fLE\u002fQGivNEjoir+07srsmaHVP\u002fDIwnho+8c\u002fvMp\u002foqnC0z+8PMCbVdXQP4gzE+gcsMY\u002fGPjPmA\u002fAvr88g4u0S+TAv0wOZeGAb86\u002flOcETNqh0D\u002fAw+8pHZCyPwDT7GQAGYw\u002f2B063kVRwD+A\u002fN\u002fqqp2LP9DhFs06bte\u002foNjCNjbtzD+ArzdHHM7AP0DM0SW\u002fL4G\u002foP66HzDNwT8sTSYpU1LTP5iijitiOMA\u002fABf8Pddnej8w+FgFzVK4P3g426WfcMg\u002fMFEZtyfVrr98s\u002f4YchnSP8Aan9UtCsU\u002fgHldWU6hyT8I5kZ76nLNv6jipffLH8w\u002fQF6jhZhbyz\u002fw8yWJs6zCPw=="},"type":"histogram"},{"hovertemplate":"Return: %{x:.2%}\u003cbr\u003eDensity: %{y:.2f}\u003cextra\u003e\u003c\u002fextra\u003e","line":{"color":"red","width":3},"mode":"lines","name":"Normal Distribution","showlegend":false,"x":{"dtype":"f8","bdata":"EFyBUF7D3r975z7pV2fev+Zy\u002fIFRC96\u002fUf65Gkuv3b+8iXezRFPdvyYVNUw+99y\u002fkaDy5Deb3L\u002f8K7B9MT\u002fcv2e3bRYr49u\u002f0kIrrySH2789zuhHHivbv6hZpuAXz9q\u002fE+VjeRFz2r9+cCESCxfav+j73qoEu9m\u002fU4ecQ\u002f5e2b++Elrc9wLZvymeF3Xxpti\u002flCnVDetK2L\u002f\u002ftJKm5O7Xv2pAUD\u002fekte\u002f1csN2Nc2179AV8tw0drWv6riiAnLfta\u002fFm5GosQi1r+A+QM7vsbVv+uEwdO3atW\u002fVhB\u002fbLEO1b\u002fBmzwFq7LUvywn+p2kVtS\u002flrK3Np76078CPnXPl57Tv2zJMmiRQtO\u002f2FTwAIvm0r9C4K2ZhIrSv61razJ+LtK\u002fGPcoy3fS0b+DguZjcXbRv+4NpPxqGtG\u002fWJlhlWS+0L\u002fEJB8uXmLQvy6w3MZXBtC\u002fM3c0v6JUz78Jjq\u002fwlZzOv96kKiKJ5M2\u002ftLulU3wszb+K0iCFb3TMv2Dpm7ZivMu\u002fNgAX6FUEy78MF5IZSUzKv+ItDUs8lMm\u002ftkSIfC\u002fcyL+MWwOuIiTIv2Jyft8VbMe\u002fOIn5EAm0xr8OoHRC\u002fPvFv+S273PvQ8W\u002fus1qpeKLxL+Q5OXW1dPDv2b7YAjJG8O\u002fOhLcObxjwr8QKVdrr6vBv+Y\u002f0pyi88C\u002fvFZNzpU7wL8k25D\u002fEQe\u002fv9AIh2L4lr2\u002ffDZ9xd4mvL8oZHMoxba6v9SRaYurRrm\u002ffL9f7pHWt78o7VVReGa2v9QaTLRe9rS\u002fgEhCF0WGs78sdjh6Kxayv9ijLt0RprC\u002fCKNJgPBrrr9g\u002fjVGvYurv7hZIgyKq6i\u002fCLUO0lbLpb9gEPuXI+uiv7hr513wCqC\u002fII6nR3pVmr\u002fQRIDTE5WUvwD3sb5aqY2\u002fYGRj1o0ogr8AR1O4A59qv4AD5+gvZGM\u002foFOI4thZgD9A5tbKpdqLP3C8klm5rZM\u002fwAW6zR9umT8AT+FBhi6fPzBMBFt2d6I\u002f4PAXlalXpT+AlSvP3DeoPzA6PwkQGKs\u002f0N5SQ0P4rT\u002fAQbM+O2ywPxAUvdtU3LE\u002faObGeG5Msz+4uNAViLy0PxCL2rKhLLY\u002faF3kT7uctz+4L+7s1Ay5PxAC+InufLo\u002fYNQBJwjtuz+4pgvEIV29Pwh5FWE7zb4\u002fsKUPf6oewD\u002fYjpRNt9bAPwR4GRzEjsE\u002fMGGe6tBGwj9YSiO53f7CP4QzqIfqtsM\u002frBwtVvduxD\u002fYBbIkBCfFPwDvNvMQ38U\u002fLNi7wR2Xxj9UwUCQKk\u002fHP4CqxV43B8g\u002frJNKLUS\u002fyD\u002fUfM\u002f7UHfJPwBmVMpdL8o\u002fKE\u002fZmGrnyj9UOF5nd5\u002fLP3wh4zWEV8w\u002fqApoBJEPzT\u002fQ8+zSncfNP\u002fzccaGqf84\u002fKMb2b7c3zz9Qr3s+xO\u002fPPz5MgIboU9A\u002f0sDC7e6v0D9oNQVV9QvRP\u002fypR7z7Z9E\u002fkh6KIwLE0T8mk8yKCCDSP7wHD\u002fIOfNI\u002fUnxRWRXY0j\u002fm8JPAGzTTP3xl1icikNM\u002fENoYjyjs0z+mTlv2LkjUPzrDnV01pNQ\u002f0DfgxDsA1T9krCIsQlzVP\u002fogZZNIuNU\u002fkJWn+k4U1j8kCuphVXDWP7p+LMlbzNY\u002fTvNuMGIo1z\u002fkZ7GXaITXP3jc8\u002f5u4Nc\u002fDlE2ZnU82D+ixXjNe5jYPzg6uzSC9Ng\u002fzq79m4hQ2T9iI0ADj6zZP\u002fiXgmqVCNo\u002fjAzF0Ztk2j8igQc5osDaP7b1SaCoHNs\u002fTGqMB6942z\u002fg3s5utdTbP3ZTEda7MNw\u002fDMhTPcKM3D+gPJakyOjcPzax2AvPRN0\u002fyiUbc9Wg3T9gml3a2\u002fzdP\u002fQOoEHiWN4\u002fioPiqOi03j8e+CQQ7xDfP7RsZ3f1bN8\u002fSuGp3vvI3z\u002fvKvYigRLgPzpll1aEQOA\u002fhJ84iodu4D\u002fP2dm9ipzgPxoUe\u002fGNyuA\u002fZE4cJZH44D+uiL1YlCbhP\u002fjCXoyXVOE\u002fRP3\u002fv5qC4T+ON6HznbDhP9hxQieh3uE\u002fJKzjWqQM4j9u5oSOpzriP7ggJsKqaOI\u002fAlvH9a2W4j9OlWgpscTiP5jPCV208uI\u002f4gmrkLcg4z8uREzEuk7jP3h+7fe9fOM\u002fwriOK8Gq4z8M8y9fxNjjP1gt0ZLHBuQ\u002fomdyxso05D\u002ftoRP6zWLkPw=="},"y":{"dtype":"f8","bdata":"N1ROJfP0zz+i2blcZWXRP3a9tddp7NI\u002fQI9tr02R1D\u002fP8MED61XWP4c8zmwvPNg\u002fWZt26RtG2j+6cZO2xHXcP9aC9AxRzd4\u002fdcM7Yn2n4D8kUDnthv7hP8Gl3ezzbOM\u002f\u002fzJPkfvz5D8T7JYI3ZTmP\u002f5KLgDfUOg\u002fuRE9FE8p6j8g5d0rgR\u002fsP3mk0cHONO4\u002fuUaODEs18D+A5I6uHGHxP0H4ZNaOnvI\u002fhLhlCFXu8z8KMTQuI1H1P2gxlvysx\u002fY\u002f5SK7TqVS+D\u002fzUhZ3vfL5PwjnAIakqPs\u002fqkBrhgZ1\u002fT\u002fG+\u002fmwi1j\u002fP0Hn\u002f8rrqQBAKKNtH8SzAUDDxaqjGsoCQO3q2nc37QNAk\u002fIplF4dBUCeQMVLz1oGQJ6+gM3DpQdAcXCuonD+CEAHNLosBGUKQFytJSKm2QtA9UqKC3dcDUCEo1DBj+0OQHiIanWARhBAQKDcP2kdEUCSrxSmgfsRQI64cDzE4BJAFBriiybNE0CFQuzamMAUQHBHwvkFuxVAJX3vEVO8FkCC5fZ5X8QXQFpIVI0E0xhAm\u002fhHiRXoGUD4qtNuXwMbQLNQS+qoJBxAeKDYQLJLHUCY10pENXgeQLZHhk3lqR9ApD3wnjdwIEBbEdfDvA0hQK\u002fNHx9SrSFA7eC\u002flsROIkDmda\u002f83fEiQOG0lCJlliNAPu1u8R08JEB0\u002fUWFyeIkQAdE3EwmiiVApSdbLfAxJkC\u002f4eup4NkmQJW4Jw+vgSdAdkdEohApKEDy49nTuM8oQHanG3ZZdSlAszVS9qIZKkDqDGSZRLwqQKoUMLvsXCtAnkV5EEn7K0AduBzrBpcsQEczRoDTLy1AvohSMFzFLUAfrArQTlcuQBqW3vJZ5S5AnanDNS1vL0BFiVeKefQvQJcN88B4OjBAZfT3yyR4MED2juY9HLMwQN6UhKw76zBAxbgJD2EgMUDPUHHga1IxQFX6lEA9gTFAciLhE7isMUAd8HUhwdQxQOHziC8\u002f+TFAIzneHRsaMkDz2jH+PzcyQC8NbiqbUDJAX56MWBxmMkAbSQastXcyQP+2tcRbhTJA\u002fdQXywWPMkBtAdd5rZQyQBipkiRPljJAwhDZu+mTMkCiRU3Ofo0yQCZ394YSgzJAO0jCqKt0MkDs7CuHU2IyQLMiNvwVTDJAYDWkWwEyMkBbSZpjJhQyQMcEtSqY8jFA1GW0C2zNMUCGFdiOuaQxQBjNDlGaeDFADWsd6SlJMUCJFuXKhRYxQMJG8ijN4DBAca2A1CCoMECe2iEco2wwQA\u002fzNal3LjBAUP\u002fNuIbbL0CJYrBSWFUvQF7kdeOxyi5A+4j3v+I7LkCSd3GDO6ktQKi3ZcQNEy1AtZvVyat5LEBebzBBaN0rQHgaU\u002fWVPitAV\u002ffwhoedKkDdIbomj\u002fopQJUSj1H+VSlAZXYMjyWwKEDJ7bQyVAkoQCvC+B\u002fYYSdAv7hVkf25JkCgB8PiDhImQPgdl19UaiVAHnwOFBTDJEA\u002fTpSikRwkQE\u002fr5hwOdyNAfs4r4cfSIkCEJgB7+i8iQJa6jIjejiFA\u002f6+do6nvIEA1vLhOjlIgQK8VTcx3bx9APUa9Kb0+HkAT0X+aPhMdQGjy9YpH7RtA9Vwe7xzNGkD6y21J\u002fbIZQNECOLggnxhAzXJUCbmRF0BB9KPT8YoWQFQHGJbwihVArvLX29SRFEAnyxxluJ8TQAH6WlSvtBJAfC5OX8jQEUA\u002fx3sDDfQQQF2iv72BHhBAr7TviEygDkBBf8qH6xENQDOQsDjOkQtAB2SJQ9ofCkA8TLK47bsIQIpkd5PfZQdAJ+sfPYAdBkDkcuAPmuIEQP3aDtnxtANAePz9WUeUAkAqevHGVYABQLb3pEPUeABA2jHauez6\u002fj923Af+2Bv9P9mXO9DIU\u002fs\u002fSbndLROi+T8z8alpCwb4P1CyyPYBf\u002fY\u002fFxhBKkUM9T\u002fSEGvyIa3zP2rNHYTkYPI\u002fZt5p\u002fdgm8T9uwYH7l\u002fzvP4ki\u002fGYWze0\u002fswynvcu96z\u002fcJ16UWs3pP5P9b3Bq+uc\u002fISsnj6hD5j94B1WZyKfkPwaCZkOFJeM\u002fDbOe2qC74T+u9iLA5WjgP6PzJKVNWN4\u002f6OXdjX8I3D\u002fr2UvjKuDZP1ZAIwEs3dc\u002fPOybTXL91T\u002fZLIR2AD\u002fUPw=="},"type":"scatter"},{"customdata":{"dtype":"f8","bdata":"AAAAAAAsnkCq9Rrq91zYvwAAAAAARJ5AbsAC7dvD178AAAAAAGCfQNDhFs06bte\u002fAAAAAADYnkB+DogdEsnVvwAAAAAASJ9ATA5l4YBvzr8AAAAAAJifQAjmRnvqcs2\u002fAAAAAABonkDUKF04oMfMvwAAAAAA1J5AQBpoMkEZy78AAAAAAFSeQMgFhFSlbsq\u002fAAAAAAAonkCgcb\u002fbLJzJvwAAAAAAxJ5A2IOSwiFnwb8AAAAAAESfQDyDi7RL5MC\u002fAAAAAAC4nkDELG7soJ3AvwAAAAAAlJ5AvHq3GS+dwL8AAAAAAOSeQMDJ+jVeacC\u002fAAAAAAD0nkCwCBcx2ALAvwAAAAAAQJ9AGPjPmA\u002fAvr8AAAAAAFCeQBCc6JnD8by\u002fAAAAAAConkCQGEaPAqG5vwAAAAAAJJ5AsMfBHI2btr8AAAAAABifQAjGxXw+ILa\u002fAAAAAACIn0AwURm3J9WuvwAAAAAAbJ5A8OO7LEUcob8AAAAAADieQKD8MNTXRZu\u002fAAAAAADonkCA\u002fjD\u002fwo+XvwAAAAAAhJ5AwOBkZbTkk78AAAAAAMieQMBmOED0fJO\u002fAAAAAAAon0BAaK80SOiKvwAAAAAATJ5AwD41Y2Z6hr8AAAAAAKCeQACWDp2rsIS\u002fAAAAAABsn0BAzNElvy+BvwAAAAAAfJ9AABf8Pddnej8AAAAAAAyfQADwIAKWB4s\u002fAAAAAABcn0CA\u002fN\u002fqqp2LPwAAAAAAVJ9AANPsZAAZjD8AAAAAADCeQMCtvgfonpI\u002fAAAAAAAAn0AAX+CFt6WVPwAAAAAAcJ5AQAb2vrb5mj8AAAAAAJCeQMBIzy1LJaY\u002fAAAAAAAgn0Cg1QUdidqmPwAAAAAA7J5AYLYJ14qdpz8AAAAAAMCeQCBsiyfozK0\u002fAAAAAAAkn0AgfUrKQ\u002fyxPwAAAAAAUJ9AwMPvKR2Qsj8AAAAAAFieQLCEDFPAz7c\u002fAAAAAACAn0Aw+FgFzVK4PwAAAAAAnJ5AgLn7cWP8uT8AAAAAALSeQGDRve4dULo\u002fAAAAAADMnkBgvCldRCi7PwAAAAAAEJ9AIFhpgGW1vT8AAAAAAHifQJiijitiOMA\u002fAAAAAABYn0DYHTreRVHAPwAAAAAAaJ9AgK83RxzOwD8AAAAAAHCfQKD+uh8wzcE\u002fAAAAAACkn0Dw8yWJs6zCPwAAAAAA0J5A4B34E+T\u002fwj8AAAAAALCeQEAzXUI4lMM\u002fAAAAAAD4nkDYGy+QdnPEPwAAAAAAYJ5AaPO3inrvxD8AAAAAAJCfQMAan9UtCsU\u002fAAAAAAB8nkCAv3Pf+ljFPwAAAAAA8J5ACMbO1hzdxT8AAAAAAAifQAgA5xijBsY\u002fAAAAAACAnkCgzhietRnGPwAAAAAAPJ9AiDMT6Bywxj8AAAAAAPyeQACoGWw938Y\u002fAAAAAADgnkCQjDsTgibHPwAAAAAAMJ9A8MjCeGj7xz8AAAAAAISfQHg426WfcMg\u002fAAAAAACUn0CAeV1ZTqHJPwAAAAAAvJ5AmNlliRHLyT8AAAAAAKyeQCgoQKRaZ8o\u002fAAAAAAB0nkCoiw7q56LKPwAAAAAAoJ9AQF6jhZhbyz8AAAAAAFyeQEgJvlKAess\u002fAAAAAACcn0Co4qX3yx\u002fMPwAAAAAAZJ9AoNjCNjbtzD8AAAAAAHieQLhtY3YRDs4\u002fAAAAAAAUn0AQDt3iR2jQPwAAAAAApJ5AHJgAPQCC0D8AAAAAAEyfQJTnBEzaodA\u002fAAAAAAA4n0C8PMCbVdXQPwAAAAAAHJ9A5BjiQEXf0D8AAAAAAASfQJiWMjSv6tA\u002fAAAAAADcnkBYrLRLX\u002f3RPwAAAAAAjJ9AfLP+GHIZ0j8AAAAAAECeQBwWus3IPNM\u002fAAAAAAB0n0AsTSYpU1LTPwAAAAAANJ9AvMp\u002foqnC0z8AAAAAAIyeQKgCTEyvi9Q\u002fAAAAAABknkDkhSTz2QPVPwAAAAAASJ5A1Bx5cdwa1T8AAAAAACyfQLTuyuyZodU\u002fAAAAAACYnkBINbN2sGPaPwAAAAAAPJ5AtJFVYBUx2z8AAAAAACCeQDjEd1eZHd0\u002fAAAAAAA0nkAIiOSB7ULfPwAAAAAAiJ5Aum7gxpov4T8=","shape":"98, 2"},"hovertemplate":"\u003cb\u003eYear %{customdata[0]}\u003c\u002fb\u003e\u003cbr\u003eReturn: %{customdata[1]:.2%}\u003cextra\u003e\u003c\u002fextra\u003e","marker":{"color":{"dtype":"f8","bdata":"qvUa6vdc2L9uwALt28PXv9DhFs06bte\u002ffg6IHRLJ1b9MDmXhgG\u002fOvwjmRnvqcs2\u002f1ChdOKDHzL9AGmgyQRnLv8gFhFSlbsq\u002foHG\u002f2yycyb\u002fYg5LCIWfBvzyDi7RL5MC\u002fxCxu7KCdwL+8ercZL53Av8DJ+jVeacC\u002fsAgXMdgCwL8Y+M+YD8C+vxCc6JnD8by\u002fkBhGjwKhub+wx8EcjZu2vwjGxXw+ILa\u002fMFEZtyfVrr\u002fw47ssRRyhv6D8MNTXRZu\u002fgP4w\u002f8KPl7\u002fA4GRltOSTv8BmOED0fJO\u002fQGivNEjoir\u002fAPjVjZnqGvwCWDp2rsIS\u002fQMzRJb8vgb8AF\u002fw912d6PwDwIAKWB4s\u002fgPzf6qqdiz8A0+xkABmMP8CtvgfonpI\u002fAF\u002fghbellT9ABva+tvmaP8BIzy1LJaY\u002foNUFHYnapj9gtgnXip2nPyBsiyfozK0\u002fIH1KykP8sT\u002fAw+8pHZCyP7CEDFPAz7c\u002fMPhYBc1SuD+AuftxY\u002fy5P2DRve4dULo\u002fYLwpXUQouz8gWGmAZbW9P5iijitiOMA\u002f2B063kVRwD+ArzdHHM7AP6D+uh8wzcE\u002f8PMlibOswj\u002fgHfgT5P\u002fCP0AzXUI4lMM\u002f2BsvkHZzxD9o87eKeu\u002fEP8Aan9UtCsU\u002fgL9z3\u002fpYxT8Ixs7WHN3FPwgA5xijBsY\u002foM4YnrUZxj+IMxPoHLDGPwCoGWw938Y\u002fkIw7E4Imxz\u002fwyMJ4aPvHP3g426WfcMg\u002fgHldWU6hyT+Y2WWJEcvJPygoQKRaZ8o\u002fqIsO6ueiyj9AXqOFmFvLP0gJvlKAess\u002fqOKl98sfzD+g2MI2Nu3MP7htY3YRDs4\u002fEA7d4kdo0D8cmAA9AILQP5TnBEzaodA\u002fvDzAm1XV0D\u002fkGOJARd\u002fQP5iWMjSv6tA\u002fWKy0S1\u002f90T98s\u002f4YchnSPxwWus3IPNM\u002fLE0mKVNS0z+8yn+iqcLTP6gCTEyvi9Q\u002f5IUk89kD1T\u002fUHHlx3BrVP7TuyuyZodU\u002fSDWzdrBj2j+0kVVgFTHbPzjEd1eZHd0\u002fCIjkge1C3z+6buDGmi\u002fhPw=="},"colorscale":[[0.0,"rgb(165,0,38)"],[0.1,"rgb(215,48,39)"],[0.2,"rgb(244,109,67)"],[0.3,"rgb(253,174,97)"],[0.4,"rgb(254,224,139)"],[0.5,"rgb(255,255,191)"],[0.6,"rgb(217,239,139)"],[0.7,"rgb(166,217,106)"],[0.8,"rgb(102,189,99)"],[0.9,"rgb(26,152,80)"],[1.0,"rgb(0,104,55)"]],"line":{"color":"DarkSlateGrey","width":1},"opacity":0.8,"showscale":false,"size":8},"mode":"markers","name":"Individual Years","showlegend":false,"text":["1931","1937","2008","1974","2002","2022","1946","1973","1941","1930","1969","2001","1966","1957","1977","1981","2000","1940","1962","1929","1990","2018","1947","1934","1978","1953","1970","1994","1939","1960","2011","2015","1987","2007","2005","1932","1984","1948","1956","1992","1979","1968","1993","2004","1942","2016","1959","1965","1971","1988","2014","2006","2010","2012","2025","1972","1964","1982","1944","2020","1951","1980","1986","1952","1999","1983","1976","1996","2017","2021","1967","1963","1949","2024","1943","2023","2009","1950","1989","1961","2003","1998","1991","1985","1975","2019","1936","2013","1997","1955","1945","1938","1995","1958","1935","1928","1933","1954"],"x":{"dtype":"f8","bdata":"qvUa6vdc2L9uwALt28PXv9DhFs06bte\u002ffg6IHRLJ1b9MDmXhgG\u002fOvwjmRnvqcs2\u002f1ChdOKDHzL9AGmgyQRnLv8gFhFSlbsq\u002foHG\u002f2yycyb\u002fYg5LCIWfBvzyDi7RL5MC\u002fxCxu7KCdwL+8ercZL53Av8DJ+jVeacC\u002fsAgXMdgCwL8Y+M+YD8C+vxCc6JnD8by\u002fkBhGjwKhub+wx8EcjZu2vwjGxXw+ILa\u002fMFEZtyfVrr\u002fw47ssRRyhv6D8MNTXRZu\u002fgP4w\u002f8KPl7\u002fA4GRltOSTv8BmOED0fJO\u002fQGivNEjoir\u002fAPjVjZnqGvwCWDp2rsIS\u002fQMzRJb8vgb8AF\u002fw912d6PwDwIAKWB4s\u002fgPzf6qqdiz8A0+xkABmMP8CtvgfonpI\u002fAF\u002fghbellT9ABva+tvmaP8BIzy1LJaY\u002foNUFHYnapj9gtgnXip2nPyBsiyfozK0\u002fIH1KykP8sT\u002fAw+8pHZCyP7CEDFPAz7c\u002fMPhYBc1SuD+AuftxY\u002fy5P2DRve4dULo\u002fYLwpXUQouz8gWGmAZbW9P5iijitiOMA\u002f2B063kVRwD+ArzdHHM7AP6D+uh8wzcE\u002f8PMlibOswj\u002fgHfgT5P\u002fCP0AzXUI4lMM\u002f2BsvkHZzxD9o87eKeu\u002fEP8Aan9UtCsU\u002fgL9z3\u002fpYxT8Ixs7WHN3FPwgA5xijBsY\u002foM4YnrUZxj+IMxPoHLDGPwCoGWw938Y\u002fkIw7E4Imxz\u002fwyMJ4aPvHP3g426WfcMg\u002fgHldWU6hyT+Y2WWJEcvJPygoQKRaZ8o\u002fqIsO6ueiyj9AXqOFmFvLP0gJvlKAess\u002fqOKl98sfzD+g2MI2Nu3MP7htY3YRDs4\u002fEA7d4kdo0D8cmAA9AILQP5TnBEzaodA\u002fvDzAm1XV0D\u002fkGOJARd\u002fQP5iWMjSv6tA\u002fWKy0S1\u002f90T98s\u002f4YchnSPxwWus3IPNM\u002fLE0mKVNS0z+8yn+iqcLTP6gCTEyvi9Q\u002f5IUk89kD1T\u002fUHHlx3BrVP7TuyuyZodU\u002fSDWzdrBj2j+0kVVgFTHbPzjEd1eZHd0\u002fCIjkge1C3z+6buDGmi\u002fhPw=="},"y":[0.1749080237694725,0.5901428612819832,0.8463987883622811,1.119731696839407,0.1312037280884873,0.43119890406724054,0.7116167224336399,1.173235229154987,1.4202230023486417,1.741614515559209,0.10411689885916049,0.5939819704323989,0.8664885281600844,1.0424678221356551,1.3363649934414201,1.6366809019706867,1.9608484485919073,2.304951286326448,0.18638900372842315,0.4582458280396084,0.822370578944476,1.0278987721304083,1.3584289297070435,1.6732723686587383,1.991213996843407,2.357035192278603,0.13993475643167197,0.20284688768272233,0.5184829137724085,0.7092900825439996,1.1215089703802876,1.3341048247374583,1.613010318597056,2.0897771074506664,2.393126406614912,0.26167946962329225,0.4609227538346741,0.7195344228012768,1.1368466053024313,1.3880304987479202,1.6244076469689557,1.9990353820222537,2.206877704223044,0.28186408041575645,0.1517559963200034,0.5325044568707964,0.7623422152178823,1.104013604235562,1.4093420558686558,1.6369708911051053,2.0939169255529113,2.3550265646722233,0.28789978831283786,0.5789654700855298,0.8195799957622171,1.1843748470046231,1.3176985004103838,1.6391965724838289,1.9090454577821074,2.265066066152653,0.1777354579378964,0.1542698063547792,0.5657475018303859,0.7713506653387179,1.056186901937476,1.4085392166316497,1.6281848449949525,2.060439396150808,2.2149101287359545,0.2973773873201035,0.5544489538593315,0.7397431363068345,1.0011044234247204,1.4630922856909667,1.7413714687695234,2.0458014336081973,2.3542540693371894,0.11480893034681808,0.4716931457088545,0.7231738119050259,1.1726206851751186,0.2246596253655116,0.46617960497052985,0.7127116700572047,1.0621964643431323,1.3650366644053493,1.7459212356676128,2.0275114942710424,2.3774425485152655,0.19444298503238988,0.4239188491876603,0.842648957444599,1.1521570097233793,0.21225543951389925,0.5541934359909122,0.19875911927287815,0.5045465658763988,0.18550820367170995],"type":"scatter"}],                        {"annotations":[{"showarrow":false,"text":"Mean: 8.61%","x":0.08608526564002535,"xanchor":"center","xref":"x","y":1,"yanchor":"bottom","yref":"y domain"},{"showarrow":false,"text":"Median: 11.11%","x":0.11106615857856017,"xanchor":"center","xref":"x","y":0,"yanchor":"top","yref":"y domain"},{"bgcolor":"white","bordercolor":"black","borderpad":10,"borderwidth":1,"opacity":0.9,"showarrow":false,"text":"\u003cb\u003eStatistics:\u003c\u002fb\u003e\u003cbr\u003eMean: 8.61%\u003cbr\u003eMedian: 11.11%\u003cbr\u003eStd Dev: 19.30%\u003cbr\u003eMin: -38.07% (1931)\u003cbr\u003eMax: 53.71% (1954)\u003cbr\u003eSkewness: -0.30\u003cbr\u003eKurtosis: -0.07","x":0.98,"xanchor":"right","xref":"paper","y":0.98,"yanchor":"top","yref":"paper"}],"height":600,"hovermode":"closest","shapes":[{"line":{"color":"green","dash":"dash"},"type":"line","x0":0.08608526564002535,"x1":0.08608526564002535,"xref":"x","y0":0,"y1":1,"yref":"y domain"},{"line":{"color":"orange","dash":"dot"},"type":"line","x0":0.11106615857856017,"x1":0.11106615857856017,"xref":"x","y0":0,"y1":1,"yref":"y domain"}],"showlegend":false,"template":{"data":{"barpolar":[{"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"type":"carpet"}],"choropleth":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"choropleth"}],"contourcarpet":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"contourcarpet"}],"contour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"contour"}],"heatmap":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"heatmap"}],"histogram2dcontour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2dcontour"}],"histogram2d":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2d"}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"mesh3d":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"mesh3d"}],"parcoords":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"parcoords"}],"pie":[{"automargin":true,"type":"pie"}],"scatter3d":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatter3d"}],"scattercarpet":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattercarpet"}],"scattergeo":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergeo"}],"scattergl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergl"}],"scattermapbox":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermapbox"}],"scattermap":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermap"}],"scatterpolargl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolargl"}],"scatterpolar":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolar"}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"scatterternary":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterternary"}],"surface":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"surface"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}]},"layout":{"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"autotypenumbers":"strict","coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]],"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]},"colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"geo":{"bgcolor":"white","lakecolor":"white","landcolor":"white","showlakes":true,"showland":true,"subunitcolor":"#C8D4E3"},"hoverlabel":{"align":"left"},"hovermode":"closest","mapbox":{"style":"light"},"paper_bgcolor":"white","plot_bgcolor":"white","polar":{"angularaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""},"bgcolor":"white","radialaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""}},"scene":{"xaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"},"yaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"},"zaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"ternary":{"aaxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"baxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"bgcolor":"white","caxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""}},"title":{"x":0.05},"xaxis":{"automargin":true,"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","zerolinewidth":2},"yaxis":{"automargin":true,"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","zerolinewidth":2}}},"title":{"text":"Distribution of S&P 500 Real Returns (1928-2025)\u003cbr\u003e\u003csub\u003eMean: 8.61%, Std Dev: 19.30%\u003c\u002fsub\u003e","x":0.5,"xanchor":"center"},"xaxis":{"tickformat":".0%","title":{"text":"Annual Real Return"}},"yaxis":{"title":{"text":"Frequency"}}},                        {"responsive": true}                    )                };            </script>        </div>

<p>Notably, percentage return calculations are asymmetric in the sense that a 50% rise from 100 to 150, followed by a 50% drop to 75, leaves you down 25%. A 10% rise is the same number of dollars as a 10% drop, but it’s harder to catch up from the loss since your base is now smaller. The log diff of the total return index, i.e. \(log(1+r)\) where \(r\) is the percent return, is a more symmetric representation of change, and this chart of log diff returns is more representative of the fat tails (<em>leptokurtosis</em>) and left <em>skew</em> in returns, with most returns to the right of the mean and fat tails on the left.</p>

<div>                        <script type="text/javascript">window.PlotlyConfig = {MathJaxConfig: 'local'};</script>
        <script charset="utf-8" src="https://cdn.plot.ly/plotly-3.2.0.min.js" integrity="sha256-iZ2u/oU2wf/vDbl/ChcX93WgbBRSBvUO6N413hDz7xM=" crossorigin="anonymous"></script>                <div id="12f8ff0c-790f-4556-bbd0-04c49a837f59" class="plotly-graph-div" style="height:600px; width:100%;"></div>            <script type="text/javascript">                window.PLOTLYENV=window.PLOTLYENV || {};                                if (document.getElementById("12f8ff0c-790f-4556-bbd0-04c49a837f59")) {                    Plotly.newPlot(                        "12f8ff0c-790f-4556-bbd0-04c49a837f59",                        [{"hovertemplate":"Return Range: %{x:.4f}\u003cbr\u003eCount: %{y}\u003cextra\u003e\u003c\u002fextra\u003e","marker":{"color":"lightblue","line":{"color":"darkblue","width":1}},"name":"S&P Returns (Log Diff)","nbinsx":10,"opacity":0.7,"showlegend":false,"x":{"dtype":"f8","bdata":"1ucmglP\u002f1z9H\u002fy2uOKu3v+7MpuQvk8y\u002feYmc4fep3r9mPGlSFXSSP9wLetSadNk\u002ffMWA5YCkm78eyLUCRKnWP5HSYHLy0dA\u002fssOocJi03b\u002flsg5ZeD3SP+95I0o2moa\u002fFzpNCCy3vr9JfWr7XJvNv6PCk8exxLY\u002fEe\u002f5DqLkyD9qynb6yWPDP72ctkcoLNI\u002fKIICGtFM0L9x6i5zImehvwHYljBSoJo\u002f\u002fBEDlagyyD8p1JlwLv\u002fKP7WEu8NVvsM\u002fN3r\u002f2xljxD\u002fJldy50haUv7iKfMcGg9s\u002fMgYLvnHR0T\u002fR36lJHK6lP1rzzJGwy8G\u002fqPEJfHoY1j8W3OqA\u002fr+4P1aceGSby4S\u002fz9\u002fO3k9fzT9GCJP+IwG7v\u002fujd9RTAcg\u002fjRb21fk3wj\u002f2uXN19gu5P3OaBF8zzMG\u002fkCrAt4J\u002fxz8n2ehlJfesP+YPDNKVtMK\u002fxVzn1Qmtk7\u002fobFyQrM+5Pw1eCoUSt8E\u002f0kZEhRRzzr8zJHQ8rKHavzi6WUn+tM8\u002fipxiPoZHxT9hu032MpDBv\u002fzBFwM91pe\u002fiAK4v0MWpz8pJBq0Yi\u002fEPxXS08TOGsG\u002fVUD9QQj5wj9Wfxu5HQvFP6Rx6CP0a5U\u002fIrb46FMFzj\u002f1VC8y1VLEPz2Q2DxS2oo\u002f60pjr4QbvD+GfQrSZDbNP9UINAYcJLe\u002f0pBMe0TzzT9Uk7QduVumP0Bs6oO5YbE\u002f\u002fLj4xO4Vi7\u002fkKhgCfKLSP5JQjXZS+8U\u002foXBn3o840T\u002fpK9GSiePNP7ssvuwb48Q\u002fC6k\u002fEj5hwL+Vkrqlgh3Cv4SwvpyJYNG\u002fNCtYEOqRzT\u002f3T6oYueuxP2gwHhgb6Is\u002f9jA87Vq3vj\u002flg5VQbW6LP3JSspLzLN2\u002fbXV82mkUyj9HVlRVbZS\u002fP1tIB8ZPQoG\u002fE9I2kOqqwD8e6eI1gOLQPy5ivZIwi74\u002f3Y\u002fmCiVSej+W7rl9ezy3Pzm9d6fkXcY\u002fdgZV68\u002fMr7\u002fTM+ydyuDPP48kYmW6esM\u002fmS3M3btcxz+KjaOhrbvQv9CuOudubMk\u002fLAJJBS7LyD8uyssCjm7BPw=="},"type":"histogram"},{"hovertemplate":"Return: %{x:.4f}\u003cbr\u003eDensity: %{y:.2f}\u003cextra\u003e\u003c\u002fextra\u003e","line":{"color":"red","width":3},"mode":"lines","name":"Normal Distribution","showlegend":false,"x":{"dtype":"f8","bdata":"8HcBJC+I4r9McFYJiFriv6hoq+7gLOK\u002fBGEA1Dn\u002f4b9gWVW5ktHhv7xRqp7ro+G\u002fGEr\u002fg0R24b90QlRpnUjhv9A6qU72GuG\u002fLDP+M0\u002ft4L+IK1MZqL\u002fgv+QjqP4AkuC\u002fQBz941lk4L+cFFLJsjbgv\u002fgMp64LCeC\u002fpwr4J8m2379f+6HyelvfvxfsS70sAN+\u002fz9z1h96k3r+HzZ9SkEnevz++SR1C7t2\u002f967z5\u002fOS3b+vn52ypTfdv2eQR31X3Ny\u002fH4HxRwmB3L\u002fXcZsSuyXcv49iRd1sytu\u002fRlPvpx5v27\u002f+Q5ly0BPbv7Y0Qz2CuNq\u002fbiXtBzRd2r8mFpfS5QHav94GQZ2Xptm\u002flvfqZ0lL2b9O6JQy++\u002fYvwbZPv2slNi\u002fvsnox1452L92upKSEN7Xvy6rPF3Cgte\u002f5pvmJ3Qn17+ejJDyJczWv1Z9Or3XcNa\u002fDm7kh4kV1r\u002fGXo5SO7rVv35POB3tXtW\u002fNkDi554D1b\u002fuMIyyUKjUv6YhNn0CTdS\u002fXhLgR7Tx078WA4oSZpbTv87zM90XO9O\u002fhuTdp8nf0r8+1Ydye4TSv\u002fbFMT0tKdK\u002frbbbB9\u002fN0b9lp4XSkHLRvx2YL51CF9G\u002f1YjZZ\u002fS70L+NeYMypmDQv0VqLf1XBdC\u002f+rWujxNUz79qlwIld53Ov9p4Vrra5s2\u002fSlqqTz4wzb+6O\u002f7koXnMvyodUnoFw8u\u002fmv6lD2kMy78K4PmkzFXKv3rBTTown8m\u002f6qKhz5PoyL9ahPVk9zHIv8plSfpae8e\u002fOkedj77Exr+qKPEkIg7GvxoKRbqFV8W\u002fiOuYT+mgxL\u002f4zOzkTOrDv2iuQHqwM8O\u002f2I+UDxR9wr9Iceikd8bBv7hSPDrbD8G\u002fKDSQzz5ZwL8wK8jJREW\u002fvxDub\u002fQL2L2\u002f8LAXH9NqvL\u002fQc79Jmv26v7A2Z3RhkLm\u002fkPkOnygjuL9wvLbJ77W2v1B\u002fXvS2SLW\u002fMEIGH37bs78QBa5JRW6yv\u002fDHVXQMAbG\u002foBX7Pacnr79gm0qTNU2svyAhmujDcqm\u002f4KbpPVKYpr+gLDmT4L2jv2CyiOhu46C\u002fQHCwe\u002foRnL\u002fAe08mF12Wv0CH7tAzqJC\u002fgCUb96Dmhb8AebKYtPl0vwCQFc2LnT0\u002fACtVEmateD+AfuyzecCHP+AzVy8glZE\u002fYCi4hANKlz\u002fgHBna5v6cP7AIvRflWaE\u002f8IJtwlY0pD8w\u002fR1tyA6nP3B3zhc66ak\u002fsPF+wqvDrD\u002fway9tHZ6vPxjz74tHPLE\u002fODBIYYCpsj9YbaA2uRa0P3iq+Avyg7U\u002fmOdQ4Srxtj+4JKm2Y164P9hhAYycy7k\u002f+J5ZYdU4uz8Y3LE2Dqa8PzgZCgxHE74\u002fWFZi4X+Avz+8SV1b3HbAP0xoCcZ4LcE\u002f3Ia1MBXkwT9spWGbsZrCP\u002fzDDQZOUcM\u002fjOK5cOoHxD8cAWbbhr7EP6wfEkYjdcU\u002fPD6+sL8rxj\u002fMXGobXOLGP1x7Fob4mMc\u002f7JnC8JRPyD98uG5bMQbJPwzXGsbNvMk\u002fnPXGMGpzyj8sFHObBirLP7wyHwaj4Ms\u002fTFHLcD+XzD\u002fcb3fb203NP2yOI0Z4BM4\u002f\u002fKzPsBS7zj+My3sbsXHPPw71E8MmFNA\u002fWARq+HRv0D+gE8Atw8rQP+giFmMRJtE\u002fMDJsmF+B0T94QcLNrdzRP8BQGAP8N9I\u002fCGBuOEqT0j9Qb8RtmO7SP5h+GqPmSdM\u002f4I1w2DSl0z8oncYNgwDUP3CsHEPRW9Q\u002fuLtyeB+31D8Ay8itbRLVP0jaHuO7bdU\u002fkOl0GArJ1T\u002fY+MpNWCTWPyAIIYOmf9Y\u002faBd3uPTa1j+wJs3tQjbXP\u002fg1IyORkdc\u002fQEV5WN\u002fs1z+IVM+NLUjYP9BjJcN7o9g\u002fGHN7+Mn+2D9ggtEtGFrZP6iRJ2Nmtdk\u002f8KB9mLQQ2j84sNPNAmzaP4C\u002fKQNRx9o\u002fyM5\u002fOJ8i2z8Q3tVt7X3bP1jtK6M72ds\u002foPyB2Ik03D\u002foC9gN2I\u002fcPzAbLkMm69w\u002feCqEeHRG3T\u002fAOdqtwqHdPwhJMOMQ\u002fd0\u002fUFiGGF9Y3j+YZ9xNrbPeP+B2MoP7Dt8\u002fKIaIuElq3z9wld7tl8XfP1xSmhFzEOA\u002fAFpFLBo+4D+kYfBGwWvgP0hpm2FomeA\u002f7HBGfA\u002fH4D+PePGWtvTgPw=="},"y":{"dtype":"f8","bdata":"pRV0wqKKrj8EcFOd2NuwPz06WP2OmLI\u002fBrfJM5Z+tD+d4fCLRZG2P3qYxkws1Lg\u002fuVxYGRRLuz+AyB5LA\u002fq9P2i4NKGfcsA\u002fsbBYVKcIwj+XMSjQfcHDP98xZO6qn8U\u002fxSc6T9qlxz99nxVG3NbJP+RiiLKmNcw\u002fMi5BwlXFzj8Ty3JMlsTQPzN7Qe1KQtI\u002fpT+WCpLd0z+7JSEDSZjVP5Cn41thdNc\u002fAkENueBz2T8jsy2\u002f4JjbP0nG3dqO5d0\u002f9KB\u002f9hUu4D\u002fIENzshX\u002fhPz8HKnxK6OI\u002fngkhsZ9p5D+KzLkPygTmP2+fOhcWu+c\u002fMBZZs9eN6T8esLeZaX7rP7scF5Msju0\u002fFSKmr4a+7z8ojfgycQjxP01ABc5WQ\u002fI\u002fP4xQTayQ8z9k7ep0KvH0P2\u002f24QuKZfY\u002fV7dnNIPu9z\u002fCYPq4zIz5P+F2vE4bQfs\u002fH2xCzSAM\u002fT8I7C9ci+7+P7euikuCdABAiIgKVBh+AUCdhvesVpQCQN8iFZGItwNAPRYVEvXnBEBw1wuX3iUGQH5eTliCcQdAfpNE2RfLCEBAY8dg0DIKQD6mrHDWqAtACbstPU0tDUCKz98kUMAOQEsb\u002fxT5MBBAtdnnth4JEUCMn3tXmegRQF6rw2VkzxJAkCDaI3a9E0Av6gJtv7IUQF0A9n4rrxVAAFXNxp+yFkAzigiy+7wXQKaiF4QYzhhAMhPcMMnlGUCI9ow82gMbQKiaZ6ERKBxAETGRuy5SHUArFYk76oEeQNLghB\u002f2th9AhTME2n54IEA+2AHO0hchQDMfXPBFuSFAdJvOBKRcIkCa2jeetQEjQNuuyDJAqCNAT8llNAZQJEAhqEAtx\u002fgkQH5wpuA\u002foiVAqar8bypMJkCqC92DPvYmQBqOOnkxoCdAXyFzkrZJKEDTOCosf\u002fIoQF6QwfU6milAUqE+LZhAKkBujmTeQ+UqQEvPwyTqhytARal6cDYoLEDPm1vN08UsQNJdKSxtYC1AT++Sra33LUDOoZXuQIsuQAPg5lXTGi9A7vMDYhKmL0B2jsF7VhYwQMN+n9cpVzBAieX5kVyVMECjXnIfydAwQMQDkEFLCTFAbhV8K8A+MUDSWKWlBnExQAwyFzD\u002fnzFA5N5SI4zLMUCt7nrPkfMxQAomo5n2FzJA8WUZF6M4MkCc6H4mglUyQA4wjAaBbjJAoVNdao+DMkAw7ieLn5QyQHO+PzemoTJA0Q9T3pqqMkCEM8yad68yQE2oSTg5sDJAtwEjN9+sMkA8JvXMa6UyQKgMNeLjmTJA1bPMDE+KMkAUm8qHt3YyQKx8MCgqXzJAnm3yTrZDMkAExjvYbSQyQG1LEwhlATJA+Pp7dLLaMUDVezPtbrAxQMytMmG1gjFA4OsXwqJRMUCmc6XlVR0xQF3pgGXv5TBATyNjfZGrMEDHQOnnX24wQJCPObp\u002fLjBABslffS7YL0C\u002fnoudm04vQLju1liXwC5AqesLtnMuLkDlX4\u002fwg5gtQIEDLSoc\u002fyxA5g5lHZFiLEBA8Z3QN8MrQPjAmUplIStAkxaLSG59KkCSkSD2ptcpQD9Y2adiMClAqYHvl\u002fOHKEDHkh+mqt4nQPsZjhrXNCdAOQ0GbMaKJkAJ7cMJxOAlQE7g+igZNyVAyBA6lgyOJEAplNGK4uUjQGQwT4bcPiNAulgkLDmZIkDv6H8lNPUhQPRxXwcGUyFA0mrVPOSyIEBTVHv1ABUgQFvBATAW8x5A7AWHcVzBHUCJ6KgoJZUcQNCMnBu6bhtANxWtYV5OGkBf10duTjQZQJzEuiLAIBhAL8RH5uITF0CzESrE3w0WQFbvJY\u002fZDhVAUx03Cu0WFEB3j+8VMSYTQO6+FeK2PBJA0rYQI4paEUC3i69KsX8QQHCTtIdbWA9AQf12Yfi\u002fDUAZqOZVKTYMQIBFzwrWugpApfCOHt5NCUC9SrivGe8HQI4KjOVZngZA8HiPeGlbBUBnLY86DSYEQOzcZ50E\u002fgJACRX6NwrjAUCLL7lI1NQAQFYco2oqpv8\u002fIkjcDfi6\u002fT++yGLFaef7P5iAA\u002fzSKvo\u002fMrirHIOE+D8B63BoxvP2P8gQj8Lmd\u002fU\u002ftwH7cSwQ9D8kUjzY3rvyPxriVh1FevE\u002fMkCg0KZK8D\u002flp9\u002f8mFjuPw=="},"type":"scatter"},{"customdata":{"dtype":"f8","bdata":"AAAAAAAsnkB5iZzh96nevwAAAAAARJ5AssOocJi03b8AAAAAAGCfQHJSspLzLN2\u002fAAAAAADYnkAzJHQ8rKHavwAAAAAASJ9AhLC+nIlg0b8AAAAAAJifQIqNo6Gtu9C\u002fAAAAAABonkAoggIa0UzQvwAAAAAA1J5A0kZEhRRzzr8AAAAAAFSeQEl9avtcm82\u002fAAAAAAAonkDuzKbkL5PMvwAAAAAAxJ5A5g8M0pW0wr8AAAAAAESfQJWSuqWCHcK\u002fAAAAAAC4nkBzmgRfM8zBvwAAAAAAlJ5AWvPMkbDLwb8AAAAAAOSeQGG7TfYykMG\u002fAAAAAAD0nkAV0tPEzhrBvwAAAAAAQJ9AC6k\u002fEj5hwL8AAAAAAFCeQBc6TQgst76\u002fAAAAAAConkBGCJP+IwG7vwAAAAAAJJ5AR\u002f8trjirt78AAAAAABifQNUINAYcJLe\u002fAAAAAACIn0B2BlXrz8yvvwAAAAAAbJ5AceoucyJnob8AAAAAADieQHzFgOWApJu\u002fAAAAAADonkD8wRcDPdaXvwAAAAAAhJ5AyZXcudIWlL8AAAAAAMieQMVc59UJrZO\u002fAAAAAAAon0D8uPjE7hWLvwAAAAAATJ5A73kjSjaahr8AAAAAAKCeQFaceGSby4S\u002fAAAAAABsn0BbSAfGT0KBvwAAAAAAfJ9A3Y\u002fmCiVSej8AAAAAAAyfQD2Q2DxS2oo\u002fAAAAAABcn0Dlg5VQbW6LPwAAAAAAVJ9AaDAeGBvoiz8AAAAAADCeQGY8aVIVdJI\u002fAAAAAAAAn0Ckcegj9GuVPwAAAAAAcJ5AAdiWMFKgmj8AAAAAAJCeQNHfqUkcrqU\u002fAAAAAAAgn0BUk7QduVumPwAAAAAA7J5AiAK4v0MWpz8AAAAAAMCeQCfZ6GUl96w\u002fAAAAAAAkn0BAbOqDuWGxPwAAAAAAUJ9A90+qGLnrsT8AAAAAAFieQKPCk8exxLY\u002fAAAAAACAn0CW7rl9ezy3PwAAAAAAnJ5AFtzqgP6\u002fuD8AAAAAALSeQPa5c3X2C7k\u002fAAAAAADMnkDobFyQrM+5PwAAAAAAEJ9A60pjr4QbvD8AAAAAAHifQC5ivZIwi74\u002fAAAAAABYn0D2MDztWre+PwAAAAAAaJ9AR1ZUVW2Uvz8AAAAAAHCfQBPSNpDqqsA\u002fAAAAAACkn0AuyssCjm7BPwAAAAAA0J5ADV4KhRK3wT8AAAAAALCeQI0W9tX5N8I\u002fAAAAAAD4nkBVQP1BCPnCPwAAAAAAYJ5Aasp2+sljwz8AAAAAAJCfQI8kYmW6esM\u002fAAAAAAB8nkC1hLvDVb7DPwAAAAAA8J5AKSQatGIvxD8AAAAAAAifQPVULzLVUsQ\u002fAAAAAACAnkA3ev\u002fbGWPEPwAAAAAAPJ9Auyy+7BvjxD8AAAAAAPyeQFZ\u002fG7kdC8U\u002fAAAAAADgnkCKnGI+hkfFPwAAAAAAMJ9AklCNdlL7xT8AAAAAAISfQDm9d6fkXcY\u002fAAAAAACUn0CZLczdu1zHPwAAAAAAvJ5AkCrAt4J\u002fxz8AAAAAAKyeQPujd9RTAcg\u002fAAAAAAB0nkD8EQOVqDLIPwAAAAAAoJ9ALAJJBS7LyD8AAAAAAFyeQBHv+Q6i5Mg\u002fAAAAAACcn0DQrjrnbmzJPwAAAAAAZJ9AbXV82mkUyj8AAAAAAHieQCnUmXAu\u002f8o\u002fAAAAAAAUn0CGfQrSZDbNPwAAAAAApJ5Az9\u002fO3k9fzT8AAAAAAEyfQDQrWBDqkc0\u002fAAAAAAA4n0DpK9GSiePNPwAAAAAAHJ9A0pBMe0TzzT8AAAAAAASfQCK2+OhTBc4\u002fAAAAAADcnkA4ullJ\u002frTPPwAAAAAAjJ9A0zPsncrgzz8AAAAAAECeQJHSYHLy0dA\u002fAAAAAAB0n0Ae6eI1gOLQPwAAAAAANJ9AoXBn3o840T8AAAAAAIyeQDIGC75x0dE\u002fAAAAAABknkC9nLZHKCzSPwAAAAAASJ5A5bIOWXg90j8AAAAAACyfQOQqGAJ8otI\u002fAAAAAACYnkCo8Ql8ehjWPwAAAAAAPJ5AHsi1AkSp1j8AAAAAACCeQNbnJoJT\u002f9c\u002fAAAAAAA0nkDcC3rUmnTZPwAAAAAAiJ5AuIp8xwaD2z8=","shape":"98, 2"},"hovertemplate":"\u003cb\u003eYear %{customdata[0]}\u003c\u002fb\u003e\u003cbr\u003eLog Diff Return: %{customdata[1]:.4f}\u003cextra\u003e\u003c\u002fextra\u003e","marker":{"color":{"dtype":"f8","bdata":"eYmc4fep3r+yw6hwmLTdv3JSspLzLN2\u002fMyR0PKyh2r+EsL6ciWDRv4qNo6Gtu9C\u002fKIICGtFM0L\u002fSRkSFFHPOv0l9avtcm82\u002f7sym5C+TzL\u002fmDwzSlbTCv5WSuqWCHcK\u002fc5oEXzPMwb9a88yRsMvBv2G7TfYykMG\u002fFdLTxM4awb8LqT8SPmHAvxc6TQgst76\u002fRgiT\u002fiMBu79H\u002fy2uOKu3v9UINAYcJLe\u002fdgZV68\u002fMr79x6i5zImehv3zFgOWApJu\u002f\u002fMEXAz3Wl7\u002fJldy50haUv8Vc59UJrZO\u002f\u002fLj4xO4Vi7\u002fveSNKNpqGv1aceGSby4S\u002fW0gHxk9Cgb\u002fdj+YKJVJ6Pz2Q2DxS2oo\u002f5YOVUG1uiz9oMB4YG+iLP2Y8aVIVdJI\u002fpHHoI\u002fRrlT8B2JYwUqCaP9HfqUkcrqU\u002fVJO0Hblbpj+IAri\u002fQxanPyfZ6GUl96w\u002fQGzqg7lhsT\u002f3T6oYueuxP6PCk8exxLY\u002flu65fXs8tz8W3OqA\u002fr+4P\u002fa5c3X2C7k\u002f6GxckKzPuT\u002frSmOvhBu8Py5ivZIwi74\u002f9jA87Vq3vj9HVlRVbZS\u002fPxPSNpDqqsA\u002fLsrLAo5uwT8NXgqFErfBP40W9tX5N8I\u002fVUD9QQj5wj9qynb6yWPDP48kYmW6esM\u002ftYS7w1W+wz8pJBq0Yi\u002fEP\u002fVULzLVUsQ\u002fN3r\u002f2xljxD+7LL7sG+PEP1Z\u002fG7kdC8U\u002fipxiPoZHxT+SUI12UvvFPzm9d6fkXcY\u002fmS3M3btcxz+QKsC3gn\u002fHP\u002fujd9RTAcg\u002f\u002fBEDlagyyD8sAkkFLsvIPxHv+Q6i5Mg\u002f0K46525syT9tdXzaaRTKPynUmXAu\u002f8o\u002fhn0K0mQ2zT\u002fP387eT1\u002fNPzQrWBDqkc0\u002f6SvRkonjzT\u002fSkEx7RPPNPyK2+OhTBc4\u002fOLpZSf60zz\u002fTM+ydyuDPP5HSYHLy0dA\u002fHuniNYDi0D+hcGfejzjRPzIGC75x0dE\u002fvZy2Rygs0j\u002flsg5ZeD3SP+QqGAJ8otI\u002fqPEJfHoY1j8eyLUCRKnWP9bnJoJT\u002f9c\u002f3At61Jp02T+4inzHBoPbPw=="},"colorscale":[[0.0,"rgb(165,0,38)"],[0.1,"rgb(215,48,39)"],[0.2,"rgb(244,109,67)"],[0.3,"rgb(253,174,97)"],[0.4,"rgb(254,224,139)"],[0.5,"rgb(255,255,191)"],[0.6,"rgb(217,239,139)"],[0.7,"rgb(166,217,106)"],[0.8,"rgb(102,189,99)"],[0.9,"rgb(26,152,80)"],[1.0,"rgb(0,104,55)"]],"line":{"color":"DarkSlateGrey","width":1},"opacity":0.8,"showscale":false,"size":8},"mode":"markers","name":"Individual Years","showlegend":false,"text":["1931","1937","2008","1974","2002","2022","1946","1973","1941","1930","1969","2001","1966","1957","1977","1981","2000","1940","1962","1929","1990","2018","1947","1934","1978","1953","1970","1994","1939","1960","2011","2015","1987","2007","2005","1932","1984","1948","1956","1992","1979","1968","1993","2004","1942","2016","1959","1965","1971","1988","2014","2006","2010","2012","2025","1972","1964","1982","1944","2020","1951","1980","1986","1952","1999","1983","1976","1996","2017","2021","1967","1963","1949","2024","1943","2023","2009","1950","1989","1961","2003","1998","1991","1985","1975","2019","1936","2013","1997","1955","1945","1938","1995","1958","1935","1928","1933","1954"],"x":{"dtype":"f8","bdata":"eYmc4fep3r+yw6hwmLTdv3JSspLzLN2\u002fMyR0PKyh2r+EsL6ciWDRv4qNo6Gtu9C\u002fKIICGtFM0L\u002fSRkSFFHPOv0l9avtcm82\u002f7sym5C+TzL\u002fmDwzSlbTCv5WSuqWCHcK\u002fc5oEXzPMwb9a88yRsMvBv2G7TfYykMG\u002fFdLTxM4awb8LqT8SPmHAvxc6TQgst76\u002fRgiT\u002fiMBu79H\u002fy2uOKu3v9UINAYcJLe\u002fdgZV68\u002fMr79x6i5zImehv3zFgOWApJu\u002f\u002fMEXAz3Wl7\u002fJldy50haUv8Vc59UJrZO\u002f\u002fLj4xO4Vi7\u002fveSNKNpqGv1aceGSby4S\u002fW0gHxk9Cgb\u002fdj+YKJVJ6Pz2Q2DxS2oo\u002f5YOVUG1uiz9oMB4YG+iLP2Y8aVIVdJI\u002fpHHoI\u002fRrlT8B2JYwUqCaP9HfqUkcrqU\u002fVJO0Hblbpj+IAri\u002fQxanPyfZ6GUl96w\u002fQGzqg7lhsT\u002f3T6oYueuxP6PCk8exxLY\u002flu65fXs8tz8W3OqA\u002fr+4P\u002fa5c3X2C7k\u002f6GxckKzPuT\u002frSmOvhBu8Py5ivZIwi74\u002f9jA87Vq3vj9HVlRVbZS\u002fPxPSNpDqqsA\u002fLsrLAo5uwT8NXgqFErfBP40W9tX5N8I\u002fVUD9QQj5wj9qynb6yWPDP48kYmW6esM\u002ftYS7w1W+wz8pJBq0Yi\u002fEP\u002fVULzLVUsQ\u002fN3r\u002f2xljxD+7LL7sG+PEP1Z\u002fG7kdC8U\u002fipxiPoZHxT+SUI12UvvFPzm9d6fkXcY\u002fmS3M3btcxz+QKsC3gn\u002fHP\u002fujd9RTAcg\u002f\u002fBEDlagyyD8sAkkFLsvIPxHv+Q6i5Mg\u002f0K46525syT9tdXzaaRTKPynUmXAu\u002f8o\u002fhn0K0mQ2zT\u002fP387eT1\u002fNPzQrWBDqkc0\u002f6SvRkonjzT\u002fSkEx7RPPNPyK2+OhTBc4\u002fOLpZSf60zz\u002fTM+ydyuDPP5HSYHLy0dA\u002fHuniNYDi0D+hcGfejzjRPzIGC75x0dE\u002fvZy2Rygs0j\u002flsg5ZeD3SP+QqGAJ8otI\u002fqPEJfHoY1j8eyLUCRKnWP9bnJoJT\u002f9c\u002f3At61Jp02T+4inzHBoPbPw=="},"y":[0.1749080237694725,0.5901428612819832,0.8463987883622811,1.119731696839407,0.1312037280884873,0.43119890406724054,0.7116167224336399,1.173235229154987,1.4202230023486417,1.741614515559209,0.10411689885916049,0.5939819704323989,0.8664885281600844,1.0424678221356551,1.3363649934414201,1.6366809019706867,1.9608484485919073,2.304951286326448,0.18638900372842315,0.4582458280396084,0.822370578944476,1.0278987721304083,1.3584289297070435,1.6732723686587383,0.1912139968434072,0.5570351922786028,0.739934756431672,1.1028468876827222,1.4184829137724084,1.6092900825439995,2.0215089703802875,2.2341048247374586,0.1130103185970559,0.5897771074506667,0.8931264066149119,1.1616794696232922,1.360922753834674,1.6195344228012767,2.036846605302431,2.2880304987479203,0.12440764696895577,0.49903538202225406,0.10687770422304368,0.5818640804157564,0.7517559963200035,1.1325044568707963,1.3623422152178821,1.704013604235562,2.0093420558686557,2.2369708911051056,0.2939169255529117,0.5550265646722229,0.8878997883128379,1.1789654700855297,1.4195799957622168,1.7843748470046232,1.9176985004103837,2.2391965724838294,0.10904545778210761,0.4650660661526529,0.7777354579378964,0.1542698063547792,0.5657475018303859,0.7713506653387179,1.056186901937476,1.4085392166316497,1.6281848449949525,2.060439396150808,2.2149101287359545,0.2973773873201035,0.5544489538593315,0.7397431363068345,1.0011044234247204,1.4630922856909667,1.7413714687695234,2.0458014336081973,2.3542540693371894,0.11480893034681808,0.4716931457088545,0.7231738119050259,1.1726206851751186,1.4246596253655115,1.6661796049705297,1.9127116700572044,2.2621964643431327,0.16503666440534942,0.5459212356676129,0.8275114942710426,1.177442548515265,1.3944429850323898,1.6239188491876604,2.042648957444599,2.35215700972338,0.21225543951389925,0.5541934359909122,0.7987591192728782,1.1045465658763987,0.18550820367170995],"type":"scatter"}],                        {"annotations":[{"showarrow":false,"text":"Mean: 0.0656","x":0.0655654164790236,"xanchor":"center","xref":"x","y":1,"yanchor":"bottom","yref":"y domain"},{"showarrow":false,"text":"Median: 0.1053","x":0.10531000044998931,"xanchor":"center","xref":"x","y":0,"yanchor":"top","yref":"y domain"},{"bgcolor":"white","bordercolor":"black","borderpad":10,"borderwidth":1,"opacity":0.9,"showarrow":false,"text":"\u003cb\u003eStatistics:\u003c\u002fb\u003e\u003cbr\u003eMean: 0.0656\u003cbr\u003eMedian: 0.1053\u003cbr\u003eStd Dev: 0.1902\u003cbr\u003eMin: -0.4791 (1931)\u003cbr\u003eMax: 0.4299 (1954)\u003cbr\u003eSkewness: -0.82\u003cbr\u003eKurtosis: 0.64","x":0.98,"xanchor":"right","xref":"paper","y":0.98,"yanchor":"top","yref":"paper"}],"height":600,"hovermode":"closest","shapes":[{"line":{"color":"green","dash":"dash"},"type":"line","x0":0.0655654164790236,"x1":0.0655654164790236,"xref":"x","y0":0,"y1":1,"yref":"y domain"},{"line":{"color":"orange","dash":"dot"},"type":"line","x0":0.10531000044998931,"x1":0.10531000044998931,"xref":"x","y0":0,"y1":1,"yref":"y domain"}],"showlegend":false,"template":{"data":{"barpolar":[{"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"type":"carpet"}],"choropleth":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"choropleth"}],"contourcarpet":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"contourcarpet"}],"contour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"contour"}],"heatmap":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"heatmap"}],"histogram2dcontour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2dcontour"}],"histogram2d":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2d"}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"mesh3d":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"mesh3d"}],"parcoords":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"parcoords"}],"pie":[{"automargin":true,"type":"pie"}],"scatter3d":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatter3d"}],"scattercarpet":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattercarpet"}],"scattergeo":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergeo"}],"scattergl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergl"}],"scattermapbox":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermapbox"}],"scattermap":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermap"}],"scatterpolargl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolargl"}],"scatterpolar":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolar"}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"scatterternary":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterternary"}],"surface":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"surface"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}]},"layout":{"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"autotypenumbers":"strict","coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]],"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]},"colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"geo":{"bgcolor":"white","lakecolor":"white","landcolor":"white","showlakes":true,"showland":true,"subunitcolor":"#C8D4E3"},"hoverlabel":{"align":"left"},"hovermode":"closest","mapbox":{"style":"light"},"paper_bgcolor":"white","plot_bgcolor":"white","polar":{"angularaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""},"bgcolor":"white","radialaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""}},"scene":{"xaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"},"yaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"},"zaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"ternary":{"aaxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"baxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"bgcolor":"white","caxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""}},"title":{"x":0.05},"xaxis":{"automargin":true,"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","zerolinewidth":2},"yaxis":{"automargin":true,"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","zerolinewidth":2}}},"title":{"text":"Distribution of S&P 500 Real Returns (Log diff basis, 1928-2025)\u003cbr\u003e\u003csub\u003eMean: 0.0656, Std Dev: 0.1902\u003c\u002fsub\u003e","x":0.5,"xanchor":"center"},"xaxis":{"title":{"text":"Annual Return (Log Diff)"}},"yaxis":{"title":{"text":"Frequency"}}},                        {"responsive": true}                    )                };            </script>        </div>

<p>Why is volatility used to measure risk? Volatility is the standard deviation of returns, and measures the size of typical daily (or longer, or shorter) swings. Volatility measures the width of the bell curve, or the range of possible outcomes. Historical volatility measures the size of past swings. Implied volatility measures what options price in about future swings. Lower volatility means outcomes are fairly predictable; higher volatility means a lot of different outcomes are possible.</p>

<p>Consider Ben Graham’s metaphor of manic-depressive Mr. Market.</p>

<blockquote>
  <p><em>One of your partners, named Mr. Market, is very obliging indeed. Every day he tells you what he thinks your interest is worth and furthermore offers either to buy you out or to sell you an additional interest on that basis. Sometimes his idea of value appears plausible and justified by business developments and prospects as you know them. Often, on the other hand, Mr. Market lets his enthusiasm or his fears run away with him, and the value he proposes seems to you a little short of silly.</em></p>
</blockquote>

<p>On a typical day, bipolar Mr. Market swings a typical amount between euphoria and despair.</p>

<p>That volatility tells you how risky Mr. Market thinks the stock is, as a first-order approximation. In the short run, volatility just tells you market perception of risk. In the long run, it incorporates the good and bad things that actually did happen, and more closely approximates true risk.</p>

<p>Even then, a lot of things that could have happened didn’t happen. Maybe there was a too-great or not-great-enough probability of a disastrous war priced into the swings during the Cuban Missile Crisis. The concept of ‘risk’ is a Platonic ideal of things that are not knowable and don’t necessarily follow distributions you can model. Any attempt to put a number on it is inherently subjective. Still, volatility measures the range of returns that investors actually experienced, and what risk the market prices in, and these are good to know.</p>

<p>There are at least 3 different, related concepts here:</p>
<ul>
  <li>The historical distribution of outcomes investors actually experienced.</li>
  <li>The true distribution of actual possible future outcomes for individual securities, which influences how you construct a portfolio. This is an abstract concept. Better models predict better. But that does not mean there is some perfect model, or that the future is acutally determined by some random process like picking fates out of a hat.</li>
  <li>The distribution investors currently believe, based on their knowledge of history, explcit models they build, implicit models revealed by their actions, which in turn impact short-term volatility.</li>
</ul>

<p>We usually express volatility at an annual rate. We can do that because if you assume well-behaved log-normally distributed returns, then there is a simple relationship between daily volatility, monthly volatility, and annual volatility.<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup></p>

<p>Let’s look at the distribution of stock returns over longer time frames.</p>

<div>                        <script type="text/javascript">window.PlotlyConfig = {MathJaxConfig: 'local'};</script>
        <script charset="utf-8" src="https://cdn.plot.ly/plotly-3.2.0.min.js" integrity="sha256-iZ2u/oU2wf/vDbl/ChcX93WgbBRSBvUO6N413hDz7xM=" crossorigin="anonymous"></script>                <div id="52ddb6ab-6514-4cf2-8467-7f6ba9f40b00" class="plotly-graph-div" style="height:1200px; width:100%;"></div>            <script type="text/javascript">                window.PLOTLYENV=window.PLOTLYENV || {};                                if (document.getElementById("52ddb6ab-6514-4cf2-8467-7f6ba9f40b00")) {                    Plotly.newPlot(                        "52ddb6ab-6514-4cf2-8467-7f6ba9f40b00",                        [{"hovertemplate":"1-Year Return: %{x:.2%}\u003cbr\u003eCount: %{y}\u003cextra\u003e\u003c\u002fextra\u003e","marker":{"color":"lightsalmon","line":{"color":"darkgray","width":1}},"name":"1-Year","nbinsx":15,"opacity":0.7,"showlegend":false,"x":{"dtype":"f8","bdata":"OMR3V5kd3T+wx8EcjZu2v6Bxv9ssnMm\u002fqvUa6vdc2L\u002fArb4H6J6SPwiI5IHtQt8\u002foPww1NdFm7+0kVVgFTHbPxwWus3IPNM\u002fbsAC7dvD17\u002fUHHlx3BrVP8A+NWNmeoa\u002fEJzomcPxvL\u002fIBYRUpW7Kv7CEDFPAz7c\u002fSAm+UoB6yz9o87eKeu\u002fEP+SFJPPZA9U\u002f1ChdOKDHzL\u002fw47ssRRyhv0AG9r62+Zo\u002fqIsO6ueiyj+4bWN2EQ7OP4C\u002fc9\u002f6WMU\u002foM4YnrUZxj\u002fA4GRltOSTv7pu4MaaL+E\u002fqAJMTK+L1D\u002fASM8tSyWmP7x6txkvncC\u002fSDWzdrBj2j+AuftxY\u002fy5PwCWDp2rsIS\u002fHJgAPQCC0D+QGEaPAqG5vygoQKRaZ8o\u002fQDNdQjiUwz9g0b3uHVC6P8QsbuygncC\u002fmNlliRHLyT8gbIsn6MytP9iDksIhZ8G\u002fwGY4QPR8k79gvCldRCi7P+Ad+BPk\u002f8I\u002fQBpoMkEZy79+DogdEsnVv1istEtf\u002fdE\u002fkIw7E4Imxz\u002fAyfo1XmnAv4D+MP\u002fCj5e\u002fYLYJ14qdpz8Ixs7WHN3FP7AIFzHYAsC\u002f2BsvkHZzxD8AqBlsPd\u002fGPwBf4IW3pZU\u002fmJYyNK\u002fq0D8IAOcYowbGPwDwIAKWB4s\u002fIFhpgGW1vT8QDt3iR2jQPwjGxXw+ILa\u002f5BjiQEXf0D+g1QUdidqmPyB9SspD\u002fLE\u002fQGivNEjoir+07srsmaHVP\u002fDIwnho+8c\u002fvMp\u002foqnC0z+8PMCbVdXQP4gzE+gcsMY\u002fGPjPmA\u002fAvr88g4u0S+TAv0wOZeGAb86\u002flOcETNqh0D\u002fAw+8pHZCyPwDT7GQAGYw\u002f2B063kVRwD+A\u002fN\u002fqqp2LP9DhFs06bte\u002foNjCNjbtzD+ArzdHHM7AP0DM0SW\u002fL4G\u002foP66HzDNwT8sTSYpU1LTP5iijitiOMA\u002fABf8Pddnej8w+FgFzVK4P3g426WfcMg\u002fMFEZtyfVrr98s\u002f4YchnSP8Aan9UtCsU\u002fgHldWU6hyT8I5kZ76nLNv6jipffLH8w\u002fQF6jhZhbyz\u002fw8yWJs6zCPw=="},"xaxis":"x","yaxis":"y","type":"histogram"},{"hovertemplate":"5-Year Return: %{x:.2%}\u003cbr\u003eCount: %{y}\u003cextra\u003e\u003c\u002fextra\u003e","marker":{"color":"lightcoral","line":{"color":"darkgray","width":1}},"name":"5-Year","nbinsx":15,"opacity":0.7,"showlegend":false,"x":{"dtype":"f8","bdata":"iAkNXO\u002fEs7\u002f4ENZ+vrCyvyDUjS1HIK+\u002fYJZhQvm6qz\u002fo9GEUSYTMP\u002fC9\u002f02fQbw\u002fcBgdvivrtT8QYCjRnM62P0BBeHyfTYO\u002fCAkGKVpGur8AlBEioA5jP+DhS8p\u002fCJC\u002fgDV4E5JEkT9A0gX4Nzi6PxD4p1Mb57g\u002fgOEPmawUsj8gPVrYuP+hP6D4AU3f\u002fqU\u002fACVLrkKBnD\u002fgXmw0EY29P2AsKL35ZsQ\u002fOK\u002f0JOsNwz+orUo5hU\u002fKP6DmCshmaMw\u002fSGQf6TvyyD\u002forYMplhbAP0CXYm7v\u002fso\u002fSAClO\u002fcAwT8QfP9Pir6xPzAFdfX0Lrw\u002foFGMlqUYvj9AU0exoja1P2BV3nqUwbc\u002fkHk13j3dvT9Adjc4DxujPyB0KVyTW7k\u002fUOfau2oVsj8AnKR57L6FP8BqbJ5JJYq\u002fgGbIX79Noj9A0gNEKhGbP9CvknvBhaC\u002fYAFHoZJItb\u002fwY6S4QdOgv0BPc7qHm5S\u002fMFWnyuWasr9gAt8cPWOgv+DRtLbegK8\u002fQBaSsGfOpT\u002fgpVavEImSv6DYC71fRKQ\u002fcCXneB9QtD9A4dXW+vqyP5CHxtQvPbc\u002fmJhDMDYHxD+oy59L5RTAP2DZ8wGCCL0\u002fELnFI7WMxD8gz1DK5Ge2P8CdV3EMoLo\u002fkPtFdpJbvD8Qx35iIfy5PyAv\u002fY8MYqk\u002fSK9B9tP\u002fwD9ggNllCmm+PyA\u002fIn0Pz8U\u002fsO\u002fvV5bayj8gziCxGDXQP6BhlTAThMM\u002fkGvoqGAdtT+AZe1RhyKdv2Aef9BgoZ2\u002f8MHp2qT+p7\u002fgTkQsdPSTv6A7+A5r+qA\u002fwO+CO3r\u002ftz+g57q0WuKnvyC4kyuFTZW\u002fAGh+309GTj9A8GuUvQqZvwCas6Sg1Va\u002faIqRSy6cwz\u002fY61rTZSPBP\u002fAQ5sEWkbs\u002fAP0UVtCfwD+w9Ayj+urBP1BS5uIxa7E\u002fALZnGSWbuD+ooSekB3TAP3hV+13iIMM\u002fADq7ISJZqz\u002fgEGweFBy8PwCqZcxq+7g\u002f4Me0mqcVuD8="},"xaxis":"x2","yaxis":"y2","type":"histogram"},{"hovertemplate":"10-Year Return: %{x:.2%}\u003cbr\u003eCount: %{y}\u003cextra\u003e\u003c\u002fextra\u003e","marker":{"color":"lightblue","line":{"color":"darkgray","width":1}},"name":"10-Year","nbinsx":15,"opacity":0.7,"showlegend":false,"x":{"dtype":"f8","bdata":"ACDdfQwRiT8AeJ+gkQFqP4B7gikuTIc\u002fgK0MevJllj\u002fAE7QyuVOoP0CXBXniJKw\u002fYCKqxJNGoT9g4QJ2j86qP6CjOvCGCqc\u002fgL3tZpWLf7+A9\u002fIvXmOiPwAgSqRZT4M\u002fgBCi8nyLnj\u002fgBRF2eIGwP5Ck4E+lN7s\u002fMDwfw2Y3vT+grl3qySy3PyCjwHVbDr8\u002fcDN+c67lvj\u002fQ+0tz\u002fcXDP0A0Eme1OsI\u002f2EAJxw\u002f5xj84rizGt5XFPwAFH+11UMI\u002fqKMRMUprwz9gfoyAbSK\u002fPzjA3LeHksI\u002f8FbHQ\u002fPVvD\u002fwLqTrFr23P5A41JvStbI\u002fII1mJ5S3uz+gdfCZ46SzP0DvvVMyEKo\u002foHaQIXKTqT9gKkteXbSiP6Auad+Jzq8\u002fgBP\u002ft11Qkj9wtdksPCajvyBHnc8eape\u002fAMYVg9Rpfj+AWoV26PaYv\u002fCyKJl\u002fdKC\u002fgJx97P6Mi78A+RdcvwVxP+CbxjlvkpO\u002foNvOVKqVkr8A4IgZyq+WP\u002fBUV7R8XLE\u002fwP4sHVwAsT8glg3fMMywP7AsNb\u002fu7bQ\u002fQFtUJaWjuD+ACUSlcdO9P8A9Rup10rY\u002f6BTEHqShwD\u002fgbdsUEEG+P9B4bjBFgbs\u002fIIuRnuCJuj8QFWsfpCS8P\u002fD\u002fRebugrw\u002foOUQKKnxwT9wx\u002fwAvcLDP6i\u002fr12BzcI\u002faD8z15BAwj+QVUMjZbm5P5BV6ICu+7A\u002fwP15X\u002fV4tT\u002fgy7ZUn8q3P8DR2\u002f0FIrA\u002fgHKldOh0rT+AshuOeJOfP3BiqTjdXqO\u002fUD83Tzheob\u002fAkH\u002f20B2DvwCxZzrjInA\u002fQOjumVIWpz9AswekfNioP0DT5O3Qf6s\u002foAB9Pmgcqz8AC3kFvompP6BGBwAEJLE\u002fAOQCeUMcvD9wxYU\u002ffGa9P+CpPfpiOb4\u002fiHEgMPnewT8QlnPcQom4PwCeuuGDtrY\u002fEBmo0kPLuD\u002fg4dhTGna8Pw=="},"xaxis":"x3","yaxis":"y3","type":"histogram"},{"hovertemplate":"20-Year Return: %{x:.2%}\u003cbr\u003eCount: %{y}\u003cextra\u003e\u003c\u002fextra\u003e","marker":{"color":"lightgreen","line":{"color":"darkgray","width":1}},"name":"20-Year","nbinsx":15,"opacity":0.7,"showlegend":false,"x":{"dtype":"f8","bdata":"AHcV6bGVmD8ACTvRpcp5P4Cxmh\u002fbDZU\u002fgEQ76HL+pT\u002fgxTTbcZazPyBpIp97irU\u002fQEugw1Oerz9gsPBJ+Ba2PzDtvUIeCrU\u002fkAjI2pkAsj\u002fAPpfSL362PzBO+qpBVbc\u002fMOksBm7XuD8AEhv+UmO6P6CU4G8UfMA\u002fgNVO0YAsvj9Qu\u002fENGRO+P9DkPyCa8b0\u002fwNfp5phLuz\u002fwZHy5KPC8PxDJaTgBB8A\u002fONVPJGg\u002fwD9gplwtY7O7PyCU1+Z\u002fdLg\u002fkLn5zfu0tz\u002fAGgkHSWq3PxCRq3rjYbQ\u002fABLPN+beoT+g7vOn2w6hP4AXQcSDWKQ\u002f4EW\u002f3uJkpD\u002fAR3dkEVmVP0BqvUCwp5I\u002fwA7SRT1xmz+AY0S2FA2BP8CykswGtZU\u002fgP6o8X1\u002flD+AOMo4UlqMP0BhkCjtS5U\u002fIEyaWkV9oj8AibHMWPmbP0CWGILyxp4\u002fYNPxaGhaqT9ANzmWsXGnP2CfUWtiBas\u002fYNMxS1Z5qD+ABY47oF6wP6A5DzJ86bU\u002fQCIxNz2Etj9AkDCRzZe2P8AARV5yT7w\u002foF\u002fvcvT7vz8IdR9nRdjAP8DV+oLSlL0\u002fkJOf5\u002fd3vT+wv13FNoq3P6DdIGv2eLg\u002fEJp+GWQpuT\u002fQBCwZvBK2P3D4cfDKiLU\u002foLYC2MuJtT+g7y4\u002f3pirPyAukhXu76o\u002fwCddTTJdsD\u002fg1sRhXCqqP8CulwjWf6w\u002f4BM0tv\u002fosD9gb\u002fo9hbmyP6AjN0Gorq0\u002fgH8\u002fEmp+qz+gTezHgPSoP8AL63OrE6E\u002fgFGR5Gxaoz9A5GnlOdmqP7DF0lk407E\u002f8H4EJX\u002f2sT9Q84kK\u002foSxP4BPHMFnN7M\u002fwK7dWHvotD8="},"xaxis":"x4","yaxis":"y4","type":"histogram"}],                        {"annotations":[{"font":{"size":16},"showarrow":false,"text":"1-Year Real Annual Returns (98 observations)","x":0.5,"xanchor":"center","xref":"paper","y":1.0,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"5-Year Rolling Real Annual Returns (94 observations)","x":0.5,"xanchor":"center","xref":"paper","y":0.73,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"10-Year Rolling Real Annual Returns (89 observations)","x":0.5,"xanchor":"center","xref":"paper","y":0.46,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"20-Year Rolling Real Annual Returns (79 observations)","x":0.5,"xanchor":"center","xref":"paper","y":0.19,"yanchor":"bottom","yref":"paper"},{"font":{"size":10},"showarrow":false,"text":"Mean: 8.61%","x":0.08608526564002535,"xanchor":"left","xref":"x","y":1,"yanchor":"top","yref":"y domain"},{"align":"left","bgcolor":"white","bordercolor":"black","borderpad":8,"borderwidth":1,"font":{"size":10},"opacity":0.9,"showarrow":false,"text":"\u003cb\u003eStatistics:\u003c\u002fb\u003e\u003cbr\u003eMean: 8.61%\u003cbr\u003eMedian: 11.11%\u003cbr\u003eStd Dev: 19.20%\u003cbr\u003eMin: -38.07%\u003cbr\u003eMax: 53.71%","x":0.98,"xanchor":"right","xref":"x","y":0.98,"yanchor":"top","yref":"y"},{"font":{"size":10},"showarrow":false,"text":"Mean: 7.01%","x":0.07009828521890249,"xanchor":"left","xref":"x2","y":1,"yanchor":"top","yref":"y2 domain"},{"align":"left","bgcolor":"white","bordercolor":"black","borderpad":8,"borderwidth":1,"font":{"size":10},"opacity":0.9,"showarrow":false,"text":"\u003cb\u003eStatistics:\u003c\u002fb\u003e\u003cbr\u003eMean: 7.01%\u003cbr\u003eMedian: 8.42%\u003cbr\u003eStd Dev: 7.84%\u003cbr\u003eMin: -10.26%\u003cbr\u003eMax: 25.32%","x":0.98,"xanchor":"right","xref":"x2","y":0.98,"yanchor":"top","yref":"y2"},{"font":{"size":10},"showarrow":false,"text":"Mean: 6.94%","x":0.06942453802003516,"xanchor":"left","xref":"x3","y":1,"yanchor":"top","yref":"y3 domain"},{"align":"left","bgcolor":"white","bordercolor":"black","borderpad":8,"borderwidth":1,"font":{"size":10},"opacity":0.9,"showarrow":false,"text":"\u003cb\u003eStatistics:\u003c\u002fb\u003e\u003cbr\u003eMean: 6.94%\u003cbr\u003eMedian: 6.70%\u003cbr\u003eStd Dev: 5.45%\u003cbr\u003eMin: -3.78%\u003cbr\u003eMax: 17.95%","x":0.98,"xanchor":"right","xref":"x3","y":0.98,"yanchor":"top","yref":"y3"},{"font":{"size":10},"showarrow":false,"text":"Mean: 6.93%","x":0.06925211338182145,"xanchor":"left","xref":"x4","y":1,"yanchor":"top","yref":"y4 domain"},{"align":"left","bgcolor":"white","bordercolor":"black","borderpad":8,"borderwidth":1,"font":{"size":10},"opacity":0.9,"showarrow":false,"text":"\u003cb\u003eStatistics:\u003c\u002fb\u003e\u003cbr\u003eMean: 6.93%\u003cbr\u003eMedian: 7.02%\u003cbr\u003eStd Dev: 3.35%\u003cbr\u003eMin: 0.63%\u003cbr\u003eMax: 13.16%","x":0.98,"xanchor":"right","xref":"x4","y":0.98,"yanchor":"top","yref":"y4"}],"height":1200,"shapes":[{"line":{"color":"green","dash":"dash","width":2},"type":"line","x0":0.08608526564002535,"x1":0.08608526564002535,"xref":"x","y0":0,"y1":1,"yref":"y domain"},{"line":{"color":"green","dash":"dash","width":2},"type":"line","x0":0.07009828521890249,"x1":0.07009828521890249,"xref":"x2","y0":0,"y1":1,"yref":"y2 domain"},{"line":{"color":"green","dash":"dash","width":2},"type":"line","x0":0.06942453802003516,"x1":0.06942453802003516,"xref":"x3","y0":0,"y1":1,"yref":"y3 domain"},{"line":{"color":"green","dash":"dash","width":2},"type":"line","x0":0.06925211338182145,"x1":0.06925211338182145,"xref":"x4","y0":0,"y1":1,"yref":"y4 domain"}],"showlegend":false,"template":{"data":{"barpolar":[{"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"type":"carpet"}],"choropleth":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"choropleth"}],"contourcarpet":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"contourcarpet"}],"contour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"contour"}],"heatmap":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"heatmap"}],"histogram2dcontour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2dcontour"}],"histogram2d":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2d"}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"mesh3d":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"mesh3d"}],"parcoords":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"parcoords"}],"pie":[{"automargin":true,"type":"pie"}],"scatter3d":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatter3d"}],"scattercarpet":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattercarpet"}],"scattergeo":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergeo"}],"scattergl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergl"}],"scattermapbox":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermapbox"}],"scattermap":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermap"}],"scatterpolargl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolargl"}],"scatterpolar":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolar"}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"scatterternary":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterternary"}],"surface":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"surface"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}]},"layout":{"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"autotypenumbers":"strict","coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]],"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]},"colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"geo":{"bgcolor":"white","lakecolor":"white","landcolor":"white","showlakes":true,"showland":true,"subunitcolor":"#C8D4E3"},"hoverlabel":{"align":"left"},"hovermode":"closest","mapbox":{"style":"light"},"paper_bgcolor":"white","plot_bgcolor":"white","polar":{"angularaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""},"bgcolor":"white","radialaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""}},"scene":{"xaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"},"yaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"},"zaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"ternary":{"aaxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"baxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"bgcolor":"white","caxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""}},"title":{"x":0.05},"xaxis":{"automargin":true,"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","zerolinewidth":2},"yaxis":{"automargin":true,"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","zerolinewidth":2}}},"title":{"font":{"size":16},"text":"S&P 500 Compound Annual Returns by Time Horizon (1928-2025)","x":0.5,"xanchor":"center"},"xaxis":{"anchor":"y","domain":[0.0,1.0],"range":[-0.4,0.6],"tickformat":".0%","title":{"text":"Annual Return"}},"yaxis":{"anchor":"x","domain":[0.81,1.0],"title":{"text":"Frequency"}},"xaxis2":{"anchor":"y2","domain":[0.0,1.0],"range":[-0.4,0.6],"tickformat":".0%","title":{"text":"Compound Annual Return"}},"yaxis2":{"anchor":"x2","domain":[0.54,0.73],"title":{"text":"Frequency"}},"xaxis3":{"anchor":"y3","domain":[0.0,1.0],"range":[-0.4,0.6],"tickformat":".0%","title":{"text":"Compound Annual Return"}},"yaxis3":{"anchor":"x3","domain":[0.27,0.46],"title":{"text":"Frequency"}},"xaxis4":{"anchor":"y4","domain":[0.0,1.0],"range":[-0.4,0.6],"tickformat":".0%","title":{"text":"Compound Annual Return"}},"yaxis4":{"anchor":"x4","domain":[0.0,0.19],"title":{"text":"Frequency"}}},                        {"responsive": true}                    )                };            </script>        </div>

<p>We see tighter distributions as we look at longer spans. Many of the 20-year time spans overlap, so this probably overstates the convergence. But note that there has never been a 20-year negative real return in the S&amp;P. If returns are uncorrelated and well behaved, we should expect returns over longer periods to converge toward the mean return according to a square root law. You are not guaranteed a great return, but if you stay invested for a long time the law of averages is on your side.</p>

<p>Let’s look at the distribution of real returns of various assets:</p>

<div>                        <script type="text/javascript">window.PlotlyConfig = {MathJaxConfig: 'local'};</script>
        <script charset="utf-8" src="https://cdn.plot.ly/plotly-3.2.0.min.js" integrity="sha256-iZ2u/oU2wf/vDbl/ChcX93WgbBRSBvUO6N413hDz7xM=" crossorigin="anonymous"></script>                <div id="3ea06d42-901c-446d-878d-e0aaaa00e8bd" class="plotly-graph-div" style="height:2100px; width:100%;"></div>            <script type="text/javascript">                window.PLOTLYENV=window.PLOTLYENV || {};                                if (document.getElementById("3ea06d42-901c-446d-878d-e0aaaa00e8bd")) {                    Plotly.newPlot(                        "3ea06d42-901c-446d-878d-e0aaaa00e8bd",                        [{"marker":{"color":"lightsalmon"},"name":"Small Caps","nbinsx":15,"showlegend":false,"x":{"dtype":"f8","bdata":"bL85S7B+5D+iHgkLHLHdv3BKuep9r9y\u002fEKyQyak12L+wTmVSh8PbP6CEJhQ3KPc\u002fgFqEjqwtyz8CpBeBmSHgPw5L6fcM9O0\u002fRONPqJOr4b9gz+YyvOa0P8DTK2UZ4qi\u002frBbfWQ1Z1b9k5D1xwGvDvyhLJ\u002fYYr98\u002fTv3D1Q\u002fE9T9qH7nJiYnlP9i++DwL2Ow\u002fvCUxUABD0b8A+7EKCeG4v4AEKzCW152\u002fEH3kW+hk0z9kD3hxWlLcP0BMDk6ck5S\u002fAGhZ3aaRZT9wWDINqhKxvwbAfKSSL+U\u002fVIww9FXM0D9A0K8n6UOjv7TSeohKgMa\u002frrgvJdsU5T8AGxzS95q7P6CV0NnP56i\u002fBAQdvLFL0j+ATpVyZhO8v\u002fge7ad+rMY\u002f0LxXrDo+zD+4LCcxIzPbP7BfULrt\u002fb+\u002fDJLcYDWF8T\u002f6kJk+bhrhP3CnMviWl9e\u002fFKZnXxiGzb\u002fAS4Bzy3e\u002fP2B1GyPdEqC\u002fktmzRAX427+WfnEFqFrWv0xBCkT6kN8\u002f6H8JbkS02j\u002f4glukMkzMP0DxaSgdVcc\u002flESb1H4K0D+o6nmUmrnQP\u002fA8F0aQDb+\u002fkFwC8gZhzD8gGMssbCjTP\u002fx4k9qet8a\u002fmF+GxlGKyT+A1o99+RiEP9z2nHsXmMa\u002fEA\u002f4GwI2vz8AvPF5XqGWP8oGtyXgbtS\u002fSOJ+zpC02j9IhOHep+nLP2jkucj0asw\u002fIO7lmpiJsr\u002foksdhqnbSP+CpS+avabw\u002f0DO1sB2fyT+g3azVo\u002f\u002fCv6wutFWK1NU\u002f4KWPCkz+vr\u002fskd+dAUfTPwDFHiH58K2\u002fYh+0iI8Q7D8Idzd8+2jBPwBQFaRm3Gw\u002fIBzY5wfMwz\u002fM9pP4BDnAv3hr+xCmoNy\u002fpEr1\u002fNqM2z+AtlXo4YrQP2gMZAgOI8W\u002fYOdENcOpxT8MARdO0cTePwA0tHXxcX8\u002fKPxoajsIub9wv91FxL3CPyBPWNaQUsA\u002fDCzLa1LCxr8gq8nmPR24P3AO8LZqtdQ\u002fEMZQx3Riwj9omFaJ06XRvwAMPfagNZI\u002fQEADhP7rrD\u002fYrm\u002f8+S\u002fBPw=="},"xaxis":"x","yaxis":"y","type":"histogram"},{"marker":{"color":"lightcoral"},"name":"S&P","nbinsx":15,"showlegend":false,"x":{"dtype":"f8","bdata":"OMR3V5kd3T+wx8EcjZu2v6Bxv9ssnMm\u002fqvUa6vdc2L\u002fArb4H6J6SPwiI5IHtQt8\u002foPww1NdFm7+0kVVgFTHbPxwWus3IPNM\u002fbsAC7dvD17\u002fUHHlx3BrVP8A+NWNmeoa\u002fEJzomcPxvL\u002fIBYRUpW7Kv7CEDFPAz7c\u002fSAm+UoB6yz9o87eKeu\u002fEP+SFJPPZA9U\u002f1ChdOKDHzL\u002fw47ssRRyhv0AG9r62+Zo\u002fqIsO6ueiyj+4bWN2EQ7OP4C\u002fc9\u002f6WMU\u002foM4YnrUZxj\u002fA4GRltOSTv7pu4MaaL+E\u002fqAJMTK+L1D\u002fASM8tSyWmP7x6txkvncC\u002fSDWzdrBj2j+AuftxY\u002fy5PwCWDp2rsIS\u002fHJgAPQCC0D+QGEaPAqG5vygoQKRaZ8o\u002fQDNdQjiUwz9g0b3uHVC6P8QsbuygncC\u002fmNlliRHLyT8gbIsn6MytP9iDksIhZ8G\u002fwGY4QPR8k79gvCldRCi7P+Ad+BPk\u002f8I\u002fQBpoMkEZy79+DogdEsnVv1istEtf\u002fdE\u002fkIw7E4Imxz\u002fAyfo1XmnAv4D+MP\u002fCj5e\u002fYLYJ14qdpz8Ixs7WHN3FP7AIFzHYAsC\u002f2BsvkHZzxD8AqBlsPd\u002fGPwBf4IW3pZU\u002fmJYyNK\u002fq0D8IAOcYowbGPwDwIAKWB4s\u002fIFhpgGW1vT8QDt3iR2jQPwjGxXw+ILa\u002f5BjiQEXf0D+g1QUdidqmPyB9SspD\u002fLE\u002fQGivNEjoir+07srsmaHVP\u002fDIwnho+8c\u002fvMp\u002foqnC0z+8PMCbVdXQP4gzE+gcsMY\u002fGPjPmA\u002fAvr88g4u0S+TAv0wOZeGAb86\u002flOcETNqh0D\u002fAw+8pHZCyPwDT7GQAGYw\u002f2B063kVRwD+A\u002fN\u002fqqp2LP9DhFs06bte\u002foNjCNjbtzD+ArzdHHM7AP0DM0SW\u002fL4G\u002foP66HzDNwT8sTSYpU1LTP5iijitiOMA\u002fABf8Pddnej8w+FgFzVK4P3g426WfcMg\u002fMFEZtyfVrr98s\u002f4YchnSP8Aan9UtCsU\u002fgHldWU6hyT8I5kZ76nLNv6jipffLH8w\u002fQF6jhZhbyz\u002fw8yWJs6zCPw=="},"xaxis":"x2","yaxis":"y2","type":"histogram"},{"marker":{"color":"lightblue"},"name":"T-Notes","nbinsx":15,"showlegend":false,"x":{"dtype":"f8","bdata":"QMkXCsShlD8AgEoj7GuiP+BWGNXi6L0\u002fsAf5FuMTsz+wossPSTLLP4Dz7AFlMYY\u002fkHZXEuFCsD+APGLkEpKNPyBTRtabAqI\u002fQIcTVbJtjb+AHJNpi2iyP6BVyj89l6Y\u002fQF77SFPVpz8IiMqR8tS7v2AR7hxJo6+\u002fAHiuLTqkcr8A0MllrFJmPwCc6HXrMI8\u002ftBd2VL5BwL9w1zHBgZ+yv8BrY+1SsIS\u002fsPNKB32dsT8ANPMSe5iqv2C\u002fI3ZVaK6\u002fgDRNvn7Cjj\u002fAtKsihkChP6DfvRcezqQ\u002fwDIAmHd0kb8A3GlpKw6qv+D0zvzaZaM\u002fMKLOs01ro7+ASblkGwemv3DuFwoA9rk\u002fADN9seBFjD8gOrCD0gemPwBQGqPnajk\u002fwH7arVL2mz\u002fA3ppZezKIvwC\u002frHZL0nW\u002fIO+vaxD1pr8AVq1oNkOMvyjVe5ehBru\u002fwLvFzxYfuz9Qn8IeJyqwP4A56gFRSXe\u002fkEHhtKzFp78AiZ23eJW3vyDd3O4F5p+\u002foCHW8VQluz8gSmQP+\u002fapvzgNnndwALe\u002fgD8+uQaGvL+YhG72zqPBvwBRaHWVMXu\u002f4LExLLPd0T8AjUOxalB3v8ChAlHoGLg\u002fICimO+4Fyz9wngO8LlvNP1j9VVWbB7e\u002fQE3k9i+noj+QuHRuWuq\u002fPwBcgArW71M\u002fkMyLbn6ovT\u002fw9FjV6RKwP6B9OJknj7w\u002f+EJJgQq1ur94X9kugyTKP+Ck1LwGxZK\u002fULQIdaq7tD9oQRBVFcTAP1iOq0hqRbu\u002fUDgIO2FtwD9AyjVpLUWkP3CggNsc278\u002fQICMVrQ8jr+A9d1db3+IP4A7tFKytXW\u002fgDt0MnYnd7\u002fgf5y+9CWuP3DSr5bYlsk\u002fDKg651A+wb\u002fwVlyivpKxP9hn7Fl7QMA\u002fgPl09DvFiD+YiCkXHMC6vwBpLG2wYbk\u002fALtL0yePdj+AmnlzBsWLvwD1OZHNyHs\u002fILh7pnNck7\u002fg25uFmmWyP+Du9scRLrk\u002fAHGB9BFku7\u002fQIt\u002ftejLNvwAq55ax63Q\u002fAApUu9SEpr\u002fApkfPLzipPw=="},"xaxis":"x3","yaxis":"y3","type":"histogram"},{"marker":{"color":"lightgreen"},"name":"Baa Corps","nbinsx":15,"showlegend":false,"x":{"dtype":"f8","bdata":"AAh5C0uqpj+AlUJTB8WYP9BlADOJ97I\u002fiHm4YDb3sb9g1caTfyfYP\u002fCdMXoeAb8\u002fYKSGx6rQxT\u002fA62Wm+Ki5P2BOh+qvEbk\u002fKBjlaj4asr9Qs7BkOaK\u002fP6BbN0TUb7Q\u002fgGf4WKYqtD8wNn2XjOymv0Cc38YSF6K\u002fIP2fJuBKqT9AIXOGLVulP+CS5D8izKY\u002fKPqmHtHtwL+Aq3bxdiu0vwCEXc7Rt3E\u002f4I30uTR7sz\u002fg3kj4gl6QvyCQsLdS562\u002fIPQ8ds27oj+AXQCE3rSBPwCETwzHzLE\u002fQFzxPeMJkT9ADtbSeImqv9Cq2x3w\u002f6G\u002fYHZvao9+pz8AggOE0BVZv4BOSFn+yKo\u002foGWEo0uGpj+gKPWl6BSqP6ASRduYPaM\u002fwJ04ED1ApT+Aw5MKCHWJP6h6L8OhFbG\u002fIBq7xEtPlb8AVIX5DJ5TP9AQsk4k0rO\u002fAFjprWWbSD\u002fQy89F2Zy6P6DDw7Xsz7M\u002fIKokA6KqpL+8waI9ngzDv0CkPt34saM\u002fOLt23Ckswj\u002fAzXGMjTmfP3Cal7msnau\u002f9HFRsBlKwb9ECUbZugLCvwAr7hL1S3G\u002f+BCNkBsYzz+wRWvJu5e+P1D6k5Ldvbw\u002fiACjyfS9yD\u002fwJOA9MKbKP\u002fB1EHRLQ6C\u002fQFKdlkWcuz8wYE4xKYm8PwCg3izlsnG\u002feIW+7\u002fCPwD9QWhWcDNO6P\u002fDhndrqD8E\u002fEBjaWad6o7+AAXxBIujFP0B0AgKBZZM\u002fgP9c+9MmuD8Ack0jdVuwP2DqA9uRF5G\u002f4JCDgPurrT\u002fwYqtjacKxP1DeK\u002fM4NLg\u002fgLQCM1xkuj9A8ZBLyImxP8CEKbdKAJE\u002fANB8pH89mz+AchOP+TSAP9ChMjJdFqK\u002fkGvrD6F6xT9g6KpXDvGzP\u002fBQBOZeG7c\u002f0GCYimZFsz+A2eBnnICavzD9bmvVYbk\u002fwFi843Gslr\u002fgvKBqL7O3P0B7N1rap7E\u002fwJUV2DmWqb\u002fIBMSsszjAP+BKSD+gVbc\u002fwDwM+jDMrL\u002fIQB8CKBLKvyBrlvh2q6o\u002fQMudOcHshr\u002fA+e2xvhGlPw=="},"xaxis":"x4","yaxis":"y4","type":"histogram"},{"marker":{"color":"lightsalmon"},"name":"T-Bills","nbinsx":15,"showlegend":false,"x":{"dtype":"f8","bdata":"oMYarD3xpT9A5MXIezeaP9D6QDw8770\u002fWHRmsUhpwD\u002fQXFsc0y7APwDM3GUy+V8\u002fAPVlurLziL8AFDVeAAScvwC2qBlgxom\u002fYDVPlcaymb8A3RrDGPGdPwCwZa2OCT4\u002fAMx\u002fuq2Xe7+47w5+YNK2v6CZNAQnZ7S\u002fQFbrAFqlmb9A8HLzHDWTv2BSD3Mms5K\u002fcKeL5Bk8w7\u002fQBytxgl+zv2Dm2uxLWpO\u002fYFhp2V2toD\u002fgy+C2Htumv0C3\u002fPS8pqW\u002fgJ+QdfKrgz+AytiCrDWHP4CC0easV5E\u002fAHDn2H+Kiz8AQBAJ4O1svwAqmCB69Gk\u002fAIAsD4TXDj+Af5VTD6uQP4AHVSAQj44\u002fgBPQoiwakT+Ahf5jcBWNP4AKr+1Ec44\u002fAIOsDfUcmj9ATXjM0VqUPwCzZglkpYs\u002fgPoVgFjsiD8ALixQiCp4PwDzdsVtLXI\u002fAPLj7bHXfz8An9hk6i2FPwCvrzIZ93k\u002fwDT1CIJ4j79AF\u002faM+nikvwC3J+ZjBoa\u002fALAxYkp1UT+AsKH97qOLv0AMPa8HR5G\u002fYN4aIBFInb\u002fAPZL5aneEv8DqFuu7Cag\u002f4NRKmYzmsT9A9sPsC3OpP0A2O+ltaa0\u002foC9OCqtXoz\u002fAbTzw+ZWpPwBdGED26o0\u002fwESN62Q6mD+gUabVxk+iP4A+wHL7uY8\u002fAEsAcf6YmD8AiGCkYkF4PwDm34TUo2k\u002fwC36bdbnkD9Ajo3GeyyfP8BUmWSuHJI\u002f4IS64qKboT8gzot2T56gP4C9t\u002fN15ZQ\u002fgBpY5+nhmT+AFc2koXGTPwDkAQqpe32\u002fQG0mM5wTgb9gF6W232aSvwD8a1CG\u002f16\u002fwKTQrtMPlz8AdDXkFGJvPwCznr6Dxoo\u002foHtEZgOimb+AnGVLIVuLv6AEHJ0R95y\u002fYKbAsvydkL8ApOTiCBeNvwBdxMSaiH2\u002fgEuUAq6he7\u002fA35FJJZqRvwBvAcplP4e\u002fALDNtqc9Qz8A4jh2YQ1cvwDO6trTPoS\u002foPuIWb27sL9gRQQXq\u002f2kv0BuNv7nGZM\u002fQMLosIjPlj8AWs\u002fO9WaNPw=="},"xaxis":"x5","yaxis":"y5","type":"histogram"},{"marker":{"color":"lightcoral"},"name":"Real Estate","nbinsx":15,"showlegend":false,"x":{"dtype":"f8","bdata":"wPk6429smz+ALZCzjeSavwAPfAYf7JY\u002fADG04v9Wij8AwsLMjJJhv9AL\u002fdiCP6e\u002fAMQ2Dk0QjD+AwvbVCNuwP8DGWgbp25E\u002fAEmcyjxlZ7\u002fAD50bGA6UP4DOU6UrqIq\u002fACGvwWhbmj+83qSxAVPFvwC+irhBw6q\u002f0M1z9qQatT9YDTA919\u002fBP9A8iFNv3Lc\u002fgBI4Xb\u002ffqT8gXKHIrjq9P8CxvscxjYK\u002fgJFI8BWhlj8AkeOrZSeWvwCAzNyJdT0\u002fYIvTFtiOoj\u002fAsssXIVy7P8C7zsOXMJE\u002fALZw5CeRbr9AdORLF5eUvwDgd144v1y\u002fgM3Ytm8ehr9AqTwe+0+QvwAFUEntB3i\u002fADqx3bnnaD8A1erMgm2EvwDgaIWEGnQ\u002fABZFiDFkZz8A\u002fOL3mU1lv8BKNtFAIZa\u002fgCrAd5bAfL8A1gG6uup2vwAG5qrvvn4\u002fABX89n+omT8ARllEPGiDP4DhAYp9DnG\u002fgLWR8vfiqL8g+55GbqOUvwDgKBbn7Vi\u002fgEbLju4soD+QfhVzPxWzPyAVVLx8fq8\u002fABia9kY3cD+gyT0WtUunv6CDs+mn\u002faG\u002f4OfQ8P8aoL8AJyFxwOmCPwD2YTFvvnw\u002f4FtfKbYdoj9wXpndb4+1P2CMx7kLvqA\u002fgJgYonR5mz8Ayeunec5jv6AW6TtkY7C\u002fULCTPUQPoL+g+wInALuUvwD2jhPjl3e\u002fAEiVmgNsWb8Ar5yG5NB9vwCm68EkyIG\u002fgGAkuAFblz+Ad\u002f2G2laoP4AreZGV56g\u002fYPobAjU\u002frT+gfjMY7NWpP8DrtCfY9rE\u002fgFACRbrvsz+ACmxy4r25PzCAkd2x\u002fLg\u002fwG\u002fsYkQigL\u002fYulAthlG3v\u002fDSV8PY6b6\u002fIGxyLgdjsL9A62IR\u002f1Csv3BvIu63BrG\u002f4D0lOXmgpz8gf8liCz+3P0BrCR06CqM\u002f4Dkjo2Gypj+AyvOcuDSgP2D21ZstjKQ\u002fACtqIQQzmj+AoBXLdgiMP0DQPlbC5LY\u002fYB\u002fkTihKvD+AtxD7L+F+v4C7O09tDJc\u002fgGo9qK1nhT9AxJCMoRyHvw=="},"xaxis":"x6","yaxis":"y6","type":"histogram"},{"marker":{"color":"lightblue"},"name":"Gold","nbinsx":15,"showlegend":false,"x":{"dtype":"f8","bdata":"AE827P\u002f1iT+APROKL7p9v3Bwr8Z9wbE\u002fGBcEIdXGtr9oEFjZXoHWP3DIJGQ\u002f1NA\u002fQDn4XOEP0z\u002fgTVbytGGZv4A73BnZhIu\u002f4LNfF3y6nr+AO0ay2hKfP0AZyAz6RIm\u002fgP9liYoZmL84PIq4YR+3v9h8SdEENbW\u002f4MMEtd9snb9AnrL93wKXvwBSF3xvgmc\u002f\u002fMH55YGlw78oKhWuTMm0vyB1PDkivp2\u002f0LGivWVSsb9AmNNoc4qhPzA1wXgr+6y\u002fwIBAkr9dhr8AoD9kRAZCv4BtOjZ2L4s\u002fAOlRY7ZycL8g33SJBtGevyD8z8aS+52\u002fQPhl\u002fXnLir9ARCK+OGqRv4Cdau8ytIG\u002fgKxz4CGdfb8ARjpJEBiMvwBpaLOxkpS\u002fgEsLTzwdg79AIgzJkb+Sv4AM8hRG+qC\u002fEBUJkTSmob\u002fQM130YfWyPwDPncXg3Ya\u002ffBMbbG41wr8orv5cn6TAP2Tt6SPsFdw\u002f2t2Fewbq4j+4iMl24KfePxhMgMhA\u002ftK\u002fAM\u002fVxonitb8QE2InsR7DP\u002fjjYf4Sb9A\u002fGjkIPir97z\u002fAcCcd5UqYP7B0mbaJZdi\u002fMFYsNn4TvT907DbB7WPJv\u002fDYCQ80ucy\u002fQOOsYxu5lT+o6IkRX5zGPwAPZUR9oMg\u002fjNaK2BYeyL+gMmd1zFCyv1gTaOTsPLa\u002fUKIERifevL84e4qBW3u1v7CI3U5DmcI\u002foNUQ8owoqL8AZ2HvFyiPv8CRL2KYmLO\u002fnBuuVCMWzb8gEsLNDJSYv6CVKDktSJK\u002fwO+qaYLdtb9A9E9d2TqAv4BAGFZX\u002f8w\u002fMAQiZg+gxj+A2Tydg6GLP+i\u002fD9DUw8E\u002fyABjZu3IyT+woO+Aoh7RPyA2gsqbnqU\u002f4NhIr1XOyz9sdxCP237RPzDB9p3ah7Y\u002fIIJbxiXYoz9Wyuc9xlvSvwDPq+7LsHm\u002fKD2ixYZPwL8gqn216j2uP0AOlJB0dbo\u002fQP0MioCInL+gaej6jwPFPyDGF50azcw\u002fgKoS0fvOub8gr7XdgWasv3AVwiX4i7g\u002fyLAi2w2zzD9GiDGh5MXjPw=="},"xaxis":"x7","yaxis":"y7","type":"histogram"}],                        {"annotations":[{"font":{"size":16},"showarrow":false,"text":"Small Caps Real Returns (1928-2025)","x":0.5,"xanchor":"center","xref":"paper","y":1.0,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"S&P Real Returns (1928-2025)","x":0.5,"xanchor":"center","xref":"paper","y":0.85,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"T-Notes Real Returns (1928-2025)","x":0.5,"xanchor":"center","xref":"paper","y":0.7,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Baa Corps Real Returns (1928-2025)","x":0.5,"xanchor":"center","xref":"paper","y":0.55,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"T-Bills Real Returns (1928-2025)","x":0.5,"xanchor":"center","xref":"paper","y":0.39999999999999997,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Real Estate Real Returns (1928-2025)","x":0.5,"xanchor":"center","xref":"paper","y":0.25,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Gold Real Returns (1928-2025)","x":0.5,"xanchor":"center","xref":"paper","y":0.09999999999999999,"yanchor":"bottom","yref":"paper"},{"bgcolor":"rgba(255, 255, 255, 0.8)","bordercolor":"gray","borderpad":4,"borderwidth":1,"font":{"size":10},"showarrow":false,"text":"Mean: 14.38%\u003cbr\u003eStd Dev: 37.29%","x":0.95,"xanchor":"right","xref":"x","y":0.95,"yanchor":"top","yref":"y"},{"bgcolor":"rgba(255, 255, 255, 0.8)","bordercolor":"gray","borderpad":4,"borderwidth":1,"font":{"size":10},"showarrow":false,"text":"Mean: 8.61%\u003cbr\u003eStd Dev: 19.30%","x":0.95,"xanchor":"right","xref":"x2","y":0.95,"yanchor":"top","yref":"y2"},{"bgcolor":"rgba(255, 255, 255, 0.8)","bordercolor":"gray","borderpad":4,"borderwidth":1,"font":{"size":10},"showarrow":false,"text":"Mean: 1.83%\u003cbr\u003eStd Dev: 8.86%","x":0.95,"xanchor":"right","xref":"x3","y":0.95,"yanchor":"top","yref":"y3"},{"bgcolor":"rgba(255, 255, 255, 0.8)","bordercolor":"gray","borderpad":4,"borderwidth":1,"font":{"size":10},"showarrow":false,"text":"Mean: 3.86%\u003cbr\u003eStd Dev: 8.80%","x":0.95,"xanchor":"right","xref":"x4","y":0.95,"yanchor":"top","yref":"y4"},{"bgcolor":"rgba(255, 255, 255, 0.8)","bordercolor":"gray","borderpad":4,"borderwidth":1,"font":{"size":10},"showarrow":false,"text":"Mean: 0.40%\u003cbr\u003eStd Dev: 3.82%","x":0.95,"xanchor":"right","xref":"x5","y":0.95,"yanchor":"top","yref":"y5"},{"bgcolor":"rgba(255, 255, 255, 0.8)","bordercolor":"gray","borderpad":4,"borderwidth":1,"font":{"size":10},"showarrow":false,"text":"Mean: 1.25%\u003cbr\u003eStd Dev: 4.97%","x":0.95,"xanchor":"right","xref":"x6","y":0.95,"yanchor":"top","yref":"y6"},{"bgcolor":"rgba(255, 255, 255, 0.8)","bordercolor":"gray","borderpad":4,"borderwidth":1,"font":{"size":10},"showarrow":false,"text":"Mean: 4.07%\u003cbr\u003eStd Dev: 19.43%","x":0.95,"xanchor":"right","xref":"x7","y":0.95,"yanchor":"top","yref":"y7"}],"height":2100,"showlegend":false,"template":{"data":{"barpolar":[{"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"type":"carpet"}],"choropleth":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"choropleth"}],"contourcarpet":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"contourcarpet"}],"contour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"contour"}],"heatmap":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"heatmap"}],"histogram2dcontour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2dcontour"}],"histogram2d":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2d"}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"mesh3d":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"mesh3d"}],"parcoords":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"parcoords"}],"pie":[{"automargin":true,"type":"pie"}],"scatter3d":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatter3d"}],"scattercarpet":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattercarpet"}],"scattergeo":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergeo"}],"scattergl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergl"}],"scattermapbox":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermapbox"}],"scattermap":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermap"}],"scatterpolargl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolargl"}],"scatterpolar":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolar"}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"scatterternary":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterternary"}],"surface":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"surface"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}]},"layout":{"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"autotypenumbers":"strict","coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]],"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]},"colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"geo":{"bgcolor":"white","lakecolor":"white","landcolor":"#E5ECF6","showlakes":true,"showland":true,"subunitcolor":"white"},"hoverlabel":{"align":"left"},"hovermode":"closest","mapbox":{"style":"light"},"paper_bgcolor":"white","plot_bgcolor":"#E5ECF6","polar":{"angularaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"bgcolor":"#E5ECF6","radialaxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"scene":{"xaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","gridwidth":2,"linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white"},"yaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","gridwidth":2,"linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white"},"zaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","gridwidth":2,"linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white"}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"ternary":{"aaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"baxis":{"gridcolor":"white","linecolor":"white","ticks":""},"bgcolor":"#E5ECF6","caxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"title":{"x":0.05},"xaxis":{"automargin":true,"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","zerolinewidth":2},"yaxis":{"automargin":true,"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","zerolinewidth":2}}},"title":{"text":"Real Returns Distribution by Asset (1928-2025)","x":0.5},"xaxis":{"anchor":"y","domain":[0.0,1.0],"range":[-0.5,1.5],"tickformat":".0%","title":{"text":"Annual Return"}},"yaxis":{"anchor":"x","domain":[0.9,1.0],"title":{"text":"Frequency"}},"xaxis2":{"anchor":"y2","domain":[0.0,1.0],"range":[-0.5,1.5],"tickformat":".0%","title":{"text":"Annual Return"}},"yaxis2":{"anchor":"x2","domain":[0.75,0.85],"title":{"text":"Frequency"}},"xaxis3":{"anchor":"y3","domain":[0.0,1.0],"range":[-0.5,1.5],"tickformat":".0%","title":{"text":"Annual Return"}},"yaxis3":{"anchor":"x3","domain":[0.6,0.7],"title":{"text":"Frequency"}},"xaxis4":{"anchor":"y4","domain":[0.0,1.0],"range":[-0.5,1.5],"tickformat":".0%","title":{"text":"Annual Return"}},"yaxis4":{"anchor":"x4","domain":[0.45,0.55],"title":{"text":"Frequency"}},"xaxis5":{"anchor":"y5","domain":[0.0,1.0],"range":[-0.5,1.5],"tickformat":".0%","title":{"text":"Annual Return"}},"yaxis5":{"anchor":"x5","domain":[0.3,0.39999999999999997],"title":{"text":"Frequency"}},"xaxis6":{"anchor":"y6","domain":[0.0,1.0],"range":[-0.5,1.5],"tickformat":".0%","title":{"text":"Annual Return"}},"yaxis6":{"anchor":"x6","domain":[0.15,0.25],"title":{"text":"Frequency"}},"xaxis7":{"anchor":"y7","domain":[0.0,1.0],"range":[-0.5,1.5],"tickformat":".0%","title":{"text":"Annual Return"}},"yaxis7":{"anchor":"x7","domain":[0.0,0.09999999999999999],"title":{"text":"Frequency"}}},                        {"responsive": true}                    )                };            </script>        </div>

<p>We can see that assets with high volatility tend to have higher mean returns:</p>

<table>
  <thead>
    <tr>
      <th> </th>
      <th>Mean Return</th>
      <th>Geometric</th>
      <th>STD</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>GDP</td>
      <td>0.033020</td>
      <td>0.031945</td>
      <td>0.047254</td>
    </tr>
    <tr>
      <td>CPI</td>
      <td>0.031108</td>
      <td>0.030374</td>
      <td>0.039154</td>
    </tr>
    <tr>
      <td>S&amp;P</td>
      <td>0.085485</td>
      <td>0.067000</td>
      <td>0.193954</td>
    </tr>
    <tr>
      <td>Small Caps</td>
      <td>0.141127</td>
      <td>0.084081</td>
      <td>0.372102</td>
    </tr>
    <tr>
      <td>T-Bills</td>
      <td>0.003392</td>
      <td>0.002675</td>
      <td>0.038017</td>
    </tr>
    <tr>
      <td>T-Notes</td>
      <td>0.018030</td>
      <td>0.014209</td>
      <td>0.088987</td>
    </tr>
    <tr>
      <td>Baa Corps</td>
      <td>0.038531</td>
      <td>0.034818</td>
      <td>0.088440</td>
    </tr>
    <tr>
      <td>Real Estate</td>
      <td>0.012791</td>
      <td>0.011557</td>
      <td>0.049934</td>
    </tr>
    <tr>
      <td>Gold</td>
      <td>0.034768</td>
      <td>0.020178</td>
      <td>0.186131</td>
    </tr>
  </tbody>
</table>

<div>                        <script type="text/javascript">window.PlotlyConfig = {MathJaxConfig: 'local'};</script>
        <script charset="utf-8" src="https://cdn.plot.ly/plotly-3.2.0.min.js" integrity="sha256-iZ2u/oU2wf/vDbl/ChcX93WgbBRSBvUO6N413hDz7xM=" crossorigin="anonymous"></script>                <div id="f9b23972-5e6d-4c23-9a96-6109febeadcb" class="plotly-graph-div" style="height:600px; width:700px;"></div>            <script type="text/javascript">                window.PLOTLYENV=window.PLOTLYENV || {};                                if (document.getElementById("f9b23972-5e6d-4c23-9a96-6109febeadcb")) {                    Plotly.newPlot(                        "f9b23972-5e6d-4c23-9a96-6109febeadcb",                        [{"colorbar":{"title":{"text":"Correlation"}},"colorscale":[[0.0,"rgb(5,48,97)"],[0.1,"rgb(33,102,172)"],[0.2,"rgb(67,147,195)"],[0.3,"rgb(146,197,222)"],[0.4,"rgb(209,229,240)"],[0.5,"rgb(247,247,247)"],[0.6,"rgb(253,219,199)"],[0.7,"rgb(244,165,130)"],[0.8,"rgb(214,96,77)"],[0.9,"rgb(178,24,43)"],[1.0,"rgb(103,0,31)"]],"text":{"dtype":"f8","bdata":"AAAAAAAA8D+syA5c5P7MPwLLBHUrJ7E\u002fOHSXdftUwT8snigziTHVv7W2hBNVEMm\u002fqJrDOAI1wL\u002fxwCoGyLKxv1IFgwME0Ly\u002frMgOXOT+zD8AAAAAAADwP1AV0yF6Usa\u002fmQ0cyRnVu787hDZIap\u002fmv1\u002fn1N2TiuC\u002fMZGAhnAv4b8uFEqweWO6vzZ9L6jSHLM\u002fAssEdSsnsT9QFdMhelLGvwAAAAAAAPA\u002fbmQos4Iv5z89qSRvL6qxPzgzYeFQSLc\u002f7SoLgqtG2z\u002fCXGQFXxzIP\u002fsT2t98lrG\u002fOHSXdftUwT+ZDRzJGdW7v25kKLOCL+c\u002fAAAAAAAA8D8MEgOkcYmsv33jpVbM9qO\u002f0\u002f6fGiPH1D\u002fIbPQTq4nJP9d3VP7hr4c\u002fLJ4oM4kx1b87hDZIap\u002fmvz2pJG8vqrE\u002fDBIDpHGJrL8AAAAAAADwP8Q4ipT+SuI\u002fmvuLtAl63j90YuFPfCilv0g0y06rsJy\u002ftbaEE1UQyb9f59Tdk4rgvzgzYeFQSLc\u002ffeOlVsz2o7\u002fEOIqU\u002fkriPwAAAAAAAPA\u002fhnMSDAKy5z9XAMYIOdltvzO2PN\u002f6\u002fHO\u002fqJrDOAI1wL8xkYCGcC\u002fhv+0qC4KrRts\u002f0\u002f6fGiPH1D+a+4u0CXreP4ZzEgwCsuc\u002fAAAAAAAA8D\u002fyp0O4v5S0P4rofV\u002ftWqQ\u002f8cAqBsiysb8uFEqweWO6v8JcZAVfHMg\u002fyGz0E6uJyT90YuFPfCilv1cAxgg52W2\u002f8qdDuL+UtD8AAAAAAADwP89NUI1sXrm\u002fUgWDAwTQvL82fS+o0hyzP\u002fsT2t98lrG\u002f13dU\u002fuGvhz9INMtOq7CcvzO2PN\u002f6\u002fHO\u002fiuh9X+1apD\u002fPTVCNbF65vwAAAAAAAPA\u002f","shape":"9, 9"},"textfont":{"size":10},"texttemplate":"%{text:.2f}","x":["GDP","CPI","S&P","Small Caps","T-Bills","T-Notes","Baa Corps","Real Estate","Gold"],"y":["GDP","CPI","S&P","Small Caps","T-Bills","T-Notes","Baa Corps","Real Estate","Gold"],"z":{"dtype":"f8","bdata":"AAAAAAAA8D+syA5c5P7MPwLLBHUrJ7E\u002fOHSXdftUwT8snigziTHVv7W2hBNVEMm\u002fqJrDOAI1wL\u002fxwCoGyLKxv1IFgwME0Ly\u002frMgOXOT+zD8AAAAAAADwP1AV0yF6Usa\u002fmQ0cyRnVu787hDZIap\u002fmv1\u002fn1N2TiuC\u002fMZGAhnAv4b8uFEqweWO6vzZ9L6jSHLM\u002fAssEdSsnsT9QFdMhelLGvwAAAAAAAPA\u002fbmQos4Iv5z89qSRvL6qxPzgzYeFQSLc\u002f7SoLgqtG2z\u002fCXGQFXxzIP\u002fsT2t98lrG\u002fOHSXdftUwT+ZDRzJGdW7v25kKLOCL+c\u002fAAAAAAAA8D8MEgOkcYmsv33jpVbM9qO\u002f0\u002f6fGiPH1D\u002fIbPQTq4nJP9d3VP7hr4c\u002fLJ4oM4kx1b87hDZIap\u002fmvz2pJG8vqrE\u002fDBIDpHGJrL8AAAAAAADwP8Q4ipT+SuI\u002fmvuLtAl63j90YuFPfCilv0g0y06rsJy\u002ftbaEE1UQyb9f59Tdk4rgvzgzYeFQSLc\u002ffeOlVsz2o7\u002fEOIqU\u002fkriPwAAAAAAAPA\u002fhnMSDAKy5z9XAMYIOdltvzO2PN\u002f6\u002fHO\u002fqJrDOAI1wL8xkYCGcC\u002fhv+0qC4KrRts\u002f0\u002f6fGiPH1D+a+4u0CXreP4ZzEgwCsuc\u002fAAAAAAAA8D\u002fyp0O4v5S0P4rofV\u002ftWqQ\u002f8cAqBsiysb8uFEqweWO6v8JcZAVfHMg\u002fyGz0E6uJyT90YuFPfCilv1cAxgg52W2\u002f8qdDuL+UtD8AAAAAAADwP89NUI1sXrm\u002fUgWDAwTQvL82fS+o0hyzP\u002fsT2t98lrG\u002f13dU\u002fuGvhz9INMtOq7CcvzO2PN\u002f6\u002fHO\u002fiuh9X+1apD\u002fPTVCNbF65vwAAAAAAAPA\u002f","shape":"9, 9"},"zmid":0,"type":"heatmap"}],                        {"height":600,"template":{"data":{"barpolar":[{"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"type":"carpet"}],"choropleth":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"choropleth"}],"contourcarpet":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"contourcarpet"}],"contour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"contour"}],"heatmap":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"heatmap"}],"histogram2dcontour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2dcontour"}],"histogram2d":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2d"}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"mesh3d":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"mesh3d"}],"parcoords":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"parcoords"}],"pie":[{"automargin":true,"type":"pie"}],"scatter3d":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatter3d"}],"scattercarpet":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattercarpet"}],"scattergeo":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergeo"}],"scattergl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergl"}],"scattermapbox":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermapbox"}],"scattermap":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermap"}],"scatterpolargl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolargl"}],"scatterpolar":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolar"}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"scatterternary":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterternary"}],"surface":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"surface"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}]},"layout":{"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"autotypenumbers":"strict","coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]],"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]},"colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"geo":{"bgcolor":"white","lakecolor":"white","landcolor":"#E5ECF6","showlakes":true,"showland":true,"subunitcolor":"white"},"hoverlabel":{"align":"left"},"hovermode":"closest","mapbox":{"style":"light"},"paper_bgcolor":"white","plot_bgcolor":"#E5ECF6","polar":{"angularaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"bgcolor":"#E5ECF6","radialaxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"scene":{"xaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","gridwidth":2,"linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white"},"yaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","gridwidth":2,"linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white"},"zaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","gridwidth":2,"linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white"}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"ternary":{"aaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"baxis":{"gridcolor":"white","linecolor":"white","ticks":""},"bgcolor":"#E5ECF6","caxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"title":{"x":0.05},"xaxis":{"automargin":true,"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","zerolinewidth":2},"yaxis":{"automargin":true,"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","zerolinewidth":2}}},"title":{"text":"Correlation Matrix"},"width":700,"xaxis":{"title":{"text":""}},"yaxis":{"title":{"text":""}}},                        {"responsive": true}                    )                };            </script>        </div>

<p>The more risky an asset is, the higher the return investors demand to hold it. (Gold is an outlier; its lack of correlation with the other assets, and reputation for holding its real value over the long run in spite of inflation make people hold it, in spite of high volatility.)</p>

<p>More to the point, investors really care about <em>nondiversifiable risk</em>. Truly random, idiosyncratic volatility in a financial instrument is not a big deal if you can buy 20 securities with that type of risk which cancel each other out.</p>

<p>Why are some assets more volatile than others? Fixed income assets have a fixed payout, but longer duration can make them more sensitive to variations in interest rates. Some companies have higher variability in earnings, or may have no earnings and be a crapshoot, like a speculative drug or tech company. The earnings are farther in the future and duration comes into play. Also, if a company has a lot of debt and fixed expenses, i.e. high financial and operating leverage, then a swing in expectations about business conditions might impact future earnings and the stock price a lot more than an unlevered stock with very consistent earnings.</p>

<h2 id="2-issues-with-volatility">2. Issues with volatility</h2>

<p>A model of log normal distributions is not totally realistic in practice:</p>

<ul>
  <li>
    <p>As seen above, we have <em>asymmetric fat tails</em> (the <a href="https://en.wikipedia.org/wiki/Volatility_smile">volatility smile</a>). Why? Extreme events happen more frequently than predicted by normal distributions. Extreme negative events happen more frequently than equally extreme positive events. We have meltdowns but not meltups. We have seen nuclear power plants melt down into a pile of rubble and melted fuel. We have never seen a pile of rubble melt up into a working nuclear power plant. Entropy says you can demolish a building almost instantaneously with well-placed explosives, but you can’t construct a building the same way, however well you place the explosives.</p>
  </li>
  <li>
    <p>We have <em>serial correlation</em>. Markets can trend. Information can take time to be fully understood and reflected in stock prices. A decision a board or investment committee makes one day might result in many changes to companies or portfolios over long periods. Investor psychology is durably impacted by the recent past. Investors can also overreact and mean-revert. A high Shiller PE is associated with lower future returns. And people have loss aversion and a healthy fear of entropy and not being able to buy a GI Joe with a Kung Fu grip, and suffer from herding and crowd psychology. They will rush to sell when it’s down 40% and then rush to buy when it’s up 40%. Trending and mean-reversion can coexist at different time scales and for different types of perturbations.</p>
  </li>
  <li>
    <p>We do not have <em>covariance stationarity</em>. The S&amp;P today, with &gt;40% in Big Tech, has different risk/return characteristics compared to say 1980 energy-heavy stocks or 1960 manufacturing stocks. We have regime changes based on changes in economic and market structures like the gold standard, international trade, monetary and fiscal policy regimes. Observed volatility measures what Mr. Market thinks at a given time. Mr. Market evolves over time and what Mr. Market thinks today might not be an accurate reflection of the future. Past performance does not predict future results.</p>
  </li>
  <li>
    <p><em>Nonlinearity</em>. Companies have complex dynamics that are not fully described by linear relationships over longer time periods and larger changes in the environment. Consider two identical companies, like gold mines, whose earnings depend on the price of gold and the cost of mining it. Suppose one decides to lever up and distribute cash. If the gold price goes down a lot, the unlevered company may no longer be profitable but it still owns the gold mine and the possibility of being profitable in the future. The second, levered company is bankrupt. The debtholders take over the mine to recover the debt, and the stock is worthless. On the other hand, if the stock goes up a lot, the second company organically delevers and the economics become similar to the first company. There is positive convexity, investors keep the upside and bondholders get a lot of downside in exchange for interest payments. At a high price the stocks may have a beta of 1 and a high correlation. At lower prices the levered one has a higher beta. Correlation is a first-order measure of how things move together, it doesn’t accurately reflect higher-order derivatives and the dynamics of large price moves.</p>
  </li>
  <li>
    <p>Investors may have <em>complex distributional preferences</em> that aren’t well described by volatility. For instance, they might care mostly about downside volatility in an asymmetric loss averse psychological model, maybe like <a href="https://thedecisionlab.com/reference-guide/economics/prospect-theory">Kahneman-Tversky prospect theory</a>. Humans can be weird and boundedly rational. But weird utility functions make the math intractable, and lead to path dependencies and time inconsistencies. It’s hard to reason about unreasonable things.<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup></p>
  </li>
</ul>

<p>Humans don’t have a linear utility relationship with volatility. Markets don’t exhibit log normal behavior in realized returns. As Einstein said, if you want to describe reality correctly, you must leave elegance to the tailor. Some degree of mathematical perversity is a feature of real human beings and real financial markets.</p>

<p>Nevertheless, it is useful to start from tractable assumptions and simple models we can reason about, and see what they tell us. Even if they are imperfect in practice, they teach us useful ways to think. And from there maybe we can relax assumptions and build more realistic models.</p>

<p>Keeping these imperfections in mind, let’s proceed, with an awareness of monsters lurking below the surface.</p>

<h2 id="3-visualizing-volatility-math-with-triangles">3. Visualizing volatility math with triangles</h2>

<p>The relationship between the volatility of <em>individual stocks</em> and the volatility of a <em>portfolio of stocks</em> can be expressed using the <em>volatilities</em> and <em>correlation</em> of returns, and visualized with <em>vector addition</em>.</p>

<style>
  * {
    box-sizing: border-box;
  }

  body {
    line-height: 1.6;
    color: #333;
    background: #f8f9fa;
    margin: 0;
    padding: 20px;
  }

  .container {
    max-width: 900px;
    margin: 0 auto;
    background: white;
    padding: 40px;
    border-radius: 12px;
    box-shadow: 0 2px 20px rgba(0, 0, 0, 0.08);
  }

  h1 {
    color: #1a1a1a;
    margin-top: 0;
    margin-bottom: 10px;
    font-size: 32px;
    font-weight: 700;
  }

  .subtitle {
    color: #666;
    font-size: 16px;
    margin-bottom: 30px;
    line-height: 1.5;
  }

  .explanation {
    background: #f0f7ff;
    border-left: 4px solid #667eea;
    padding: 15px 20px;
    margin-bottom: 30px;
    border-radius: 4px;
  }

  .explanation p {
    margin: 0;
    color: #555;
    font-size: 14px;
  }

  .legend {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
    gap: 15px;
    margin-bottom: 30px;
    padding: 20px;
    background: #f8f9fa;
    border-radius: 8px;
  }

  .legend-item {
    display: flex;
    align-items: center;
    gap: 10px;
  }

  .legend-color {
    width: 30px;
    height: 3px;
    border-radius: 2px;
  }

  .legend-text {
    font-size: 14px;
    color: #555;
  }

  .style>
  .slider-container {
    margin-bottom: 30px;
  }

  .slider-label {
    display: block;
    margin-bottom: 15px;
    color: #666;
    font-size: 14px;
    font-weight: 500;
    letter-spacing: 1px;
  }

  input[type="range"] {
    width: 100%;
    height: 8px;
    border-radius: 5px;
    background: linear-gradient(to right, #667eea 0%, #764ba2 100%);
    outline: none;
    -webkit-appearance: none;
  }

  input[type="range"]::-webkit-slider-thumb {
    -webkit-appearance: none;
    appearance: none;
    width: 24px;
    height: 24px;
    border-radius: 50%;
    background: white;
    cursor: pointer;
    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
    border: 3px solid #667eea;
    transition: all 0.2s ease;
  }

  input[type="range"]::-webkit-slider-thumb:hover {
    transform: scale(1.2);
    box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);
  }

  input[type="range"]::-moz-range-thumb {
    width: 24px;
    height: 24px;
    border-radius: 50%;
    background: white;
    cursor: pointer;
    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
    border: 3px solid #667eea;
    transition: all 0.2s ease;
  }

  input[type="range"]::-moz-range-thumb:hover {
    transform: scale(1.2);
    box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);
  }

  .value-display {
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    border-radius: 12px;
    padding: 20px;
    text-align: center;
    box-shadow: 0 4px 15px rgba(102, 126, 234, 0.3);
    margin-bottom: 30px;
  }

  .value-label {
    color: white;
    font-size: 12px;
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: 1px;
    margin-bottom: 8px;
    opacity: 0.9;
  }

  .value-number {
    color: white;
    font-size: 20px;
    font-weight: 700;
    margin-bottom: 5px;
  }

  .value-angle {
    color: white;
    font-size: 14px;
    opacity: 0.9;
  }

  .range-indicators {
    display: flex;
    justify-content: space-between;
    margin-top: 8px;
    padding: 0 5px;
  }

  .range-indicator {
    color: #999;
    font-size: 12px;
    font-weight: 500;
  }

  .canvas-container {
    background: #f8f9fa;
    border-radius: 15px;
    padding: 40px 30px;
    margin-bottom: 20px;
    display: flex;
    justify-content: center;
    align-items: center;
    position: relative;
    min-height: 500px;
  }

  canvas {
    background: white;
    border-radius: 10px;
    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
    position: absolute;
  }

  #arrowSvg {
    position: absolute;
    pointer-events: none;
  }

  .fixed-label {
    font-size: 16px;
    font-weight: bold;
    text-align: center;
    pointer-events: none;
  }

  #fixedLabel1 {
    color: #667eea;
    line-height: 1.2;
  }

  #fixedLabel1 .value {
    font-size: 12px;
    margin-top: 2px;
  }

  #fixedLabel2 {
    color: #ff6b6b;
    line-height: 1.2;
  }

  #fixedLabel2 .value {
    font-size: 12px;
    margin-top: 2px;
  }

  #fixedLabel3 {
    color: #764ba2;
    line-height: 1.2;
  }

  #fixedLabel3 .value {
    font-size: 12px;
    margin-top: 2px;
  }

  #fixedLabel4 {
    color: #10b981;
    line-height: 1.2;
  }

  #fixedLabel4 .value {
    font-size: 12px;
    margin-top: 2px;
  }

  .arrow-line {
    stroke: #666;
    stroke-width: 1;
    fill: none;
  }

  .arrow-marker {
    fill: #666;
  }

  @media (max-width: 768px) {
    .container {
      padding: 20px;
    }

    h1 {
      font-size: 24px;
    }

    .canvas-container {
      padding: 20px 10px;
      min-height: 350px;
    }

    canvas {
      width: 100% !important;
      height: auto !important;
    }
  }

</style>

<div class="container">
  <p class="subtitle">Interactive visualization of portfolio risk using vector addition<br />
  Drag the slider to set the correlation between the 2 assets.</p>

  <div class="slider-container">
    <label class="slider-label" for="valueSlider">Correlation (ρ)</label>
    <input type="range" id="valueSlider" min="-1" max="1" step="0.001" value="0" />
    <div class="range-indicators">
      <span class="range-indicator">-1.000</span>
      <span class="range-indicator">0.000</span>
      <span class="range-indicator">+1.000</span>
    </div>
  </div>

  <div class="canvas-container">
    <canvas id="vectorCanvas" width="400" height="400"></canvas>
    <svg id="arrowSvg" width="400" height="400">
      <defs>
        <marker id="arrowhead" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto">
          <polygon points="0 0, 10 3, 0 6" class="arrow-marker" />
        </marker>
      </defs>

      <!-- Fixed labels below triangle -->
      <foreignObject x="70" y="250" width="60" height="50">
        <div xmlns="http://www.w3.org/1999/xhtml" id="fixedLabel1" class="fixed-label">
          <div>\(w_1 \sigma_1\)</div>
          <div class="value">\(20\%\)</div>
        </div>
      </foreignObject>
      <foreignObject x="160" y="250" width="80" height="80">
        <div xmlns="http://www.w3.org/1999/xhtml" id="fixedLabel2" class="fixed-label">
          <div>\(\theta\)</div>
          <div class="value" id="thetaDegrees"></div>
          <div class="value" id="thetaCosine"></div>
        </div>
      </foreignObject>
      <foreignObject x="270" y="250" width="60" height="50">
        <div xmlns="http://www.w3.org/1999/xhtml" id="fixedLabel3" class="fixed-label">
          <div>\(w_2 \sigma_2\)</div>
          <div class="value">\(15\%\)</div>
        </div>
      </foreignObject>

      <!-- Label above triangle -->
      <foreignObject x="160" y="30" width="80" height="50">
        <div xmlns="http://www.w3.org/1999/xhtml" id="fixedLabel4" class="fixed-label">
          <div>\(\sigma_{12}\)</div>
          <div class="value" id="sigma12Value"></div>
        </div>
      </foreignObject>

      <!-- Arrow lines -->
      <line id="arrow1" class="arrow-line" marker-end="url(#arrowhead)"></line>
      <line id="arrow2" class="arrow-line" marker-end="url(#arrowhead)"></line>
      <line id="arrow3" class="arrow-line" marker-end="url(#arrowhead)"></line>
      <line id="arrow4" class="arrow-line" marker-end="url(#arrowhead)"></line>
    </svg>
  </div>
</div>
<script>
    const slider = document.getElementById("valueSlider");
    const canvas = document.getElementById("vectorCanvas");
    const ctx = canvas.getContext("2d");
    const arrow1 = document.getElementById("arrow1");
    const arrow2 = document.getElementById("arrow2");
    const arrow3 = document.getElementById("arrow3");
    const arrow4 = document.getElementById("arrow4");
    const thetaDegrees = document.getElementById("thetaDegrees");
    const thetaCosine = document.getElementById("thetaCosine");
    const sigma12Value = document.getElementById("sigma12Value");

    // Add ARIA label to slider
    slider.setAttribute("aria-label", "Correlation coefficient slider from -1 to +1");

    // Vector definitions in mathematical coordinates
    const A = { x: 0, y: 0 };
    const B = { x: 0.2, y: 0 };
    const BC_LENGTH = 0.15;

    // Canvas scale and offset
    const SCALE = 800;
    const OFFSET_X = 100;
    const OFFSET_Y = 180;

    // Convert from math coordinates to canvas coordinates
    function toCanvas(x, y) {
    return {
        x: OFFSET_X + x * SCALE,
        y: OFFSET_Y - y * SCALE, // Flip y-axis for canvas
    };
    }

    // Draw an arrow from (x1,y1) to (x2,y2)
    function drawArrow(x1, y1, x2, y2, color, lineWidth = 3) {
    const headLength = 10;
    const angle = Math.atan2(y2 - y1, x2 - x1);

    // Draw line
    ctx.strokeStyle = color;
    ctx.lineWidth = lineWidth;
    ctx.beginPath();
    ctx.moveTo(x1, y1);
    ctx.lineTo(x2, y2);
    ctx.stroke();

    // Draw arrowhead
    ctx.fillStyle = color;
    ctx.beginPath();
    ctx.moveTo(x2, y2);
    ctx.lineTo(
        x2 - headLength * Math.cos(angle - Math.PI / 6),
        y2 - headLength * Math.sin(angle - Math.PI / 6)
    );
    ctx.lineTo(
        x2 - headLength * Math.cos(angle + Math.PI / 6),
        y2 - headLength * Math.sin(angle + Math.PI / 6)
    );
    ctx.closePath();
    ctx.fill();
    }

    function drawVectors() {
    // Clear canvas
    ctx.clearRect(0, 0, canvas.width, canvas.height);

    // Get cosine value from slider
    const cosValue = parseFloat(slider.value);

    // Calculate angle: theta = arccos(cosValue)
    const theta = Math.acos(cosValue);

    // Calculate point C based on angle
    const C = {
        x: B.x + BC_LENGTH * Math.cos(theta),
        y: B.y + BC_LENGTH * Math.sin(theta),
    };

    // Calculate lengths
    const AB_length = Math.sqrt(
        Math.pow(B.x - A.x, 2) + Math.pow(B.y - A.y, 2)
    );
    const BC_length = BC_LENGTH;
    const AC_length = Math.sqrt(
        Math.pow(C.x - A.x, 2) + Math.pow(C.y - A.y, 2)
    );

    // Convert to canvas coordinates
    const canvasA = toCanvas(A.x, A.y);
    const canvasB = toCanvas(B.x, B.y);
    const canvasC = toCanvas(C.x, C.y);

    // Draw vector AB (blue)
    drawArrow(canvasA.x, canvasA.y, canvasB.x, canvasB.y, "#667eea");

    // Draw vector BC (purple)
    drawArrow(canvasB.x, canvasB.y, canvasC.x, canvasC.y, "#764ba2");

    // Draw vector AC (green)
    drawArrow(canvasA.x, canvasA.y, canvasC.x, canvasC.y, "#10b981");

    // Draw arc showing angle from x-axis to BC
    const arcRadius = 40;
    ctx.strokeStyle = "#ff6b6b";
    ctx.lineWidth = 2;
    ctx.beginPath();
    // Arc from 0 (positive x-axis) to theta (BC direction)
    // In canvas, angles are measured clockwise from positive x-axis
    // But y-axis is flipped, so we need to go from -theta to 0
    ctx.arc(canvasB.x, canvasB.y, arcRadius, -theta, 0);
    ctx.stroke();

    // Calculate midpoints for arrows
    const midAB_x = (canvasA.x + canvasB.x) / 2;
    const midAB_y = (canvasA.y + canvasB.y) / 2;
    const midBC_x = (canvasB.x + canvasC.x) / 2;
    const midBC_y = (canvasB.y + canvasC.y) / 2;
    const midAC_x = (canvasA.x + canvasC.x) / 2;
    const midAC_y = (canvasA.y + canvasC.y) / 2;

    // Update arrows from fixed labels to triangle elements
    // Arrow 1: from top center of label "w1σ1" to center of side AB
    arrow1.setAttribute("x1", "100");
    arrow1.setAttribute("y1", "250");
    arrow1.setAttribute("x2", midAB_x);
    arrow1.setAttribute("y2", midAB_y);

    // Arrow 2: from top center of label "θ" to vertex B
    arrow2.setAttribute("x1", "200");
    arrow2.setAttribute("y1", "250");
    arrow2.setAttribute("x2", canvasB.x);
    arrow2.setAttribute("y2", canvasB.y);

    // Arrow 3: from top center of label "w2σ2" to center of side BC
    arrow3.setAttribute("x1", "300");
    arrow3.setAttribute("y1", "250");
    arrow3.setAttribute("x2", midBC_x);
    arrow3.setAttribute("y2", midBC_y);

    // Arrow 4: from bottom center of label "σ12" to center of side AC
    arrow4.setAttribute("x1", "200");
    arrow4.setAttribute("y1", "60");
    arrow4.setAttribute("x2", midAC_x);
    arrow4.setAttribute("y2", midAC_y);

    // Update theta label values
    const thetaDegrees_val = (theta * 180 / Math.PI).toFixed(1);
    const cosThetaValue = Math.cos(theta).toFixed(3);
    thetaDegrees.innerHTML = `\\(${thetaDegrees_val}°\\)`;
    thetaCosine.innerHTML = `\\(\\cos=${cosThetaValue}\\)`;

    // Calculate portfolio volatility: sqrt(0.2^2 + 0.15^2 + 2*0.2*0.15*cos(theta))
    const w1sigma1 = 0.2;
    const w2sigma2 = 0.15;
    const sigma12 = Math.sqrt(
        w1sigma1 * w1sigma1 +
        w2sigma2 * w2sigma2 +
        2 * w1sigma1 * w2sigma2 * Math.cos(theta)
    );
    const sigma12Percent = (sigma12 * 100).toFixed(1);
    sigma12Value.innerHTML = `\\(${sigma12Percent}\\%\\)`;

    // Re-render MathJax for labels
    if (window.MathJax && window.MathJax.typesetPromise) {
        MathJax.typesetPromise([thetaDegrees, thetaCosine, sigma12Value]).catch((err) =>
        console.log("MathJax error:", err)
        );
    }
    }

    function updateDisplay() {
    drawVectors();
    }

    slider.addEventListener("input", () => {
    const value = parseFloat(slider.value);
    slider.setAttribute("aria-valuenow", value.toFixed(3));
    slider.setAttribute("aria-valuetext", `Correlation ${value.toFixed(3)}`);
    updateDisplay();
    });

    // Initialize - wait for MathJax to be ready
    function init() {
    // Set initial ARIA attributes
    slider.setAttribute("aria-valuemin", "-1");
    slider.setAttribute("aria-valuemax", "1");
    slider.setAttribute("aria-valuenow", "0");
    slider.setAttribute("aria-valuetext", "Correlation 0.000");

    updateDisplay();
    }

    // Check if MathJax is ready, otherwise wait for it
    if (window.MathJax && window.MathJax.startup) {
    MathJax.startup.promise.then(init);
    } else {
    // Fallback: just initialize (MathJax will typeset when ready)
    window.addEventListener("load", init);
    }
</script>

<p>Recall that the correlation is the change in expected return of one stock conditioned on the change in expected return of the other, each expressed in units of the number of standard deviations.</p>

<p>Suppose we have 2 stocks with actual returns \(r_1\) and \(r_2\), expected (mean) returns \(\mu_1\) and \(\mu_2\), standard deviations \(\sigma_1\) and \(\sigma_2\) and correlation \(\rho_{12}\). Then:</p>

\[\frac{\hat{r}_2 - \mu_2}{\sigma_2} = \frac{\hat{r}_1-\mu_1}{\sigma_1}  \rho_{12}\]

<p>If the realized return \(r_1\) of stock 1 is 1 SD higher than its expected value \(\mu_1\), then the expected return of stock 2 \(r_2\) is \(\rho_{12}\) SDs higher than its expected value \(\mu_2\).</p>

<table>
  <thead>
    <tr>
      <th>Correlation</th>
      <th>Return of stock \(1\)</th>
      <th>Expected return of stock \(2\), given return of stock \(1\)</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>\(\rho_{12}=1\)</td>
      <td>\(\mu_1 + \sigma_1\)</td>
      <td>\(\mu_2 + \sigma_2\)</td>
    </tr>
    <tr>
      <td>\(\rho_{12}=0.5\)</td>
      <td>\(\mu_1 + \sigma_1\)</td>
      <td>\(\mu_2 + 0.5\sigma_2\)</td>
    </tr>
    <tr>
      <td>\(\rho_{xy}=0\)</td>
      <td>\(\mu_1 + \sigma_1\)</td>
      <td>\(\mu_2\)</td>
    </tr>
    <tr>
      <td>\(\rho_{12}=-1.0\)</td>
      <td>\(\mu_1 + \sigma_1\)</td>
      <td>\(\mu_2 -\sigma_2\)</td>
    </tr>
  </tbody>
</table>

<p>If we have a portfolio of these 2 stocks, the return of the portfolio is the weighted average of the two returns:
\(r_p = w_1r_1 +w_2r_2\)
where \(w_i\) is the weight of stock \(i\) between 0 and 1 and \(r_i\) is the return of stock \(i\).</p>

<p>The volatility of this portfolio is given by</p>

\[\sigma_{p} = \sqrt{(w_1\sigma_1)^2 + (w_2\sigma_2)^2+ 2w_1\sigma_1 w_2\sigma_2\rho_{12}}\]

<p>This is a vector addition. Suppose we have a triangle of 3 vectors \(\vec{a}\), \(\vec{b}\), and \(\vec{c}=\vec{a}+\vec{b}\), and an angle \(\theta\) between \(\vec{a}\) and \(\vec{b}\). Denote the length of the three sides as \(a\), \(b\), \(c\) (properly \(\lVert \vec{a} \rVert ,\lVert \vec{b} \rVert ,\lVert \vec{c} \rVert\)).</p>

<p>Then the length of the 3rd side \(c\) is given by:</p>

\[c = \sqrt{a^2 + b^2+ 2a b\cos \theta }\]

<p>The equation for \(c\) has a form analogous to the equation for \(\sigma_{p}\), with correlation standing in for cosine.</p>

<p>If we define \(a=w_1\sigma_1\), \(b=w_2\sigma_2\), then we can draw a triangle with 2 sides of length \(a\) and \(b\). We set the angle \(\theta\) so \(\cos \theta\) = \(\rho_{12}\). Then the length \(c\) of the third side of the triangle represents the volatility of the portfolio of the 2 stocks.</p>

<p>The rest of this is strictly optional but if you define the portfolio weight vector:</p>

\[\mathbf{w} = \begin{pmatrix} w_1 \\ w_2 \end{pmatrix}\]

<p>and the correlation matrix of these 2 stocks:</p>

\[\mathbf{R} = \begin{pmatrix} 1 &amp; \rho_{12} \\ \rho_{12} &amp; 1 \end{pmatrix}\]

<p>and a diagonal matrix to scale it by the standard deviations:</p>

\[\mathbf{D} = \begin{pmatrix} \sigma_1 &amp; 0 \\ 0 &amp; \sigma_2 \end{pmatrix}\]

<p>then the covariance matrix is</p>

\[\Sigma = \mathbf{D} \mathbf{R} \mathbf{D} =
\begin{pmatrix}
\sigma_1^2 &amp; \rho_{12}\sigma_1\sigma_2 \\
\rho_{12}\sigma_1\sigma_2 &amp; \sigma_2^2
\end{pmatrix}\]

<p>And you can write the formula for the portfolio variance as:</p>

\[\sigma_p^2 = \mathbf{w}^\top \Sigma \mathbf{w}\]

<p>And that formula generalizes to \(n\) assets with an \(n \times n\) covariance matrix \(\Sigma\) and a weight vector of \(n\) asset weights. A useful bit of notation, since large portfolios have a lot of terms.</p>

<p>This formula is an identity. It does not depend on returns being log-normally distributed. However, if returns are log-normally distributed, then so is the portfolio return. A <a href="https://en.wikipedia.org/wiki/68%E2%80%9395%E2%80%9399.7_rule">68–95–99.7 rule</a> will hold. If you have deviations from normality, the formula will still hold, but the <em>interpretation</em> may be very different.</p>

<h2 id="4-visualizing-optimal-portfolios-with-efficient-frontiers">4. Visualizing optimal portfolios with efficient frontiers</h2>

<p>Let’s build an <em>efficient frontier</em> which is a great way to visualize the risk and return of feasible portfolios.</p>

<p>We use data on major asset classes from <a href="https://pages.stern.nyu.edu/~adamodar/New_Home_Page/datafile/histretSP.html">Aswath Damodaran</a>.</p>

<p>Descriptions of the data are in the 1st tab of the <a href="https://www.stern.nyu.edu/~adamodar/pc/datasets/histretSP.xls">histretSP.xls</a> Excel spreadsheet.</p>

<table>
  <tbody>
    <tr>
      <td>Stocks (Large Cap)</td>
      <td>S&amp;P 500</td>
    </tr>
    <tr>
      <td>Stocks (Small Cap)</td>
      <td>Ken French bottom decile</td>
    </tr>
    <tr>
      <td>US T.Bill</td>
      <td>Average 3-month Treasury bill rate</td>
    </tr>
    <tr>
      <td>US T.Bond</td>
      <td>10-year Treasury bond constant maturity return</td>
    </tr>
    <tr>
      <td>Aaa &amp; Baa Corporate Bond</td>
      <td>Moody’s Aaa and Baa returns</td>
    </tr>
    <tr>
      <td>Real Estate</td>
      <td>Case-Shiller Index (residential, price only)</td>
    </tr>
    <tr>
      <td>Gold</td>
      <td>Gold price per oz.</td>
    </tr>
  </tbody>
</table>

<p>We can compute an efficient frontier, showing the best feasible combinations of risk (vol) and return, using the following process:</p>

<ol>
  <li>Estimate the covariance matrix of all the assets.</li>
  <li>Find the maximum return portfolio, which is 100% of the highest mean return asset.</li>
  <li>Find the minimum volatility portfolio via gradient descent (convex optimization).</li>
  <li>Split the space between the max return vol and min vol into e.g. 200 equally spaced points.</li>
  <li>For each vol \(\sigma_i\), find the portfolio weights that maximize the weighted average return, subject to a constraint of at most that vol, \(\sigma_p &lt; \sigma_i\).</li>
  <li>Plot the resulting portfolio returns vs. the portfolio vol.</li>
</ol>

<p>Minimizing volatility (or maximizing return) is a convex optimization problem. ‘Convex’ means the return surface in weight space is like a big hill with a single peak, with no local maxima or saddle points. So if we just always move in the direction that gives better results, we are guaranteed to reach the best solution.</p>

<p>In math terms, we can solve a convex optimization problem by gradient descent. By convention we optimize in the direction of a minimum like the negative of the return. If the 2nd derivatives (Hessian in multiple dimensions) are nonnegative everywhere, then if we keep going downhill, then the first local minimum we find, where any weight change in any direction moves volatility up, is also the global minimum. Also, if you add constraints like “weights must sum to 1”, which form a boundary around the search space, the feasible space defined by constraints must be convex and not some weird shape, where gradient descent could lead you to a corner solution at a binding constraint, even if starting from somewhere else would lead you to a different, better solution.</p>

<p>We can use <code class="language-plaintext highlighter-rouge">cvxpy</code> which is a framework by <a href="https://stanford.edu/~boyd/software.html">Stephen P. Boyd</a> that lets you use various optimization problem solvers.</p>

<p>We get this efficient frontier, the blue line, which shows the maximum mean return you can get for any portfolio risk budget.</p>

<div>                        <script type="text/javascript">window.PlotlyConfig = {MathJaxConfig: 'local'};</script>
        <script charset="utf-8" src="https://cdn.plot.ly/plotly-3.2.0.min.js" integrity="sha256-iZ2u/oU2wf/vDbl/ChcX93WgbBRSBvUO6N413hDz7xM=" crossorigin="anonymous"></script>                <div id="b07b2702-c74a-49f1-9a8b-5ff9e7e12332" class="plotly-graph-div" style="height:450px; width:800px;"></div>            <script type="text/javascript">                window.PLOTLYENV=window.PLOTLYENV || {};                                if (document.getElementById("b07b2702-c74a-49f1-9a8b-5ff9e7e12332")) {                    Plotly.newPlot(                        "b07b2702-c74a-49f1-9a8b-5ff9e7e12332",                        [{"line":{"color":"#636EFA","width":2},"mode":"lines","name":"Efficient frontier (from model)","x":{"dtype":"f8","bdata":"xB0tp2KMnT9D8W57mFGfP4YQmylni6A\u002fU\u002fkQEAJuoT\u002ficSD5nFCiP3Du4eM3M6M\u002f+9Siy9IVpD96y\u002f60bfikP\u002fJFVJ8I26U\u002fC9Y+iKO9pj\u002fLYvNwPqCnP6rvaFrZgqg\u002fc6KjRHRlqT\u002fI51ktD0iqP3D9dhaqKqs\u002f9Jrn\u002f0QNrD\u002fYvd7o3++sP3N0VdF60q0\u002fKj3BuhW1rj85f4+lsJevP69bJ8clPbA\u002fjDkWO3OusD\u002fpgx+wwB+xP5aU8yQOkbE\u002ffzXCmVsCsj8wXXoOqXOyP7TJ8YL25LI\u002ftbO+90NWsz\u002fOj55skcezP0UsMOHeOLQ\u002fLHWVVSyqtD9OF\u002fjJeRu1P4cPIz\u002fHjLU\u002fM1LdsxT+tT\u002fv+4UoYm+2P8DkMp2v4LY\u002fhwHcEf1Rtz+pb1yGSsO3PwEAgvqXNLg\u002fcNxBb+WluD9iVBPkMhe5PzB3KlmAiLk\u002fscfTzc35uT8f641CG2u6P9AhhrZo3Lo\u002fYqLjK7ZNuz\u002fpeHWgA7+7P47iKBVRMLw\u002fHNHKiZ6hvD8Xy4b+6xK9P\u002fOfJHM5hL0\u002f7f7Y54b1vT9by5hc1Ga+P3UjRdEh2L4\u002fEqTxRW9Jvz\u002fft526vLq\u002fP9O1pBcFFsA\u002f5YD60atOwD+LWlCMUofAPyNLpkb5v8A\u002flUb8AKD4wD\u002fTLFK7RjHBP73xp3XtacE\u002fj439L5SiwT+9D1PqOtvBPxFMqKThE8I\u002fDlH9XohMwj8bF1IZL4XCPzNEptPVvcI\u002f2X74jXz2wj83ZkdIIy\u002fDPxY9pQLKZ8M\u002fsNVFvHCgwz\u002feyx12F9nDP64Nfi++EcQ\u002fgIzn6WRKxD9tG5KkC4PEP9DWpmCyu8Q\u002fr1ntGln0xD81JFjV\u002fyzFP9ehlo+mZcU\u002f1w\u002fHSU2exT+vtEwE9NbFP98Nf76aD8Y\u002fMUYGeUFIxj9+jUMz6IDGPy3KlO2OucY\u002fNW7zpzXyxj9MTdxh3CrHP5IDTxuDY8c\u002fWvaK1imcxz+DoQ6R0NTHP3giYUt3Dcg\u002fUiylBR5GyD+REsi\u002fxH7IP4ZF3Hlrt8g\u002fj4qqMxLwyD96gUzvuCjJP69\u002fo6lfYck\u002fII4DZAaayT9\u002fRVAerdLJP\u002fyKiNhTC8o\u002fCAHRkvpDyj8IMXpLoXzKP3AeAAdItco\u002fegwWwu7tyj+zXch7lSbLP5KIhzY8X8s\u002fXDVn8OKXyz8G01iridDLP+g7oWUwCcw\u002fBuqtH9dBzD8WygfafXrMP+gWwJQks8w\u002fvzJjTsvrzD8tpM0IciTNP2MVy8MYXc0\u002foXQefr+VzT+nm3A4Zs7NP166+fEMB84\u002fw41brLM\u002fzj\u002flGp5mWnjOPxsWyyEBsc4\u002f\u002fiAV3Kfpzj+\u002f20+WTiLPPxALX1D1Ws8\u002fM1KQCpyTzz8FdczEQszPP1z\u002fiL90AtA\u002fpLWtHMge0D8wztJ5GzvQP6rk99ZuV9A\u002fspYdNMJz0D+zF0WRFZDQP1V6ZO5orNA\u002f1i78S7zI0D9U0SGpD+XQP1dASQZjAdE\u002fuSiTY7Yd0T9LsbnACTrRP8vC2h1dVtE\u002fVK8Be7By0T8Ei+zXA4\u002fRP4Gq7TRXq9E\u002fVNVxkqrH0T\u002f0LvTu\u002fePRP5QCMkxRANI\u002fIdStqaQc0j9A8tgG+DjSP2EbQWRLVdI\u002fEiuRwZ5x0j\u002fV6dod8o3SP8I0uHtFqtI\u002fZOGa2JjG0j+VMEk27OLSP7KrVJM\u002f\u002f9I\u002fBW5Z8JIb0z92dHNN5jfTP\u002fZqCqo5VNM\u002f4M5bB41w0z8HzqRk4IzTP+KnDcIzqdM\u002fCiGMH4fF0z\u002fGCsN82uHTP2KD89kt\u002ftM\u002fKiEdN4Ea1D9gA0aU1DbUP7r9cvEnU9Q\u002fqEybTntv1D+NQcmrzovUP4aWxQgiqNQ\u002f9qv6ZXXE1D+rsdPCyODUP9MGlB8c\u002fdQ\u002f84eafG8Z1T8WIrjawjXVPzpL3jcWUtU\u002fRj4JlWlu1T+0B+TxvIrVPw4DTE8Qp9U\u002fiCmQrGPD1T\u002fMMsYJt9\u002fVP03E9mYK\u002fNU\u002f0tv\u002fwl0Y1j9jNU8gsTTWP5ggeX0EUdY\u002fuuN42ldt1j+XsMk4q4nWPxAE8JX+pdY\u002fpT0Q81HC1j8C4SNQpd7WP3h1JK34+tY\u002f7n4SCkwX1z\u002foqtVnnzPXP03m6sTyT9c\u002fHh0YIkZs1z9d9j9+mYjXP0S9mdvspNc\u002fd3ibOUDB1z\u002f0BqaWk93XPw=="},"y":{"dtype":"f8","bdata":"T\u002f0toEo3gT8UccdHdPSKPxaZpYzUpo8\u002fRixUZmW9kT9WEoNUx22TPyCuSFgl+pQ\u002fXqNvtadtlj8FQceL6c6XP3dTHOkuIpk\u002fuq8ELmVqmj+DvvQqpqmbP65E7JeB4Zw\u002fmVU\u002f2SgTnj+IvRmhij+fPxA3V4GyM6A\u002fx+1d6qjFoD9G26el51WhP\u002fJAIRaj5KE\u002fL0Hn4MZxoj84PM1Fj\u002fuiPxqRukERgqM\u002f3rHrOcIFpD8RYl\u002fOAIekP8yBpmAaBqU\u002fEs8BF0+DpT+oND231P6lP419OMbYeKY\u002fXK5xK4Lxpj9tbIpa8minP1f6E1xG36c\u002fJgoWfZdUqD9a4+v3+8ioPyEQ92aHPKk\u002f0RjLJUuvqT\u002f0ZcqrViGqP3BjIM23kqo\u002fL0KE8XoDqz\u002fIyLlDq3OrP5oN4N1S46s\u002fGpb25XpSrD8KCtCrK8GsPy0hFcJsL60\u002f\u002fqi\u002fE0WdrT\u002fpJN\u002f4ugquPxJFJj\u002fUd64\u002fs9\u002fwZwDkrj8eICZcBE6vP3q6p\u002fgKtq8\u002fbSpf0yIOsD83F+t2b0CwP3bCrdb9cbA\u002fDBbADN6isD9SOYA+HtOwP80t8uvKArE\u002f4p\u002f2L+8xsT+JdpfzlGCxP\u002fVE8RjFjrE\u002fMFidnoe8sT8VgUe94+mxP1QejwDgFrI\u002fQWMUXIJDsj\u002fSw2I90G+yP51ARZvOm7I\u002fjlr0AoLHsj+Ck3mj7vKyP\u002fEXj1cYHrM\u002fOOo9rgJJsz9Im2TysHOzPxj4UjEmnrM\u002fhquaQGXIsz\u002fCETrDcPKzP8ZFey5LHLQ\u002fc4KAy\u002fZFtD+APrfBdW+0P6K62hDKmLQ\u002fUx56nPXBtD9W\u002fCwn+uq0P0C1m1vZE7U\u002f8KZSxJQ8tT8aCY3cLWW1P46PegamjbU\u002ftjjXkP61tT82SMO5ON61PxrrQqpVBrY\u002fberEf1Yutj9xreJEPFa2P24Ua\u002fkHfrY\u002fjUz+jrqltj+04wDqVM22P0Cqe+TX9LY\u002fhd6XbEMctz94usiQb0O3P276R7NJarc\u002fYl62+dWQtz808og6GLe3PzInAgcU3bc\u002fFh5Rr8wCuD8kw6NORSi4PwTW6sCATbg\u002fIl+Ku4FyuD+aOejESpe4P6qAYzveu7g\u002feNTcWD7guD+M\u002fRIybQS5P\u002f9Y58ZsKLk\u002frohA7D5MuT\u002fHVapg5W+5P+RZ7dJhk7k\u002f0l6YzLW2uT+xHdPQ4tm5P47u40Dq\u002fLk\u002fZhrhc80fuj8ic9GujUK6P57PLSYsZbo\u002fMsDe+amHuj\u002fXO9dGCKq6P6elBhdIzLo\u002fPVjfYWruuj\u002fwYLwbcBC7P7jI6ydaMrs\u002fo3vJaSlUuz94HwGw3nW7P9xLE8d6l7s\u002fgjEbav64uz8Dae5Uatq7P5EbIzi\u002f+7s\u002fKdFEvv0cvD9nrBKKJj68PyZb+Dc6X7w\u002fi7wnXjmAvD9aoPqMJKG8P2pLP0\u002f8wbw\u002fBGJ\u002fKsHivD\u002ffFUGfcwO9P\u002fZL+igUJL0\u002fKlH4QaNEvT+rnqlXIWW9P7479NqOhb0\u002fMKMiOOylvT8OSSzUOca9Pw4iaxN45r0\u002ffmAfVqcGvj+6Ksj3xya+P\u002folilPaRr4\u002fUmonwt5mvj+bu\u002fqQ1Ya+P7K2yhe\u002fpr4\u002fetHBopvGvj\u002fexw18a+a+Pw7DT+8uBr8\u002fAw9OQ+Ylvz9SwntlkEW\u002fPzhv+hgeZb8\u002fjNF1q4uEvz+Wil4U2qO\u002fP9jQsjAKw78\u002fvlQc4Bzivz+FEaJ6iQDAP9nw8Jv2D8A\u002fLcq2N1YfwD\u002flRpKpqC7AP0ZIhEvuPcA\u002fMvWmcydNwD+w0CJ0VFzAPyPwZJ11a8A\u002fvXtUPIt6wD+DMyOblYnAP6cSUQGVmMA\u002fOme1s4mnwD9aCOb0c7bAP8fsewRUxcA\u002fAmKyISrUwD8kI\u002fWG9uLAP5QTq2658cA\u002fVxmlEXMAwT9Kz32nIw\u002fBP\u002faOtWDLHcE\u002f6yGxcWoswT9vKowKATvBP4wgjl2PScE\u002ffK+clhVYwT+OkZnik2bBPw7e4WwKdcE\u002fRLY4XXmDwT\u002fLjwvh4JHBPwNBFx1BoME\u002fR\u002fWnN5quwT\u002fho8VY7LzBPzig2J83y8E\u002fI0koMnzZwT\u002fG3b8xuufBPyWktb\u002fx9cE\u002fVBVH\u002fCIEwj+Pe3AJThLCP7FSZQFzIMI\u002fyAfYA5Iuwj\u002fKtUosqzzCP1h3qZm+SsI\u002fkz0AZsxYwj+oTeCq1GbCPw=="},"type":"scatter"},{"line":{"color":"#EF553B","width":2},"mode":"lines","name":"Efficient frontier (from history)","x":{"dtype":"f8","bdata":"xB0tp2KMnT9D8W57mFGfP4cQmylni6A\u002fU\u002fkQEAJuoT\u002ficSD5nFCiP3Du4eM3M6M\u002f+9Siy9IVpD97y\u002f60bfikP\u002fNFVJ8I26U\u002fCtY+iKO9pj\u002fLYvNwPqCnP6rvaFrZgqg\u002fc6KjRHRlqT\u002fI51ktD0iqP3D9dhaqKqs\u002f9Jrn\u002f0QNrD\u002fYvd7o3++sP3F0VdF60q0\u002fKT3BuhW1rj85f4+lsJevP69bJ8clPbA\u002fjDkWO3OusD\u002fpgx+wwB+xP5aU8yQOkbE\u002ffzXCmVsCsj8xXXoOqXOyP7TJ8YL25LI\u002ftbO+90NWsz\u002fNj55skcezP0UsMOHeOLQ\u002fLHWVVSyqtD9OF\u002fjJeRu1P4cPIz\u002fHjLU\u002fMlLdsxT+tT\u002fv+4UoYm+2P7\u002fkMp2v4LY\u002fiAHcEf1Rtz+qb1yGSsO3PwEAgvqXNLg\u002fb9xBb+WluD9hVBPkMhe5PzB3KlmAiLk\u002fscfTzc35uT8f641CG2u6P9EhhrZo3Lo\u002fYaLjK7ZNuz\u002fpeHWgA7+7P4\u002fiKBVRMLw\u002fHNHKiZ6hvD8Yy4b+6xK9P\u002fSfJHM5hL0\u002f7f7Y54b1vT9by5hc1Ga+P3YjRdEh2L4\u002fEqTxRW9Jvz\u002fft526vLq\u002fP9O1pBcFFsA\u002f5oD60atOwD+LWlCMUofAPyRLpkb5v8A\u002flUb8AKD4wD\u002fTLFK7RjHBP73xp3XtacE\u002fj439L5SiwT+9D1PqOtvBPxFMqKThE8I\u002fD1H9XohMwj8aF1IZL4XCPzNEptPVvcI\u002f2n74jXz2wj83ZkdIIy\u002fDPxY9pQLKZ8M\u002fsNVFvHCgwz\u002feyx12F9nDP60Nfi++EcQ\u002fgIzn6WRKxD9tG5KkC4PEP9DWpmCyu8Q\u002fsFntGln0xD80JFjV\u002fyzFP9ehlo+mZcU\u002f1w\u002fHSU2exT+vtEwE9NbFP98Nf76aD8Y\u002fMEYGeUFIxj9+jUMz6IDGPy3KlO2OucY\u002fNW7zpzXyxj9MTdxh3CrHP5EDTxuDY8c\u002fWfaK1imcxz+DoQ6R0NTHP3giYUt3Dcg\u002fUiylBR5GyD+REsi\u002fxH7IP4ZF3Hlrt8g\u002fkIqqMxLwyD96gUzvuCjJP7F\u002fo6lfYck\u002fIY4DZAaayT+BRVAerdLJP\u002fyKiNhTC8o\u002fCAHRkvpDyj8IMXpLoXzKP28eAAdItco\u002fegwWwu7tyj+zXch7lSbLP5GIhzY8X8s\u002fXDVn8OKXyz8H01iridDLP+c7oWUwCcw\u002fB+qtH9dBzD8WygfafXrMP+kWwJQks8w\u002fvjJjTsvrzD8tpM0IciTNP2MVy8MYXc0\u002fonQefr+VzT+nm3A4Zs7NP166+fEMB84\u002fw41brLM\u002fzj\u002fmGp5mWnjOPxsWyyEBsc4\u002f\u002fSAV3Kfpzj+\u002f20+WTiLPPxELX1D1Ws8\u002fMlKQCpyTzz8FdczEQszPP1z\u002fiL90AtA\u002fpLWtHMge0D8wztJ5GzvQP6vk99ZuV9A\u002fspYdNMJz0D+zF0WRFZDQP1Z6ZO5orNA\u002f1i78S7zI0D9U0SGpD+XQP1dASQZjAdE\u002fuSiTY7Yd0T9KsbnACTrRP8vC2h1dVtE\u002fVa8Be7By0T8Ei+zXA4\u002fRP4Gq7TRXq9E\u002fVdVxkqrH0T\u002f1LvTu\u002fePRP5QCMkxRANI\u002fIdStqaQc0j9A8tgG+DjSP2EbQWRLVdI\u002fEiuRwZ5x0j\u002fV6dod8o3SP8M0uHtFqtI\u002fZeGa2JjG0j+WMEk27OLSP7GrVJM\u002f\u002f9I\u002fBW5Z8JIb0z92dHNN5jfTP\u002fdqCqo5VNM\u002f4M5bB41w0z8HzqRk4IzTP+KnDcIzqdM\u002fCiGMH4fF0z\u002fGCsN82uHTP2KD89kt\u002ftM\u002fKiEdN4Ea1D9gA0aU1DbUP7n9cvEnU9Q\u002fqUybTntv1D+NQcmrzovUP4eWxQgiqNQ\u002f9qv6ZXXE1D+ssdPCyODUP9UGlB8c\u002fdQ\u002f9IeafG8Z1T8XIrjawjXVPzpL3jcWUtU\u002fRz4JlWlu1T+1B+TxvIrVPw8DTE8Qp9U\u002fiSmQrGPD1T\u002fMMsYJt9\u002fVP03E9mYK\u002fNU\u002f0tv\u002fwl0Y1j9iNU8gsTTWP5kgeX0EUdY\u002fvON42ldt1j+YsMk4q4nWPxAE8JX+pdY\u002fpz0Q81HC1j8D4SNQpd7WP3h1JK34+tY\u002f8H4SCkwX1z\u002fpqtVnnzPXP07m6sTyT9c\u002fIB0YIkZs1z9e9j9+mYjXP0a9mdvspNc\u002feXibOUDB1z\u002f0BqaWk93XPw=="},"y":{"dtype":"f8","bdata":"AGEUbf5cgD8ASuj25\u002f6JPwBVFs6BlY4\u002fAHXKbh4mkT\u002fAtYiKJceSP4CcQwBqQ5Q\u002fgH8jixOmlT9AlXe0vPWWP8DoBfyoNpg\u002fgPfsNsZrmT+Ajlk5LZeaPwACw8dtups\u002fAPxBBrnWnD+ANpOB\u002feydP0BH6A35\u002fZ4\u002foMNtpyIFoD+gpvYhMImgP6Biej1ZC6E\u002fQO1+p5GLoT8ghxe7GwiiPwD28nACgaI\u002fIGDsSLv2oj\u002fAE4L0pGmjP+Alj+UM2qM\u002fwKtbUTNIpD+gd6cLTrSkP6DysaqKHqU\u002fYC3YDhCHpT\u002fAGdDJ\u002f+2lP8BBrup2U6Y\u002fIPFTxY63pj\u002fgC2ycXRqnP4AymRb3e6c\u002fwDXukmzcpz9gLxCNzTuoP8BGrt4nmqg\u002fQERu9of3qD\u002fgSUUC+VOpP2BRJx6Fr6k\u002fIJoqbjUKqj8AOL0rEmSqP2DbPz0jvao\u002fQPCgSW8Vqz+AmMps\u002fGyrPyAs0LHQw6s\u002f4AnGikwZrD\u002fgHn6vR2ysPwB\u002fuNTxvKw\u002fIPFyPX0LrT9A77T+E1itPwDLvOjaoq0\u002fIC5CxfHrrT\u002fAdTRbdDOuP0Cw6Zp8ea4\u002fQFaeLiC+rj\u002fg5hrScgGvP+DF0jmGQ68\u002fwLHwVWqErz\u002fgOa6LLcSvP+BgQHNuAbA\u002fsEocIUIgsD8AZB83lz6wP2BtTqdyXLA\u002f0M+a+th5sD9gqkJczpawPyAx3qFWs7A\u002fkDQQV3XPsD9AkQnDLeuwP0Ab7+6CBrE\u002fsGOVrHchsT+AaNKNDjyxP6Dm0t1JVrE\u002fQHxfECxwsT+AR0Rwt4mxP6BzXcvtorE\u002fQB86ENG7sT9QFULyYtSxP\u002fDUoxOl7LE\u002fAGhq2JgEsj8wJ6q6PxyyP\u002fBbmf6aM7I\u002f0MyvFqxKsj8QSQgcdWGyPwBAgkz2d7I\u002fMPsbqy+Osj+QC5vMI6SyP1DmLy\u002fTubI\u002fAKfCuT7Psj\u002fgmr9dZ+SyPxBw4GJL+bI\u002f8KytWA4Osz9gl+RE9CKzP7AnCO1lN7M\u002fsLskpWZLsz8gfNjV+F6zPzClXHIhcrM\u002foGUKzuKEsz8Qf2HrQZezP4CSSc49qbM\u002fUE5DCdu6sz+Q5TIPHMyzP\u002fAP\u002fS8D3bM\u002fQE0PO5Ltsz9g94VUxv2zP1DSXFGtDbQ\u002fkGOdaUAdtD\u002fwDyzVgiy0P3CZi6t1O7Q\u002fwLEd3RpKtD9g9mnpc1i0P0DqXw+CZrQ\u002fUNB\u002fiEZ0tD+QxnmjwoG0P5DN3bn3jrQ\u002fsK0wWeabtD9wLAwgj6i0P3ArL4H0tLQ\u002fUJlWMBbBtD+QsuZY9cy0P5CIUA2S2LQ\u002fQMxQXe\u002fjtD9AoxYrDO+0P8AZsifp+bQ\u002fgLfOO4cEtT9QL94a5w61P3ATUVUJGbU\u002fsK8Ohe4itT\u002fwJ20vlyy1P9BqJNcDNrU\u002fsOI89TQ\u002ftT8Qep\u002f5Kki1P6CF50nmULU\u002fwFM3P2dZtT8gACYjrmG1P5AeUSy7abU\u002fUIK57JFxtT+gPEBcL3m1PyB6YSiWgLU\u002fIDVG+sCHtT9g\u002fBoJtY61P0CXkdhylbU\u002fYKs8LvqbtT\u002fw+m8FS6K1P2B\u002fSjFkqLU\u002fwFRXzECutT\u002fgtql97LO1P4Cwju1fubU\u002f0NTx3Zy+tT8Ardt7rMO1PyCJIyV9yLU\u002f4NJS3BvNtT+g0Maod9K1P7D27epc2bU\u002fQNJZvgXgtT9QUdDpcua1P6CxZVCl7LU\u002f0CKIuJ3ytT+wDqLnXPi1PxCcCZrj\u002fbU\u002f4GrHgjIDtj\u002fAMBtPSgi2P8A+T6QrDbY\u002fUFEJIdcRtj8wnzNdTRa2PzBEvOqOGrY\u002fwMbJVZwetj9wA9ckdiK2P3BdD9kcJrY\u002fEBiN7pAptj\u002fAhIzc0iy2PzDpbBXjL7Y\u002fQInBB8Iytj9AN+gccDW2P0As1rrtN7Y\u002fcOLiQzs6tj8AKAEXWTy2P0Dfz4xHPrY\u002fEIc6\u002fQZAtj9g83G7l0G2PxBxwBn6QrY\u002fUJhYZC5Etj8AeO7lNEW2P4DXROYNRrY\u002f4EgCqblGtj\u002fA5z1zOEe2P2D7FYOKR7Y\u002fwLfHFbBHtj\u002fwN+lnqUe2P8CyKa92R7Y\u002fkDMsIxhHtj+w7Qz4jUa2PxDwzl\u002fYRbY\u002f0FB6ivdEtj8wEgKo60O2P1CifuG0QrY\u002fIHClYlNBtj+wcxxTxz+2PwDmvNsQPrY\u002fEGCiHzA8tj9Q\u002fqNCJTq2Pw=="},"type":"scatter"},{"marker":{"color":"#636EFA","size":10},"mode":"markers+text","name":"Assets (arithmetic)","text":["S&P","Small Caps","T-Bills","T-Notes","Baa Corps","Real Estate","Gold"],"textfont":{"size":10},"textposition":"middle left","x":{"dtype":"f8","bdata":"803mCGu1yD\u002f51giXk93XPwuGmVr3iqM\u002ftvP9d\u002fittj98todNg4e2P5R9VuHjdqk\u002fWQkyV7TeyD8="},"y":{"dtype":"f8","bdata":"xWSXGK8Jtj8U7B2r1GbCPx2b4e4qUHA\u002fuvNWd6jGkj+EF6psEb6jP\u002f3W5n+Jm4k\u002f+7gt\u002f93WpD8="},"type":"scatter"},{"marker":{"color":"#EF553B","size":10},"mode":"markers","name":"Assets (geometric)","text":["S&P","Small Caps","T-Bills","T-Notes","Baa Corps","Real Estate","Gold"],"textposition":"middle left","x":{"dtype":"f8","bdata":"803mCGu1yD\u002f51giXk93XPwuGmVr3iqM\u002ftvP9d\u002fittj98todNg4e2P5R9VuHjdqk\u002fWQkyV7TeyD8="},"y":{"dtype":"f8","bdata":"kFxzg+NYsT8wWaxCJTq2PwDwKCNotGo\u002fABXG1rTKjT8gDQRUttuhP4B9Br\u002fKGYc\u002fwN2YSDiTmT8="},"type":"scatter"}],                        {"height":450,"hovermode":"closest","showlegend":true,"template":{"data":{"barpolar":[{"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"type":"carpet"}],"choropleth":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"choropleth"}],"contourcarpet":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"contourcarpet"}],"contour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"contour"}],"heatmap":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"heatmap"}],"histogram2dcontour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2dcontour"}],"histogram2d":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2d"}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"mesh3d":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"mesh3d"}],"parcoords":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"parcoords"}],"pie":[{"automargin":true,"type":"pie"}],"scatter3d":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatter3d"}],"scattercarpet":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattercarpet"}],"scattergeo":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergeo"}],"scattergl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergl"}],"scattermapbox":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermapbox"}],"scattermap":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermap"}],"scatterpolargl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolargl"}],"scatterpolar":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolar"}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"scatterternary":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterternary"}],"surface":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"surface"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}]},"layout":{"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"autotypenumbers":"strict","coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]],"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]},"colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"geo":{"bgcolor":"white","lakecolor":"white","landcolor":"#E5ECF6","showlakes":true,"showland":true,"subunitcolor":"white"},"hoverlabel":{"align":"left"},"hovermode":"closest","mapbox":{"style":"light"},"paper_bgcolor":"white","plot_bgcolor":"#E5ECF6","polar":{"angularaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"bgcolor":"#E5ECF6","radialaxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"scene":{"xaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","gridwidth":2,"linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white"},"yaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","gridwidth":2,"linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white"},"zaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","gridwidth":2,"linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white"}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"ternary":{"aaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"baxis":{"gridcolor":"white","linecolor":"white","ticks":""},"bgcolor":"#E5ECF6","caxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"title":{"x":0.05},"xaxis":{"automargin":true,"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","zerolinewidth":2},"yaxis":{"automargin":true,"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","zerolinewidth":2}}},"title":{"text":"Risk vs. Real Return"},"width":800,"xaxis":{"range":[0,0.39154390561045777],"showgrid":true,"title":{"text":"Standard Deviation of Real Returns"}},"yaxis":{"range":[0,0.1509513022716752],"showgrid":true,"title":{"text":"Real Return"}}},                        {"responsive": true}                    )                };            </script>        </div>

<p>Why the orange line? After computing the blue line, which is the portfolio’s mean return over the time span, I wanted to calculate the annualized percentage return, i.e. the geometric mean, for each optimal portfolio on the efficient frontier. I wanted to check the math that came out of the optimization.  To compute the orange line, I took the asset weights for each portfolio on the blue line, and simulated its actual performance, rebalancing annually, and calculated its realized vol and realized annualized return.  The math checked out, the blue line shows the optimal <em>mean returns</em>.  But remember when we said percentage changes are asymmetric? When we simulate the portfolio, the geometric mean return is lower than the arithmetic mean return, because of <em>volatility drag</em>. The more volatile assets go up and down a lot, and if they go up 10% to 1.1 and down 10% to 0.99, the arithmetic mean return is 0, but the geometric return is down 1%.</p>

<p>Fortunately there is a trick we can use to improve our optimization. The geometric return including volatility drag can be estimated by average return - variance/2 . In our optimization, if we maximize this adjusted return of \(\mu -\sigma^2 / 2\), we get these efficient frontiers:</p>

<div>                        <script type="text/javascript">window.PlotlyConfig = {MathJaxConfig: 'local'};</script>
        <script charset="utf-8" src="https://cdn.plot.ly/plotly-3.2.0.min.js" integrity="sha256-iZ2u/oU2wf/vDbl/ChcX93WgbBRSBvUO6N413hDz7xM=" crossorigin="anonymous"></script>                <div id="5a28a069-83c3-4e74-8f1d-92cf4370c6be" class="plotly-graph-div" style="height:450px; width:800px;"></div>            <script type="text/javascript">                window.PLOTLYENV=window.PLOTLYENV || {};                                if (document.getElementById("5a28a069-83c3-4e74-8f1d-92cf4370c6be")) {                    Plotly.newPlot(                        "5a28a069-83c3-4e74-8f1d-92cf4370c6be",                        [{"line":{"color":"#636EFA","width":2},"mode":"lines","name":"Efficient frontier (from model)","x":{"dtype":"f8","bdata":"f3LkpmKMnT\u002fT0AN8mFGfP07ztCZni6A\u002frSfWDwJuoT+DDwkKnVCiP8iD0uQ3M6M\u002f64TH09IVpD8Y8eezbfikP3NSLJ8I26U\u002faljvh6O9pj8tOaRxPqCnPwW4H1rZgqg\u002fVjSKQ3RlqT8uNXQtD0iqP\u002f4mLBaqKqs\u002fVMzU\u002f0QNrD9hxuzo3++sPwHTKdJ60q0\u002fTx59uRW1rj8Kt+2ksJevP\u002f2BOsYlPbA\u002f\u002fJGxO3OusD+BFEqwwB+xP\u002foppCQOkbE\u002fZk4xmlsCsj\u002fxlDEPqXOyP11N44P25LI\u002f3CX39UNWsz8RIA1qkcezP+ARL+HeOLQ\u002fcqbZVSyqtD\u002fxQRLKeRu1P2IKFDzHjLU\u002f\u002fmSdsRT+tT8aVy0oYm+2Py0t05yv4LY\u002fpuuqEf1Rtz84IVeGSsO3P+UYAPuXNLg\u002ffBD5b+WluD8QCkXkMhe5PzjaPVmAiLk\u002fLQDjzc35uT86+35CG2u6P6QlP7do3Lo\u002fR9jtK7ZNuz81OG2gA7+7P\u002fgW1xRRMLw\u002f9jXwiZ6hvD+FCJv+6xK9P9A0vXI5hL0\u002fmuja54b1vT+DdTFc1Ga+P25cx9Ah2L4\u002fkGZmRW9Jvz+NaAO6vLq\u002fP7agFxcFFsA\u002fw8kb0atOwD\u002f4WAeLUofAP7RMHUX5v8A\u002fHK71\u002f5\u002f4wD\u002feeoO6RjHBPyMLrXTtacE\u002ftirWLZSiwT+0OprpOtvBP+OHHKThE8I\u002fyJ6fXohMwj\u002fkkBwZL4XCP29QgNPVvcI\u002fyYfSjXz2wj\u002f6ABNIIy\u002fDP1SwdgLKZ8M\u002f46XvvHCgwz8IYvp2F9nDP3D\u002fYzG+EcQ\u002frKXL62RKxD8JWv2lC4PEP1xXmGCyu8Q\u002ffW\u002f+Gln0xD+36fvU\u002fyzFP6Nrf46mZcU\u002fQ2veSE2exT8LuigD9NbFP\u002fPeX72aD8Y\u002ftrUIeUFIxj94SmAz6IDGP+PRje2OucY\u002fBq6mpzXyxj+DEEli3CrHP2fq3BuDY8c\u002fARjy1Smcxz8r5QKQ0NTHP3gL6Up3Dcg\u002fqDezBB5GyD+97Bi\u002fxH7IP4et+Hhrt8g\u002fszPINBLwyD9EVBPuuCjJP9PvFqhfYck\u002fWeYSYgaayT\u002fafuAbrdLJPxOZK9VTC8o\u002fWe3kkvpDyj+AHCZNoXzKP1XOcwdItco\u002flWLkwe7tyj+eaUt8lSbLP5pdjDI8X8s\u002fKAZk7eKXyz\u002fG9uCnidDLP9M9P2IwCcw\u002fvsiBHNdBzD\u002fIQqTWfXrMP9oRn5Aks8w\u002f5L9jSsvrzD9WAdkDciTNP1y32rwYXc0\u002fbF3gfb+VzT+DqBU4Zs7NP92DOPIMB84\u002fm\u002fw\u002frLM\u002fzj8f8iBmWnjOPwOLzx8Bsc4\u002fBPdB2afpzj\u002f+13OSTiLPP+cpaUv1Ws8\u002fvPYvBJyTzz+IxTnEQszPP2h6Ir90AtA\u002fLvM1HMge0D9k5U95GzvQP6DjddZuV9A\u002f826uM8Jz0D8neZGNFZDQP8AU9utorNA\u002fTcSASrzI0D8EwcKoD+XQPyjTeQVjAdE\u002fyEhBY7Yd0T\u002f1X03ACTrRP443LhxdVtE\u002fE91YeLBy0T+HOv3UA4\u002fRP2AvryxXq9E\u002fqj4GkqrH0T+x7tzY\u002fePRPyzsRetPANI\u002fyEQ\u002fdWUC0j9GDZ29ZQLSP9DDgsFlAtI\u002fRfFXwmUC0j+OEXiqZQLSP9I++rhlAtI\u002fLKwtv2UC0j89PsfBZQLSP2LEUKllAtI\u002fQyjLv2UC0j9UQujAZQLSP7IAVcFlAtI\u002fDtShwWUC0j9v\u002f7DBZQLSPwMUu8FlAtI\u002fATnHwWUC0j+i\u002f9PBZQLSP6Ig4MFlAtI\u002folPswWUC0j9nPvjBZQLSP5yuA8JlAtI\u002fiIoOwmUC0j\u002fMxhjCZQLSP2NhIsJlAtI\u002fO10rwmUC0j+bwDPCZQLSP1iTO8JlAtI\u002fN95CwmUC0j8HqknCZQLSPwIAUMJlAtI\u002fBehVwmUC0j+ValvCZQLSPxSPYMJlAtI\u002fY1xlwmUC0j8n2WnCZQLSP2ILbsJlAtI\u002fsfhxwmUC0j9A1QeRZQLSP+qtX5JlAtI\u002fXwqik2UC0j9ebdCUZQLSP9E47JVlAtI\u002fK7D2lmUC0j9L+\u002fCXZQLSPz0P05hlAtI\u002fzHelmWUC0j9FiGmaZQLSP\u002ffPH5tlAtI\u002fwLjIm2UC0j+hfWScZQLSPzYd85xlAtI\u002fQ0J0nWUC0j\u002fTFOedZQLSPw=="},"y":{"dtype":"f8","bdata":"lc+FgANdgD\u002f4h7oNPf+JP6nZur4blY4\u002fsGQroX8lkT+uZpavD8aSPyn+WBbTQZQ\u002fmgUHU\u002fKjlT8w6yJtCPOWP7WEbINZM5g\u002f04sL49JnmT8GHltnjpKaP+afPsYbtZs\u002f\u002fMGtZazQnD8ebI7yLuadPygRiYNh9p4\u002fYexQ+O4AoD9Zi\u002fs1kYSgP7IW8t5LBqE\u002fQKyrkwqGoT9Ax7+bCQKiP5pzGexdeqI\u002fCt\u002fj8Xzvoj9BsUFGxWGjP0Bpy02E0aM\u002fNkUNMPo+pD9BExKwXKqkPx6PM1XZE6U\u002fxmE+AJd7pT+OftEut+GlPxnaz+ZWRqY\u002fxoNUco+ppj\u002f0h44LdwunPxqZNUghbKc\u002ftdKYj5\u002fLpz\u002fsUe9VASqoP9CbkWlUh6g\u002fPhfPNaXjqD9ZaBPm\u002fj6pPy0Gj5Jrmak\u002fAOEnYfTyqT889ZagoUuqP\u002fKnTOh6o6o\u002f1u7zH4f6qj+q+YGfzFCrPyTPfDhRpqs\u002fOP6lY4T6qz9VEG0SK0ysPzn0txlwm6w\u002fJBYD8ITorD8JOfwPlDOtP6XTOF3CfK0\u002fzwbaDTDErT8A5R1p+QmuPzzgb3E3Tq4\u002fben9WwCRrj\u002fOGdX6Z9KuP9QS1BGAEq8\u002fA192nlhRrz8Q+QgSAI+vP+D\u002fJYSDy68\u002fpMNkbncDsD\u002f0o9R6piCwP8FqIN5TPbA\u002fYYTpJIRZsD95kAWBO3WwP00DWsp9kLA\u002fp\u002fzPkE6rsD9ZPEAfscWwP\u002f1A54Ko37A\u002f17VvkTf5sD9SkOLtYBKxP9j4Sg0nK7E\u002fSA+uOoxDsT+5Ky+akluxPzE4by48c7E\u002fpldT2IqKsT\u002fCHHtbgKGxP\u002fuHJmEeuLE\u002fmhcgeGbOsT8yy1MYWuSxP2jf4qT6+bE\u002fsc2nbUkPsj+L\u002fROuRySyP6X\u002fdZH2OLI\u002fviF1NFdNsj+C\u002fpKhamGyP4QvS9gxdbI\u002fGAVYyq2Isj+4iK5d35uyP7BcbGvHrrI\u002fmNKa3WXBsj+QlbnHktOyP577J4w75bI\u002fXKh9TmT2sj9eVrvmEAezP5M6ZeREF7M\u002fZYf0mQMnsz9AqnIbUDazP9DgCU4tRbM\u002fByV7451Tsz8QSkJipGGzPzL6gShDb7M\u002fPn6Mc3x8sz8seKRUUomzP3ruzMbGlbM\u002faoVkpduhsz8gE8mwkq2zP\u002f4dGI7tuLM\u002f34v90+3Dsz91dqn6lM6zPyIr9Wnk2LM\u002f8bYZd93isz\u002f0HQ5mgeyzP67Sr2rR9bM\u002fokLNqc7+sz8ASBo6ege0P3d8ESXVD7Q\u002f1bW\u002fa+AXtD9\u002fpb\u002f4nB+0P2xO37ULJ7Q\u002flIltfy0utD\u002f2sAkoAzW0P4HmMnmNO7Q\u002fjrjNM81BtD8McqAQw0e0Pwc1xsBvTbQ\u002ftlwZ7tNStD87fNw+8Fe0P5ZKXUnFXLQ\u002fXwmvplNhtD8AOC3nm2W0P74WqpWeabQ\u002fnc6uN1xttD\u002fqHaRL1XC0P\u002fesLlIKdLQ\u002ffpOZv\u002ft2tD8HkogGqnm0P03DI5QVfLQ\u002fbl6C1z5+tD+PwRY0JoC0P+9a\u002fA3MgbQ\u002fmEP8xTCDtD++dti4VIS0P6KVhz84hbQ\u002fMVkPstuFtD9EcUFiP4a0P46cnqJjhrQ\u002f2p08zmOGtD9THWnOY4a0P5mHbs5jhrQ\u002fUlBwzmOGtD9i4A7OY4a0Pz2LRM5jhrQ\u002fmAxfzmOGtD+IqmvOY4a0P34Pz81jhrQ\u002fLOFgzmOGtD\u002fesmjOY4a0P4Ddas5jhrQ\u002fk2ZszmOGtD\u002fdtmzOY4a0Py7wbM5jhrQ\u002f8zRtzmOGtD8Ifm3OY4a0P67Nbc5jhrQ\u002f1hduzmOGtD+nW27OY4a0PxSZbs5jhrQ\u002fZNBuzmOGtD8MAm\u002fOY4a0P5Yub85jhrQ\u002fglZvzmOGtD9Oem\u002fOY4a0P26ab85jhrQ\u002fRLdvzmOGtD8u0W\u002fOY4a0P3\u002fob85jhrQ\u002ffv1vzmOGtD9oEHDOY4a0P3MhcM5jhrQ\u002f0DBwzmOGtD+oPnDOY4a0PyRLcM5jhrQ\u002fX1ZwzmOGtD8I0KTNY4a0P61XqM1jhrQ\u002fLYCrzWOGtD\u002f2UK7NY4a0P4zQsM1jhrQ\u002foASzzWOGtD8o8rTNY4a0PxQ6ts1jhrQ\u002fSTW3zWOGtD9w7LfNY4a0P0JguM1jhrQ\u002faJC4zWOGtD8me7jNY4a0P+McuM1jhrQ\u002faG+3zWOGtD9AaLbNY4a0Pw=="},"type":"scatter"},{"line":{"color":"#EF553B","width":2},"mode":"lines","name":"Efficient frontier (from history)","x":{"dtype":"f8","bdata":"f3LkpmKMnT\u002fS0AN8mFGfP07ztCZni6A\u002frSfWDwJuoT+DDwkKnVCiP8iD0uQ3M6M\u002f64TH09IVpD8Y8eezbfikP3NSLJ8I26U\u002faljvh6O9pj8tOaRxPqCnPwW4H1rZgqg\u002fVjSKQ3RlqT8uNXQtD0iqP\u002f4mLBaqKqs\u002fVMzU\u002f0QNrD9hxuzo3++sPwDTKdJ60q0\u002fTh59uRW1rj8Lt+2ksJevP\u002f2BOsYlPbA\u002f\u002fJGxO3OusD+BFEqwwB+xP\u002foppCQOkbE\u002fZk4xmlsCsj\u002fwlDEPqXOyP11N44P25LI\u002f3CX39UNWsz8QIA1qkcezP+ERL+HeOLQ\u002fc6bZVSyqtD\u002fxQRLKeRu1P2IKFDzHjLU\u002f\u002fmSdsRT+tT8aVy0oYm+2Py0t05yv4LY\u002fpuuqEf1Rtz84IVeGSsO3P+UYAPuXNLg\u002fehD5b+WluD8QCkXkMhe5PzjaPVmAiLk\u002fLQDjzc35uT86+35CG2u6P6QlP7do3Lo\u002fRtjtK7ZNuz81OG2gA7+7P\u002fgW1xRRMLw\u002f9TXwiZ6hvD+FCJv+6xK9P880vXI5hL0\u002fmuja54b1vT+DdTFc1Ga+P25cx9Ah2L4\u002fkGZmRW9Jvz+NaAO6vLq\u002fP7WgFxcFFsA\u002fw8kb0atOwD\u002f5WAeLUofAP7RMHUX5v8A\u002fHK71\u002f5\u002f4wD\u002fdeoO6RjHBPyMLrXTtacE\u002ftirWLZSiwT+zOprpOtvBP+KHHKThE8I\u002fyJ6fXohMwj\u002fkkBwZL4XCP29QgNPVvcI\u002fyYfSjXz2wj\u002f6ABNIIy\u002fDP1OwdgLKZ8M\u002f46XvvHCgwz8HYvp2F9nDP3D\u002fYzG+EcQ\u002frKXL62RKxD8JWv2lC4PEP1xXmGCyu8Q\u002ffm\u002f+Gln0xD+46fvU\u002fyzFP6Rrf46mZcU\u002fQ2veSE2exT8LuigD9NbFP\u002fPeX72aD8Y\u002ftrUIeUFIxj94SmAz6IDGP+LRje2OucY\u002fB66mpzXyxj+CEEli3CrHP2fq3BuDY8c\u002fAhjy1Smcxz8q5QKQ0NTHP3kL6Up3Dcg\u002fqDezBB5GyD++7Bi\u002fxH7IP4et+Hhrt8g\u002fszPINBLwyD9EVBPuuCjJP9PvFqhfYck\u002fWOYSYgaayT\u002fbfuAbrdLJPxOZK9VTC8o\u002fWu3kkvpDyj+AHCZNoXzKP1XOcwdItco\u002flWLkwe7tyj+eaUt8lSbLP5pdjDI8X8s\u002fKAZk7eKXyz\u002fG9uCnidDLP9I9P2IwCcw\u002fvsiBHNdBzD\u002fIQqTWfXrMP9oRn5Aks8w\u002f5L9jSsvrzD9YAdkDciTNP1232rwYXc0\u002fbF3gfb+VzT+EqBU4Zs7NP92DOPIMB84\u002fnPw\u002frLM\u002fzj8f8iBmWnjOPwKLzx8Bsc4\u002fBPdB2afpzj\u002f913OSTiLPP+gpaUv1Ws8\u002fvPYvBJyTzz+IxTnEQszPP2h6Ir90AtA\u002fLvM1HMge0D9l5U95GzvQP6DjddZuV9A\u002f826uM8Jz0D8neZGNFZDQP8EU9utorNA\u002fTcSASrzI0D8EwcKoD+XQPyjTeQVjAdE\u002fyUhBY7Yd0T\u002f1X03ACTrRP483LhxdVtE\u002fE91YeLBy0T+HOv3UA4\u002fRP2EvryxXq9E\u002fqz4GkqrH0T+x7tzY\u002fePRPyzsRetPANI\u002fyEQ\u002fdWUC0j9GDZ29ZQLSP9DDgsFlAtI\u002fRfFXwmUC0j+OEXiqZQLSP9I++rhlAtI\u002fLawtv2UC0j89PsfBZQLSP2LEUKllAtI\u002fQyjLv2UC0j9UQujAZQLSP7MAVcFlAtI\u002fDtShwWUC0j9v\u002f7DBZQLSPwQUu8FlAtI\u002fATnHwWUC0j+i\u002f9PBZQLSP6Ig4MFlAtI\u002folPswWUC0j9nPvjBZQLSP5yuA8JlAtI\u002fiIoOwmUC0j\u002fMxhjCZQLSP2NhIsJlAtI\u002fO10rwmUC0j+bwDPCZQLSP1iTO8JlAtI\u002fON5CwmUC0j8HqknCZQLSPwIAUMJlAtI\u002fBehVwmUC0j+ValvCZQLSPxWPYMJlAtI\u002fZFxlwmUC0j8n2WnCZQLSP2ILbsJlAtI\u002fsfhxwmUC0j9B1QeRZQLSP+qtX5JlAtI\u002fXwqik2UC0j9ebdCUZQLSP9E47JVlAtI\u002fLLD2lmUC0j9L+\u002fCXZQLSPz0P05hlAtI\u002fzHelmWUC0j9GiGmaZQLSP\u002ffPH5tlAtI\u002fwLjIm2UC0j+ifWScZQLSPzcd85xlAtI\u002fQ0J0nWUC0j\u002fTFOedZQLSPw=="},"y":{"dtype":"f8","bdata":"gD3xIv5cgD8Aja\u002f45\u002f6JPwCdFs+BlY4\u002fwHX4fh4mkT9AAYiVJceSPwBqbg1qQ5Q\u002fwKeYdxOmlT8AXzSwvPWWP0CDnjOpNpg\u002fwOoFO8ZrmT+A+QNDLZeaP4A+lMZtups\u002fQMK9B7nWnD9A1RV\u002f\u002feydPwDa9QH5\u002fZ4\u002fwDdCoCIFoD+g0ewcMImgPyC8bzlZC6E\u002fQM+ZjZGLoT8ge3+6GwiiPwDsCE8CgaI\u002fYNhgJbv2oj9AmSTbpGmjPwAdjcEM2qM\u002fgNtpTDNIpD8gKs8ITrSkP4AQN6KKHqU\u002fwHi7ExCHpT9AeLPX\u002f+2lP8B70ut2U6Y\u002fAJPwyI63pj\u002fgGW6oXRqnP6D4ZkD3e6c\u002fwA8nvmzcpz8AYWGkzTuoPwAs8fQnmqg\u002fQHx+Coj3qD\u002fAnckW+VOpP8BPOzKFr6k\u002fwEToijUKqj+gy648EmSqP6ClrjMjvao\u002fwIHwIm8Vqz+Ajnde\u002fGyrPyDzad7Qw6s\u002fAEBSiEwZrD9A0PMjR2ysP4BGk3zxvKw\u002fQKEgWH0LrT\u002fAkbMOFFitPyDBeNraoq0\u002fwNBzqPHrrT9AJ43LdDOuP+Ba4hN9ea4\u002fQEqhriC+rj+gVVxYcwGvPyA3KdiGQ68\u002fQCfZDGuErz8Aby1cLsSvPwDmHeRuAbA\u002fcF0fjEIgsD8An\u002fOelz6wP+Cl5RBzXLA\u002fEOBEetl5sD9Q3fafzpawPyBRitxWs7A\u002fUFfHgXXPsD8wihXSLeuwPzAYkM+CBrE\u002f8H6OV3chsT9QJj8nDjyxP0CyHK9JVrE\u002fEFmiKSxwsT\u002fA3Edbt4mxP4BnxgHuorE\u002fcB\u002fbeNG7sT9gunpSY9SxP5Aw3y2l7LE\u002fEMPJ45gEsj\u002fQKJvWPxyyP4DbzgOcM7I\u002f4BahYK1Ksj+w32\u002fPdWGyP3DZx1v2d7I\u002f8GV+zS+Osj+wf5G9I6SyP4AxJvTSubI\u002fYOcIYj7Psj\u002fQKRlCZ+SyP5BKDx9O+bI\u002fgHOW5A0Osz8Qa5CQ9SKzP1C0wpdnN7M\u002fcHlIB2hLsz\u002fQVsyC+l6zPzBGVJsicrM\u002foBt6eeSEsz8Andg8QpezP8B\u002fYRA+qbM\u002fcJJZHtu6sz9wTb7UG8yzPwD73nkC3bM\u002f0J2vLpHtsz8wVzz1yf2zP\u002fCeeK6uDbQ\u002fQEXeHkEdtD\u002fg28zwgiy0P7Din8B1O7Q\u002fQB\u002fi9RpKtD\u002fgHl3\u002fc1i0P6DNNS+CZrQ\u002fwLwbxUZ0tD9weI3vwoG0P6DV7Mz3jrQ\u002fwK6HbOabtD9ACorPj6i0PxDM2en0tLQ\u002fQMzwnBbBtD9wW1DS9cy0PzDgsVKT2LQ\u002f8HUg5O\u002fjtD8A48NCDO+0P\u002fDhaCHp+bQ\u002fYFoAKocEtT\u002fArhb+5g61PzC5QzcJGbU\u002fkO+TZ+4itT\u002fwHIYblyy1PyDyxNQDNrU\u002fUKuqETU\u002ftT9guIRJK0i1P5BgvO3mULU\u002f8CQTamhZtT+wiGYisGG1P2Cujn2+abU\u002fgDqT1JNxtT\u002fwtq9+MHm1P1CqHvSUgLU\u002fcFQTPMGHtT\u002fQws3stY61P8DV4xlzlbU\u002fQFZc2fibtT9ga6qQR6K1P9DQjnFfqLU\u002fIFKk70CutT+Qh8Up7LO1P9Co0QRhubU\u002f4GlVr8W5tT+QFwy8xbm1PyB8qrzFubU\u002fQF7IvMW5tT\u002fwvgK7xbm1P\u002fBcSbzFubU\u002fcE2xvMW5tT8Ayc+8xbm1PyAOfrzFubU\u002f8N\u002fcvMW5tT+AQuO8xbm1PzCJ47zFubU\u002fIKrivMW5tT\u002fwgOG8xbm1P7DA4LzFubU\u002fAEDgvMW5tT\u002fg4d+8xbm1P8Cz37zFubU\u002fkInfvMW5tT\u002fwX9+8xbm1P5A137zFubU\u002fAArfvMW5tT9g3d68xbm1PwCw3rzFubU\u002fQILevMW5tT9wVN68xbm1P+Am3rzFubU\u002f4PndvMW5tT+wzd28xbm1P3Ci3bzFubU\u002fQHjdvMW5tT9QT928xbm1P5An3bzFubU\u002fMAHdvMW5tT8Q3Ny8xbm1P1C43LzFubU\u002f4JXcvMW5tT9Q+LS+xbm1PxCKqL7FubU\u002fgJecvsW5tT\u002fgHJG+xbm1P1AWhr7FubU\u002foH97vsW5tT9gVHG+xbm1P+CnZ77FubU\u002fIGVevsW5tT8gh1W+xbm1P8AKTb7FubU\u002fIO1EvsW5tT8ALD2+xbm1P7DFNb7FubU\u002fsLkuvsW5tT\u002fgCCi+xbm1Pw=="},"type":"scatter"},{"marker":{"color":"#636EFA","size":10},"mode":"markers+text","name":"Assets (arithmetic)","text":["S&P","Small Caps","T-Bills","T-Notes","Baa Corps","Real Estate","Gold"],"textfont":{"size":10},"textposition":"middle left","x":{"dtype":"f8","bdata":"803mCGu1yD\u002f51giXk93XPwuGmVr3iqM\u002ftvP9d\u002fittj98todNg4e2P5R9VuHjdqk\u002fWQkyV7TeyD8="},"y":{"dtype":"f8","bdata":"xWSXGK8Jtj8U7B2r1GbCPx2b4e4qUHA\u002fuvNWd6jGkj+EF6psEb6jP\u002f3W5n+Jm4k\u002f+7gt\u002f93WpD8="},"type":"scatter"},{"marker":{"color":"#EF553B","size":10},"mode":"markers","name":"Assets (geometric)","text":["S&P","Small Caps","T-Bills","T-Notes","Baa Corps","Real Estate","Gold"],"textposition":"middle left","x":{"dtype":"f8","bdata":"803mCGu1yD\u002f51giXk93XPwuGmVr3iqM\u002ftvP9d\u002fittj98todNg4e2P5R9VuHjdqk\u002fWQkyV7TeyD8="},"y":{"dtype":"f8","bdata":"kFxzg+NYsT8wWaxCJTq2PwDwKCNotGo\u002fABXG1rTKjT8gDQRUttuhP4B9Br\u002fKGYc\u002fwN2YSDiTmT8="},"type":"scatter"}],                        {"height":450,"hovermode":"closest","showlegend":true,"template":{"data":{"barpolar":[{"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"type":"carpet"}],"choropleth":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"choropleth"}],"contourcarpet":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"contourcarpet"}],"contour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"contour"}],"heatmap":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"heatmap"}],"histogram2dcontour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2dcontour"}],"histogram2d":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2d"}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"mesh3d":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"mesh3d"}],"parcoords":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"parcoords"}],"pie":[{"automargin":true,"type":"pie"}],"scatter3d":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatter3d"}],"scattercarpet":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattercarpet"}],"scattergeo":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergeo"}],"scattergl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergl"}],"scattermapbox":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermapbox"}],"scattermap":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermap"}],"scatterpolargl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolargl"}],"scatterpolar":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolar"}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"scatterternary":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterternary"}],"surface":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"surface"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}]},"layout":{"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"autotypenumbers":"strict","coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]],"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]},"colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"geo":{"bgcolor":"white","lakecolor":"white","landcolor":"#E5ECF6","showlakes":true,"showland":true,"subunitcolor":"white"},"hoverlabel":{"align":"left"},"hovermode":"closest","mapbox":{"style":"light"},"paper_bgcolor":"white","plot_bgcolor":"#E5ECF6","polar":{"angularaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"bgcolor":"#E5ECF6","radialaxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"scene":{"xaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","gridwidth":2,"linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white"},"yaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","gridwidth":2,"linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white"},"zaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","gridwidth":2,"linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white"}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"ternary":{"aaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"baxis":{"gridcolor":"white","linecolor":"white","ticks":""},"bgcolor":"#E5ECF6","caxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"title":{"x":0.05},"xaxis":{"automargin":true,"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","zerolinewidth":2},"yaxis":{"automargin":true,"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","zerolinewidth":2}}},"title":{"text":"Risk vs. Real Return"},"width":800,"xaxis":{"range":[0,0.39154390561045777],"showgrid":true,"title":{"text":"Standard Deviation of Real Returns"}},"yaxis":{"range":[0,0.1509513022716752],"showgrid":true,"title":{"text":"Real Return"}}},                        {"responsive": true}                    )                };            </script>        </div>

<p>Maximizing the return less estimated volatility drag is very close to the actual realized efficient frontier using the estimated optimal portfolios.</p>

<p>Note: the efficient frontier stops before the ‘small cap’ marker, because it turns out that is not an efficient portfolio. Adding a bit of S&amp;P to a 100% small cap portfolio reduces volatility, since S&amp;P is less volatile, and also actually increases return, by reducing volatility drag.</p>

<p>Finally we can visualize individual portfolios via this transition map which shows how the portfolio evolves as you tolerate higher and higher risk (roll over for asset weights).</p>
<div>                        <script type="text/javascript">window.PlotlyConfig = {MathJaxConfig: 'local'};</script>
        <script charset="utf-8" src="https://cdn.plot.ly/plotly-3.2.0.min.js" integrity="sha256-iZ2u/oU2wf/vDbl/ChcX93WgbBRSBvUO6N413hDz7xM=" crossorigin="anonymous"></script>                <div id="613f32de-f7d4-4000-8876-3c6947c8da0e" class="plotly-graph-div" style="height:450px; width:800px;"></div>            <script type="text/javascript">                window.PLOTLYENV=window.PLOTLYENV || {};                                if (document.getElementById("613f32de-f7d4-4000-8876-3c6947c8da0e")) {                    Plotly.newPlot(                        "613f32de-f7d4-4000-8876-3c6947c8da0e",                        [{"customdata":{"dtype":"f8","bdata":"\u002fldwDuGsXT51oDsajlzaPzIn6hIZquA\u002fSVqPNVmA4z\u002fqZ9hvmAHmPw1MQ0ydTug\u002fO0gIcqpp6j\u002fmQAuZKX\u002fsP2mDKMiVdO4\u002f8mG965Yv8D9\u002f3gsp+hzxP21X6Q8JA\u002fI\u002f7UfRotHm8j\u002fJhIN\u002fGMXzP4N1\u002fNuGoPQ\u002f7j2AgDR59T+TIq7qBk\u002f2P4SckSEfJPc\u002frN0\u002fFmVb+T97xeaj7Wf9P4cWH4qurABAiUXpuISbAkBN0BGxmYAEQOHzZdoeXAZAEUa0Y+c0CEAW5ViKLwUKQOrK1RpGzwtAAO+RDxSUDUAMtqR1w1QPQAXoOy4fiRBA1hLVWHtlEUACOIHjAEASQDFv9UF2GBNAs0s0UxTwE0B6HqhHl8YUQNTb3Fh\u002fmxVABDIe4mpvFkDxgUKeM0IXQM2\u002fkIECFBhAJ8nR0B7lGEALuHKK47UZQAgWFFwIhBpAZb7vtWFSG0Cb4dJ77h8cQMPHVVvY7BxA6KRYVFidHkCH6d\u002fFpUUgQCG6L7YiOCFAXmhX+egmIkAkPxmjhhEjQHLzlkPT+CNAsazmmcPcJEDENzBm570lQF66FMhInCZALhh92C54J0C\u002frT7rwlEoQMM8l4dHKSlAJlN23Mr+KUDDgpH5cNIqQOxravRMpCtATtBh3GJ0LEC+sBgC90ItQBFMYZomEC5AaMjSzCvcLkA\u002fGFcBRaYvQEbZpt7BNzBAMSJL2cqbMEBeJYrSQv8wQAl1TEAsYjFA8zXmxJLEMUDF7K6XkSYyQKsgD3AxiDJA\u002f0bjjXDpMkA9SBKBGkozQGOhcrirqjNAZeJ91tYKNEB7aAybh2o0QB4NQxzCyTRAxmd8PLYoNUBkcq6SX4c1QE2y8mAe5jVAYsWgkjNENkAcxOc\u002fAqI2QMGGcF+C\u002fzZAd3tJnYxcN0AfoMQweLk3QLU9TcwtFjhAI0yoILNyOEAaBQNLOc84QOw9H3iiKzlAGNS0\u002fZuVOUAAJGxffUY6QDPVilnm9TpA4kJ7QeujO0CaMXCil1A8QMQsr2EE\u002fDxAH00tKICmPUC2AMMM3U8+QPG\u002fXnr\u002f9z5AfqhY8hmfP0AXCQDwmyJAQDIfdP8xdUBAOVH5k1PHQEBsDg9fBhlBQBhbM2dOakFAKfL2zi+7QUDIkdyPrgtCQHV7Bc7PW0JABQTtVpSrQkCrPTbZAPtCQOyoIH0YSkNAqJioRN6YQ0DDFCsMVedDQGN1q4t\u002fNURAIly0WWCDREB\u002f2+Tt+dBEQBW08KJOHkVAOWiB1F9rRUDTVJWEMbhFQPigWb3EBEZANrgUcRtRRkC3jxd8N51GQOjSz6Ua6UZAkMTOocY0R0DGVtcQPYBHQLS\u002f\u002fIF\u002fy0dA3zPPc48WSEA6sKkxbmFIQHCf62sdrEhAbgNWS572SEA8\u002fdYV8kBJQCpSygQai0lAfhmeRRfVSUDwnsL26h5KQB1U9DWWaEpARuPxDhqySkBqRvCEd\u002ftKQDRt5wWyREtA+CNCssWNS0BFinZruNZLQICt292HH0xAcHkVPTJoTECRh1DDurBMQAJZjcgh+UxA+sFrbmtBTUB7fpFPl4lNQCfuD\u002fSh0U1ASJHrDO7WTUA=","shape":"148, 1"},"fill":"tonexty","fillcolor":"#ff9896","hovertemplate":"%{customdata[0]:.2f}%\u003cextra\u003eSmall Caps\u003c\u002fextra\u003e","line":{"color":"#ff9896","width":0},"mode":"lines","name":"Small Caps","stackgroup":"one","x":{"dtype":"f8","bdata":"gD3xIv5cgD8Aja\u002f45\u002f6JPwCdFs+BlY4\u002fwHX4fh4mkT9AAYiVJceSPwBqbg1qQ5Q\u002fwKeYdxOmlT8AXzSwvPWWP0CDnjOpNpg\u002fwOoFO8ZrmT+A+QNDLZeaP4A+lMZtups\u002fQMK9B7nWnD9A1RV\u002f\u002feydPwDa9QH5\u002fZ4\u002fwDdCoCIFoD+g0ewcMImgPyC8bzlZC6E\u002fQM+ZjZGLoT8ge3+6GwiiPwDsCE8CgaI\u002fYNhgJbv2oj9AmSTbpGmjPwAdjcEM2qM\u002fgNtpTDNIpD8gKs8ITrSkP4AQN6KKHqU\u002fwHi7ExCHpT9AeLPX\u002f+2lP8B70ut2U6Y\u002fAJPwyI63pj\u002fgGW6oXRqnP6D4ZkD3e6c\u002fwA8nvmzcpz8AYWGkzTuoPwAs8fQnmqg\u002fQHx+Coj3qD\u002fAnckW+VOpP8BPOzKFr6k\u002fwEToijUKqj+gy648EmSqP6ClrjMjvao\u002fwIHwIm8Vqz+Ajnde\u002fGyrPyDzad7Qw6s\u002fAEBSiEwZrD9A0PMjR2ysP4BGk3zxvKw\u002fQKEgWH0LrT\u002fAkbMOFFitPyDBeNraoq0\u002fwNBzqPHrrT9AJ43LdDOuP+Ba4hN9ea4\u002fQEqhriC+rj+gVVxYcwGvPyA3KdiGQ68\u002fQCfZDGuErz8Aby1cLsSvPwDmHeRuAbA\u002fcF0fjEIgsD8An\u002fOelz6wP+Cl5RBzXLA\u002fEOBEetl5sD9Q3fafzpawPyBRitxWs7A\u002fUFfHgXXPsD8wihXSLeuwPzAYkM+CBrE\u002f8H6OV3chsT9QJj8nDjyxP0CyHK9JVrE\u002fEFmiKSxwsT\u002fA3Edbt4mxP4BnxgHuorE\u002fcB\u002fbeNG7sT9gunpSY9SxP5Aw3y2l7LE\u002fEMPJ45gEsj\u002fQKJvWPxyyP4DbzgOcM7I\u002f4BahYK1Ksj+w32\u002fPdWGyP3DZx1v2d7I\u002f8GV+zS+Osj+wf5G9I6SyP4AxJvTSubI\u002fYOcIYj7Psj\u002fQKRlCZ+SyP5BKDx9O+bI\u002fgHOW5A0Osz8Qa5CQ9SKzP1C0wpdnN7M\u002fcHlIB2hLsz\u002fQVsyC+l6zPzBGVJsicrM\u002foBt6eeSEsz8Andg8QpezP8B\u002fYRA+qbM\u002fcJJZHtu6sz9wTb7UG8yzPwD73nkC3bM\u002f0J2vLpHtsz8wVzz1yf2zP\u002fCeeK6uDbQ\u002fQEXeHkEdtD\u002fg28zwgiy0P7Din8B1O7Q\u002fQB\u002fi9RpKtD\u002fgHl3\u002fc1i0P6DNNS+CZrQ\u002fwLwbxUZ0tD9weI3vwoG0P6DV7Mz3jrQ\u002fwK6HbOabtD9ACorPj6i0PxDM2en0tLQ\u002fQMzwnBbBtD9wW1DS9cy0PzDgsVKT2LQ\u002f8HUg5O\u002fjtD8A48NCDO+0P\u002fDhaCHp+bQ\u002fYFoAKocEtT\u002fArhb+5g61PzC5QzcJGbU\u002fkO+TZ+4itT\u002fwHIYblyy1PyDyxNQDNrU\u002fUKuqETU\u002ftT9guIRJK0i1P5BgvO3mULU\u002f8CQTamhZtT+wiGYisGG1P2Cujn2+abU\u002fgDqT1JNxtT\u002fwtq9+MHm1P1CqHvSUgLU\u002fcFQTPMGHtT\u002fQws3stY61P8DV4xlzlbU\u002fQFZc2fibtT9ga6qQR6K1P9DQjnFfqLU\u002fIFKk70CutT+Qh8Up7LO1P9Co0QRhubU\u002f4GlVr8W5tT8="},"y":{"dtype":"f8","bdata":"MrMUrQD+8j1+M\u002f1DE99wP9CiffmaVHU\u002fus9vvzT2eD\u002fFeimPACt8P7XwIk3yHH8\u002fJoA4U3fngD+JKTBs5zyCP7TtGYDQfYM\u002fiNkva8u3hD\u002f0ePCapueFP4zgXRQgDoc\u002f6P+QLLAxiD9o52rWM06JPwQwGgUTZ4o\u002f3+iZKWx8iz\u002fbxVlVHY6MP5TS9yrgno0\u002f8zu4In46kD\u002fekg7F39GSP1ExjqbpV5U\u002f94F8uU3Rlz8HcYddNT6aP86o3s\u002ffnpw\u002fXqFhdQn8nj8tVXaqKKegP\u002fwGvNNVzKE\u002f1xOlUSHuoj+NS+TkSQ2kP7RH5lllKqU\u002frNqV7HREpj\u002fuUfcYKlynPzQJtTU7cag\u002fBOZrvDiFqT9AMdfgy5eqP0OUlRVRqKs\u002fOHPzDJO3rD\u002fYkZLKYMWtPwfhUrru0a4\u002f4GeHFZjdrz8w3IaqaHSwPziTK0VX+LA\u002ffuqtfmd8sT9jkCDK9P+xP33wDdQZg7I\u002fOLFhnOaXsz+3961jB9S0PyBp9d5pCrY\u002fg9eYfAs8tz92wV1qWmi4P89q9JNqkLk\u002ffBrLkS20uj9CwhRkW9S7PyeIGgAB8bw\u002fWYUGZ3kKvj95jAh\u002f+SC\u002fPzXfDjhrGsA\u002fYJHvMBGjwD9em3G+hSrBP41ZThfVsME\u002fE3u51AE2wj889muvN7rCP68wkFiJPcM\u002fJPs0CBzAwz8U0uXXc0HEP0VyUNU\u002fwsQ\u002f916TU0tCxT8IY3M2ncHFP7rnOKQ4QMY\u002fdKsmgSy+xj+LQ2+jmzvHPzeQRjORuMc\u002fW28O8wo1yD\u002fycO7DxbDIP9HYF+xgLMk\u002fByx4ZHmnyT\u002f5j1dB9SHKPzB3xr3Zm8o\u002fZEd2JGQVyz+zczvQjo7LPyU2+fbUB8w\u002fnCVdA0KAzD\u002fSx63MVPjMPzTLhQkDcM0\u002f1mrtYhrnzT\u002fq9dx7Cl7OP1jeYoC11M4\u002fN1cpuSJLzz\u002fP59oDkcHPP0WYrRntG9A\u002f0jWI\u002fr9f0D8AQBwU9NDQP5ENjEM3QdE\u002fIONOkJaw0T+qcbhdGR\u002fSP0qNrZrPjNI\u002fFFDVnuv50j+84SoIUGbTP8PMmC\u002fr0dM\u002fPNLmZ9081D+iCwAALqfUPysyV9bjENU\u002ffFNylAR61T\u002fmT+qDl+LVPwDbxsuhStY\u002fm6b+tiiy1j\u002fhm\u002ftbMRnXP2MtY0\u002fCf9c\u002fv545mNzl1z\u002fvTsA0hkvYP\u002fH2hS\u002fDsNg\u002fuHsfYpcV2T8ttPl1BnrZP9sv+uUT3tk\u002faYouAsNB2j8edRDzFqXaP2NhFbwSCNs\u002fuj0\u002fGrhq2z\u002fHn9MuDM3bP3A0h04QL9w\u002f1MIk98aQ3D88mVuKMvLcP5l+Hk9VU90\u002fzS70cjG03T\u002fpElELyRTePxkUBhcedd4\u002fE4rBfzLV3j9KAKbtBzXfP3BbI4qglN8\u002f6e8R0f3z3z\u002fpRdGxkCngP9M+d2kGWeA\u002fCS9l0GCI4D+FMu2doLfgP1BK7ojG5uA\u002fqMTDPNMV4T+WGFJfx0ThPw2ifyKlc+E\u002fLnOvC2qi4T9+WGDeGdHhP81kWR2z\u002f+E\u002fe0P5oTQu4j\u002fDVgB9oFziP87cwOb2iuI\u002fRAEchDq54j\u002f9JzQUa+fiP\u002fCDwl6GFeM\u002fs3u1ReoY4z8="},"type":"scatter"},{"customdata":{"dtype":"f8","bdata":"N7M6No2MbD7Z6E9Y3sIJQH1rsYP\u002fzRBAQPOuGa4AFEAWIGLXadMWQAJJU4hVaRlA0r+DbCvYG0DW6FEsxiQeQD+fK5YELiBA8EOpqNk\u002fIUBIz8adcEoiQLBgwGEyTyNAVmuKAmpOJEDDuSvcSUklQK05H3R5QCZAC9XGP2A0J0DsTh0ehSUoQORc3vbKEylA0I36nKIqKkAfpOoY23ErQNZjkSiasixAlWHZAw\u002fsLUCe1Lx\u002fpR8vQAH0gdl1JzBAclMu1AG8MEDQKZYT+k4xQDHWlc804DFAkYEZzrdvMkB+ycB20\u002f0yQADyas\u002fLijNAhDURA28WNEAtuaQG7aA0QA61iUsrKjVA0vObcL+yNUDFTsS8rjo2QCufdEeowTZAt10GI+hHN0DTPNctcs03QD2+xOZVUjhAKOcNnInWOECgNchRgFo5QOSLnM3F3TlALsHeoIhgOkD8MhrF5uI6QOlBWFmoZDtAW1Fpl1QAPEDk9qXOZqE8QI8F13dKPz1A92178ujZPUDmRaQudnI+QDB1S2qZCD9A5rlGSN+cP0CzCBATkBdAQO6nVKnaX0BASSXa4FWnQEC26MJiE+5AQEGSrSsTNEFAe9VtwG15QUB4qe\u002fQLL5BQJe26W1gAkJAfygwVR5GQkAR3gy7V4lCQDxaZfMQzEJAxkG9Oz0OQ0Ce5XdAVVBDQFeeRvbUkUNABO5vf\u002ffSQ0AmCnJhxBNEQMlToUVFVERA\u002fN9hlHiUREDfZSZUS9REQOKpkWW+E0VA9O+pKt1SRUCixWp\u002f6ZFFQAgYysVj0EVAxT\u002fL6qcORkApfiY500xGQG8dI\u002fvnikZAQkg8E7jIRkADMBlmTgZHQHKHV39IQ0dA8AkbpnqAR0CVL3YRfr1HQITjzGFg+kdAmr2UXFA3SEBR2EhM9HNIQDzWmGRpsEhA44+3Sq3sSECuZ+e\u002fjihJQBgqN9cxZElAck2D++yQSUCgkJwcq3BJQHGzc\u002fazUElAHM79CgIxSUA0e+7EmBFJQBtByTRr8khAVZGvVC7TSEDRInGII7RIQBbNuZF2lUhAobJ5svl2SECk8NnRqlhIQAmGBfGHOkhA+1JiopAcSEA5QsDmwP5HQP\u002fcqxsY4UdAS5nm2pTDR0C8WtGnNaZHQFb7GOv1iEdAVE45pdprR0ALyB6J305HQI1K2HcDMkdAjUpCWUUVR0DK22ogpPhGQMw\u002foM0e3EZAljxfbLS\u002fRkAdvKERZKNGQBOPI9ssh0ZAiO9tCxBrRkBsEZZwCE9GQFplg6AXM0ZAK3vE4zwXRkD5vRKLd\u002ftFQL4ETO\u002fG30VA4+ldcSrERUBvsvp5oahFQCnFAnkrjUVAuAup5MdxRUBBjuSddlZFQJuL4Es2O0VArWDl4wYgRUBIPfvu5wRFQKbRCfvY6URA+M5VmtnOREBe1VRZ6bNEQDoeWu0HmURAnFsB4DR+RED00qnQb2NEQDRuuMqySERAjpaOdQguREAo1VcmZRNEQDQ\u002fKtDP+ENA9RtzLU7eQ0Dt+y562sNDQCjJeVV1qUNAHa6\u002fLRePQ0Cd3jx6wXRDQHLFKzd4WkNAe7uNTolYQ0A=","shape":"148, 1"},"fill":"tonexty","fillcolor":"#d62728","hovertemplate":"%{customdata[0]:.2f}%\u003cextra\u003eS&P\u003c\u002fextra\u003e","line":{"color":"#d62728","width":0},"mode":"lines","name":"S&P","stackgroup":"one","x":{"dtype":"f8","bdata":"gD3xIv5cgD8Aja\u002f45\u002f6JPwCdFs+BlY4\u002fwHX4fh4mkT9AAYiVJceSPwBqbg1qQ5Q\u002fwKeYdxOmlT8AXzSwvPWWP0CDnjOpNpg\u002fwOoFO8ZrmT+A+QNDLZeaP4A+lMZtups\u002fQMK9B7nWnD9A1RV\u002f\u002feydPwDa9QH5\u002fZ4\u002fwDdCoCIFoD+g0ewcMImgPyC8bzlZC6E\u002fQM+ZjZGLoT8ge3+6GwiiPwDsCE8CgaI\u002fYNhgJbv2oj9AmSTbpGmjPwAdjcEM2qM\u002fgNtpTDNIpD8gKs8ITrSkP4AQN6KKHqU\u002fwHi7ExCHpT9AeLPX\u002f+2lP8B70ut2U6Y\u002fAJPwyI63pj\u002fgGW6oXRqnP6D4ZkD3e6c\u002fwA8nvmzcpz8AYWGkzTuoPwAs8fQnmqg\u002fQHx+Coj3qD\u002fAnckW+VOpP8BPOzKFr6k\u002fwEToijUKqj+gy648EmSqP6ClrjMjvao\u002fwIHwIm8Vqz+Ajnde\u002fGyrPyDzad7Qw6s\u002fAEBSiEwZrD9A0PMjR2ysP4BGk3zxvKw\u002fQKEgWH0LrT\u002fAkbMOFFitPyDBeNraoq0\u002fwNBzqPHrrT9AJ43LdDOuP+Ba4hN9ea4\u002fQEqhriC+rj+gVVxYcwGvPyA3KdiGQ68\u002fQCfZDGuErz8Aby1cLsSvPwDmHeRuAbA\u002fcF0fjEIgsD8An\u002fOelz6wP+Cl5RBzXLA\u002fEOBEetl5sD9Q3fafzpawPyBRitxWs7A\u002fUFfHgXXPsD8wihXSLeuwPzAYkM+CBrE\u002f8H6OV3chsT9QJj8nDjyxP0CyHK9JVrE\u002fEFmiKSxwsT\u002fA3Edbt4mxP4BnxgHuorE\u002fcB\u002fbeNG7sT9gunpSY9SxP5Aw3y2l7LE\u002fEMPJ45gEsj\u002fQKJvWPxyyP4DbzgOcM7I\u002f4BahYK1Ksj+w32\u002fPdWGyP3DZx1v2d7I\u002f8GV+zS+Osj+wf5G9I6SyP4AxJvTSubI\u002fYOcIYj7Psj\u002fQKRlCZ+SyP5BKDx9O+bI\u002fgHOW5A0Osz8Qa5CQ9SKzP1C0wpdnN7M\u002fcHlIB2hLsz\u002fQVsyC+l6zPzBGVJsicrM\u002foBt6eeSEsz8Andg8QpezP8B\u002fYRA+qbM\u002fcJJZHtu6sz9wTb7UG8yzPwD73nkC3bM\u002f0J2vLpHtsz8wVzz1yf2zP\u002fCeeK6uDbQ\u002fQEXeHkEdtD\u002fg28zwgiy0P7Din8B1O7Q\u002fQB\u002fi9RpKtD\u002fgHl3\u002fc1i0P6DNNS+CZrQ\u002fwLwbxUZ0tD9weI3vwoG0P6DV7Mz3jrQ\u002fwK6HbOabtD9ACorPj6i0PxDM2en0tLQ\u002fQMzwnBbBtD9wW1DS9cy0PzDgsVKT2LQ\u002f8HUg5O\u002fjtD8A48NCDO+0P\u002fDhaCHp+bQ\u002fYFoAKocEtT\u002fArhb+5g61PzC5QzcJGbU\u002fkO+TZ+4itT\u002fwHIYblyy1PyDyxNQDNrU\u002fUKuqETU\u002ftT9guIRJK0i1P5BgvO3mULU\u002f8CQTamhZtT+wiGYisGG1P2Cujn2+abU\u002fgDqT1JNxtT\u002fwtq9+MHm1P1CqHvSUgLU\u002fcFQTPMGHtT\u002fQws3stY61P8DV4xlzlbU\u002fQFZc2fibtT9ga6qQR6K1P9DQjnFfqLU\u002fIFKk70CutT+Qh8Up7LO1P9Co0QRhubU\u002f4GlVr8W5tT8="},"y":{"dtype":"f8","bdata":"8Hx3GHlFAj6LgMJCt3ygP7UODL2OgqU\u002fzXTLcniaqT8n14e3kTetP3wk2fBpQ7A\u002fxHqwTwfSsT9gJFNFvEqzP\u002fRQTG7ItbQ\u002frnWlzUkUtj9wjqzohWm3P+zXj7pKt7g\u002fgg4sVfj9uT\u002fH7WDcFj+7P7+bmL18e7w\u002fqDkdZq6zvT9Db3d4WOi+P5yXb9uqDMA\u002fAGV3ZCC\u002fwD8eF+g4jJDBP3\u002fZKU3TXcI\u002f2qR2AnAmwz8oNggzS+vDP14PxaVjrcQ\u002fc9v9dYdrxT9wh3h\u002fpifGP+IwJkeL4cY\u002f43zEMD2Zxz\u002ffKl0nI0\u002fIP5nZsTyUA8k\u002fihvEp1C2yT8vSRDLlWfKP2RYXqhBF8s\u002fp\u002fpWwxPGyz\u002fdOyTdEnTMP+\u002f+s2XXIM0\u002fHdRPQa7MzT833aJjnHfOP96CQ6K1Ic8\u002fAK2MlO3Kzz\u002fh5HW56znQP0pP6TvvjdA\u002fCeJGH5\u002fh0D+hIKCSDjXRP0PYx9IZiNE\u002fY+wuQrvr0T8XTBgo0VLSP\u002fVpVr3dt9I\u002fGWW1htIa0z8EDruYdHzTP1IDTyWL3NM\u002fqL5BLnA71D9gFddVCpnUP09mQ8SS9dQ\u002fIJamwxFR1T+r9g3vnavVP+3ZJUI3BdY\u002fS+hEH\u002f1d1j8p47fs+7XWP8HAxDpIDdc\u002fUUiu3f1j1z+5MC\u002flCbrXP9wCY9txD9g\u002fWrAvayVk2D946NYKv7jYP6LzHLaVDNk\u002f++j\u002fHfVf2T+rVCHj5rLZP+PbXWN3Bdo\u002f8Sj4lKRX2j8doUUuVqnaP+7tzk6N+to\u002fipmHiFhL2z+IvzYoDJzbP1LhNdQE7Ns\u002fBrjGNrg73D80wEXOS4vcPwm1IonC2tw\u002fSilNYOEp3T\u002fG9T5FtnjdP6aOWzLDxt0\u002fAO7a3hcV3j+\u002f4DC6MGPePzgjgTUfsd4\u002fNt7SLh\u002f\u002f3j\u002f3wkjSvUzfP5Whw4Agmt8\u002f+YStNkTn3z+30bL19BngP4Dd5eUfQOA\u002fpd\u002f3oMBc4D8KcW6XG0jgP3EMSmCmM+A\u002f36ysd10f4D+SbWUNQwvgPzfONLSd7t8\u002fOu0TtKHG3z80nV3N5Z7fP2SBNQKid98\u002fP366xZtQ3z8PC8Vo0CnfP861d109A98\u002fSxiIF+Lc3j\u002fYAkh5ubbeP0aBx7LCkN4\u002fIxZ5+ftq3j+VsSpmY0XeP43lcRjzH94\u002fdpdTd7H63T+JFG8BmdXdP7VAe0eosN0\u002fdzbk4t2L3T8XD2p7OGfdPwXhwsm2Qt0\u002fbsj0lFce3T85LiuwGfrcP4kdx\u002fn71dw\u002fmTKhDgCy3D\u002fIKm5IH47cP7CqvK5batw\u002fTA6+VrRG3D9o\u002fRdgKCPcPwgv3PS2\u002f9s\u002fLfhtSV\u002fc2z8TLCKcILnbPwFtfjT6lds\u002fAA8gYuty2z\u002fjgk3980\u002fbP7yJpEwSLds\u002fi0htQkYK2z9wTmBGj+faP9\u002f3csbsxNo\u002fFWUwNl6i2j9QRLQB43\u002faP3Mcacl6Xdo\u002fTUzE9SQ72j+U0BYL4RjaP73U4Wmn9tk\u002fjWQxtYXU2T\u002fXEOH9bLLZPwXWKylmkNk\u002ftHUYjHhu2T8R3FrFnEzZP8Lim6DTKtk\u002fjCbCbRMJ2T+MthoNXufYP37yiZi4xdg\u002fnmDeHD\u002fD2D8="},"type":"scatter"},{"customdata":{"dtype":"f8","bdata":"vwNtkhPNTUAQ2C5QJYlJQIdG1GQc7EZA+th3S9DKREBBy5Mhi+lCQBrhAMiRMEFAtzbganklP0C2mQ2CABQ8QGIpQ2y4IDlAzCaLwolGNkAQ+vIn\u002f38zQB2IXxezyTBALyfHCLtCLEC5ZdWE+wgnQB+G9vDK4yFABF9h0dqgGUAuF7\u002fNCjQPQP6PB64lsvY\u002fRj9g\u002f1FI7D6\u002fNS6sjcdEPlcYER1tnb8+yW7w5a7zxz6uT2XTypa5Po8cemXhyKU+IWqKSxw6pD50pE1hYBSwPgUrY2KwF7k+T34g2uTJsz59808JRp+mPu\u002fK9nl98QU+VhtAsfHtET6Gi3OkG9BmPoDVbqcFApk+naF6kcRbkz7DzvsSq5Z7PpCVDNiz14A+fq3wqjjPfD5ZIV71Aj15PkdZCYGdqnw+JtCQwpQ3iD6kdRg9\u002fTikPr9U5jwZQww+0jEDMrg4HT4ctSv\u002f1nBvPuKPqkaprns+BspqGMXYYD6yAn+RSyuAPr4cVUaLP7g+ODYME2vmYD4\u002fXowHoGd+PomcYoChUZQ+1TPVXY6KUT55Gc\u002fCp6djPpuFoe2qWWI+0geR5q7aWj7+4cnbOwpUPh07BuX6gFk+hRI4bEF8XT72UiuK+2BgPoow0MIQhl0+KNgohr\u002fYUT4GNeeF1AFLPnp8Z5G6NVE+IeXMr\u002fVmfT52GCqdQh9xPgKztCwoXWs+q8Ms78\u002f6Yz4U0RHHSiRcPozYVLITLWI+hrrOrNzHYj5cxvdt4SpZPmyPPrw7gVQ+uLPPvLgkUT57a\u002ftOCmqBPgzAQ8SfIoI+dd+zqUksgD6IHvqqNBKEPhaikFVin3I+42Ts+5+LXT6fkNtxTJd\u002fPgOUK7I3toQ+v9YzUBaTcT6WmqAoX9ZqPkQX7mQYI3w+rhTGehbJST4aTGpp3PdTPmW5gYaLyVk+w7MnSZwxZj7DS+i3RXJrPju8Lm85Co0+A50nqNA7mj7QJRBfTuKSPgEACw1cqYc+7F8Csv8jkj4sxOcq6zCJPnJYJlJKY4o+H388mlD\u002faz5\u002fp5Eiy8yKPrZiRyq+jo8++x\u002f1Qoctkj5kxT8IFOGVPjTP8PSEZJ0+RtbTHUR2Zz4hol0ToFluPqZu4K\u002fezm8+wgpL6729ZD45rakGZ\u002f9bPi5R5n\u002fOHpo+LDSqnCn9lT7iqo+QGDqUPu95KVyYQZM+4qQTtyDakj5x6PNINwaTPgiO3hHw05M++ZudqxJplT4t6wSB7RWYPlF3dZ9ua5w+Ek73T9x2Wz7\u002fvqF9PTVjPheeN0VYfms+e\u002f3M47Tbcz5nOLFOZox8Po\u002fAeFnxKIQ+i0Lalwetiz7lfZercFOSPsoaU1S8Tpc+VJQK+2tonD7f77bNXQ9oPgdMfG0A1Gs+5DYBHxQ3bT4geYEao3dtPrQhXStpG2w+mE4VER+6aD6jsA\u002f68maVPm2pgeXN0os+9wOyuR00ez7B3AjtdA9fPs72+5mZ+Y8+1Nzab9CmZz7tPPLaS+tdPoZ21\u002f7Rn3U+g1RbZ6KreD4lfVa9vA1xPkQhhHdm2nY+x6YInl\u002fWIz6wT1HQKdJYPqkpBvfNHj4+eOo9jT9DYz4=","shape":"148, 1"},"fill":"tonexty","fillcolor":"#1f77b4","hovertemplate":"%{customdata[0]:.2f}%\u003cextra\u003eT-Bills\u003c\u002fextra\u003e","line":{"color":"#1f77b4","width":0},"mode":"lines","name":"T-Bills","stackgroup":"one","x":{"dtype":"f8","bdata":"gD3xIv5cgD8Aja\u002f45\u002f6JPwCdFs+BlY4\u002fwHX4fh4mkT9AAYiVJceSPwBqbg1qQ5Q\u002fwKeYdxOmlT8AXzSwvPWWP0CDnjOpNpg\u002fwOoFO8ZrmT+A+QNDLZeaP4A+lMZtups\u002fQMK9B7nWnD9A1RV\u002f\u002feydPwDa9QH5\u002fZ4\u002fwDdCoCIFoD+g0ewcMImgPyC8bzlZC6E\u002fQM+ZjZGLoT8ge3+6GwiiPwDsCE8CgaI\u002fYNhgJbv2oj9AmSTbpGmjPwAdjcEM2qM\u002fgNtpTDNIpD8gKs8ITrSkP4AQN6KKHqU\u002fwHi7ExCHpT9AeLPX\u002f+2lP8B70ut2U6Y\u002fAJPwyI63pj\u002fgGW6oXRqnP6D4ZkD3e6c\u002fwA8nvmzcpz8AYWGkzTuoPwAs8fQnmqg\u002fQHx+Coj3qD\u002fAnckW+VOpP8BPOzKFr6k\u002fwEToijUKqj+gy648EmSqP6ClrjMjvao\u002fwIHwIm8Vqz+Ajnde\u002fGyrPyDzad7Qw6s\u002fAEBSiEwZrD9A0PMjR2ysP4BGk3zxvKw\u002fQKEgWH0LrT\u002fAkbMOFFitPyDBeNraoq0\u002fwNBzqPHrrT9AJ43LdDOuP+Ba4hN9ea4\u002fQEqhriC+rj+gVVxYcwGvPyA3KdiGQ68\u002fQCfZDGuErz8Aby1cLsSvPwDmHeRuAbA\u002fcF0fjEIgsD8An\u002fOelz6wP+Cl5RBzXLA\u002fEOBEetl5sD9Q3fafzpawPyBRitxWs7A\u002fUFfHgXXPsD8wihXSLeuwPzAYkM+CBrE\u002f8H6OV3chsT9QJj8nDjyxP0CyHK9JVrE\u002fEFmiKSxwsT\u002fA3Edbt4mxP4BnxgHuorE\u002fcB\u002fbeNG7sT9gunpSY9SxP5Aw3y2l7LE\u002fEMPJ45gEsj\u002fQKJvWPxyyP4DbzgOcM7I\u002f4BahYK1Ksj+w32\u002fPdWGyP3DZx1v2d7I\u002f8GV+zS+Osj+wf5G9I6SyP4AxJvTSubI\u002fYOcIYj7Psj\u002fQKRlCZ+SyP5BKDx9O+bI\u002fgHOW5A0Osz8Qa5CQ9SKzP1C0wpdnN7M\u002fcHlIB2hLsz\u002fQVsyC+l6zPzBGVJsicrM\u002foBt6eeSEsz8Andg8QpezP8B\u002fYRA+qbM\u002fcJJZHtu6sz9wTb7UG8yzPwD73nkC3bM\u002f0J2vLpHtsz8wVzz1yf2zP\u002fCeeK6uDbQ\u002fQEXeHkEdtD\u002fg28zwgiy0P7Din8B1O7Q\u002fQB\u002fi9RpKtD\u002fgHl3\u002fc1i0P6DNNS+CZrQ\u002fwLwbxUZ0tD9weI3vwoG0P6DV7Mz3jrQ\u002fwK6HbOabtD9ACorPj6i0PxDM2en0tLQ\u002fQMzwnBbBtD9wW1DS9cy0PzDgsVKT2LQ\u002f8HUg5O\u002fjtD8A48NCDO+0P\u002fDhaCHp+bQ\u002fYFoAKocEtT\u002fArhb+5g61PzC5QzcJGbU\u002fkO+TZ+4itT\u002fwHIYblyy1PyDyxNQDNrU\u002fUKuqETU\u002ftT9guIRJK0i1P5BgvO3mULU\u002f8CQTamhZtT+wiGYisGG1P2Cujn2+abU\u002fgDqT1JNxtT\u002fwtq9+MHm1P1CqHvSUgLU\u002fcFQTPMGHtT\u002fQws3stY61P8DV4xlzlbU\u002fQFZc2fibtT9ga6qQR6K1P9DQjnFfqLU\u002fIFKk70CutT+Qh8Up7LO1P9Co0QRhubU\u002f4GlVr8W5tT8="},"y":{"dtype":"f8","bdata":"HiHV4psS4z9IiuD1xVfgP7eXipUuV90\u002f2prMkzOd2j+Rasf3LDXYP7u5mpm6ANY\u002flOX1Bgbv0z83BsE+UvjRP1O+IOnwFNA\u002fOPRVsT+DzD89nNB6wfXIP\u002fLMZTIOfcU\u002fZtEOQzoWwj+REWM5I3y9P6LUHHwi5rY\u002fX\u002f+FcfJmsD+YBJnVWPijP43Ctwf9DI0\u002fYKMUFM4Zgj48gspCB5naPRn74fPKO1Q+IEYf842oXj7BKPnOgWBQPnp2+C9o4js+xNn4QfvjOT7Isxs\u002f9pREPvlYujQpD1A+hEVxIVhUST7JvMyG1PQ8Pq1VeStjFpw9rGrh4iDzpj0Sxw6VVjP9Pc3kb0xLATA+6KXkAWLHKD41\u002f0SRG6gRPnuWJK76jhU+4BJxRCRwEj5swyciDCcQPkK++7i2WBI+CKSau3b\u002fHj4ZglLTi+I5Pj02YI12FqI9xJrEFamzsj22QP3qQR8EPhZcoJN2txE+tocscViQ9T275Fo\u002fTLIUPhIGGwioCU8+Upc4vNCh9T0eCY0jhXUTPmif5GYWAio+\u002fLLdbelz5j1TP2XQhCj5PWoRh78Dffc9U72uGMwv8T0wc9kEs6bpPVoRsheMUvA977nHMOLe8j3piOWHBPf0PejCcHIp5fI9H1ILZP\u002fX5j3lSkzv2UjhPadX\u002fzRVB+Y9PixaFEHREj4nw7C0kuoFPlNoaelMgwE+LRkGrfWS+T2Se7k3vwLyPU2abEDwQ\u002fc9WohaORAK+D1FNw+OcRvwPTgo\u002fscEP+o9majWTZDx5T1Wf4miSkoWPlfhsg+PNhc+gTIPfZGzFD4VJ0BB57AZPjDuhW1A1gc+upxPT7jo8j2PXDAB3zcUPhgunqbWgho+owiK4dR+Bj6J\u002fJmzCS0BPuQO4CH7ARI+KF8YOrKA4D0sV2mbLo\u002fpPSxi4iL9gPA9ndEyIHZo\u002fD2wY7N10JABPjCXZVHnlSI+fWTwIx\u002fKMD491HBv6SsoPtij0JVrSR4+nx6xh1E4Jz7Kh8fTTh8gPsSU78Ni4yA+mVuX3RTrAT56TAto6CYhPmpJxzllMiQ+QeG+LIREJz6fJT1SYQEsPjYemkCxzzI+\u002fjDmRAUI\u002fj1n2I1oj2wDPryYuMxvWwQ+NktqN3iM+j1D1XY3I+vxPYT2VWaOtzA+DyS7+1MlLD6nLJl79uMpPsy6pb3hpSg+2p8tjnEhKD6HKWFd4FkoPlKhEkozYSk+AVdj+sVnKz4HLYE0Y9QuPmcjdMxGMDI+m6ItM8CT8T0yE6ZEEZb4PfoxvWmKmAE+x\u002fyf+iRrCT7m8FwyYEUSPq0pNLoBzhk+1DR3Qmu2IT5Y1BMZC3UnPsU2DvFr1S0+uyttllkuMj7BUUYw\u002fcv+Pb3eB29czwE+xZPNPJyyAj72ipqB7dsCPmm5wBsQ\u002fQE+hbZYKo6m\u002fz0Y4uAMDmUrPtXS9kCYziE+lNnDyAhpET7DoS6s7uDzPQlMeLTIdiQ+JC\u002fvhClG\u002fj30T3wb8yXzPVkIHpjZrQs+QRqoEwOUDz46d2TJJNQFPtI0VyiDQA0+zI0fblFkuT3rt9g9VMXvPS8GsjfqRtM9Zw0cbf+n+D0="},"type":"scatter"},{"customdata":{"dtype":"f8","bdata":"YjCJk2AfOT6zO90jxrunPrEz2QLQT7E+\u002fT6IXQzNgj4xD4CUnhTuPjef5OEFCcY+Wzx\u002fs5x37D47ULJtUKG0Pk7JPpkxWLg+fFd02O\u002fAqT7dKyXASRDSPgegnEyiubs+hdp1tt6yiz4W7lzJacaxPr7XIQDvUMA+luHtldcCrz7CUH28lqyRPpJQpBPfNYE+\u002f1rC2wr80D6PQLMKdpQzPpzrVGlUELo+2wp+MXcSyj7M+hbBoinBPjCebYQbFqo+q+bFK1pZrD5hcAXzLsC3Pg\u002fis4pchMM+vu6qdejCvT7SWmyFd\u002fawPjairLyPXxA+XNZhG4XyGz7co4jtPelxPlU10WnlRaQ+sditpPCWoz46zQYkLjqIPvOD7keLmYk+wmssFWO8hj5qS2ufGreEPiVwsxIuPoc+oHXJGCW1kj6CEta2A52tPtNFyeNtzhQ+nvtb+8bfJD72YLKHdKt7PhWX0\u002fRZ8os+2Gs5grGwcD7TE5B3CzOPPmovFYxMZcg+2DdrWOKgcj6o1oWoHSSRPkDQ81NKIKc+1cFiAg3RYz5m6qXjQmB2Pg9BxP9RQ3U+Fn5sEEg8cD5JhNWQBi5pPueJglmJhW0+6ovKb5ylbj5S8ef49PBuPqot6idwiWs+bp8nN1ojYj4XhZXm4mRiPs9Kuimzz28+Hl75x8qvlj6K3Eye6mKJPo7nbwWgAIU+fTnE4JHRfz6\u002f4Obnklp3PrwnHJz1u38+ext2UC\u002fugD7CqO9Jvel1Ps+wemIxJXE+rlSSuqpFaj6VTeq0OV2WPmQAkeCiMZc+MVSELh6olD5Vr8ym5tuZPua9bsHYQ4g+k4eiLidccz7R4LRlrMWUPpSkJqOlF5w+ePM2iym6jD7PLE0eykyKPrqZKk\u002fbpZs+1mCHIPJTZz7sqoT3jT1xPjX0LYLHgnU+EGsBQMMcgj7kjJNRicaDPuPDb6zWaaQ+c6rYHUY4sT5AkM+zVu+nPqpV7yBgaZ4+rbsuY1hApT4MXLdB5qSbPg7D6H9Xc5o+ub1Ri4ODeT4F2dxyT\u002fSdPlOs9JFrWqE+\u002fabyrzSyoz70BID6EWKnPjbap2NGA68+\u002fa\u002f5fF12eD61lhDuJ0p\u002fPtOq3ogNOoA+3sinL8v3dD53KDVRiQ5sPsYq4jgm9ak+qGSu4batpT7bEZZmksmjPvl5\u002fkR7sqI+H0tLebUsoj7F0ymjYDeiPqbQipHg3KI+OPQ\u002fM\u002fI9pD6OP6PceaKmPjJz0r56jKo+9IeJ\u002fyOCaT4cgMHlZb1xPkfaLCbQQHk+dq4zeYgkgj7IRIcDQfKJPiJPLr+pOpI+PMyvE5rmmD4HAFkveGigPpAHX7jMxKQ+AS19ZNoxqT75vaf3qE11PlaadhZchng+QlDrloqgeT7XFNZV6Ll5PmP88x6Ca3g+kLLTTBxgdT4g1bKBEl6iPqIPkRJfv5c+S79d3UkThz5OkxiSwihqPtQLsRBl+Jk+UnJjPfzdcj7XwRXWY5ZnPiJr9TxZyoA+RnDuOqb7gj7d53C97QJ6PnDfJqFjMIE+bX61Sk6yLT7UzSv4yIpiPvRRHBJVe0Y+KAhiFtjbbD4=","shape":"148, 1"},"fill":"tonexty","fillcolor":"#aec7e8","hovertemplate":"%{customdata[0]:.2f}%\u003cextra\u003eT-Notes\u003c\u002fextra\u003e","line":{"color":"#aec7e8","width":0},"mode":"lines","name":"T-Notes","stackgroup":"one","x":{"dtype":"f8","bdata":"gD3xIv5cgD8Aja\u002f45\u002f6JPwCdFs+BlY4\u002fwHX4fh4mkT9AAYiVJceSPwBqbg1qQ5Q\u002fwKeYdxOmlT8AXzSwvPWWP0CDnjOpNpg\u002fwOoFO8ZrmT+A+QNDLZeaP4A+lMZtups\u002fQMK9B7nWnD9A1RV\u002f\u002feydPwDa9QH5\u002fZ4\u002fwDdCoCIFoD+g0ewcMImgPyC8bzlZC6E\u002fQM+ZjZGLoT8ge3+6GwiiPwDsCE8CgaI\u002fYNhgJbv2oj9AmSTbpGmjPwAdjcEM2qM\u002fgNtpTDNIpD8gKs8ITrSkP4AQN6KKHqU\u002fwHi7ExCHpT9AeLPX\u002f+2lP8B70ut2U6Y\u002fAJPwyI63pj\u002fgGW6oXRqnP6D4ZkD3e6c\u002fwA8nvmzcpz8AYWGkzTuoPwAs8fQnmqg\u002fQHx+Coj3qD\u002fAnckW+VOpP8BPOzKFr6k\u002fwEToijUKqj+gy648EmSqP6ClrjMjvao\u002fwIHwIm8Vqz+Ajnde\u002fGyrPyDzad7Qw6s\u002fAEBSiEwZrD9A0PMjR2ysP4BGk3zxvKw\u002fQKEgWH0LrT\u002fAkbMOFFitPyDBeNraoq0\u002fwNBzqPHrrT9AJ43LdDOuP+Ba4hN9ea4\u002fQEqhriC+rj+gVVxYcwGvPyA3KdiGQ68\u002fQCfZDGuErz8Aby1cLsSvPwDmHeRuAbA\u002fcF0fjEIgsD8An\u002fOelz6wP+Cl5RBzXLA\u002fEOBEetl5sD9Q3fafzpawPyBRitxWs7A\u002fUFfHgXXPsD8wihXSLeuwPzAYkM+CBrE\u002f8H6OV3chsT9QJj8nDjyxP0CyHK9JVrE\u002fEFmiKSxwsT\u002fA3Edbt4mxP4BnxgHuorE\u002fcB\u002fbeNG7sT9gunpSY9SxP5Aw3y2l7LE\u002fEMPJ45gEsj\u002fQKJvWPxyyP4DbzgOcM7I\u002f4BahYK1Ksj+w32\u002fPdWGyP3DZx1v2d7I\u002f8GV+zS+Osj+wf5G9I6SyP4AxJvTSubI\u002fYOcIYj7Psj\u002fQKRlCZ+SyP5BKDx9O+bI\u002fgHOW5A0Osz8Qa5CQ9SKzP1C0wpdnN7M\u002fcHlIB2hLsz\u002fQVsyC+l6zPzBGVJsicrM\u002foBt6eeSEsz8Andg8QpezP8B\u002fYRA+qbM\u002fcJJZHtu6sz9wTb7UG8yzPwD73nkC3bM\u002f0J2vLpHtsz8wVzz1yf2zP\u002fCeeK6uDbQ\u002fQEXeHkEdtD\u002fg28zwgiy0P7Din8B1O7Q\u002fQB\u002fi9RpKtD\u002fgHl3\u002fc1i0P6DNNS+CZrQ\u002fwLwbxUZ0tD9weI3vwoG0P6DV7Mz3jrQ\u002fwK6HbOabtD9ACorPj6i0PxDM2en0tLQ\u002fQMzwnBbBtD9wW1DS9cy0PzDgsVKT2LQ\u002f8HUg5O\u002fjtD8A48NCDO+0P\u002fDhaCHp+bQ\u002fYFoAKocEtT\u002fArhb+5g61PzC5QzcJGbU\u002fkO+TZ+4itT\u002fwHIYblyy1PyDyxNQDNrU\u002fUKuqETU\u002ftT9guIRJK0i1P5BgvO3mULU\u002f8CQTamhZtT+wiGYisGG1P2Cujn2+abU\u002fgDqT1JNxtT\u002fwtq9+MHm1P1CqHvSUgLU\u002fcFQTPMGHtT\u002fQws3stY61P8DV4xlzlbU\u002fQFZc2fibtT9ga6qQR6K1P9DQjnFfqLU\u002fIFKk70CutT+Qh8Up7LO1P9Co0QRhubU\u002f4GlVr8W5tT8="},"y":{"dtype":"f8","bdata":"m49N2RQU0D2J0Yue\u002fWA+PgHmkFW4KEY+v9XrqrMQGD4VmcJ9ZUCDPlG30miCNFw+MOllXhI4gj4ipEoHFWhKPsCvCD81KU8+6Yn4x3p7QD7Tf4G4Fh9nPg\u002fX\u002fVl8vlE+S8naIii6IT7KByVoh8BGPjHrxJl54lQ+vB8T5dvYQz6Iwy9DeZ8mPpx7LvCDBxY+9IjuiX69ZT5bceVA8w\u002fJPWQw2oBKrlA+3liYcaivYD4FQcGQ2vdVPuHVjSH9sUA+gg7llrQkQj4qSL9+omZOPsGHx7tX+1g+4Ebo5BkMUz5p0A+MW7ZFPlnuBd0y9aQ9bpNnjOTisT1DvVIRHO0GPgc6SSsR8zk+pfYbix8TOT5+041rygIfPuOR6qhEYiA+p6gFbRgaHT4h+vkd+YMaPsmZN\u002fk6wB0+Pt4BARvyJz4\u002fcsZq2fNCPmowxFbUoao96eXR7wi4uj1WH5tMabURPtDlm+7I4iE+hZ7OKwxdBT5UfT1rtfcjPkD\u002flZT7OV8+msxL9ivYBz4AHXjNyfAlPpAKYb34mT0+Ytm7SoFd+T22c4KoLKQMPq255jJzNws+82N2UgrIBD4G5JLXdB0APvp2pcjS5AI+6Ohi6zCdAz7EUg+Vac0DPsnflfCjnwE+CPU8t3039z2YtHffX4v3PaMlycj3WwQ+1QfjUfkJLT6Wysp5Tj8gPvPq1oEU4ho+\u002fldzKSpdFD5HuVoUk+QNPhxhoYJVTxQ+S6irrsGrFT4C2OBodwwMPvVSfrsq8gU+E7E0RG3QAD4v3lTdSaAsPlekkKQssC0+C037eMpwKj7GMraTvIwwPqyMWu0pDx8+YFGxO+DHCD7EH4E6n5YqPmkXqHKn+jE+V4ey8qliIj4eWlo8\u002fNQgPkTdtAnUsTE+83vgMxfc\u002fT1sS76OWREGPmMFbnOtiAs+HzdoZg4vFz4ZqontC1AZPrIjPcgSITo+BH5xMJcKRj7DPcxW\u002fqI+Pk5LHuyjdjM+3WD+VaQzOz7fY0w0N7ExPuoqyKOo7TA+GsFxOitUED4ilZf3tyszPmqA8T9MNjY+Oeru\u002fwU2OT44gRR+K+49Ptu+I88i2UM+tB4r09NPDz4sf4X0fwYUPkF0WgswxRQ+1B9mo8bWCj6eOFXD0vQBPmAbIEPlnEA+pE2NaKK\u002fOz5MVMqX7lM5PgEX1UOy7jc+eRh\u002fpXdDNz6BTCuJH1E3Pqyk2nz2JDg+9sejGOToOT6XWzfn7fg8Pj81cjK\u002f\u002fUA+5NEkPUpTAD4ZKQxP\u002fbQGPkJOtvl6KRA+rG4jmwA5Fz6fxYnjCpsgPg1b6SdUVSc++8fWiX3fLz7qejTWmQA1PgDC\u002fuuAlTo+r5dk7ucfQD7EjHpRr0QLPlqSjelMZA8+SYXoGL9mED6UFzcY+3YQPvqUGTzuQQ8+63MjL01cCz6PBmoMp4I3Pixwr2mYZS4++nmMTlSJHT4TK00q7b0APkBPcQD5njA+A9pBlmEmCD56h2OhIzH+PX4YY93ifRU+yj0I5VlMGD5va6TftqUQPj4omIZ\u002fABY+g+ppyXkBwz0FylaF4rv3PZSwYUrTxtw9ir0+YDh4Aj4="},"type":"scatter"},{"customdata":{"dtype":"f8","bdata":"ISCKNIJ1QkCngmOtp9ZCQJxMAb5BDENAvaGCBOs3Q0DR9UeSoV5DQKzQN4LIgUNAZgFJFySjQ0ArBwXbVsJDQFJzBc6o4ENAaExiBMX9Q0AjuP9WOhpEQOAShiQZNkRA6LWO6nBRREBmp4GdUmxEQKZJzLTGhkRABEL7bMmgREAcVHo3SbpEQOfoRwzQ00RAX3qqod19REB7tuF705RDQHmjA16XsUJAuFp++gfTQUCs6UOXc\u002fhAQATTGeh8IUBAtue8XB2cPkDWeGpWn\u002fo8QPSEiUwKXjtAnzWfj7zFOUB0i0+A6zE4QDSabbKxojZAOfyrmSUWNUDSDQdViYwzQI6sewHeBDJAy5loKvaAMEA7R2jxQwAuQD4PMdDCAStAOL4LTdEHKEDp\u002fokghxElQCDwPIHZHiJAj2pM+lNfHkBnw8UZuosYQDgw1ryKtRJAFt8\u002fmjHRCUAiVRXZBoT8P2QWExa50tU\u002fnShEqFdwnz7HzgNdPyalPmcnrb3E19E+r5eEXgJUeD6nGsguBumTPpOqPq3okKk+STTkdlXXbj4qoWuxc1iAPjpWrwUXSXs+UjE6l6+Hcj7qqoS4IX1oPtelJpphsGo+FoLLHhh9az46V4vV0R1sPtofHsgcGmg+BZ8dClk6XD5NXdyjUalVPqAthqHdIlo+oCBaBZtuhz7mKaKiXNF3PiZKbAbvI3M+i7wL\u002fsAwbD70tC5pDAxkPoNqwJ+UK2o+HK9PrPQNaz7eMCDCILBhPrDp5jjfvFc+Ge8G+\u002fXoUz53sH+ieH2FPpzVPg134IY+muU1xfiQhT6E8S4YBcGLPnuIE+c9Jno+n1xNSrnUZD5V926SlzSGPiqmUUIWJYw+7+WS8MJWeD4L0eHevhxzPo\u002fnCbwpT4Q+Gpf1z+x0Uj6BlVDtNFZcPhUqv3U5IGI+5oHXLNz0bj6oGShj2KZyPvaRS0AkkpM+NO5USOtvoT45+3P4z+mYPhmTOZ1hQ48+gzN0J2eOlz7q8PAjBxuQPuD9PWLxlZA+T6k6HdxkcT7z+xJOY0SRPjqO0MCePpQ+6yV\u002fmpk6lz4eYma8udqbPsoyt777pKI+d+x8M8SqbT7Om2yuxyBzPm6\u002ffv\u002fl\u002fHM+ShI0j1n\u002faT6cjTlPTYBhPtaeMTV7SaA+xD3bizdbmz56r5bSGRuZPlkn50ns2Jc+DR5Bj+VLlz4C1Zbc5XWXPhsiNm8YZ5g+8a5Kt7ZMmj71t\u002fd8zYedPiDwdXbhY6E+oZv7d5HGYD7xEk4Sn2xnPllXOG5fvHA+edzlPMwieD4TBirnGlKBPsY7cARebIg+YJ1EMOG8kD6DvIS1ryGWPtsNIsmgGpw+tt8SZLsZoT6bc\u002fNctu9sPiY4tFpDtXA+W01czmGDcT5sjIVqy6JxPtrdmmEyy3A+RtjUURx\u002fbT7qOWjI\u002f3iZPlQlmdghhpA+\u002f\u002fwST00egD7dGpPnplpiPoshTF2pspI+0BrTTRaRaz4SdJo7cGNhPghP4f4h+ng+zTMp4EJnfD568YcN3ZRzPpGPpW3QIXo+Hc\u002fAVxGlJj4spfpFGE9cPrDTGhcQK0E+Ue6T\u002fPL5ZT4=","shape":"148, 1"},"fill":"tonexty","fillcolor":"#2ca02c","hovertemplate":"%{customdata[0]:.2f}%\u003cextra\u003eReal Estate\u003c\u002fextra\u003e","line":{"color":"#2ca02c","width":0},"mode":"lines","name":"Real Estate","stackgroup":"one","x":{"dtype":"f8","bdata":"gD3xIv5cgD8Aja\u002f45\u002f6JPwCdFs+BlY4\u002fwHX4fh4mkT9AAYiVJceSPwBqbg1qQ5Q\u002fwKeYdxOmlT8AXzSwvPWWP0CDnjOpNpg\u002fwOoFO8ZrmT+A+QNDLZeaP4A+lMZtups\u002fQMK9B7nWnD9A1RV\u002f\u002feydPwDa9QH5\u002fZ4\u002fwDdCoCIFoD+g0ewcMImgPyC8bzlZC6E\u002fQM+ZjZGLoT8ge3+6GwiiPwDsCE8CgaI\u002fYNhgJbv2oj9AmSTbpGmjPwAdjcEM2qM\u002fgNtpTDNIpD8gKs8ITrSkP4AQN6KKHqU\u002fwHi7ExCHpT9AeLPX\u002f+2lP8B70ut2U6Y\u002fAJPwyI63pj\u002fgGW6oXRqnP6D4ZkD3e6c\u002fwA8nvmzcpz8AYWGkzTuoPwAs8fQnmqg\u002fQHx+Coj3qD\u002fAnckW+VOpP8BPOzKFr6k\u002fwEToijUKqj+gy648EmSqP6ClrjMjvao\u002fwIHwIm8Vqz+Ajnde\u002fGyrPyDzad7Qw6s\u002fAEBSiEwZrD9A0PMjR2ysP4BGk3zxvKw\u002fQKEgWH0LrT\u002fAkbMOFFitPyDBeNraoq0\u002fwNBzqPHrrT9AJ43LdDOuP+Ba4hN9ea4\u002fQEqhriC+rj+gVVxYcwGvPyA3KdiGQ68\u002fQCfZDGuErz8Aby1cLsSvPwDmHeRuAbA\u002fcF0fjEIgsD8An\u002fOelz6wP+Cl5RBzXLA\u002fEOBEetl5sD9Q3fafzpawPyBRitxWs7A\u002fUFfHgXXPsD8wihXSLeuwPzAYkM+CBrE\u002f8H6OV3chsT9QJj8nDjyxP0CyHK9JVrE\u002fEFmiKSxwsT\u002fA3Edbt4mxP4BnxgHuorE\u002fcB\u002fbeNG7sT9gunpSY9SxP5Aw3y2l7LE\u002fEMPJ45gEsj\u002fQKJvWPxyyP4DbzgOcM7I\u002f4BahYK1Ksj+w32\u002fPdWGyP3DZx1v2d7I\u002f8GV+zS+Osj+wf5G9I6SyP4AxJvTSubI\u002fYOcIYj7Psj\u002fQKRlCZ+SyP5BKDx9O+bI\u002fgHOW5A0Osz8Qa5CQ9SKzP1C0wpdnN7M\u002fcHlIB2hLsz\u002fQVsyC+l6zPzBGVJsicrM\u002foBt6eeSEsz8Andg8QpezP8B\u002fYRA+qbM\u002fcJJZHtu6sz9wTb7UG8yzPwD73nkC3bM\u002f0J2vLpHtsz8wVzz1yf2zP\u002fCeeK6uDbQ\u002fQEXeHkEdtD\u002fg28zwgiy0P7Din8B1O7Q\u002fQB\u002fi9RpKtD\u002fgHl3\u002fc1i0P6DNNS+CZrQ\u002fwLwbxUZ0tD9weI3vwoG0P6DV7Mz3jrQ\u002fwK6HbOabtD9ACorPj6i0PxDM2en0tLQ\u002fQMzwnBbBtD9wW1DS9cy0PzDgsVKT2LQ\u002f8HUg5O\u002fjtD8A48NCDO+0P\u002fDhaCHp+bQ\u002fYFoAKocEtT\u002fArhb+5g61PzC5QzcJGbU\u002fkO+TZ+4itT\u002fwHIYblyy1PyDyxNQDNrU\u002fUKuqETU\u002ftT9guIRJK0i1P5BgvO3mULU\u002f8CQTamhZtT+wiGYisGG1P2Cujn2+abU\u002fgDqT1JNxtT\u002fwtq9+MHm1P1CqHvSUgLU\u002fcFQTPMGHtT\u002fQws3stY61P8DV4xlzlbU\u002fQFZc2fibtT9ga6qQR6K1P9DQjnFfqLU\u002fIFKk70CutT+Qh8Up7LO1P9Co0QRhubU\u002f4GlVr8W5tT8="},"y":{"dtype":"f8","bdata":"h4+mqaag1z\u002fq7kGW\u002fxzYPwWLfNSbYdg\u002fRNkXvn6Z2D\u002ftG1xADMvYP717HuQK+Ng\u002fT+1xjr0i2T9qE3edrErZP5K8\u002fOh7cdk\u002fSHbuvb6W2T9LhXr0K7vZP0idq4DY3tk\u002fwzp5NtgB2j+Nt5vJQCTaP\u002fOlYRAdRto\u002fs4eTOWhn2j9XsyHMC4jaP3m5o2G4qNo\u002fy\u002fjPSbU62j9BMQLcahDZPxZ10YyO7dc\u002fmYhuDa7Q1j+p7Vbg5bjVP7Onupm+pdQ\u002fsvomCB2X0z\u002flD5YY64vSP0Cxn6Hdg9E\u002fZtC3KI1+0D8aTHquN\u002fjOP2ucRF81+cw\u002fXS6zxKD9yj+ItVCBzgXJP7aA0VN4EMc\u002fI6Z7afMfxT\u002feDvuuXjPDP4T\u002fuJnOSME\u002fUpfRlVPCvj+l1eMzt\u002fe6PxVSBj+6Mbc\u002f9TnpvjVwsz9l2xumK2uvP9fCqxqd8qc\u002fk1s9TuKFoD8\u002fLPlhBECSP9J472MB72s\u002f1b2wa\u002fAeND633wSgPBI7Pjz\u002fbGO+1mY+CT2VEtojDz4JdLjfMHwpPjVEhN+9XEA+515KfwO9Az5UpQQ1GewUPk68WyJ1dhE+fs4C\u002f+q3Bz7QsSQVfVj\u002fPZSnali5FAE+BElZhL2XAT7yvBvGmv4BPjZmynC+2f49VShG09wQ8j2L\u002fGsZArrrPdeNnXEnuvA9ADQXETf+HT5Fpn2In3wOPqxUqUXqfwg+MGSC9LgKAj44gVqlBan5PeNihUe7vwA+3zw9l5xQAT7VH3v4AKT2Pez3jWdlYu49STyYIhx86T2trq0X4oEbPgWrWndGSB0+VWOrBtiaGz6SmuB1NsMhPoyK45NQvBA+y4B37uKp+j13t9UhR2wcPoHGH3JBAyI+USZB7F8nDz5\u002fXdnftnYIPltRfb3t\u002fhk++IOWcOef5z2asbg7sSLyPaoCrb98M\u002fc923F1EunPAz7CcrhLzd8HPgjukzP7DCk+BbZsANFRNj66nfCPmeMvPudTOf4pAiQ+x+Xwb+omLj74zZrHeZ0kPpDeOpLOOiU+1l0sG6lDBj4Y3Nq1GBomPtqCzfbA6Sk+I8p55KW7LT6YCy0SqtMxPn1VjjFr3Tc+8DBah6b8Aj7KVkPf4HsIPhyjCEehlQk+qjSchGyjAD6z8ipbyWb2PaGDP6Dv2DQ+kv7TEQ+CMT6WUds0WBEwPhZRZStNhi4+dyYgrcnRLT6SYnmfjAcuPiNAbjxIPC8+NHp30e\u002fUMD5VD4oSRuYyPj2utUVoQjY+urKyHgx59T2G+TrkrPv9PTXWZkX\u002fawU+ScjodtzkDj43RUqOpysWPt\u002fbwrMHQx8+ccmAXKVsJT68LosbFFQsPjqY4tyP\u002fDE+HBRqOH\u002fjNT6MDKaX74QCPmQz0pLlYgU+qNO9obpqBj5s+4Hk75IGPpK12s74fgU+5Z7u9rXgAj5ttEKAcE0wPlfyFbmRJiU+PKqnoqqhFD6\u002fsSJHRn73Pdt8OETt7ic+11iRJ4mkAT6nQohW10H2PQrgNG99+A8+ojW+cJstEj6SSY8bdxAJPuwydCd7uRA+JeCkKD\u002f8vD3pnNMDJB7yPcLbDTKu+dU9UxLcBTch\u002fD0="},"type":"scatter"},{"customdata":{"dtype":"f8","bdata":"NygSHtL2PD4g7u1xVUoCQA5PMv8aUxVA76+vZM9AH0BHiHQlSgEkQDK+0iJ4BShAaZa0eTDJK0AnzKd0IV0vQAJy98JyZjFAlsfhUgoQM0B+pclM\u002fq00QIfnlSNfQjZAfQsDypbON0B5fM+wQFQ5QJqqMUzT0zpAwLf+fEtOPEDaZ8izVcQ9QCB7h3NaNj9AHDfx2kMmQEAJdwtIL3RAQMY\u002fk77sv0BAlr8L9zMKQUDbz2XdOVNBQJptWQfRmkFA6FKq2EXhQUD+oyPC4yZCQGntUD7Ka0JAi83aDzCwQkAwjR4pkvNCQAI5VtymNUNAvHe4tcV3Q0AAm3++hLlDQMw2VhWB+0NAwQwexi08REC7pKmN73tEQPdDp6nWu0RAPMVz9j\u002f7REAkgpVybTpFQIgYbddQeUVAbO8FKPO3RUAX20uthPVFQEhTwpIcNEZABfMF0ftxRkCO5ZuSma9GQB7ATtc57UZAQ6ZHnnSCRkCsyoPEOeZFQEoVMA0ETUVAu6N\u002fGWy2RECOQoacOiJEQCGblfBVkENABsBaYE0AQ0D0ekkcM3JCQGXZsZW\u002f5UFA3vU9s95aQUC3JnYZcNFAQKG4V9FpSUBA+Von7kmFP0AZwVk2HHo+QOQrI44UcT1AdPVcMvBpPEB\u002fDWxoymQ7QJlNU\u002f6PYTpAsLj9al1gOUBd8ApJ\u002fl84QEX+hGiOYTdAMjqO4ZFkNkAre3b88Wg1QMKUu++RbjRAqDPYNVl1M0D5c95oYH0yQMhntdqvhjFALZJciDORMEBn4JLP4DgvQAOy2aB3Ui1AB81CytdtK0BdsT8\u002fk4opQJwVmW+YqCdAl31S12nIJUAFx3j94ekjQKt5TkOfDiJABbqTLjYzIEDS+iTTObIcQG5TcPFMABlAYWRNN+ROFUBfydGnMaERQGp0KSBe7AtAdxgtx8abBEBV7a7YQaj6P4YDLKkHTug\u002ffCrIiWWmJj8ww4WmeFryPkhnius0AuE+mXwPVFmEuD5x6FD1hS6kPpNsnbYcl5k+gtNhqsDddT6Ixg8nNfvAPkfGyFYQL8I+mPePbKpMwz4U+olF6Z\u002fFPon1hDTyQ8s+5lleRm+SlD6YS2QBIkqZPj7bbS78UJk+f8ndJU61jz7A0WawnaGEPinxCzewnMI+uACbUb9hvj5BLtaFnCW7PteigLpVJrk+c38YODEBuD6df3EMzae3PiVYOsKCHLg+no+7wMx+uT6PYLEUvx28Pnx7GE\u002fCRcA+7JtTRKrhfj5DNibzHzmFPkiaxLFd340+usZPO0s7lT4YMF40pw2ePppG+Pt+6KQ+m6JsuwlLrD7aE58b+HmyPvKiATSoL7c+z6F6EV3luz494Lo5n3iHPv7WghH1z4o+Z4xvyNvOiz6y1H86IbaLPoniy9tuHYo+NJOKlg6yhj4NnOaez1SzPg7V8cSQ0ag+stz5kw7wlz6VJvU8sep6PtenXAT3xao+Bn\u002fW7uxfgz7Z0TLBp993PhH28ggACJE+FlZfmg8Rkz4EZ2RP1MSJPhT4dTz6upA+6ZMTuIKAPD51WTk6Wp1xPtLl8\u002fBfOlU+oi5iW8JAez4=","shape":"148, 1"},"fill":"tonexty","fillcolor":"#98df8a","hovertemplate":"%{customdata[0]:.2f}%\u003cextra\u003eBaa Corps\u003c\u002fextra\u003e","line":{"color":"#98df8a","width":0},"mode":"lines","name":"Baa Corps","stackgroup":"one","x":{"dtype":"f8","bdata":"gD3xIv5cgD8Aja\u002f45\u002f6JPwCdFs+BlY4\u002fwHX4fh4mkT9AAYiVJceSPwBqbg1qQ5Q\u002fwKeYdxOmlT8AXzSwvPWWP0CDnjOpNpg\u002fwOoFO8ZrmT+A+QNDLZeaP4A+lMZtups\u002fQMK9B7nWnD9A1RV\u002f\u002feydPwDa9QH5\u002fZ4\u002fwDdCoCIFoD+g0ewcMImgPyC8bzlZC6E\u002fQM+ZjZGLoT8ge3+6GwiiPwDsCE8CgaI\u002fYNhgJbv2oj9AmSTbpGmjPwAdjcEM2qM\u002fgNtpTDNIpD8gKs8ITrSkP4AQN6KKHqU\u002fwHi7ExCHpT9AeLPX\u002f+2lP8B70ut2U6Y\u002fAJPwyI63pj\u002fgGW6oXRqnP6D4ZkD3e6c\u002fwA8nvmzcpz8AYWGkzTuoPwAs8fQnmqg\u002fQHx+Coj3qD\u002fAnckW+VOpP8BPOzKFr6k\u002fwEToijUKqj+gy648EmSqP6ClrjMjvao\u002fwIHwIm8Vqz+Ajnde\u002fGyrPyDzad7Qw6s\u002fAEBSiEwZrD9A0PMjR2ysP4BGk3zxvKw\u002fQKEgWH0LrT\u002fAkbMOFFitPyDBeNraoq0\u002fwNBzqPHrrT9AJ43LdDOuP+Ba4hN9ea4\u002fQEqhriC+rj+gVVxYcwGvPyA3KdiGQ68\u002fQCfZDGuErz8Aby1cLsSvPwDmHeRuAbA\u002fcF0fjEIgsD8An\u002fOelz6wP+Cl5RBzXLA\u002fEOBEetl5sD9Q3fafzpawPyBRitxWs7A\u002fUFfHgXXPsD8wihXSLeuwPzAYkM+CBrE\u002f8H6OV3chsT9QJj8nDjyxP0CyHK9JVrE\u002fEFmiKSxwsT\u002fA3Edbt4mxP4BnxgHuorE\u002fcB\u002fbeNG7sT9gunpSY9SxP5Aw3y2l7LE\u002fEMPJ45gEsj\u002fQKJvWPxyyP4DbzgOcM7I\u002f4BahYK1Ksj+w32\u002fPdWGyP3DZx1v2d7I\u002f8GV+zS+Osj+wf5G9I6SyP4AxJvTSubI\u002fYOcIYj7Psj\u002fQKRlCZ+SyP5BKDx9O+bI\u002fgHOW5A0Osz8Qa5CQ9SKzP1C0wpdnN7M\u002fcHlIB2hLsz\u002fQVsyC+l6zPzBGVJsicrM\u002foBt6eeSEsz8Andg8QpezP8B\u002fYRA+qbM\u002fcJJZHtu6sz9wTb7UG8yzPwD73nkC3bM\u002f0J2vLpHtsz8wVzz1yf2zP\u002fCeeK6uDbQ\u002fQEXeHkEdtD\u002fg28zwgiy0P7Din8B1O7Q\u002fQB\u002fi9RpKtD\u002fgHl3\u002fc1i0P6DNNS+CZrQ\u002fwLwbxUZ0tD9weI3vwoG0P6DV7Mz3jrQ\u002fwK6HbOabtD9ACorPj6i0PxDM2en0tLQ\u002fQMzwnBbBtD9wW1DS9cy0PzDgsVKT2LQ\u002f8HUg5O\u002fjtD8A48NCDO+0P\u002fDhaCHp+bQ\u002fYFoAKocEtT\u002fArhb+5g61PzC5QzcJGbU\u002fkO+TZ+4itT\u002fwHIYblyy1PyDyxNQDNrU\u002fUKuqETU\u002ftT9guIRJK0i1P5BgvO3mULU\u002f8CQTamhZtT+wiGYisGG1P2Cujn2+abU\u002fgDqT1JNxtT\u002fwtq9+MHm1P1CqHvSUgLU\u002fcFQTPMGHtT\u002fQws3stY61P8DV4xlzlbU\u002fQFZc2fibtT9ga6qQR6K1P9DQjnFfqLU\u002fIFKk70CutT+Qh8Up7LO1P9Co0QRhubU\u002f4GlVr8W5tT8="},"y":{"dtype":"f8","bdata":"npQ0PHyJ0j32jDAhY2mXP\u002f0xDa2nS6s\u002fR7hRu4QAtD9GUvEvQJu5P7H9FxhSv74\u002fi0G78XDIwT9CHIrFpBLEP6awZZ2xRcY\u002fO\u002fVJnXNmyD9Zv3K+T3jKP1FR\u002fWrqfcw\u002foGAY7hJ5zj\u002fnWUf26zXQP4Elr4JoK9E\u002fKTjW86Ad0j\u002fT0UKmAw3TPwCCI33T+dM\u002f8KyG+dur1D+5JyOumA\u002fVP6FRYDGLcNU\u002fg9bbrJ7P1T+T9fLdFi3WP\u002fjTAaO5iNY\u002f4V9pw+ji1j+sx4nPBDzXP2gbUxI2lNc\u002ff22no8Lr1z9cJf7DAkLYP7BnRSSYltg\u002fdswzgjrr2D9wnYQ7Yj\u002fZP2wnO23Yk9k\u002fkRqX\u002faDm2T+dyEnePDjaP\u002fR\u002fPIcIito\u002fEJb6JjPb2j9C7oE2ESzbP3vN52+QfNs\u002fn44wXLzM2z8dYEIbixvcP4+TnLGpa9w\u002fRGrU7Nu63D+DbUJVugndPzuu3\u002fSbWN0\u002f+jBwbvHP3D\u002fSaccF+AfcP34l1zncQ9s\u002fifo8uhmD2j8mfhy+acXZP+1VY3GrCtk\u002f81HQj05S2D8ZvKVhapzXP4Eg+E6j6NY\u002fCPO\u002fnd821j\u002f0lybj9YbVP1Ps4F3Z2NQ\u002fYpZ\u002fRlgs1D8aZ2K8WYHTP0B4Pzy719I\u002fF53AC1Iv0j9Hef2eL4jRPy8dAq1H4tA\u002fhS5vbaw90D+LrlUBMTPPP4EcJRWD7c0\u002f0ALffLCpzD8jsm4knGfLP7Cf2zIhJ8o\u002fPsfrRCDoyD\u002fY+ibYuKrHPwq405L1bsY\u002fG7uA17w0xT\u002fH668ocfvDP8\u002fsJJojxMI\u002flBLjvvqNwT\u002f0rnoosFjAP9J3rzJxSL4\u002f\u002f6oXKM\u002fhuz\u002fyMTQ6Sn25P9FJCNH0HLc\u002fBkAZUG68tD8gOtqllV2yP1teXD4xALA\u002fNZ8l1kJGqz8yPytm45CmP+iwdo\u002f03qE\u002f4OGVb\u002f5gmj\u002fawDxNhg+RP6xgD8QyHH8\u002fEH7hm\u002fL9vD5nvJYSC36HPlIJLHVixXU+AYsyBbphTz5ye7lYJtU5Ps\u002f9bje2YDA+z7xokh\u002f9Cz4+g8z+bLxVPsEmXVB7Rlc+mYTCVw20WD5s+D9j961bPvFpDV8qc2E+8+3UTwlVKj4kJmnscS8wPmU6mJjUMzA+RzlvSxNLJD6Qugjsd2gaPl58QhPN0lc+n1y\u002fH8JxUz6vy6dVwF9RPkwWSMmIGFA+DvW4mdi5Tj7yPLrcbEdOPoyPxVTQ3E4+E7i\u002f4SZRUD7MPZDFjv5RPgXHXOor1FQ+O6G6K6DDEz6oePNVZiobPnaBxXFQHiM+nAi4GC0tKz7S9YMh8DszPlSDXOYxwzo+WUk7WYsbQj5AvVBMXKZHPtqxmxmkrU0+FFPyAHnaUT5thac\u002fCQsePv\u002fvhsPuKCE+lHj1xxHMIT5oaes5PrwhPhA\u002feFmttiA+yEsDed8MHT5jOP5ker5IPgjJP1iQxD8+7lcrs+mjLj75+UoICzoRPnVCZJyJIkE+WZjpZLTMGD7j7bs0644OPvc6QdjMzCU+l9RGDcJnKD42I7uE+H0gPg8p8w82aiU+bFTZTMQ90j0GXnKc+IsGPiFPvez\u002fK+s9zkZ8OiBxET4="},"type":"scatter"},{"customdata":{"dtype":"f8","bdata":"P1AEhKPWC0CT+DIdNVUVQGkn0\u002f6wBhhAmhW10Zw4GkA650duZSgcQMkTcYYT7x1A8I0VXTSZH0BxmixCLJcgQE9xFka4WSFAkRG7I\u002fcVIkA8Rx1HC80iQP8EzDzjfyNAPZ4mew8vJEDaBdyTS9skQLl5khLphCVAkCSL+k4sJkB7u8wCx9EmQPZrslJ3dSdAxjlpgWgZKED8hWkiHL0oQIjGL08pXClAfkurPx\u002f4KUCFsIPJfZEqQJ+btqjUKCtAELb\u002fMXC9K0DD0jDx8U8sQG1Oh8eG4CxAH0UlnlFvLUDFvm9XCP0tQGdjyvPZiS5A7UMiQwIVL0CKQD\u002fZ\u002f54vQN9gbefWEzBAftxPtelXMEATjIlYqpswQHTyniHp3jBARyxgjNQhMUB0a\u002f1wYmQxQBL5qwSbpjFANXFqWXPoMUDc9KbRDioyQAGAm0acazJAP68\u002fHMGsMkAttnEGqu0yQLtJo\u002fdiLjNAt1GDDWxTM0BtlOO0Um8zQHa7R4KbijNAxBSjWsqlM0Bw0pg7UcAzQPDYUPVQ2jNAZgI1KCT0M0DxjCbqhQ00QEUMTRqnJjRAY5P5aH8\u002fNEAXCBGQF1g0QJQYAkBicDRAzsl6IHWINECDrKKoUaA0QEz8wBkEuDRAOGrIs6HPNED2DU6fCuc0QO53Bcw6\u002fjRAHiquLBIVNUACUZ6vNCw1QJavmccFQzVA8FHIQrRZNUBssJRrQnA1QAHKVkG3hjVA+mHx2CKdNUApC9VUd7M1QETYVOihyTVA3+IFk6HfNUCDfdoNovU1QPqJn+BQCzZAs4foZO0gNkClYZVGiDY2QB1Y1a8hTDZALzIPr6RhNkBFV3GYEnc2QM2ulfEAjDZA+WapAzyhNkDUhRAjc7Y2QMkPZJWpyzZAzqqBmhnhNkDCK+DKUvY2QNqSK6RzCzdA4CQWbXkgN0DYayQTJTU3QCxSbomJSTdANJySl35IN0BtfcgqK9g2QNQsBCOxaDZApQH4ehD6NUBDfIW7Now1QFvOSSAlHzVApzOHKSOzNEBFiTyx20c0QPjPICwT3TNA1HrnbfJyM0CTPew4cgkzQNSOV8iLoDJArq3zijc4MkA\u002fWvVpcdAxQLzJp+8yaTFA4dmIpXYCMUDxfjOMN5wwQKmt4kx0NjBAglBJpEOiL0CMhOwVftguQA3Jj9GPDy5AG1gSMXFHLUB+NOP2GoAsQO3AnUGGuStAwCybiKzzKkD9yziYhy4qQJnWcYwRailAcSnmeECmKEB4VCIhGOMnQNGDHHqOICdAmJr0l55eJkDgUe3FQ50lQKJ5ZYJ53CRA8DxFezscJECT4iCLhVwjQOcgKbdTnSJAwHvULaLeIUDyN++1bCAhQJWiNhOxYiBAuZPNadZKH0Dy+Qy9L9EdQN4Pf+ZnWBxAfobo6HjgGkBUB1XeXGkZQORjun0O8xdAQycQVoh9FkBSJPNExQgVQIxbzQjZlBNAaLmrrI4hEkBqK5dkE68QQG7hedWEeg5AjnHPA\u002fmXC0DyL\u002fDuq7YIQKNpadSN1gVAlUNEO9b3AkDVpgRPcxoAQCI7ZIy6fPo\u002fsR+JUhQR+j8=","shape":"148, 1"},"fill":"tonexty","fillcolor":"#FECB52","hovertemplate":"%{customdata[0]:.2f}%\u003cextra\u003eGold\u003c\u002fextra\u003e","line":{"color":"#FECB52","width":0},"mode":"lines","name":"Gold","stackgroup":"one","x":{"dtype":"f8","bdata":"gD3xIv5cgD8Aja\u002f45\u002f6JPwCdFs+BlY4\u002fwHX4fh4mkT9AAYiVJceSPwBqbg1qQ5Q\u002fwKeYdxOmlT8AXzSwvPWWP0CDnjOpNpg\u002fwOoFO8ZrmT+A+QNDLZeaP4A+lMZtups\u002fQMK9B7nWnD9A1RV\u002f\u002feydPwDa9QH5\u002fZ4\u002fwDdCoCIFoD+g0ewcMImgPyC8bzlZC6E\u002fQM+ZjZGLoT8ge3+6GwiiPwDsCE8CgaI\u002fYNhgJbv2oj9AmSTbpGmjPwAdjcEM2qM\u002fgNtpTDNIpD8gKs8ITrSkP4AQN6KKHqU\u002fwHi7ExCHpT9AeLPX\u002f+2lP8B70ut2U6Y\u002fAJPwyI63pj\u002fgGW6oXRqnP6D4ZkD3e6c\u002fwA8nvmzcpz8AYWGkzTuoPwAs8fQnmqg\u002fQHx+Coj3qD\u002fAnckW+VOpP8BPOzKFr6k\u002fwEToijUKqj+gy648EmSqP6ClrjMjvao\u002fwIHwIm8Vqz+Ajnde\u002fGyrPyDzad7Qw6s\u002fAEBSiEwZrD9A0PMjR2ysP4BGk3zxvKw\u002fQKEgWH0LrT\u002fAkbMOFFitPyDBeNraoq0\u002fwNBzqPHrrT9AJ43LdDOuP+Ba4hN9ea4\u002fQEqhriC+rj+gVVxYcwGvPyA3KdiGQ68\u002fQCfZDGuErz8Aby1cLsSvPwDmHeRuAbA\u002fcF0fjEIgsD8An\u002fOelz6wP+Cl5RBzXLA\u002fEOBEetl5sD9Q3fafzpawPyBRitxWs7A\u002fUFfHgXXPsD8wihXSLeuwPzAYkM+CBrE\u002f8H6OV3chsT9QJj8nDjyxP0CyHK9JVrE\u002fEFmiKSxwsT\u002fA3Edbt4mxP4BnxgHuorE\u002fcB\u002fbeNG7sT9gunpSY9SxP5Aw3y2l7LE\u002fEMPJ45gEsj\u002fQKJvWPxyyP4DbzgOcM7I\u002f4BahYK1Ksj+w32\u002fPdWGyP3DZx1v2d7I\u002f8GV+zS+Osj+wf5G9I6SyP4AxJvTSubI\u002fYOcIYj7Psj\u002fQKRlCZ+SyP5BKDx9O+bI\u002fgHOW5A0Osz8Qa5CQ9SKzP1C0wpdnN7M\u002fcHlIB2hLsz\u002fQVsyC+l6zPzBGVJsicrM\u002foBt6eeSEsz8Andg8QpezP8B\u002fYRA+qbM\u002fcJJZHtu6sz9wTb7UG8yzPwD73nkC3bM\u002f0J2vLpHtsz8wVzz1yf2zP\u002fCeeK6uDbQ\u002fQEXeHkEdtD\u002fg28zwgiy0P7Din8B1O7Q\u002fQB\u002fi9RpKtD\u002fgHl3\u002fc1i0P6DNNS+CZrQ\u002fwLwbxUZ0tD9weI3vwoG0P6DV7Mz3jrQ\u002fwK6HbOabtD9ACorPj6i0PxDM2en0tLQ\u002fQMzwnBbBtD9wW1DS9cy0PzDgsVKT2LQ\u002f8HUg5O\u002fjtD8A48NCDO+0P\u002fDhaCHp+bQ\u002fYFoAKocEtT\u002fArhb+5g61PzC5QzcJGbU\u002fkO+TZ+4itT\u002fwHIYblyy1PyDyxNQDNrU\u002fUKuqETU\u002ftT9guIRJK0i1P5BgvO3mULU\u002f8CQTamhZtT+wiGYisGG1P2Cujn2+abU\u002fgDqT1JNxtT\u002fwtq9+MHm1P1CqHvSUgLU\u002fcFQTPMGHtT\u002fQws3stY61P8DV4xlzlbU\u002fQFZc2fibtT9ga6qQR6K1P9DQjnFfqLU\u002fIFKk70CutT+Qh8Up7LO1P9Co0QRhubU\u002f4GlVr8W5tT8="},"y":{"dtype":"f8","bdata":"j2ZzfQzRoT+ee0t3WE6rP7kT243iwK4\u002f8pK7cRLIsD\u002fJYL2iXwWyPznPhWpeKLM\u002f11rQRRc5tD9eDWKcYTy1P\u002f+5HMBmNbY\u002fh+0DD1smtz9N4ItGshC4P\u002fTIdb6d9bg\u002fY24xYNbVuT8rT2FCTLK6P2g12sVni7s\u002fpNLQxaxhvD90BC+deTW9P08PLCL\u002fBr4\u002fT9nir9fYvj8ZRbpzYaq\u002fPwWozLf7OsA\u002fCU+1UcyewD9+XAJY9ADBP\u002fXyIsjPYcE\u002fAIkepevAwT9em65Srx7CPzEy8Ik3e8I\u002fejanoprWwj+dZcIETTHDP5Ro\u002fMRsi8M\u002fRvjsU3zkwz93hf+zzDzEP4Rn8kZGlMQ\u002fT8golmjrxD\u002f6+gG5IULFPxos6qU0mMU\u002ftw+k3NztxT9XVm1dDUPGP6fi0anQl8Y\u002fOUlfxBjsxj+98d\u002f3EkDHP+1RqDv7k8c\u002fb2XMlF3nxz+11HI7czrIP9GbanpLjcg\u002f6iB\u002fRLO8yD8bQ0zdaeDIP8qTUWlWA8k\u002fGQayuyEmyT+ZF9gOFkjJPz7Y9mJdack\u002focWVuGuKyT\u002fY8crZ6KrJP1iA3VQTy8k\u002fSy1ehuDqyT+EZq+ZWwrKPyRnIYVzKco\u002fRSudAERIyj+yV1XszmbKP\u002fFCAfgjhco\u002fUhfDVl6jyj9QT8pGVcHKPzHhgZQD38o\u002fwNkwOUD8yj+wZ8AJ3RnLP\u002fMTVKMRN8s\u002fwuMU7xlUyz8kmp\u002fb+HDLP+O63123jcs\u002f7mhyC2qqyz9evOck\u002f8bLP4ozBppe48s\u002f9OSWIof\u002fyz8tjJK1sBvMP+SRW8NxN8w\u002fiVFxYhtTzD\u002fe97Tpwm7MP4GPJY9oisw\u002frX3qg\u002fGlzD85W3J7X8HMP7UI\u002fSoq3Mw\u002fm1DtDlf3zD+A3jPlfhLNPwu48N2lLc0\u002f1Q1UiBZJzT99TK4DQWTNP6cDQldMf80\u002fkL6CBjWazT\u002fhLfFVqrTNP2Gc84bEzs0\u002flDh+1m7NzT\u002fJqtfkpz3NP4qVDzf3rsw\u002fEStcxlwhzD90BQfwwJTLP0GNDEglCcs\u002fHULgU+V+yj\u002feCxAWlPXJP2c9NFflbMk\u002f0jZ6WQ3lyD+8oDjYAl7IP4rVZSm918c\u002fUN5gnTJSxz+OSkT4Xc3GPw+mUfU2ScY\u002furpxlrbFxT+HeQR21kLFP7kbS92UwMQ\u002fm+FXnOM+xD9kF7ZVwb3DP0YaCtgoPcM\u002fYzggPhW9wj+YIbDlgT3CP8szb2dqvsE\u002fHzHelMo\u002fwT\u002f06OZ1nsHAP5WTZ0XiQ8A\u002fkSASUx+Nvz+ZgO4VUpO+P0lrdvhPmr0\u002fmeQFrhKivD\u002fr7YswlKq7Pw0rY7vOs7o\u002fUga\u002fxry9uT8EIgEEWci4P63sFVue07c\u002fCg++6Ifftj9fPQlFEOy1PwYieZM0+bQ\u002ftLrfn+8GtD9o3cpFPRWzP2UUR4kZJLI\u002fPLIPlYAzsT9Ax8WibkOwP1eU7qDAp64\u002fdGUzRaTJrD+miu+fgeyqP\u002fFqyfZxEKk\u002fmc7bgDE1pz\u002faGFsa+lqlP\u002f+ulbGcgaM\u002fKF0eSvGooT+ScDPBI6KfP3WR973o85s\u002flgTInXhHmD8lbxqOvJyUP0ljSpeq85A\u002fkPWKU8WukD8="},"type":"scatter"},{"customdata":{"dtype":"f8","bdata":"GPCYFk2R6T9zeWISrRUHQCgmSTolT\u002fQ\u002fJPviIL93CECoqslpzeT3Pyq8eizR2QlA\u002fDdkpo\u002fL+j\u002f+nb444zsLQPSBpLkqV\u002f0\u002fPSiuX\u002fWdDECghfy0Van\u002fP+jtiFUHAA5ADkNvNb\u002fpAECvv+dqGWIPQDjqqGn77wFAWzSNtBViEECK1lMwtOoCQGqgWrweExFAZp8c3jLcA0AT\u002fTLCJ8QRQOwaW1wbxgRAq0zIyDB1EkDU0CPDpakFQMTHaM45JhNAwj8MjsCHBkDj+MPUQtcTQJoOSQsmYQdAjMmC20uIFEBQEoiJajYIQHZ+UuFUORVAHHdnGgYICUCiP97nXeoVQIoHMi1b1glA\u002fPr47WabFkDylb5pu6EKQNisMPRvTBdA1FNAbRNqC0Ctv+n4eP0XQGIwZ1OrLAxAAbfZAIKuGEDA8H2bk+kMQBtruwWLXxlAFlJnaoShDUAadEUNlBAaQHQvaZYRVQ5ACsBzE53BGkBQfWzuswQPQJeBQBmmchtA+GZlJ9CwD0B\u002fCu0gryMcQOnY4fbcLBBAt3i9J7jUHEDkBLtO3H8QQOEoEy7BhR1AVnZqj4TREEAoK1IwyjYeQPI1hODvIRFAGYK0NdPnHkCucDzoNHERQPCL2T\u002fcmB9A2PL7jGe\u002fEUAKChKj8iQgQDcEliuZDBJAhEPeJXd9IEA9clAq2VgSQB2o76b71SBAToSO9DSkEkDm9sIqgC4hQMgTbKi47hJADGxjrwSHIUBgalw3bzgTQEv7hDKJ3yFAEtEySGKBE0AaiM21DTgiQD6DzZmayRNA9BH0OJKQIkBOVj4PIBEUQHMTGLwW6SJAtnWF1PlXFEDflHo\u002fm0EjQBWPaD8unhRA3O9Vwh+aI0BlcWCAw+MUQHxSuEWk8iNAXuVL074oFUAjWNnIKEskQFRnzSklbRVARTTzS62jJEDxxcIt+7AVQGhVKc8x\u002fCRAAEKAysPzFUD30FFStlQlQLJ6FpSXNBZA6VNV1TqtJUAUD1OpnHMWQPIJSFi\u002fBSZA+n3Z7PmwFkAnqsPbQ14mQN5JfKvP7BZAqB7pXsi2JkDhVq76OicXQELRo+FMDydAFnuay1RgF0C4BSNl0WcnQKpGBj8zmBdAzqMG6FXAJ0D\u002f1oi36c4XQDbAG2vaGChAAgJuiIkEGEAgADjuXnEoQOUiCB0iORhArqlScePJKEARM+BYwWwYQBvrFPRnIilAqqYJonOfGEBBa7t27HopQLh+AzhE0RhABXs7+XDTKUBgt25EPQIZQNnH\u002fXv1KypA\u002fwHx+mcyGUAM4O\u002f\u002feYQqQHCoXOjMYRlA+W9tg\u002f7cKkAu02bKc5AZQGdhTgaDNStAGZ4Lz2O+GUC8op6HB44rQM258dmi6xlAuPsADYzmK0DCHpi4NxgaQFGUbJAQPyxAbXjHmidEGkAYaNkTlZcsQOunQZh3bxpAZKI8lxnwLEDLJVFkLJoaQK19eBqeSC1AV6bOeErEGkAq9JidIqEtQN2rUh3W7RpAh7GdIKf5LUCE1pwh0xYbQIJz2aMrUi5AKasNAUU\u002fG0AzczYnsKouQOxIoH4uZxtAKznnqTQDL0C4Acbik44bQB8\u002fLC25Wy9AH2HWTHe1G0DdMm6wPbQvQDbD3zDb2xtAV+6tGWEGMEDhu6wXwgEcQEAEd1ujMjBAyUDr4y4nHEAaxxad5V4wQMVvUr8jTBxAmM5k3ieLMED4NvPFo3AcQBiMUx9qtzBAvrP75q6UHEDMw+1grOMwQIPNHhRIuBxAWdF3ou4PMUC\u002fQ2jvcNscQC7m8uMwPDFAR38VsSr+HED2zY4mc2gxQINXM9h3IB1ALjojaLWUMUBYrXudWUIdQPnLlqn3wDFAhuktedFjHUD1N\u002frqOe0xQFVRR1fhhB1A5hTJLHwZMkCB5IcQiqUdQCCXxG2+RTJAeBQrtfXFHUDCIiWvAHIyQEmn4bGf5h1ACUOC8EKeMkC9OSDdkQYeQPcQhjKFyjJAvz1hi9IlHkB7A6xzx\u002fYyQKVHX2xnRB5A9HhLtQkjM0CrrbMSVmIeQJFHgvZLTzNAKsvO\u002faR\u002fHkBkaDw5jnszQFB1En9XnB5A1Rn\u002fedCnM0CcV5j5cLgeQF3rUbsS1DNAz\u002fRrX\u002fbTHkD1w578VAA0QP9YaXzr7h5AG2PHPZcsNEAwaGzeUwkfQJcPin7ZWDRAlWby2DIjH0Bu2cLCG4U0QDtILo+LPB9ARMZFBF6xNEBXeJzwYFUfQDJ50kWg3TRANEw7wLVtH0AEbXqH4gk1QI4XQJiMhR9Ag+oaySQ2NUAz0vn855wfQCCpfQdnYjVA1FAxIMqzH0DPJHZJqY41QD6AAT81yh9Ay8Ani+u6NUBKEcRpK+AfQExowcwt5zVA7Fb7k671H0DUZEUOcBM2QBiGJktgBSBALFSwT7I\u002fNkDlBhmYsQ8gQPJF\u002fJD0azZAhgDKBMwZIEDq7R3SNpg2QALYI1qwIyBADYkBE3nENkBsJ7JWXy0gQEHfilO78DZAkh+cqtk2IED8SFea\u002fRw3QHDHTgwgQCBAp+vQ2z9JN0Am95oYM0kgQAUnPB2CdTdAJFw5ahNSIEBa\u002fZFexKE3QFgJKZTBWiBAKL3JnwbON0CE8BkiPmMgQJok2uBI+jdAm0bQmIlrIED7iLshiyY4QIa4gXakcyBAvoBqYs1SOECu6Cwzj3sgQL0o6qIPfzhAKJPrQEqDIEDDeEXjUas4QJzGgA3WiiBAUiJNKZTXOEAp3Tn+MpIgQELfpWrWAzlA1lXNdWGZIED4SxSsGDA5QAuwb9FhoCBAbtaM7VpcOUBwK7tpNKcgQKozGC+diDlA3PTektmtIEBcjcBw37Q5QMoa4JpRtCBATU0zrSHhOUA7eBfSnLogQG6AsPBjDTpAtAUTfrvAIEC4Mmk0pjk6QOxG+eKtxiBAlk2wd+hlOkAO9bdedMwgQO5ZjrgqkjpA+Bnv9g7SIEC6ARb7bL46QDLAACF+1yBA7+V4PK\u002fqOkD+\u002fjnswdwgQM82CHzxFjtAYiPQadrhIEBu2Qq8M0M7QOMjBenH5iBAc6vL\u002fHVvO0Aik7eQiusgQAi60TW4mztAKWA4uyLwIEDrwSmE+sc7QOhRooCQ9CBA9TTZojz0O0Diy8PL0\u002fggQAVBnd98IDxAt7r6cCL5IEB42zKHviM8QA==","shape":"148, 2"},"hovertemplate":"Return: %{customdata[0]:.2f}%\u003cbr\u003eVol: %{customdata[1]:.2f}%\u003cextra\u003e\u003c\u002fextra\u003e","line":{"color":"rgba(0,0,0,0)","width":0},"mode":"lines","showlegend":false,"x":{"dtype":"f8","bdata":"gD3xIv5cgD8Aja\u002f45\u002f6JPwCdFs+BlY4\u002fwHX4fh4mkT9AAYiVJceSPwBqbg1qQ5Q\u002fwKeYdxOmlT8AXzSwvPWWP0CDnjOpNpg\u002fwOoFO8ZrmT+A+QNDLZeaP4A+lMZtups\u002fQMK9B7nWnD9A1RV\u002f\u002feydPwDa9QH5\u002fZ4\u002fwDdCoCIFoD+g0ewcMImgPyC8bzlZC6E\u002fQM+ZjZGLoT8ge3+6GwiiPwDsCE8CgaI\u002fYNhgJbv2oj9AmSTbpGmjPwAdjcEM2qM\u002fgNtpTDNIpD8gKs8ITrSkP4AQN6KKHqU\u002fwHi7ExCHpT9AeLPX\u002f+2lP8B70ut2U6Y\u002fAJPwyI63pj\u002fgGW6oXRqnP6D4ZkD3e6c\u002fwA8nvmzcpz8AYWGkzTuoPwAs8fQnmqg\u002fQHx+Coj3qD\u002fAnckW+VOpP8BPOzKFr6k\u002fwEToijUKqj+gy648EmSqP6ClrjMjvao\u002fwIHwIm8Vqz+Ajnde\u002fGyrPyDzad7Qw6s\u002fAEBSiEwZrD9A0PMjR2ysP4BGk3zxvKw\u002fQKEgWH0LrT\u002fAkbMOFFitPyDBeNraoq0\u002fwNBzqPHrrT9AJ43LdDOuP+Ba4hN9ea4\u002fQEqhriC+rj+gVVxYcwGvPyA3KdiGQ68\u002fQCfZDGuErz8Aby1cLsSvPwDmHeRuAbA\u002fcF0fjEIgsD8An\u002fOelz6wP+Cl5RBzXLA\u002fEOBEetl5sD9Q3fafzpawPyBRitxWs7A\u002fUFfHgXXPsD8wihXSLeuwPzAYkM+CBrE\u002f8H6OV3chsT9QJj8nDjyxP0CyHK9JVrE\u002fEFmiKSxwsT\u002fA3Edbt4mxP4BnxgHuorE\u002fcB\u002fbeNG7sT9gunpSY9SxP5Aw3y2l7LE\u002fEMPJ45gEsj\u002fQKJvWPxyyP4DbzgOcM7I\u002f4BahYK1Ksj+w32\u002fPdWGyP3DZx1v2d7I\u002f8GV+zS+Osj+wf5G9I6SyP4AxJvTSubI\u002fYOcIYj7Psj\u002fQKRlCZ+SyP5BKDx9O+bI\u002fgHOW5A0Osz8Qa5CQ9SKzP1C0wpdnN7M\u002fcHlIB2hLsz\u002fQVsyC+l6zPzBGVJsicrM\u002foBt6eeSEsz8Andg8QpezP8B\u002fYRA+qbM\u002fcJJZHtu6sz9wTb7UG8yzPwD73nkC3bM\u002f0J2vLpHtsz8wVzz1yf2zP\u002fCeeK6uDbQ\u002fQEXeHkEdtD\u002fg28zwgiy0P7Din8B1O7Q\u002fQB\u002fi9RpKtD\u002fgHl3\u002fc1i0P6DNNS+CZrQ\u002fwLwbxUZ0tD9weI3vwoG0P6DV7Mz3jrQ\u002fwK6HbOabtD9ACorPj6i0PxDM2en0tLQ\u002fQMzwnBbBtD9wW1DS9cy0PzDgsVKT2LQ\u002f8HUg5O\u002fjtD8A48NCDO+0P\u002fDhaCHp+bQ\u002fYFoAKocEtT\u002fArhb+5g61PzC5QzcJGbU\u002fkO+TZ+4itT\u002fwHIYblyy1PyDyxNQDNrU\u002fUKuqETU\u002ftT9guIRJK0i1P5BgvO3mULU\u002f8CQTamhZtT+wiGYisGG1P2Cujn2+abU\u002fgDqT1JNxtT\u002fwtq9+MHm1P1CqHvSUgLU\u002fcFQTPMGHtT\u002fQws3stY61P8DV4xlzlbU\u002fQFZc2fibtT9ga6qQR6K1P9DQjnFfqLU\u002fIFKk70CutT+Qh8Up7LO1P9Co0QRhubU\u002f4GlVr8W5tT8="},"y":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"type":"scatter"}],                        {"height":450,"hovermode":"x unified","legend":{"x":1.05,"y":0},"shapes":[{"line":{"color":"red","dash":"dash","width":1},"type":"line","x0":0.039613345220394613,"x1":0.039613345220394613,"xref":"x","y0":0,"y1":1,"yref":"y domain"},{"line":{"color":"green","dash":"dash","width":1},"type":"line","x0":0.06555479995294888,"x1":0.06555479995294888,"xref":"x","y0":0,"y1":1,"yref":"y domain"}],"showlegend":true,"template":{"data":{"barpolar":[{"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"type":"carpet"}],"choropleth":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"choropleth"}],"contourcarpet":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"contourcarpet"}],"contour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"contour"}],"heatmap":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"heatmap"}],"histogram2dcontour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2dcontour"}],"histogram2d":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2d"}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"mesh3d":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"mesh3d"}],"parcoords":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"parcoords"}],"pie":[{"automargin":true,"type":"pie"}],"scatter3d":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatter3d"}],"scattercarpet":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattercarpet"}],"scattergeo":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergeo"}],"scattergl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergl"}],"scattermapbox":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermapbox"}],"scattermap":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermap"}],"scatterpolargl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolargl"}],"scatterpolar":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolar"}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"scatterternary":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterternary"}],"surface":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"surface"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}]},"layout":{"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"autotypenumbers":"strict","coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]],"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]},"colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"geo":{"bgcolor":"white","lakecolor":"white","landcolor":"#E5ECF6","showlakes":true,"showland":true,"subunitcolor":"white"},"hoverlabel":{"align":"left"},"hovermode":"closest","mapbox":{"style":"light"},"paper_bgcolor":"white","plot_bgcolor":"#E5ECF6","polar":{"angularaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"bgcolor":"#E5ECF6","radialaxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"scene":{"xaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","gridwidth":2,"linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white"},"yaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","gridwidth":2,"linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white"},"zaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","gridwidth":2,"linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white"}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"ternary":{"aaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"baxis":{"gridcolor":"white","linecolor":"white","ticks":""},"bgcolor":"#E5ECF6","caxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"title":{"x":0.05},"xaxis":{"automargin":true,"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","zerolinewidth":2},"yaxis":{"automargin":true,"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","zerolinewidth":2}}},"title":{"text":"Optimal Portfolio Transition Map, 1928-2025"},"width":800,"xaxis":{"title":{"text":"Portfolio Real Return"}},"yaxis":{"range":[0,1],"title":{"text":"Portfolio Weight"}}},                        {"responsive": true}                    )                };            </script>        </div>

<h2 id="5-picking-the-optimal-portfolio-on-the-frontier">5. Picking the optimal portfolio on the frontier</h2>
<div>                        <script type="text/javascript">window.PlotlyConfig = {MathJaxConfig: 'local'};</script>
        <script charset="utf-8" src="https://cdn.plot.ly/plotly-3.2.0.min.js" integrity="sha256-iZ2u/oU2wf/vDbl/ChcX93WgbBRSBvUO6N413hDz7xM=" crossorigin="anonymous"></script>                <div id="5d515234-f27e-4ef6-b7e7-b03518ac2a5a" class="plotly-graph-div" style="height:450px; width:800px;"></div>            <script type="text/javascript">                window.PLOTLYENV=window.PLOTLYENV || {};                                if (document.getElementById("5d515234-f27e-4ef6-b7e7-b03518ac2a5a")) {                    Plotly.newPlot(                        "5d515234-f27e-4ef6-b7e7-b03518ac2a5a",                        [{"hovertemplate":"Std: %{x:.4f}\u003cbr\u003eReturn: %{y:.4f}\u003cextra\u003e\u003c\u002fextra\u003e","line":{"color":"#636EFA","width":2},"mode":"lines","name":"Efficient frontier","x":{"dtype":"f8","bdata":"f3LkpmKMnT\u002fS0AN8mFGfP07ztCZni6A\u002frSfWDwJuoT+DDwkKnVCiP8iD0uQ3M6M\u002f64TH09IVpD8Y8eezbfikP3NSLJ8I26U\u002faljvh6O9pj8tOaRxPqCnPwW4H1rZgqg\u002fVjSKQ3RlqT8uNXQtD0iqP\u002f4mLBaqKqs\u002fVMzU\u002f0QNrD9hxuzo3++sPwDTKdJ60q0\u002fTh59uRW1rj8Lt+2ksJevP\u002f2BOsYlPbA\u002f\u002fJGxO3OusD+BFEqwwB+xP\u002foppCQOkbE\u002fZk4xmlsCsj\u002fwlDEPqXOyP11N44P25LI\u002f3CX39UNWsz8QIA1qkcezP+ERL+HeOLQ\u002fc6bZVSyqtD\u002fxQRLKeRu1P2IKFDzHjLU\u002f\u002fmSdsRT+tT8aVy0oYm+2Py0t05yv4LY\u002fpuuqEf1Rtz84IVeGSsO3P+UYAPuXNLg\u002fehD5b+WluD8QCkXkMhe5PzjaPVmAiLk\u002fLQDjzc35uT86+35CG2u6P6QlP7do3Lo\u002fRtjtK7ZNuz81OG2gA7+7P\u002fgW1xRRMLw\u002f9TXwiZ6hvD+FCJv+6xK9P880vXI5hL0\u002fmuja54b1vT+DdTFc1Ga+P25cx9Ah2L4\u002fkGZmRW9Jvz+NaAO6vLq\u002fP7WgFxcFFsA\u002fw8kb0atOwD\u002f5WAeLUofAP7RMHUX5v8A\u002fHK71\u002f5\u002f4wD\u002fdeoO6RjHBPyMLrXTtacE\u002ftirWLZSiwT+zOprpOtvBP+KHHKThE8I\u002fyJ6fXohMwj\u002fkkBwZL4XCP29QgNPVvcI\u002fyYfSjXz2wj\u002f6ABNIIy\u002fDP1OwdgLKZ8M\u002f46XvvHCgwz8HYvp2F9nDP3D\u002fYzG+EcQ\u002frKXL62RKxD8JWv2lC4PEP1xXmGCyu8Q\u002ffm\u002f+Gln0xD+46fvU\u002fyzFP6Rrf46mZcU\u002fQ2veSE2exT8LuigD9NbFP\u002fPeX72aD8Y\u002ftrUIeUFIxj94SmAz6IDGP+LRje2OucY\u002fB66mpzXyxj+CEEli3CrHP2fq3BuDY8c\u002fAhjy1Smcxz8q5QKQ0NTHP3kL6Up3Dcg\u002fqDezBB5GyD++7Bi\u002fxH7IP4et+Hhrt8g\u002fszPINBLwyD9EVBPuuCjJP9PvFqhfYck\u002fWOYSYgaayT\u002fbfuAbrdLJPxOZK9VTC8o\u002fWu3kkvpDyj+AHCZNoXzKP1XOcwdItco\u002flWLkwe7tyj+eaUt8lSbLP5pdjDI8X8s\u002fKAZk7eKXyz\u002fG9uCnidDLP9I9P2IwCcw\u002fvsiBHNdBzD\u002fIQqTWfXrMP9oRn5Aks8w\u002f5L9jSsvrzD9YAdkDciTNP1232rwYXc0\u002fbF3gfb+VzT+EqBU4Zs7NP92DOPIMB84\u002fnPw\u002frLM\u002fzj8f8iBmWnjOPwKLzx8Bsc4\u002fBPdB2afpzj\u002f913OSTiLPP+gpaUv1Ws8\u002fvPYvBJyTzz+IxTnEQszPP2h6Ir90AtA\u002fLvM1HMge0D9l5U95GzvQP6DjddZuV9A\u002f826uM8Jz0D8neZGNFZDQP8EU9utorNA\u002fTcSASrzI0D8EwcKoD+XQPyjTeQVjAdE\u002fyUhBY7Yd0T\u002f1X03ACTrRP483LhxdVtE\u002fE91YeLBy0T+HOv3UA4\u002fRP2EvryxXq9E\u002fqz4GkqrH0T+x7tzY\u002fePRPyzsRetPANI\u002fyEQ\u002fdWUC0j8="},"y":{"dtype":"f8","bdata":"gD3xIv5cgD8Aja\u002f45\u002f6JPwCdFs+BlY4\u002fwHX4fh4mkT9AAYiVJceSPwBqbg1qQ5Q\u002fwKeYdxOmlT8AXzSwvPWWP0CDnjOpNpg\u002fwOoFO8ZrmT+A+QNDLZeaP4A+lMZtups\u002fQMK9B7nWnD9A1RV\u002f\u002feydPwDa9QH5\u002fZ4\u002fwDdCoCIFoD+g0ewcMImgPyC8bzlZC6E\u002fQM+ZjZGLoT8ge3+6GwiiPwDsCE8CgaI\u002fYNhgJbv2oj9AmSTbpGmjPwAdjcEM2qM\u002fgNtpTDNIpD8gKs8ITrSkP4AQN6KKHqU\u002fwHi7ExCHpT9AeLPX\u002f+2lP8B70ut2U6Y\u002fAJPwyI63pj\u002fgGW6oXRqnP6D4ZkD3e6c\u002fwA8nvmzcpz8AYWGkzTuoPwAs8fQnmqg\u002fQHx+Coj3qD\u002fAnckW+VOpP8BPOzKFr6k\u002fwEToijUKqj+gy648EmSqP6ClrjMjvao\u002fwIHwIm8Vqz+Ajnde\u002fGyrPyDzad7Qw6s\u002fAEBSiEwZrD9A0PMjR2ysP4BGk3zxvKw\u002fQKEgWH0LrT\u002fAkbMOFFitPyDBeNraoq0\u002fwNBzqPHrrT9AJ43LdDOuP+Ba4hN9ea4\u002fQEqhriC+rj+gVVxYcwGvPyA3KdiGQ68\u002fQCfZDGuErz8Aby1cLsSvPwDmHeRuAbA\u002fcF0fjEIgsD8An\u002fOelz6wP+Cl5RBzXLA\u002fEOBEetl5sD9Q3fafzpawPyBRitxWs7A\u002fUFfHgXXPsD8wihXSLeuwPzAYkM+CBrE\u002f8H6OV3chsT9QJj8nDjyxP0CyHK9JVrE\u002fEFmiKSxwsT\u002fA3Edbt4mxP4BnxgHuorE\u002fcB\u002fbeNG7sT9gunpSY9SxP5Aw3y2l7LE\u002fEMPJ45gEsj\u002fQKJvWPxyyP4DbzgOcM7I\u002f4BahYK1Ksj+w32\u002fPdWGyP3DZx1v2d7I\u002f8GV+zS+Osj+wf5G9I6SyP4AxJvTSubI\u002fYOcIYj7Psj\u002fQKRlCZ+SyP5BKDx9O+bI\u002fgHOW5A0Osz8Qa5CQ9SKzP1C0wpdnN7M\u002fcHlIB2hLsz\u002fQVsyC+l6zPzBGVJsicrM\u002foBt6eeSEsz8Andg8QpezP8B\u002fYRA+qbM\u002fcJJZHtu6sz9wTb7UG8yzPwD73nkC3bM\u002f0J2vLpHtsz8wVzz1yf2zP\u002fCeeK6uDbQ\u002fQEXeHkEdtD\u002fg28zwgiy0P7Din8B1O7Q\u002fQB\u002fi9RpKtD\u002fgHl3\u002fc1i0P6DNNS+CZrQ\u002fwLwbxUZ0tD9weI3vwoG0P6DV7Mz3jrQ\u002fwK6HbOabtD9ACorPj6i0PxDM2en0tLQ\u002fQMzwnBbBtD9wW1DS9cy0PzDgsVKT2LQ\u002f8HUg5O\u002fjtD8A48NCDO+0P\u002fDhaCHp+bQ\u002fYFoAKocEtT\u002fArhb+5g61PzC5QzcJGbU\u002fkO+TZ+4itT\u002fwHIYblyy1PyDyxNQDNrU\u002fUKuqETU\u002ftT9guIRJK0i1P5BgvO3mULU\u002f8CQTamhZtT+wiGYisGG1P2Cujn2+abU\u002fgDqT1JNxtT\u002fwtq9+MHm1P1CqHvSUgLU\u002fcFQTPMGHtT\u002fQws3stY61P8DV4xlzlbU\u002fQFZc2fibtT9ga6qQR6K1P9DQjnFfqLU\u002fIFKk70CutT+Qh8Up7LO1P9Co0QRhubU\u002f4GlVr8W5tT8="},"type":"scatter"},{"hovertemplate":"%{text}\u003cbr\u003eStd: %{x:.4f}\u003cbr\u003eReturn: %{y:.4f}\u003cextra\u003e\u003c\u002fextra\u003e","marker":{"color":"#636EFA","size":10},"mode":"markers+text","name":"Assets","text":["S&P","Small Caps","T-Bills","T-Notes","Baa Corps","Real Estate","Gold"],"textposition":"middle left","x":[0.19303644117881866,0.3728989577242455,0.03816960316613568,0.08859208039753139,0.08800526278329274,0.04973518491464826,0.19429640061941703],"y":{"dtype":"f8","bdata":"kFxzg+NYsT8wWaxCJTq2PwDwKCNotGo\u002fABXG1rTKjT8gDQRUttuhP4B9Br\u002fKGYc\u002fwN2YSDiTmT8="},"type":"scatter"},{"hovertemplate":"Max Sharpe\u003cbr\u003eStd: %{x:.4f}\u003cbr\u003eReturn: %{y:.4f}\u003cbr\u003eSharpe: 0.563\u003cextra\u003e\u003c\u002fextra\u003e","marker":{"color":"red","size":15,"symbol":"star"},"mode":"markers+text","name":"Max Sharpe","text":["Max Sharpe"],"textposition":"middle left","x":[0.07034847750156245],"y":[0.039613345220394613],"type":"scatter"},{"hovertemplate":"EF Avg Wts\u003cbr\u003eStd: %{x:.4f}\u003cbr\u003eReturn: %{y:.4f}\u003cextra\u003e\u003c\u002fextra\u003e","marker":{"color":"green","size":15,"symbol":"star"},"mode":"markers","name":"EF Avg Wts","text":["EF Avg Wts"],"textposition":"middle left","x":[0.15091755722747593],"y":[0.06555479995294888],"type":"scatter"},{"hovertemplate":"CML\u003cbr\u003eStd: %{x:.4f}\u003cbr\u003eReturn: %{y:.4f}\u003cextra\u003e\u003c\u002fextra\u003e","line":{"color":"red","dash":"dash","width":1.5},"mode":"lines","name":"Capital Market Line","x":[0,0.17758782327058836],"y":[0,0.1],"type":"scatter"}],                        {"height":450,"hovermode":"closest","showlegend":true,"template":{"data":{"barpolar":[{"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"type":"carpet"}],"choropleth":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"choropleth"}],"contourcarpet":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"contourcarpet"}],"contour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"contour"}],"heatmap":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"heatmap"}],"histogram2dcontour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2dcontour"}],"histogram2d":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2d"}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"mesh3d":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"mesh3d"}],"parcoords":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"parcoords"}],"pie":[{"automargin":true,"type":"pie"}],"scatter3d":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatter3d"}],"scattercarpet":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattercarpet"}],"scattergeo":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergeo"}],"scattergl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergl"}],"scattermapbox":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermapbox"}],"scattermap":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermap"}],"scatterpolargl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolargl"}],"scatterpolar":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolar"}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"scatterternary":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterternary"}],"surface":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"surface"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}]},"layout":{"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"autotypenumbers":"strict","coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]],"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]},"colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"geo":{"bgcolor":"white","lakecolor":"white","landcolor":"#E5ECF6","showlakes":true,"showland":true,"subunitcolor":"white"},"hoverlabel":{"align":"left"},"hovermode":"closest","mapbox":{"style":"light"},"paper_bgcolor":"white","plot_bgcolor":"#E5ECF6","polar":{"angularaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"bgcolor":"#E5ECF6","radialaxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"scene":{"xaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","gridwidth":2,"linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white"},"yaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","gridwidth":2,"linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white"},"zaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","gridwidth":2,"linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white"}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"ternary":{"aaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"baxis":{"gridcolor":"white","linecolor":"white","ticks":""},"bgcolor":"#E5ECF6","caxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"title":{"x":0.05},"xaxis":{"automargin":true,"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","zerolinewidth":2},"yaxis":{"automargin":true,"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","zerolinewidth":2}}},"title":{"text":"Risk vs. Real Return"},"width":800,"xaxis":{"range":[0,0.39154390561045777],"showgrid":true,"title":{"text":"Standard Deviation of Real Returns"}},"yaxis":{"range":[0,0.1],"showgrid":true,"title":{"text":"Real Return"}}},                        {"responsive": true}                    )                };            </script>        </div>

<p>There is a smart way to pick a good portfolio, which chooses the red star, and a midwit way, which chooses the green star.</p>

<p>First, the genius way:</p>

<ul>
  <li>Let’s assume there is a risk-free rate on cash of 0%, which you can achieve with a volatility of 0%. Since we are using real returns, this means something that yields exactly the CPI every year. A guaranteed pre-tax return of CPI + some coupon is achievable with TIPS. The vol will only be 0 in real terms if you e.g. donate the coupons.</li>
  <li>If you add this risk-free asset to the mix, it is a marker at the origin.</li>
  <li>Then you can combine this risk-free asset with any portfolio on the efficient frontier and your return will be a weighted average of the risk-free rate of 0% and the chosen portfolio return.</li>
  <li>If you draw a line from (0, 0) so it is tangent to the outermost point of the efficient frontier, then the tangent portfolio is the portfolio with the maximum Sharpe ratio, which is defined as \((r_{portfolio} - r_{riskfree} ) / \sigma_{portfolio}\). It’s how much return you pick up over the risk-free return per unit of risk. You can combine the Sharpe-optimal portfolio with some amount of cash to achieve any risk-return profile on the dotted line.</li>
  <li>Then suppose you can borrow at some rate less than the return on your portfolio. For simplicity’s sake assume it’s the same 0% real rate. Then if you continue the line to the right of the Sharpe-optimal portfolio, that represents borrowing at 0% and buying more of the Sharpe-optimal portfolio. If you can borrow at e.g. 2% then the line will be a little flatter and be tangent to the efficient frontier starting a bit further right where the slopes line up.</li>
</ul>

<p>Every point on this capital market line is a feasible portfolio with the same Sharpe ratio. In Sharpe world, you should always buy the risk asset portfolio with maximum Sharpe ratio. And then lever it up for more risk and return, like a hedge fund, or lever it down combining it with the risk-free asset if you prefer lower risk and return.</p>

<p>But there are some problems with this in our world:</p>

<ol>
  <li>
    <p>We are trying to maximize real returns after inflation. On the one hand, there isn’t actually an asset that pays the CPI flat. On the other hand, TIPS should do better, but with some modest volatility. Ideally we would add TIPS to the asset universe. But they’ve only been around the last 30 years or less. We could try to model what TIPS returns would have been historically by estimating historical inflation expectations based on current inflation, the monetary/fiscal policy mix, other predictors like yield curves, gold prices, FX etc., and add some noise to match correlations. But that’s a rabbit hole. Assuming a zero return asset isn’t accurate, but it’s not crazy, it’s a little less return and volatility than is actually achievable.</p>
  </li>
  <li>
    <p>Most retail investors can’t or don’t use leverage. You can invest on margin, but the margin rate is high. If you borrow, there is a path dependency where you get liquidated if your equity gets too low or negative. If the borrowing rate varies, that would have to be reflected in the optimization. Retail investors typically want to move to the right to increase their risk and return, and not simply lever up.</p>
  </li>
  <li>
    <p>There is the complex problem of overfitting. We have taken average returns of assets and covariances over a long period. But we don’t really know how accurate these are as a forecast over our time horizon. And optimal portfolios are highly sensitive to return and covariance forecasts. In fact, optimization tends to maximize estimation errors. The better your optimal portfolio, the more likely it takes advantage of unlikely quirks in the forecasts.</p>
  </li>
</ol>

<p>In machine learning, we generally regularize to avoid overfitting. if we perform a regression, we typically add a penalty to parameters to shrink them toward 0, and the estimator toward the mean. We use cross-validation to determine how much to regularize, and balance overfitting and underfitting, by checking what regularization parameters generalize best out-of-sample.</p>

<p>This can be viewed as a Bayesian approach, where we start with a maximum entropy prior. For instance: a naive base case might be that all parameters are 0 with some distribution; then we update the prior in proportion to the strength of the evidence they are greater than 0. L2 regularization implies a Gaussian prior on parameter distribution, L1 implies a Laplacian prior.</p>

<p>Knuth has been quoted as saying, the root of all evil is premature optimization. Which is exactly the same as overfitting to an imperfect understanding of the problem. Bad government policy = overfitting to past problems. Bad heuristics and prejudices = overfitting to personal experience or what your grandparents or your lizard brain taught you. It takes a lot of wisdom to only learn from data in proportion to the evidence. You have to have a good model for how the evidence was created and what the underlying reality might look like.</p>

<p>Frequentists may object to a Bayesian approach because it seems non-mathy, where does this prior belief come from? On the other hand, even if you don’t use an implicit prior in linear regression, you can back a prior out via Bayes’s law, like a continuous distribution from -infinity to +infinity. So I would argue everyone is a Bayesian, but non-Bayesians don’t make priors explicit. The real question is whether a Bayesian prior improves out-of-sample performance, and it often does. If you use a prior distribution on IMDB movie ratings, you get a better rating sooner with fewer incoming votes. If you have some information about what the model should look like, you should use it, otherwise you are not getting the best model. Of course, you should only use the most defensible maximum-entropy prior, otherwise you might be introducing bias into your model.</p>

<p>If we don’t systematically regularize, our model will overfit and not generalize well out of sample.</p>

<p>As far as I know, there is no generally accepted way to do this for portfolio optimization. So, here is a midwit way to back off the optimized portfolio toward one that is more robust to estimation errors: just average all the optimal portfolios.</p>

<p>That gets us the green star, which looks like this:</p>

<p>Average over entire efficient frontier:</p>

<table>
  <tbody>
    <tr>
      <td>Real Return</td>
      <td>6.56%</td>
    </tr>
    <tr>
      <td>SD</td>
      <td>15.09%</td>
    </tr>
    <tr>
      <td>Sharpe Ratio</td>
      <td>0.434</td>
    </tr>
  </tbody>
</table>

<table>
  <thead>
    <tr>
      <th>Asset</th>
      <th>Weight</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>S&amp;P</td>
      <td>34.3%</td>
    </tr>
    <tr>
      <td>Small Caps</td>
      <td>23.1%</td>
    </tr>
    <tr>
      <td>T-Bills</td>
      <td>3.1%</td>
    </tr>
    <tr>
      <td>Baa Corps</td>
      <td>15.9%</td>
    </tr>
    <tr>
      <td>Real Estate</td>
      <td>8.5%</td>
    </tr>
    <tr>
      <td>Gold</td>
      <td>15.1%</td>
    </tr>
  </tbody>
</table>

<p>This is admittedly a very simplistic, possibly stupid methodology that loses Sharpe ratio, but not very much. The portfolios at the extremes are probably not ones you would realistically choose. You might want to average over the reasonable portfolios in the middle. But we could view it as a base case.</p>

<p>If we add a risk-free asset we get this.</p>

<p>Average over entire efficient frontier:</p>

<table>
  <tbody>
    <tr>
      <td>Real Return</td>
      <td>6.06%</td>
    </tr>
    <tr>
      <td>SD</td>
      <td>13.73%</td>
    </tr>
    <tr>
      <td>Sharpe Ratio</td>
      <td>0.442</td>
    </tr>
  </tbody>
</table>

<table>
  <thead>
    <tr>
      <th>Asset</th>
      <th>Weight</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>S&amp;P</td>
      <td>31.3%</td>
    </tr>
    <tr>
      <td>Small Caps</td>
      <td>20.8%</td>
    </tr>
    <tr>
      <td>Baa Corps</td>
      <td>15.7%</td>
    </tr>
    <tr>
      <td>TIPS</td>
      <td>11.1%</td>
    </tr>
    <tr>
      <td>Real Estate</td>
      <td>7.1%</td>
    </tr>
    <tr>
      <td>Gold</td>
      <td>13.9%</td>
    </tr>
  </tbody>
</table>

<p>A risk-free asset unsurprisingly can help reduce your risk.</p>

<p>In general, inflation is a risk you want to protect against in a portfolio. It was a big deal in the 70s. The current policy mix may tend toward the inflationary: large fiscal deficits, political pressure on the Fed, tariffs, deglobalization, dollar depreciation, and labor market tightness exacerbated by immigration crackdowns.</p>

<p>Stocks offer some inflation protection over the long run. Buffett would probably argue against gold and TIPS generally, because they are low or zero-yielding assets, and a bet against the rationality and wisdom of policymakers. Also, if you are Buffett, your opportunity set is a bit different, if you can reliably find equities that will give you inflation protection in the form of moats and brand equity and pricing power over the very long haul, plus equity risk premium. Inflation protection is expensive if it means giving up equity risk premium. The index investor disclaims any such ability and is more at risk. In any event, these portfolios should be considered a starting point for thinking, not a substitute for it.</p>

<p>TIPS offer an inflation hedge and a safe real return, so they might dominate gold. In my opinion, there isn’t a strong theoretical argument gold should increase in value faster than inflation in the long run (gold bugs might disagree and think fiat currencies go to zero, but that’s my story and I’m sticking to it). I could see reasonable arguments why gold should maintain its real value: As the world gets richer, people may want the same value of jewelry in proportion to their wealth, the supply of gold is fairly fixed, with mining and industrial consumption resulting in little net change, and thus gold prices may keep pace with other assets. Also, there is monetary demand for gold; when people lose confidence in monetary authorities and fiat currency holding value, they demand gold because it is currency-like and supply is relatively fixed. So gold offers an inflation hedge.</p>

<p>The real estate series we have is the Case-Shiller index. Real estate is an important asset class, but this index is not investable. Some investors may have homes and already be exposed to real estate. Others would probably prefer liquid real estate ETFs, but we don’t have data on them until recently. If we take out real estate, the analysis looks like this:</p>

<p>Average over entire efficient frontier:</p>

<table>
  <tbody>
    <tr>
      <td>Real Return</td>
      <td>6.03%</td>
    </tr>
    <tr>
      <td>SD</td>
      <td>13.73%</td>
    </tr>
    <tr>
      <td>Sharpe Ratio</td>
      <td>0.439</td>
    </tr>
  </tbody>
</table>

<table>
  <thead>
    <tr>
      <th>Asset</th>
      <th>Weight</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>S&amp;P</td>
      <td>31.5%</td>
    </tr>
    <tr>
      <td>Small Caps</td>
      <td>20.8%</td>
    </tr>
    <tr>
      <td>Baa Corps</td>
      <td>16.8%</td>
    </tr>
    <tr>
      <td>TIPS</td>
      <td>17.1%</td>
    </tr>
    <tr>
      <td>Gold</td>
      <td>13.8%</td>
    </tr>
  </tbody>
</table>

<h2 id="6-more-scientific-ways-to-pick-an-optimal-portfolio">6. More scientific ways to pick an optimal portfolio</h2>

<p>There is no generally accepted way to regularize this analysis, but there is a lot of work in this area, here are a few approaches:</p>

<ul>
  <li>
    <p><a href="http://www.ledoit.net/honey.pdf">Ledoit-Wolf</a> covariance matrix shrinkage - More robust covariances that work better out of sample.</p>
  </li>
  <li>
    <p>Just add a vol penalty to the optimization to force a lower risk, more diversified portfolio at each level of return. We are already adding a vol penalty to adjust for volatility drag. We can increase the penalty, and my theory is, this will force a more diversified portfolio and be more robust to estimation error. This begs the question of how big a penalty. We could do leave-one-out cross-validation or a similar Monte Carlo process to compute a Sharpe-optimal portfolio on many penalty parameters, and plot the average return, SD and Sharpe ratio for held-out data vs the penalty parameter, to find what works best out of sample. The machine learning engineer in me says go for it, the midwit finance/statistics guy finds it hard to justify rigorously. Maximizing long-run geometric return is Kelly-optimal and maps to log utility, doubling the penalty is something like moving to half-Kelly. Directionally it makes sense but there is no theoretically correct risk aversion parameter, we are left with what works best empirically.</p>
  </li>
  <li>
    <p><a href="https://portfoliooptimizer.io/blog/mean-variance-optimization-in-practice-well-diversified-near-efficient-portfolios/">Near optimal portfolios</a> One approach is, first find the highest Sharpe portfolio. Then we can say, find the lowest risk portfolio with no more than e.g. a 0.05 drop in Sharpe ratio. Since this portfolio is more diversified, i.e. most diversified within 0.05 of maximum Sharpe, it should be more robust out-of-sample.</p>
  </li>
  <li>
    <p><a href="https://portfoliooptimizer.io/blog/mean-variance-optimization-in-practice-subset-resampling-based-efficient-portfolios/">Subset resampled portfolios</a>, Suppose we have 6 assets, do 6 optimizations, dropping one asset each time, then average all the portfolios. Similar to random forest, an ensemble of intentionally weakened models can perform better out of sample than a single overfitted model.</p>
  </li>
  <li>
    <p><a href="https://docs.portfoliooptimizer.io/index.html#post-/portfolios/analysis/mean-variance/efficient-frontier/resampling-based">Michaud resampling</a> and <a href="https://github.com/enjine-com/mcos/tree/master">MCOS</a>. Do Monte Carlo simulations where we perturb the return forecasts and covariances randomly each time, and average all the resulting portfolios.</p>
  </li>
  <li>
    <p><a href="https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2708678">Hierarchical Risk Parity</a> and related methods like Nested Cluster Optimization. Create a tree of assets clustered by similarity. Then starting at the bottom at each non-leaf create a risk parity portfolio of assets under the node, and recursively climb the tree to get a global portfolio. If you create a portfolio of t-bonds and notes and bills and corporates (NCO) and MBS and munis, we will get some of each, even if one is dominated under MV optimization. Same if you do US stocks and various international markets with different market caps and geographies. Then as you combine clusters, all asset classes are represented, whereas a global optimization might omit some assets. Vanilla HRP actually ignores returns and substitutes cluster hierarchy for the covariance matrix, and creates a minimum risk portfolio assuming no covariance at each level. Which ignores a lot of information. <a href="https://medium.com/geekculture/schur-complementary-portfolios-fix-hierarchical-risk-parity-28b0efa1f35f">Schur portfolios</a> let you split the difference between vanilla HRP and optimization using the return and covariance information.</p>
  </li>
</ul>

<p>If you can come up with a good set of assumptions and a reasonable way to regularize covariance matrices and return forecasts and generate optimal portfolios that generalize well out of sample, you can gain fame and fortune.</p>

<h2 id="7-concluding-thoughts">7. Concluding thoughts</h2>

<p>What have we learned?</p>

<ul>
  <li>Markets are complex. All models are wrong (George Box), but some are useful. We didn’t even go into issues with the single-index beta model.</li>
  <li>Visualizing portfolio composition as vectors and correlations as cosines can help build intuition about volatility, correlation and diversification.</li>
  <li>If you have a risk-free asset, that changes the shape of the efficient frontier and gives you a line to the left of the Sharpe-optimal portfolio. If you can borrow and use leverage, that changes it again. If you assume some modest ability to pick stocks and short stocks, that improves the efficient frontier a lot, but not many people are actually able to do this consistently over the long run.</li>
  <li>Individual investors typically want to avoid leverage, shorts, and stock-picking. Even really smart and sophisticated investors get burned by leverage. For instance before the financial crisis, Citibank and Harvard both decided they should be taking more risk and leverage and got burned. Famously, the <a href="https://en.wikipedia.org/wiki/When_Genius_Failed">geniuses at Long Term Capital Management</a> made highly levered bets on relatively sure things like buying illiquid off-the-run bonds and selling liquid on-the-run bonds, only to lose billions when markets went into crisis and markets rushed to risk-off via the most liquid instruments.</li>
  <li>Picking the right tradeoff on the frontier is important, hard, and requires a risk aversion assumption/choice.</li>
  <li>Because you don’t have accurate volatility and return estimates, you want to back off from optimal portfolios in the direction of more diversification and robustness to regime change. Regularization is important. The midwit average may be the simplest thing that might work.</li>
  <li>You can probably reduce and quantify the estimation error with some clever cross-validation.</li>
  <li>You may wish to take estimation error into account explicitly in picking a portfolio.</li>
  <li>Potentially you could adjust volatility estimates to additionally incorporate estimation uncertainty, and then pick an optimal portfolio using log utility/risk aversion. Kelly bets and log utility are two sides of the same coin.</li>
  <li>There are only 2 strategies in the world, mean reversion and trend following. Buy what’s cheap on the dip like Buffett, or buy the thing that goes up most and everyone else is buying because there is probably a reason. You can turn these 2 strategies into a 2x2 matrix, adding 2 corners: buy what looks cheap and also has momentum, like AQR, or ignore both and just buy the index.</li>
  <li>Returns to capital must come from GDP. If GDP goes up you want your fair payoff from the capital/labor share. Real interest rates and wages drive the capital/labor share to some extent. If the economy were to shrink, or the capital share were to shrink, all investors would likely suffer, nothing escapes their gravitational pull.</li>
  <li>A complementary view is, you want to take as many diversified risks as you can that you are reasonably well compensated for, interest rate risk, overall growth risk, inflation risk. In the long run equity risk has been well-compensated via the equity risk premium. But not always, fror instance from 1929 to 1932, late 60s to 1974, 2008. Historically you should buy the dip, but it might take many years to catch up.</li>
  <li>You get alpha when you understand the complex nonlinear dynamics of the world better than the market, and stay within your circle of competence.</li>
  <li>Being a good gambler and risk manager and staying within your circle of competence is more important than being a good analyst.</li>
  <li>A big part of investing is finding situations with asymmetry, optionality, and positive convexity. Then if things turn out better than expected you can make good money but if things turn out poorly your downside is limited.</li>
  <li>It’s easy to pontificate about investing and hard to invest.</li>
  <li>I’m a midwit so your mileage may vary.</li>
</ul>

<p><a href="https://github.com/druce/portfolio_optimization/tree/master">Code is here</a></p>

<p>Related reading:</p>

<ul>
  <li><a href="https://www.cvxpy.org/version/1.1/tutorial/index.html">CVXPY tutorial</a></li>
  <li><a href="https://web.stanford.edu/~boyd/cvxbook/">Boyd and Vandenberghe - Convex Optimization</a></li>
  <li><a href="https://www.amazon.com/Advanced-Portfolio-Optimization-Cutting-edge-Quantitative/dp/3031843037">Cajas - Advanced Portfolio Optimization: A Cutting-edge Quantitative Approach</a></li>
  <li><a href="https://www.amazon.com/Pioneering-Portfolio-Management-Unconventional-Institutional/dp/1416544690">David Swensen - Pioneering Portfolio Management: An Unconventional Approach to Institutional Investment</a></li>
  <li><a href="https://www.amazon.com/Intelligent-Asset-Allocator-Portfolio-Maximize/dp/1260026647">Bernstein - The Intelligent Asset Allocator: How to Build Your Portfolio to Maximize Returns and Minimize Risk</a></li>
  <li><a href="https://www.amazon.com/Asset-Allocation-Theory-Practice-Finance/dp/1119817714">Kinlaw et al - Asset Allocation: From Theory to Practice and Beyond (Wiley Finance) 1st Edition</a></li>
  <li><a href="https://www.amazon.com/Theory-Practice-Investment-Management-Construction/dp/0470929901">Fabozzi and Markowitz, ed. - The Theory and Practice of Investment Management: Asset Allocation, Valuation, Portfolio Construction, and Strategies</a></li>
  <li><a href="https://www.amazon.com/Innovations-Pension-Fund-Management-Muralidhar/dp/0804745218">Muralidhar - Innovations in Pension Fund Management</a></li>
  <li><a href="https://www.amazon.com/About-Asset-Allocation-Richard-Ferri/dp/0071429581">Ferri - All About Asset Allocation Paperback</a></li>
  <li><a href="https://www.amazon.com/Global-Asset-Allocation-Survey-Strategies/dp/0988679922">Faber - Global Asset Allocation: A Survey of the World’s Top Asset Allocation Strategies</a></li>
</ul>
<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1" role="doc-endnote">
      <p>This is the formula: \(\sigma_{\text{annual}} = \sigma_{\text{daily}} \times \sqrt{N}\) . This formula assumes daily returns are well-behaved: independent, constant variance over time, no serial correlation or changes in volatility, ideally normally distributed. The formula fails if: 1) Returns are serially correlated (trending); 2) Volatility is not constant; 3) There are fat tails. All of which are probably true in stock markets. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:2" role="doc-endnote">
      <p>If you have portfolios \(a\), \(b\), \(c\), then if \(a\) is preferred to \(b\), and \(b\) is preferred to \(c\) then \(a\) should be preferred to \(c\). But in prospect theory, the preference depends not just on the portfolio but how expectations are anchored. Fat left tails have an outsize impact on distribution preferences, which may be realistic but hard to cope with in the math. <a href="#fnref:2" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>Druce Vertes</name></author><category term="investing" /><category term="investing" /><summary type="html"><![CDATA[A deep dive into intro portfolio theory, optimization, and asset allocation]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://druce.ai/assets/2025/efrontier.png" /><media:content medium="image" url="https://druce.ai/assets/2025/efrontier.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Mysterious ways</title><link href="https://druce.ai/2025/11/mysterious-ways" rel="alternate" type="text/html" title="Mysterious ways" /><published>2025-11-13T01:01:01+00:00</published><updated>2025-11-13T01:01:01+00:00</updated><id>https://druce.ai/2025/11/mysterious-ways</id><content type="html" xml:base="https://druce.ai/2025/11/mysterious-ways"><![CDATA[<blockquote>
  <p>The smartest thing anyone ever told me about their religion was “I don’t actually believe any of that stuff, I just like going to church.”
<!--more--></p>
</blockquote>

<p>She was a Unitarian. I liked her. I like Unitarianism. It doesn’t make stuff worse.</p>

<p>There are mysteries. The human mind abhors a mystery, like nature abhors a vacuum. And we love a good narrative. An entire Hollywood and novel-publishing and theater industry attests to it. We have to fill in the blanks of the mystery with a narrative.</p>

<p>There is truth in Descartes. I directly sense that I exist. And that sensation is something inaccessible to science.</p>

<p>Consider <a href="https://www.goodreads.com/quotes/9688420-selective-subjectivism-let-us-suppose-that-an-ichthyologist-is-exploring">Eddington’s ichtyologist</a>:</p>

<blockquote>
  <p>Let us suppose that an ichthyologist is exploring the life of the ocean. He casts a net into the water and brings up a fishy assortment. Surveying his catch, he proceeds in the usual manner of a scientist to systematise what it reveals.
He arrives at two generalisations :</p>

  <p>(1) No sea-creature is less than two inches long.
(2) All sea-creatures have gills.</p>

  <p>These are both true of his catch, and he assumes tentatively that they will remain true however often he repeats it.</p>

  <p>In applying this analogy, the catch stands for the body of knowledge which constitutes physical science, and the net for the sensory and intellectual equipment which we use in obtaining it. The casting of the net corresponds to observation; for knowledge which has not been or could not be obtained by observation is not admitted into physical science.</p>

  <p>An onlooker may object that the first generalisation is wrong. “There are plenty of sea-creatures under two inches long, only your net is not adapted to catch them.”</p>

  <p>The ichthyologist dismisses this objection contemptuously. “Anything uncatchable by my net is ipso facto outside the scope of ichthyological knowledge, and is not part ot the kingdom of fishes which has been defined as the theme of ichthyological knowledge. In short, what my net can’t catch isn’t fish.”</p>

  <p>Or— to translate the analogy— If you are not simply guessing, you are claiming a knowledge ot the physical universe discovered in some other way than by the methods of physical science, and admittedly unvenfiablc by such methods. You are a metaphysician. Bah !”</p>
</blockquote>

<p>A scientist can say consciousness is just an illusion. But it sure doesn’t feel like an illusion. Even the scientist doesn’t act as if it is an illusion, but tells themself some story that motivates them to do science. If it’s all an illusion creating more illusions, why bother? It’s hard out there for a reasoning creature. The first reality you experience defies reason.</p>

<p><em>Some</em> metaphysics must exist? It’s just not all that clear whether it’s a benevolent God or Descartes’s evil demon deceiving us, or a fully indifferent one.</p>

<blockquote>
  <p>Whereof we cannot speak, we must pass over in silence - Ludwig Wittgenstein</p>
</blockquote>

<p>We should probably just shut up, but we can’t. We are born crying. And live complaining, and die disappointed. We must be comforted. <a href="https://druce.ai/2023/09/bullshit">Demand for bullshit must be supplied</a>.</p>

<p>Why does it always has to be such stupid bullshit though? Burning bushes and whatnot? Stuff that makes people hate each other?</p>

<p><a href="https://www.goodreads.com/quotes/6808572-a-miracle-is-a-violation-of-the-laws-of-nature">David Hume said, on miracles</a>:</p>

<blockquote>
  <p>No testimony is sufficient to establish a miracle unless it is of such a kind that its falsehood would be more miraculous than the fact that it tries to establish.</p>
</blockquote>

<p>We can’t reasonably believe in miracles just because some dude or some ancient primitive book told us. But we are miracles. Our existence is a miracle. Nature is a miracle. Everything is a miracle. Reasoning can’t establish miracles, but we directly sense them.</p>

<blockquote>
  <p>Even if there is only one possible unified theory, it is just a set of rules and equations. What is it that breathes fire into the equations and makes a universe for them to describe? - Stephen Hawking</p>
</blockquote>

<p>And everything is endogenous. You miraculously create your world with your thoughts.</p>

<blockquote>
  <p>When life itself seems lunatic, who knows where madness lies? Perhaps to be too practical is madness. To surrender dreams — this may be madness. Too much sanity may be madness — and maddest of all: to see life as it is, and not as it should be! - Miguel de Cervantes</p>
</blockquote>

<p><a href="https://www.goodreads.com/quotes/902620-we-are-all-stories-in-the-end-just-make-it">All we are is stories in the end, so why not at least try to make it a good one?</a> I’m not going to judge you if you make up a story to get you through the night. If you have to believe in something, if it makes you a better, happier person, more power to you.</p>

<p>But why does it always have to be a story that demands judging and othering and harming people? God gave us this strip of land and the right to kill people who think otherwise. But we are good people by definition! An avatar of Western Civilization! Certainly not, for instance, the world’s greatest example of main character syndrome.</p>

<p>Gandhi was asked what he thought about Western civilization, he said he thought it would be a very good idea.</p>

<blockquote>
  <p>We have just enough religion to make us hate, but not enough to make us love one another. - Jonathan Swift</p>
</blockquote>

<p>I’m not religious but I’m not against religion. I’m against stupid religions. And religions are for the most part stupid, because people are for the most part stupid.</p>

<p>Inside every human there’s a John Lennon ‘Imagine all the people living life in peace’ and a Steely Dan ‘Everybody on the street has murder in their eyes’.</p>

<p>When you are dealing with effed-up people, say Hitler for example, you just have to fight and defeat them. There is no alternative, except a one-way trip to the showers. But when you run around thinking everyone is Hitler, and you have to do horrible stuff or it’s the end of ‘Western civilization’, you turn into <a href="https://www.boredpanda.com/real-life-examples-swore-to-destroy/">the thing you swore was the ultimate evil.</a></p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/htg72vkhsmY?si=HZA0NlG4gHRSJ7gn" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>

<iframe width="560" height="315" src="https://www.youtube.com/embed/Hvz0TOm0zgI?si=7ZcyPo6CDWVE-8Gv" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>]]></content><author><name>Druce Vertes</name></author><category term="random" /><category term="random" /><summary type="html"><![CDATA[The smartest thing anyone ever told me about their religion was “I don’t actually believe any of that stuff, I just like going to church.”]]></summary></entry><entry><title type="html">An AI Maturity Framework</title><link href="https://druce.ai/2025/11/ai-maturity" rel="alternate" type="text/html" title="An AI Maturity Framework" /><published>2025-11-02T01:01:01+00:00</published><updated>2025-11-02T01:01:01+00:00</updated><id>https://druce.ai/2025/11/ai-maturity</id><content type="html" xml:base="https://druce.ai/2025/11/ai-maturity"><![CDATA[<blockquote>
  <p><em>A 12-dimension assessment of your company’s AI maturity and readiness, and a roadmap for developing an AI strategy</em></p>

</blockquote>
<figure>
<picture>
  <img src="/assets/2025/spiderchart.png" alt="Spider chart" fetchpriority="high" style="width: 100%; height: auto;" />
</picture>
  <figcaption>A 12-dimension, 200+ question AI maturity model.</figcaption>
</figure>
<!--more-->

<h2 id="how-to-think-about-ai-now">How to think about AI now</h2>

<h3 id="gen-ai-is-the-ability-to-understand-language">Gen AI is the ability to understand language</h3>

<ul>
  <li>Search and retrieval with deep semantic understanding</li>
  <li>Create a first draft of anything</li>
  <li>Especially coding</li>
  <li>And if you can code, you can do anything a computer can do: advanced agentic processes that compose sequences of retrieving or sensing, creating, and acting.</li>
</ul>

<h3 id="everything-is-language-or-at-least-everything-a-business-can-do-or-talk-about">Everything is language (or at least everything a business can do or talk about)</h3>

<p>A short digression into epistemology:</p>

<p><a href="https://www.goodreads.com/quotes/9688420-selective-subjectivism-let-us-suppose-that-an-ichthyologist-is-exploring">Eddington’s ichthyologist</a>: If you go fishing with a net with 2-inch holes, you catch stuff more than 2 inches big.</p>

<p>Tired:</p>

<ul>
  <li>Biology is a subset of chemistry, the application of chemistry to living things.</li>
  <li>Chemistry is a subset of physics, the application of physics to materials.</li>
  <li>Physics is the application of mathematics to the natural world.</li>
  <li>Mathematics is the abstraction of everything.</li>
</ul>

<p>Math is our deepest abstraction, and also the formal foundation of computation. Checking proofs, which start from axioms and apply rules of logic, is something a Turing machine can do. It can also do search to find new valid proofs. Gödel’s incompleteness theorem is analogous to the halting problem of mathematics. The former says you can’t write a program that will tell if any program stops without running it; the latter says there are mathematical conjectures that must be either true or false but are unprovable.</p>

<p>Wired:</p>

<ul>
  <li>Information theory is everything you can represent with symbols and language.</li>
  <li>Computer science is the study about computation and Turing machines and other simpler models of computation.</li>
  <li>Mathematics is the study of the set of Turing machines that represent proofs.</li>
</ul>

<p>Probably the last 3 are all isomorphic. If you can’t prove it, you can’t know it.</p>

<p>The point is: everything knowable is expressed in language. If you do language, you can write any program and solve any solvable problem (eventually).</p>

<p>As for anything which is not language:</p>

<p><em>Wovon man nicht sprechen kann, darüber muß man schweigen. - Ludwig Wittgenstein</em>
<em>(What we cannot speak about, we must attend in silence)</em></p>

<h3 id="pillars-of-an-ai-strategy">Pillars of an AI strategy</h3>

<ul>
  <li>
    <p>People - if you have a good AI team, they can implement everything below.</p>
  </li>
  <li>
    <p>Data - AI works on data. You want all your processes to generate clean data that AI can use for retrieval, creation, automation. Data engineering should provide data quality, timeliness, reliable availability, process observability, security, compliance, governance, discoverability, interoperability, scalability, lifecycle management, change control, cost control.</p>
  </li>
  <li>
    <p>Tech foundations: ability to reliably scale AI processes with security, robustness, business continuity, disaster recovery.</p>
  </li>
  <li>
    <p>Process: industrialize automation, software dev etc.</p>
  </li>
</ul>

<p>A good metaphor is infinite interns, but possibly stoner interns and occasionally disobedient rogue interns.</p>

<h3 id="pitfalls-to-avoid">Pitfalls to avoid</h3>

<ul>
  <li>
    <p>IP and data protection</p>
  </li>
  <li>
    <p>Reputational / regulatory risk</p>
  </li>
  <li>
    <p>All security concerns amplified - a power multiplier for bad actors, and for cyber defenders.</p>
  </li>
</ul>

<p>It’s useful to think of AI as an insider threat. Those infinite stoner interns need to be limited in what they can do (least privilege) and subject to multiple layers of checking for correctness and guardrails so they don’t go rogue.</p>

<h3 id="ai-maturity">AI Maturity</h3>

<p>AI maturity measures the degree to which organizations have mastered AI-related capabilities to achieve operational excellence. AI maturity is not defined by tech tools alone, but by how effectively the organization can improve outcomes by orchestrating people, technology, data, and process. Organizations that successfully navigate AI transformation gain competitive advantages, operate with greater efficiency, increase velocity and respond faster to market changes, delivering more value creation.</p>

<p>Here are levels of maturity:</p>

<ul>
  <li><strong>Level 1 (Crawl):</strong> Initial unstructured exploration and planning.</li>
  <li><strong>Level 2 (Walk):</strong> Structured learning, training, planning, foundation-laying, and initial POCs and pilots.</li>
  <li><strong>Level 3 (Run):</strong> Operational deployment at scale, with robust infrastructure, governance, and security, and business value measured against KPIs.</li>
  <li><strong>Level 4 (Fly):</strong> An AI-native organization where AI is central and pervasive, deploying advanced use cases like autonomous agents, advanced fine-tuned models, with continuous improvement and adoption of emerging capabilities.</li>
</ul>

<p>Finally, <a href="https://druce.ai/assets/2025/ai_maturity.html">here is a link to the model itself.</a> Answer questions to assess your own organization’s maturity. For each dimension, 50% completion of a level unlocks the next higher level. Of course, it’s a work in progress, and opinionated. I definitely threw in the kitchen sink, everything doesn’t apply to everyone. But it should inventory most things people should be thinking about doing. (You can also download the HTML and delete/edit questions that don’t apply)</p>]]></content><author><name>Druce Vertes</name></author><category term="AI" /><category term="AI" /><summary type="html"><![CDATA[A 12-dimension assessment of your company’s AI maturity and readiness, and a roadmap for developing an AI strategy A 12-dimension, 200+ question AI maturity model.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://druce.ai/assets/2025/spiderchart.png" /><media:content medium="image" url="https://druce.ai/assets/2025/spiderchart.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Claude Code, Claude Skills and the Vibe Coding Revolution</title><link href="https://druce.ai/2025/10/vibecoding" rel="alternate" type="text/html" title="Claude Code, Claude Skills and the Vibe Coding Revolution" /><published>2025-10-29T01:01:01+00:00</published><updated>2025-10-29T01:01:01+00:00</updated><id>https://druce.ai/2025/10/vibecoding</id><content type="html" xml:base="https://druce.ai/2025/10/vibecoding"><![CDATA[<blockquote>
  <p>Another <a href="https://simonwillison.net/2025/Oct/16/claude-skills/">Simon Willison post</a> has motivated me to go down a rabbit hole.</p>
</blockquote>

<figure>
<picture>
  <source srcset="/assets/2025/karpathy.webp" type="image/webp" />
  <img src="/assets/2025/karpathy.jpeg" alt="Vibecoding, by Andrej Karpathy." fetchpriority="high" style="width: 100%; height: auto;" />
</picture>
  <figcaption>Image credit: <a href="https://twitter.com/karpathy">via Andrej Karpathy</a></figcaption>
</figure>

<!--more-->

<p>AI coding assistants and vibecoding are a sea change in the world of software engineering. They make midwit <a href="https://www.youtube.com/watch?v=qYodWEKCuGg">code monkeys</a> like me something like 20% faster at creating a given functionality (depends on task, others say different, parts <a href="https://arxiv.org/abs/2302.06590">one</a>, <a href="https://economics.mit.edu/sites/default/files/inline-files/draft_copilot_experiments.pdf">two</a>, <a href="https://arxiv.org/abs/2507.09089">three</a>). But they also let me tackle things I never would have tackled, and the output is more robust in the long run, in terms of docs, tests, readability.</p>

<p>Suppose I want to do a traveling-salesman traversal of a bunch of news headlines in topic order. With Cursor or Claude Code, I can ask it to find all the Python modules that do traveling salesman and perform my task. And I can look at the code, run them, pick the one that is performant and makes sense. I can try different embeddings and choose the smallest one that works (or do dimensionality reduction).</p>

<p>I’ve known 10x devs who can just emit complex working C code fluently and it works on the first try, and I can’t do that. But using a coding assistant, I feel like one of them. It feels like I’ve been given superpowers. Or at least a fairly capable pair-coding partner.</p>

<p>And then with Claude Code I can say, add this field to the database schema, update the CRUD code to reflect it, write tests, and update the docstrings. And it will one-shot it.</p>

<p>I could even sketch a UI and say, make this using React and Bootstrap, and it will do a passable job. I can integrate it with GitHub, assign it PRs, and it will take a crack at them. I can spawn multiple sessions and have multiple agents working on multiple Git branches. I can give it my style hints on how I write code, write my own slash commands, lots of <a href="https://github.com/hesreallyhim/awesome-claude-code">awesome stuff</a>.  <a href="https://creatoreconomy.so/p/inside-claude-code-how-an-ai-native-actually-works-cat-wu">AI-first dev is just different</a>, although there is a <a href="https://windowsontheory.org/2025/11/04/thoughts-by-a-non-economist-on-ai-and-economics/">messiness tax</a>.</p>

<p>If you are a late adopter, update your toolchains! Take the mini courses on <a href="https://learn.deeplearning.ai/courses/claude-code-a-highly-agentic-coding-assistant/lesson/66b35/introduction">Claude Code</a> and <a href="https://cursor.com/en-US/learn">Cursor</a> and start to use them effectively.</p>

<p>Now let’s talk about <a href="https://www.anthropic.com/news/skills">Claude Skills</a>. Because they might also be a sea change, and let normies build agent workflows, without using a Python agent framework like LangGraph or OpenAI Agents SDK, or even a lightweight agent builder like Zapier or Copilot Studio.</p>

<p>“A skill is a Markdown file telling the model how to do something, optionally accompanied by extra documents and pre-written scripts that the model can run to help it accomplish the tasks described by the skill.” (direct quote from Simon Willison)</p>

<p>It’s an orchestration layer. It’s the world’s simplest, most effective agent framework.</p>

<p>Suppose you want the LLM to act like your travel agent, based on some <a href="https://www.anthropic.com/news/model-context-protocol">MCP tools</a> from airlines and booking.com. With MCP, you could tell the LLM, book me a ticket from New York to Paris. And the LLM will look up the right MCP tool, say OK! This lets me search for flights, book them etc.</p>

<p>Now with skills, I can write a markdown file that says: “always buy business class, no redeyes, window seat, because that’s how I roll. Prefer Delta because I am Diamond Medallion.”</p>

<p>On Claude Desktop you make a skill by creating a markdown file explaining that this is a skill for buying airline tickets, and here’s a workflow to do that.</p>

<p>When you start a chat it puts a token-efficient directory of available skills in the context.</p>

<p>Then when you say, book me a ticket, the first thing the LLM does is bring the full skill details into the context. It’s like the LLM now has a binder full of SOPs and when there is something relevant in the binder, before starting the task it takes out the checklist from the SOPs.</p>

<p>That may not sound like much, but this happens at runtime and you can also say, try booking.com, but if it times out retry 3 times. And then do Expedia and then Travelocity. So you can do a loop and control flow.</p>

<p>And then you could say, if I book a flight to Asia, give me an overnight in London so I can visit my gran, first book NY to London and then London to Singapore or wherever using the same airline ticket skill. So that’s recursion.</p>

<p>And then, one required tool in this context is computer use, running in a sandbox. You can give your skill bash scripts and Python scripts. So they can run complex behaviors, without writing full MCP tools.</p>

<p>You should be able to write <a href="https://druce.ai/2025/05/agent_engineering">agent patterns</a> by writing small skills combining some scripts and plain English descriptions, and an orchestrator skill in plain English (or have the code assistant write a script which would be more predictable: in practice explaining an agentic flow to the LLM in English is not ideal).</p>

<p>In the Claude Desktop sandbox, the computer use tool can’t access enterprise files, just what you upload to the sandbox. Still, easy way to implement small tools like, extract something from a PDF.</p>

<p>In Claude Code CLI a skill script can access local resources, network and the Web (with permission), so you could write a tool that just runs locally as a script and accesses the network and enterprise files.</p>

<p>So skills are more than hints files, they are an ultra simple agent framework and orchestration layer. For example, have a few skills that perform different tasks on videos with ffmpeg; have another skill that runs an end to end production process using those skills based on a doc explaining the process like a directed acyclic graph.</p>

<p>Or even 3 skills like plan a to-do list, code, test, and then a high level skill that says, take an objective from user and loop through: 1) update to-do list, 2) code the 1st item on list, 3) test and record outcome, until the objective is achieved. You just built a <a href="https://simonwillison.net/2025/Sep/18/agents/">ReAct agent</a> and a primitive version of Claude Code.</p>

<p>OpenAI and Microsoft have ~9 agent frameworks between them. Anthropic has 0. And yet, Anthropic has the most successful agentic tool for the biggest enterprise use case which is coding. Because Claude Code is really a universal agent. With tools + skills + computer use you can tell it to do anything.</p>

<p>Claude Code works well because it has</p>
<ul>
  <li>A great to-do list workflow so it doesn’t go off task.</li>
  <li>Great context engineering using skills, putting the right part of the code base in the context</li>
  <li>A great LLM well-tuned for this process.</li>
</ul>

<p>Maybe there is more secret sauce, but that is what I can see.</p>

<p>Skills and MCP can bring Claude Code to a higher level. So you are cruising along using Claude Code or Claude Desktop to do a research project. You use it do download a bunch of PDF articles, normalize to text, apply prompts to extract parts relevant to your project and make a virtual index card knowledge base. You can do all this extraction with computer use, it will write code on the fly. It might be a bit of a trial and error process, so suppose you find some parts that work well and you want to keep doing it that way.</p>

<ul>
  <li>You can write an MCP tool, which is a fairly heavy solution.</li>
  <li>You can write a skill with a script for the computer use tool which is a lot simpler. In this case the skill is like MCP-lite.</li>
  <li>The skill is easy to share as part of a git repo. (can be a per-project skill in the case of Claude Code).</li>
  <li>The progressive disclosure/gradual discovery of skill details on demand means you can use more of them without cluttering up the context or confusing the LLM.</li>
  <li>Skills operate at a higher level in the stack compared to tools and can call each other, so you can potentially implement more complex agent patterns. Although I would probably write Python with a framework like Agents SDK once agents get complex. But I could eventually see skills that abstract some of those patterns.</li>
</ul>

<p>Skills add a lot of agent bang for minimal framework complexity bucks.</p>

<p>I can also see a world where Claude Code knows you are say a financial researcher, and constantly adds new skills, puts them in hierarchies to abstract tasks like, finding and understanding news and research, analytics, writing. And improves them as it watches you work. For now you have to write your own skills with Claude’s help though. (edit - this is changing with <a href="https://github.com/ccplugins/awesome-claude-code-plugins">plugins</a> and <a href="https://claudemarketplaces.com/">marketplaces</a>)</p>

<p>The ‘agentic browsers’ are a bit disappointing to me, I can’t really tell it, read this folder full of PDFs and extract relevant parts using prompts into notes for this presentation I am doing. And I still have some security concerns about prompt injection. But I can do this research task with Claude Code. And over time all browsers will be agentic browsers with skills, probably.</p>

<p>Claude Code and skills punch above their weight. You can use Claude Code and skills and computer use as a universal agent to do anything on your computer implementing complex agent patterns.</p>

<p>If you haven’t already done it, download <a href="https://www.claude.com/product/claude-code">Claude Code</a>, hook up some <a href="https://mcpmarket.com/categories/developer-tools">MCP servers</a> and try some <a href="https://github.com/anthropics/skills">skills</a>. I have barely scratched the surface and am excited to do more.</p>

<p><a href="https://github.com/druce/research-kb/tree/main">A couple of small skills for this research project here.</a></p>

<h3 id="see-also">See also:</h3>
<ul>
  <li><a href="https://learn.deeplearning.ai/courses/claude-code-a-highly-agentic-coding-assistant/lesson/66b35/introduction">Claude Code tutorial</a></li>
  <li><a href="https://blog.sshh.io/p/how-i-use-every-claude-code-feature">How I Use Every Claude Code Feature</a></li>
  <li><a href="https://www.sidetool.co/post/exploring-claude-code-features?utm_source=chatgpt.com">Exploring Claude Code: Features</a></li>
  <li><a href="https://creatoreconomy.so/p/inside-claude-code-how-an-ai-native-actually-works-cat-wu">How an AI native actually works</a></li>
  <li><a href="https://www.lennysnewsletter.com/p/everyone-should-be-using-claude-code">50 ways non-technical people are using Claude Code in their work and life</a></li>
  <li><a href="https://github.com/hesreallyhim/awesome-claude-code">Awesome Claude Code</a></li>
</ul>]]></content><author><name>Druce Vertes</name></author><category term="AI" /><category term="AI" /><summary type="html"><![CDATA[Explore how Claude Code and Claude Skills are revolutionizing software development with agentic AI coding assistants. Learn about vibecoding and the future of AI-powered programming.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://druce.ai/assets/2025/karpathy.jpeg" /><media:content medium="image" url="https://druce.ai/assets/2025/karpathy.jpeg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Bad Vibes: High Variance v. High Bias</title><link href="https://druce.ai/2025/08/bad-vibes" rel="alternate" type="text/html" title="Bad Vibes: High Variance v. High Bias" /><published>2025-08-09T01:01:01+00:00</published><updated>2025-08-09T01:01:01+00:00</updated><id>https://druce.ai/2025/08/bad-vibes</id><content type="html" xml:base="https://druce.ai/2025/08/bad-vibes"><![CDATA[<blockquote>
  <p><a href="https://www.ajc.com/news/2025/08/active-shooter-reported-on-emory-university-campus/">“He was very unsettled and he very deeply believed that vaccines hurt him and were hurting other people.”</a></p>

  <p><a href="https://www.gbnews.com/politics/us/rfk-promises-clean-cesspool-corruption-cdc">RFK, Jr. promises to ‘clean up cesspool of corruption at CDC’.</a></p>

  <p><a href="https://www.goodreads.com/quotes/78721-in-such-a-world-of-conflict-a-world-of-victims">“In such a world of conflict, a world of victims and executioners, it is the job of thinking people, not to be on the side of the executioners.”- Albert Camus</a></p>
</blockquote>

<!--more-->

<p>Medicine is high-bias, in the mathematical sense of a model that is relatively insensitive to changes in data. Like a linear model vs. a higher-order model that can follow complex multidimensional curves in the data. Medicine over-indexes on pedigrees like Harvard PhDs. It is slow to accept revolutionary ideas even in the face of evidence, and then gives Nobel laureates who originate them possibly undue deference. <a href="https://en.wikipedia.org/wiki/Planck%27s_principle">“Science progresses one funeral at a time”</a>, as explored by <a href="https://en.wikipedia.org/wiki/The_Structure_of_Scientific_Revolutions">Thomas Kuhn</a>.</p>

<p>For life-and-death decisions, this is usually for the better.</p>

<p>Science needs <a href="https://en.wikipedia.org/wiki/Falsifiability">falsifiability</a> and verifiability, or it’s not science. Statistical evidence is a very dull, sample-inefficient knife. For instance, it’s generally accepted that cigarettes contribute to cancer, or that high cholesterol of certain kinds contributes to heart attacks. But it took a while. People have argued and maybe still argue that medicine is wrong, it’s more complex than that, that both cigarettes and cancer are downstream of e.g. stress and lifestyles and genetics that make people want to smoke.</p>

<p>So you can expose lab animals to cigarettes (or high cholesterol), or to the toxins in cigarette smoke, and see what happens. You can randomly target people with anti-smoking or anti-cholesterol interventions. Complex systems are hard, like maybe the cholesterol in arteries doesn’t come from dietary cholesterol but from high carb diets. But at some point, it becomes perverse to deny some degree of causality, as calculated by <a href="https://www.amazon.com/Book-Why-Science-Cause-Effect/dp/046509760X">increasingly systematic methods</a>, even if they only gradually approach the truth.</p>

<p>On the other hand, health influencers like Andrew Huberman, Dr. Mike, Dr. Phil, Dr. Oz (<a href="https://www.nbcnews.com/health/health-news/dr-mehmet-oz-health-claims-controversial-medicare-trump-rcna181085">if it quacks like a quack</a>) probably over-index on engagement.</p>

<p>There are probably ways to synthesize slow research and fast, extreme social media, to leverage all the crowdsourced data and discussions to make medicine better and more adaptable over time, and customized to different populations and individuals, and communicate and educate better. Doctors should be a bit concerned how often people report that <a href="https://pubmed.ncbi.nlm.nih.gov/37115527/">ChatGPT does a better job</a> of listening to patients and diagnosing.</p>

<p>People get mad when medicine is slow and hidebound. And they also get mad when it seems to change advice on e.g. masks or diets, and what was bad is now good. <a href="https://www.factcheck.org/2025/08/rfk-jr-justifies-cuts-to-mrna-vaccine-projects-with-falsehoods/">They can even get mad when it cures a pandemic</a>. Not because it was too slow or too fast but because…well I’m not really sure what the problem is. They say the mRNA vaccine is ineffective and risks outweigh the benefits but it certainly seemed to end the pandemic, and evidence of widespread problems seems scant.</p>

<p>Also they are canceling <em>research</em> into messenger RNA therapies, not just the current crop of vaccines. Reprogramming the immune system is just too powerful, we don’t want to have cancer vaccines I guess. It’s not enough to say the climate science is wrong, <a href="https://futurism.com/white-house-orders-nasa-destroy-important-satellite">we’re not allowed to even collect data now</a>.</p>

<p><em>Cultishness</em>  might be a better description than <em>engagement</em> of what newer social-media movements over-index on, the health influencers, Trump and <a href="https://en.wikipedia.org/wiki/TESCREAL">TESCREAL</a> and Bitcoin.</p>

<p>Unfortunately it’s a recurring story of our era. There’s a lack of trust in institutions attributable to emergence of social media. Internet vibes are more real than what goes on in labs and models. <a href="https://www.axios.com/2025/08/11/ai-friends-chatbots-future">And it might keep getting worse and collapse entirely.</a> Or we might figure out how to use AI to make it better, more trustworthy.</p>

<p>There is truth to the notion that institutions have some catching up to do with technology. It’s not like we would have flying cars by now if government didn’t stand in the way, but government tends to slow things like new drugs and Ubers down. And we should have real-time payment clearing and real-time spending and jobs data.</p>

<p>But what’s happening is like living with a crazy person. With crazy people you can nod and say OK and let them think and do what they want. But the inmates are running the asylum, and now you can’t even get those therapies because they won’t be approved or offered and the research will happen elsewhere. It seems more about control than reality. You can’t tell me what to do, any thinking or data-gathering about systemic effects and behaviors is socialism or tyranny or something.</p>

<p>Then trolls like Q and Alex Jones find the pressure points, and the mountebanks like Dr. Oz, RFK Jr., Fox, Trump, Musk attack them relentlessly to gain wealth and power. And then Dr. Fauci gets death threats, and people shoot up hospitals and medical research offices.</p>

<p>Its a con man’s carnival, a grifter gravy train. The information space is just completely captured by memes divorced from reality, and by hustlers, scammers, trolls, and con artists. We really need decent reality-grounded folks to figure out how to recapture the marketplace of ideas, or we’re doomed to government of the shitposters, by the shitposters, for the shitposters. There are folks like MeidasTouch and the Krassensteins who sometimes get labeled grifters and clout chasers. But maybe every successful business is a bit of a cult or a racket, everything human that endures has an element of grift and graft and <a href="https://druce.ai/2023/09/bullshit">bullshit</a>. They had to sell indulgences to build the Sistine Chapel.</p>

<p>US democracy is pretty low-bias and high-variance; It’s boundedly responsive to voters, and to money. It also has a lot of apathy, most people can’t be bothered by politics or understanding policy, and stuff generally just works without their participation. Until recently there was a reasonable amount of consensus around obvious stuff like measles and polio vaccines, and fluoride conspiracies were way outside the mainstream. But US democracy has pressure points, and you can make a buck selling crazy viral stuff. Folks like Putin and Murdoch and Musk figured out how to exploit the pressure points, and sell appealing self-serving nonsense to their benefit. The founding fathers talked about this a lot, they  wanted indirect election of the president, lifetime judge appointments to introduce high bias (lower sensitivity to public opinion) and avoid high-variance populist demagogues and big changes in direction. Later governments did the same by delegating authority to commissioners and the Federal Reserve to conduct independent analyses and policies.</p>

<p>Of course, it was just a nut who shot at the CDC, just like it was just a nut who beat Paul Pelosi with a hammer, just like it was just a nut who gunned down legislators in Minnesota etc., etc.</p>

<p>But, you know Trump did January 6, he invoked 2nd amendment solutions, he wanted to call the military out against protestors, he repeatedly said stuff like, back in the day we took care of bad people. The Army is there to shoot bad people. Let’s pass laws to make it OK for righteous people to run over protestors or ‘stand their ground’ against bad people. When the looting starts, the shooting starts. He refused to call Gov. Walz because he’s a bad guy. His minions reshared stuff about the shooter being a Walz appointee, just like they shared stuff about Pelosi getting attacked as part of some kind of gay love triangle. Could write 10x as much on extreme right-wing violence and Trump stoking it with eliminationist rhetoric, and you know it’s true. <a href="https://www.nbcnews.com/tech/elon-musk/grok-elon-musks-ai-chatbot-seems-get-right-wing-update-rcna217306">Even Grok admits it</a>.</p>

<p>There’s a shitposting strategy to constantly be doing and saying outrageous stuff to keep the narrative on him and away from <a href="https://en.wikipedia.org/wiki/Donald_Trump_sexual_misconduct_allegations">sensitive topics</a>, and to be so crazy and fast-moving that any reasoned, evidence-based response is responding to the stuff from 2 news cycles ago. It’s about control, not reality.</p>

<p>There’s an iterated prisoner’s dilemma game of <a href="https://ncase.me/trust/">building trust</a>, and there’s a one-time prisoner’s dilemma game of defection, where you have to <a href="https://claremontreviewofbooks.com/digital/the-flight-93-election/">crash the cockpit door</a> and <a href="https://x.com/elonmusk/status/1602278477234728960">kill the woke mind virus or else nothing else matters.</a></p>

<p>Of course, every election is a Flight 93 election now. So the Republicans want to redistrict Texas and do a new Census now. And some Democrats are like, OK in that case we’re going to redistrict NY and California to be 90% Democratic. On the one hand, OK you might have to fight fire with fire and play to win. But if one side wants to kill democracy, they are happy to see you abandon democratic principles. You go down that road it’s not much of a democracy.</p>

<p>There is a logic of peace which is to try to find common ground (prisoner’s dilemma cooperation), and there is a logic of war which is to destroy the enemy before they destroy you (defection). The side that wants to end democracy is guaranteed to win eventually. Defection breeds defection. They only have to win once, unless they are stopped in a relatively final way first. <a href="https://www.wsj.com/politics/why-the-far-right-hates-churchill-20fdc710?gaa_at=eafs&amp;gaa_n=ASWzDAgJ0Vd-2KKrQSfn6gkC1byk4l8wpt50egt7i1Z-fkeu4Dfyhe-C1sIcNF9Mrbg%3D&amp;gaa_ts=6897a3f1&amp;gaa_sig=DbVUztaqu8_djfBklE1RmfNnXO_uGcmZVTtHFA4MyQDiqcYMd6n-rRUJi-_JqfLT7vju2fzSkLoTmgBwI776QA%3D%3D">There’s a reason the extreme right hates Churchill.</a></p>

<p>In my lifetime the conservatives were the high-bias party, respecting tradition and hierarchy and wealth and pedigree, standing athwart history yelling ‘stop’. But now they are the party of revolution and chaos, they got hostile-taken-over by ends-justify-the-means Jacobin reactionaries, and it will evolve in exactly the same way. Poorly and violently.</p>

<p>It will make great TV, or TikTok. In the words of the greatest Doctor, we’re all just stories in the end so make it a good one. Not one that looks fire on TikTok (literally). Not one that future generations will say, wow, how could they believe this guy who can’t utter a coherent sentence, who is a pathological liar (Ibrought eleventy gajillion dollars into the US! I cut drug prices 1,500%! I prevented 32 wars this morning!), who is a congenital cheater and sex abuser, and likely child molester, and holds deep antipathy for huge swaths of Americans. I mean, given what we know about Epstein, how likely was the option presented, and how likely was it to have been taken.</p>

<p>In the words of <a href="https://www.poetryfoundation.org/poems/43290/the-second-coming">Yeats</a>:</p>

<p><em>Things fall apart; the centre cannot hold;</em><br />
<em>Mere anarchy is loosed upon the world,</em><br />
<em>The blood-dimmed tide is loosed, and everywhere</em>   <br />
<em>The ceremony of innocence is drowned;</em><br />
<em>The best lack all conviction, while the worst</em>   <br />
<em>Are full of passionate intensity.</em><br />
<em>Surely some revelation is at hand</em></p>]]></content><author><name>Druce Vertes</name></author><category term="politics" /><category term="politics" /><summary type="html"><![CDATA[“He was very unsettled and he very deeply believed that vaccines hurt him and were hurting other people.” RFK, Jr. promises to ‘clean up cesspool of corruption at CDC’. “In such a world of conflict, a world of victims and executioners, it is the job of thinking people, not to be on the side of the executioners.”- Albert Camus]]></summary></entry><entry><title type="html">Urban Myths of AI</title><link href="https://druce.ai/2025/07/dumb_people" rel="alternate" type="text/html" title="Urban Myths of AI" /><published>2025-07-13T01:01:01+00:00</published><updated>2025-07-13T01:01:01+00:00</updated><id>https://druce.ai/2025/07/dumb-people</id><content type="html" xml:base="https://druce.ai/2025/07/dumb_people"><![CDATA[<picture>
  <source srcset="/assets/2025/dumb_people.webp" type="image/webp" />
  <img src="/assets/2025/dumb_people.png" fetchpriority="high" style="width: 100%; height: 100%;" />
</picture>

<blockquote>
  <p>This is a rant about cybersecurity and the information space around AI.</p>
</blockquote>

<!--more-->

<p>A couple of years ago, I was out sailing in NY harbor. A gust picked up my red L.L. Bean baseball cap and blew it into the water.  I went home, and I was scrolling Facebook, and the first thing I saw was an ad for a red L.L. Bean baseball cap.</p>

<p>So what are the odds that Facebook really does listen to all your activities and show you ads according to them?</p>

<p>I’ve seen Mark Zuckerberg talk over the years and say things like,<a href="https://www.theguardian.com/technology/2018/apr/17/facebook-people-first-ever-mark-zuckerberg-harvard"> “They trust me. Dumb fucks.”</a></p>

<p>All too plausible that he would try things like that.</p>

<p>But I also know how machine learning works. And the algorithm knows I sometimes shop at L.L. Bean, and certainly that I looked at the red baseball cap if not actually bought it.</p>

<p>And it knows my location. It’s at least equally plausible that machine learning would learn that after a day doing outdoor activities, people sometimes buy baseball caps or outdoor wear, and that it would show me something that I had been interested in.</p>

<p>For sure there are some shenanigans that we don’t know about. But the known ways they monitor and manipulate us are as bad as the conspiracy theories. Who needs to spy on you when you let them know where you are, who with, and every online interaction?</p>

<p>Eventually I quit Facebook:</p>
<ul>
  <li>I had a possibly ADD-related unhealthy relationship with it. I would spend too much time there…even though most of the time was not that positive. There was a lot of addictive clickbait-y junk and stupid stuff, and people getting in my business. And politics.</li>
  <li>I felt there was <a href="https://phys.org/news/2023-12-social-media-happier-efficient.html">more upside to leaving in terms of overall mental well-being</a>.</li>
  <li>Overall not trusting the company. Google and Apple know everything about me. I don’t need every company to know everything, especially ones who have repeatedly showed themselves to be manipulative and untrustworthy.</li>
</ul>

<p>Now I want to share this tweet.</p>

<p><img src="/assets/2025/tweet.png" /></p>

<p>Okay, not gonna lie, this is stupid.</p>

<p>ChatGPT explicitly provides an opt out to training on your data. Language in contracts for products like ChatGPT Enterprise is also explicit. Here are personal GPT settings:</p>

<p><img src="/assets/2025/chatgpt_tos.png" /></p>

<p>A lot of work goes into making a clean data corpus for pre-training. If you do a multi-million-dollar training run, and then realize the data set was contaminated with really bad stuff, there’s no way to fix it. You have to start over from scratch, or <a href="https://www.techdirt.com/2024/12/03/the-curious-case-of-chatgpts-banned-names-hard-coding-blocks-to-avoid-nuisance-threats/">blacklist some questions because responses expose you to liability</a>. It’s just a <a href="https://www.washingtonpost.com/technology/2025/07/11/grok-ai-elon-musk-antisemitism/">disaster and a PR nightmare</a>.</p>

<p><a href="https://arxiv.org/abs/2405.05904">LLMs struggle to acquire new knowledge through post-training and fine-tuning.</a> Reinforcement Learning With Human Feedback, Direct Policy Optimization, Supervised Fine-Tuning are mostly about structuring better responses on the existing knowledge base.</p>

<p>It’s beyond unlikely that OpenAI is intentionally, systematically, taking your private conversations and training with them. I think if you have any picture of how the LLM sausage is made, the scenario does not seem remotely plausible. <em>Of course it’s hallucinating that it read the board minutes.</em></p>

<p>Nevertheless, I’ve repeatedly had this conversation with, you know, smart IT people who are supposed to be familiar with the technology and ToS. And sometimes people have got a little bit testy with me for telling me their concerns are over the top. “I heard it from X! Trust me, bro.”</p>

<p>I’m not saying there might not be reasons to avoid ChatGPT. How should AI engineers and CTOs and CEOs think about the risks of putting private data, proprietary data into LLMs?</p>

<p>There are levels to this game.</p>

<p><em>Level 0: What, me worry?</em> Let anybody put anything they want into any SaaS products, install any mobile apps, Chrome extensions that can read and change your Web pages.</p>

<p>This is clearly a very bad idea. <a href="https://www.zdnet.com/article/how-to-delete-your-23andme-data-asap-and-why-you-should/">Look at 23andMe</a>. They had a severe breach, they went broke, they could have been bought by anybody who would then have had all your DNA information, and not been subject to the contracts that were previously signed.</p>

<p>And frankly this seems like a blind spot in our existing privacy and security landscape. Some rights you shouldn’t be able to sign away, or lose in bankruptcy court.</p>

<p>If you are Goldman Sachs, and Google knows everything you search for, Bloomberg has all your chats with your clients, they will know what you are up to. Other providers who know more than you might be comfortable with: NetJets, your ISP, your mobile provider, whoever runs all the networks of video cameras, personal assistants, butlers and system admins, and so on. Goldman basically <a href="https://symphony.com/">started a company</a> that is Signal with compliance because of discomfort with Bloomberg. And a <a href="https://www.twosigma.com/">huge hedge fund</a> is basically, what if Google used every bit of online data exhaust for investing. It’s the Wild West out there. Software is eating the world so everything gets captured, and now AI can find everything. You have to do better than ‘nothing’.</p>

<p><em>Level 1:</em> Understand terms of service and only use trusted SaaS endpoints, and exercise opt-outs, and implement internal policies and controls about what can be pasted into approved AI.</p>

<p>That seems like the bare minimum. Then, as long as you trust that ChatGPT complies properly with the-opt out and the terms of service, and they don’t suffer a breach, you should be okay.</p>

<p>Should you trust OpenAI? They are a startup. Things are <a href="https://calv.info/openai-reflections">a little bit chaotic</a>. Nation-states spy on them. And they have had <a href="https://www.cnbc.com/2023/03/23/openai-ceo-says-a-bug-allowed-some-chatgpt-to-see-others-chat-titles.html">breaches where your conversations were shown to other users</a> and where <a href="https://www.theregister.com/2024/07/08/infosec_in_brief/">info was stolen</a>.</p>

<p>Also they are currently under a <a href="https://arstechnica.com/tech-policy/2025/06/openai-confronts-user-panic-over-court-ordered-retention-of-chatgpt-logs/">court order to retain logs indefinitely and let plaintiffs search them</a>. Presumably a separate pipeline that doesn’t impact e.g. other training and operational pipelines. But again, <a href="https://www.bloomberg.com/news/articles/2025-07-01/columbia-university-applicants-personal-data-stolen-by-hacker">breaches happen</a>.</p>

<p>So you need to exercise your own judgment about which SaaS services you can trust and what the upsides and the downsides are.</p>

<p><em>Level 2: Trusted public cloud</em>. If you are a Fortune 500 company or a regulated investment company, or you handle medical or other data that’s subject to HIPAA and other regs, you need stronger representations about the privacy of the data. You might avoid public API endpoints. You might use a cloud provider like Microsoft’s Azure, which is <a href="https://learn.microsoft.com/en-us/compliance/regulatory/offering-home">certified ISO 27001 compliant and SOC-3 and HIPAA compliant and audited</a>. And then you access hosted LLMs via that trusted public cloud.</p>

<p>If you use Microsoft Teams and hosted Microsoft Office 365, then you have chosen to trust Microsoft with your internal communications. There is no reason not to trust them for LLMs.</p>

<p>For most companies, major cloud providers are the best they can do. But if you are the CIA, or a really secretive investment firm like <a href="https://www.youtube.com/watch?v=hWX8V9KSZM8">Renaissance</a>, you are not even OK with public cloud.</p>

<p><em>Level 3: On-prem servers and trusted private clouds.</em> You host your own email, and chat, and video-conferencing, and your own LLMs. No Teams, no Zoom, no Gmail. You implement things like biometric access, compartmentalization.</p>

<p>But if you build everything in-house, it’s expensive. You still have to trust someone: your employees, and the vendors who help you build it. And constantly monitor it and update it. And you have to trust that you’re able to do it more securely than Microsoft and AWS and Google, and it’s not their first rodeo. If you’re not extremely capable, you’re just gonna spend a lot more money and create a lot of hassle and end up less secure.</p>

<p>If government-sponsored hackers want to breach you, they still have a good shot, by compromising workers, having their spies work for you, intercepting equipment and tampering with it. With enough effort, they can probably get into anything. If Microsoft <a href="https://www.axios.com/2024/04/03/microsoft-security-practices-government-review">fails to stop them</a>, <a href="https://www.axios.com/2024/03/08/microsoft-executive-emails-russia-hack">again and again</a>, what chance have you got?</p>

<p>As an IT manager or CTO or CEO, you have to pick a posture based on your own company’s sensitivity to a hack and loss of data and based on your resources, and for most companies, keeping everything in a single trusted cloud is the most appropriate solution.</p>

<p>So choose your own adventure. Pick your poison. How dead are you if you have a breach, and what can you afford to prevent it? Understand your threat models and what will kill you, like ransomware and spearphishers wiring firm or customer funds to a Manila casino. Make sure you are implementing best practices, spending appropriate resources combating appropriate realistic well-grounded threats, and not chasing your tail and making operations more complicated for no reason.</p>

<p>All this to say, there are valid reasons why you might not want to use OpenAI, but them spying on and publishing your private conversations is not one of them. (Unless you somehow leak them onto the Web and into the training corpus).</p>

<p>And you should have people who know what they are doing, not making decisions on the basis of tweets or panel discussions at your typical industry conference.</p>

<p>So what’s my point? Mostly I just wanted to get this off my chest, and the next time it comes up, point to it.</p>

<p>But also, there’s a lot of nonsense out there. There’s bad medical information out there, bad AI information, bad cybersecurity information. It’s a free country, anybody can be a viral influencer on social media.</p>

<p>If you’re a doctor or an IT guy, people already don’t listen, you give simple detailed instructions, they hear what they want to hear and  do whatever they want to do. AI just makes it worse, they’ll find someone to tell them authoritatively whatever they want.</p>

<p>There are a lot of professional AI-haters, like Gary Marcus and Ed Zitron, for whom AI can do no right. Even the so-called experts, what they say does not always do a service to the community.</p>

<p>And of course, there’s an insane amount of hype about AI and people who sell it act like it’s better than it is, and will be AGI if you just give them <a href="https://thenewstack.io/making-sense-of-sam-altmans-7-trillion-ai-chips-gambit/">seven trillion dollars, man</a>. Some managers swallow it, and think that you can just say AI, do this complex task and it will spontaneously automate it flawlessly, or at least perform it as well as humans with no errors or hallucinations, and then you can cut staff.</p>

<p>AI figured out language. Which is a huge step forward. But it has a long way to go to be anything like AGI. It has to be able to learn on the fly. It has to integrate the left brain and right brain, Type 1 and Type 2 cognition. But just with a deep understanding of language, we can automate a lot of things, and it will disrupt a lot of professions and industries. And a lot of non-AI savvy companies are going to be disrupted by hungry, smart, AI-first companies.</p>

<p>No one is coming to save you. Our leaders don’t know what they’re doing. There is no Real Room, where real experts in charge with perfect information and real authority work.  It’s just us. <a href="https://bsky.app/profile/swiftonsecurity.com/post/3ltpc5ergjs2a">We are The Room</a>. There’s no replacement for serious thinking grounded in reality, and it’s in short supply.</p>

<p>So prep for artificial intelligence, and also inconceivable amounts of human stupidity. Be careful out there.</p>

<p>(Obligatory disclosure, on some days, and some matters I am without doubt one of the Dumb People. Having made this clickbait title, there will without a doubt be a stupid typo in here.)</p>

<p><img src="/assets/2025/careful.png" /></p>]]></content><author><name>Druce Vertes</name></author><category term="infosec" /><category term="infosec" /><summary type="html"><![CDATA[This is a rant about cybersecurity and the information space around AI.]]></summary></entry><entry><title type="html">16 Agent Patterns: An Agent Engineering Primer</title><link href="https://druce.ai/2025/05/agent_engineering" rel="alternate" type="text/html" title="16 Agent Patterns: An Agent Engineering Primer" /><published>2025-05-12T01:01:01+00:00</published><updated>2025-05-12T01:01:01+00:00</updated><id>https://druce.ai/2025/05/agent-engineering</id><content type="html" xml:base="https://druce.ai/2025/05/agent_engineering"><![CDATA[<picture>
  <source srcset="/assets/2025/glitch_small.webp" type="image/webp" />
  <img src="/assets/2025/glitch_small.png" alt="Agent engineering illustration" style="width: 100%; height: auto;" />
</picture>
<blockquote>
  <p><em>Any sufficiently advanced technology is indistinguishable from magic. — Arthur C. Clarke</em></p>

  <p>What are AI agents? <a href="https://x.com/simonw/status/1843290729260703801">Simon Willison</a> crowdsourced a lot of definitions that focus on:</p>

  <p>1) Using AI to take action on the user’s behalf in the real world (i.e. <em>what</em> the agent does) <br />
2) Using AI to control a loop or complex flow (i.e. <em>how</em> the agent does it).</p>

  <p>An AI agent takes a sequence of <strong>actions</strong> based on an AI-determined <strong>control flow.</strong></p>

  <p>Agents use prompts as the CPU of a Turing machine that can manage state, memory, I/O, and control flow. The agent can access the Internet and tools to perform compute tasks, retrieve info, take actions via APIs, and use the outputs to determine next steps in a loop or complex control flow. Maybe even control a browser or computer.</p>

  <p>In this post, we’ll try to develop a roadmap of agent concepts and patterns to learn, and resources to learn them.</p>
</blockquote>

<!--more-->

<h2 id="spinning-up-from-prompting-to-single-turn-agents">Spinning Up: From Prompting to Single-Turn Agents</h2>

<p>Before diving into agent patterns, let’s review 4 LLM foundational skills:</p>

<ol>
  <li><strong>Prompting</strong> – The term ‘Prompt engineering’ contains an element of puffery, but we need to give clear, specific, instructions, so the LLM answers properly and in the right format. It’s an entry‑level skill that underpins every other pattern.
    <ul>
      <li>C-L-E-A-R Framework:
        <ul>
          <li><em>Contextualize</em> - Specify a role or persona and intent: <em>“You are a copy editor with years of experience polishing articles and blog posts for web publication. You will read the content carefully and suggest changes for clarity, style, and standard usage.”</em></li>
          <li><em>Limits</em> - Length; format e.g. <em>‘three bullet points’</em>; tone or style e.g. <em>‘concisely’</em>, or <em>‘like a tech journalist’</em>, or <em>‘only use facts from this text’</em>.</li>
          <li><em>Elaborate and give Examples</em> - Explain and provide as many details and specifics as possible. Use <a href="https://www.promptingguide.ai/techniques/cot">chain of thought</a> and <a href="https://arxiv.org/abs/2407.12994">other advanced prompting methods</a>.</li>
          <li><em>Audience</em> - Identify the audience the response is addressed to, such as ‘explain like I’m 5’.</li>
          <li><em>Reflect or Review</em> - Prompt ChatGPT to ask clarifying questions before answering, give itself space, such as <em>“think step by step”</em>, <em>“make sure of x before answering”</em>.</li>
        </ul>
      </li>
      <li>Alternatives: <a href="https://medium.com/@BK.HAN/6-essential-elements-of-ai-prompt-engineering-tcepft-as-bk-hans-mnemonic-43e689f22ad8">T-C-E-P-F-T</a> (Task, Context, Example, Persona, Format, Tone). Or <a href="https://www.forbes.com/sites/danfitzpatrick/2024/08/10/the-perfect-chatgpt-prompt-doesnt-exi-/">P-R-E-P-A-R-E-D</a> (Propose, Role, Explain/Explicit, Presentation, Ask, Rate/Reflect, Emotions, Diversity). Use what resonates with you.</li>
      <li>These days, you don’t need to spend hundreds of hours learning prompt engineering. Think about your intention, take a first crack using one of the above frameworks, and then ask your favorite LLM to improve it, iterating as necessary. <a href="https://cookbook.openai.com/examples/enhance_your_prompts_with_meta_prompting">OpenAI Cookbook: Enhance your prompts with meta prompting</a>.</li>
      <li>Side quest - <a href="https://www.promptfoo.dev/docs/intro/">proper evals</a>, and automated prompt engineering with tools like <a href="https://dspy.ai/">DSPy</a>. If you have good evals, you will eventually have good prompts and outputs through iteration. If you don’t have good evals, changes in underlying LLMs and assumptions will break your prompts and workflows.</li>
      <li>As prompts become more dynamic and complex and we add tool use (discussed next), we start to think about it as ‘Context engineering’ to ensure the LLM has info it needs to provide a good answer. However we name it, good prompting and evals are a foundational skill. You need to know how to talk to the AI and measure the results. <br /></li>
      <li>See previous post: <a href="https://druce.ai/2024/01/prompting">Practical ChatGPT Prompting: 15 Patterns to Improve Your Prompts</a></li>
      <li>Also see <a href="https://cookbook.openai.com/examples/gpt4-1_prompting_guide">GPT 4.1 prompting guide</a>. The recent 4.1 OpenAI models are trained for agentic workflows, they do many things automatically that required complex prompting in previous models.<br />   <br /></li>
    </ul>
  </li>
  <li>
    <p><strong>Tool Use</strong> – Expose a catalog of external APIs to the agent, like a Python function, search, SQL, REST, a browser, a full Python interpreter REPL, or a shell terminal, etc. Let the LLM decide whether to call a tool and which tool to call at each turn of the conversation. The LLM can respond with a request to call a tool using a provided calling signature; the user or client calls the tool and responds with the output; the LLM then uses tool output to determine the final answer or an additional tool call). See <a href="https://microsoft.github.io/ai-agents-for-beginners/04-tool-use/">Microsoft: Tool Use Design Pattern</a></p>
  </li>
  <li>
    <p><strong>Retrieval-Augmented Generation (RAG)</strong>: Give the agent documents and a tool (such as a vector database) to find relevant parts of the documents and respond using them via in-context learning, i.e. stuffing the prompt with data to ground the answers. <em>“Please answer this question using the following text”</em>. See <a href="https://www.ai-bites.net/retrieval-augmented-generation-rag-a-quick-and-comprehensive-introduction/">Retrieval Augmented Generation (RAG) — A quick and comprehensive introduction.
</a></p>
  </li>
  <li><strong>Chain‑of‑Thought Prompting</strong> – Ask for step‑by‑step reasoning traces that make the model’s logic explicit and usually boost accuracy on math, logic and multi‑step tasks. <em>“Before providing a final answer, please think step by step, walk through your complete research and thought process, and show your reasoning.”</em> Kind of like <a href="https://rubberduckdebugging.com/">‘explaining your code to your rubber duck’</a>, telling the model to show its work, and explain what it’s doing as it does it, forces it to think longer, and improves performance. Thought traces are also important for agents to remember what they did previously and why they did it. <a href="https://arxiv.org/abs/2201.11903">Paper: Wei et al.</a></li>
</ol>

<p>With these 4 elements you can build highly capable single-turn OpenAI <a href="https://platform.openai.com/docs/api-reference/assistants">Assistants</a> or <a href="https://help.openai.com/en/articles/8554397-creating-a-gpt">Custom GPTs</a>.</p>

<p>You can write a system prompt that describes a workflow to follow in response to user input, give it docs with detailed processes and reference information, and external tools to use. See for instance this <a href="https://chatgpt.com/g/g-4tqcPryPK-the-m-a-matrix-by-tuck-advisorstm">Tuck AI Matrix custom GPT</a>, which follows a proprietary methodology to do basic evaluations of M&amp;A deals.</p>

<p>However, the OpenAI custom GPTs and Assistants (and their equivalents on other platforms) have a single prompt, so they aren’t true multi-turn agentic workflows. (They can call multiple tools though.) To level up to full-blown agentic workflows, we want more customizable multi-turn workflows that may use many different models, custom tools, sub-agents, and complex control flows.</p>

<h2 id="16-multi-turn-agent-patterns">16 Multi-turn Agent Patterns</h2>

<ol>
  <li>
    <p><strong>ReAct (Reason + Act) Loops</strong> – Interleave “Thought → Action → Observation” so the agent both reasons and calls tools (search, code, DB) in the same dialog, allowing complex chains of thoughts and actions. This was the breakthrough behind <a href="https://agpt.co/">AutoGPT</a>, which you can run online <a href="https://agentgpt.reworkd.ai/">here</a>. Ask a question like ‘Find the best coffee grinder for espresso under $300’, and it will loop through a process of thinking, what are the tasks I need to do based on what I’ve done so far, what is the highest priority task, do it, observe the output, iterate until the goal is reached.  <a href="https://arxiv.org/abs/2210.03629">Paper: Yao et al.</a> ; Blog posts: <a href="https://interconnected.org/home/2023/03/16/singularity">Matt Webb</a>; <a href="https://til.simonwillison.net/llms/python-react-pattern">Simon Willison</a> <br />   <br />The ReAct pattern is fascinating and powerful, but the autonomy can make it unpredictable and hard to reason about, which is a general tradeoff when building agents. The more autonomy you give it, the more room for emergent behavior, but also the more risk it goes off the rails.</p>
  </li>
  <li>
    <p><strong>Prompt Chaining &amp; Sequential Workflows</strong> – Break a complex task into ordered sub‑prompts with intermediate validation (“gate checks”) before moving to the next stage.  <a href="https://python.langchain.com/docs/tutorials/agents/">LangChain: Build an Agent</a>. Example: <a href="https://github.com/druce/AInewsbot/blob/main/README.md">a news gathering workflow</a>. Small prompts that perform composable tasks that can be tested and optimized independently are more predictable and easier to maintain than long ‘God’ prompts that try to do everything. See <a href="https://applied-llms.org/">What We’ve Learned From A Year of Building with LLMs</a></p>
  </li>
  <li>
    <p><strong>Structured Output</strong> – Since errors tend to compound as you go down the agent’s trajectory, structured outputs and validation are critical. Ask the model to return JSON, then validate it, letting downstream code parse or act on the response safely. If output doesn’t validate, attempt to fix the output, or fix the input and retry. The GPT-4.1 models are exceptionally good at returning valid JSON, which you can also use <a href="https://docs.pydantic.dev/latest/">Pydantic</a> to specify and validate. Study the <a href="https://cookbook.openai.com/examples/gpt4-1_prompting_guide">prompting guide</a> thoroughly.</p>
  </li>
  <li>
    <p><strong>Human-in-the-loop</strong>  – At the current maturity of AI development, fully autonomous agents are typically very challenging to achieve in complex, high-stakes environments, where they add the most value. It’s much more realistic to try to make agentic assistants and copilots that take humans through a structured process, than to aim for full autonomy. The AI can speed things up dramatically, but performance can also be hit-or-miss, so human supervision is critical. At key steps the human should evaluate and course-correct as necessary. <em>Time travel</em> allowing the human to go back to a previous step, adjust, and try again can also be useful. <br />   <br /> In fact, if you remember nothing else from this post: <br />   <br /> 🤖🦾 <strong>Use AI for what AI is good at:</strong> parsing lots of information quickly and generating a first draft at a near-human level; fuzzy logic (easier to ask the LLM the human name for a URL than to parse the numerous ways websites provide titles) <br />   <br /> 🛠️⚙️ - <strong>Use tools for what tools are good at</strong>: faithfully executing algorithmic workflows;<br />   <br /> 👩‍⚕️💪 - <strong>Use humans in the loop for what humans are good at:</strong> critical thinking and creativity. <br />   <br /></p>
  </li>
  <li>
    <p><strong>Reflection</strong> – After an initial answer, the agent critiques its own work and revises.  For instance, a check for factuality may reduce hallucinations. Is this summary consistent with the text it summarizes? The agent can reflect and improve multiple times until satisfied, and/or perform multiple separate checks, like for factuality and also a Flesch-Kincaid readability benchmark. See <a href="https://www.deeplearning.ai/the-batch/agentic-design-patterns-part-2-reflection/">DeepLearning.ai “Reflection” pattern</a>. <a href="https://arxiv.org/abs/2303.11366">Paper: Shinn et al.</a></p>
  </li>
  <li>
    <p><strong>Evaluator‑Optimizer (Generator‑Critic) Loops</strong> – Divides the reflection pattern into substeps. One LLM prompt proposes an answer, another scores/criticizes it, and also provides directions for improvement; apply recommended improvements; and iterate until no further improvements are needed. <a href="https://www.anthropic.com/engineering/building-effective-agents">Anthropic post “Building Effective AI Agents”</a></p>
  </li>
  <li>
    <p><strong>Task Routing / Mixture‑of‑Experts</strong> – A router runs a classification prompt based on the current state to determine the next action, such as a prompt or sub-agent workflow.  <a href="https://www.linkedin.com/in/vekambar/">Anthropic Agentic Systems - #2. Routing</a></p>
  </li>
  <li>
    <p><strong>Agentic RAG &amp; Specialized Retrieval Teams</strong> – Multiple retrieval agents individually query their own knowledge pool; an aggregator agent synthesizes the evidence before final generation.  <a href="https://www.ibm.com/think/topics/agentic-rag?utm_source=chatgpt.com">IBM primer “What is Agentic RAG?”</a></p>
  </li>
  <li>
    <p><strong>Memory</strong> – In the basic ReAct workflow, the previous chain of the conversation serves as the record of everything learned so far. But you might want to structure the memory in the agent in a more efficient manner, and inject knowledge into the context in the manner the LLM can use it most effectively. See e.g. <a href="https://www.ibm.com/think/topics/ai-agent-memory">IBM: What is AI agent memory?</a> ; <a href="https://mem0.ai/">Mem0</a></p>

    <ul>
      <li>
        <p><strong>Short‑Term Memory</strong> – Keep just enough context (conversation buffer, sliding window, or summary) inside the model’s token limit for coherent multi‑turn chats. <a href="https://medium.com/@crskilpatrick807/context-windows-the-short-term-memory-of-large-language-models-ab878fc6f9b5">Context Windows: The Short‑Term Memory of LLMs</a></p>
      </li>
      <li>
        <p><strong>Long‑Term Memory</strong> – Persist facts or conversation extracts or summaries in a vector database, knowledge graph, SQL or NoSQL database, and retrieve them on demand so the agent “remembers” over the course of a long session working with lots of information, and across sessions. (A vector database has one job, fast nearest neighbors so you can look up text by semantic similarity.) <a href="https://www.pinecone.io/learn/series/langchain/langchain-conversational-memory/">Pinecone guide to conversational memory with LangChain</a></p>
      </li>
    </ul>
  </li>
  <li>
    <p><strong>Plan‑and‑Execute (Hierarchical Planning)</strong> – First draft a high‑level plan, then execute each sub‑task in order. <a href="https://blog.langchain.dev/planning-agents/">LangChain: Plan-and-Execute Agents</a>; <a href="https://arxiv.org/abs/2305.04091?utm_source=chatgpt.com">Paper: Wang et al.</a></p>
  </li>
  <li>
    <p><strong>Parallelization of Sub‑tasks</strong> – In contrast to sequential tasks, we can fan out independent LLM calls asynchronously (map‑reduce, parallel tools) and aggregate results for speed or consensus. We can perform similar tasks in different ways and pick the best one, or take all the outputs and synthesize a response from them. With ‘mini’ and ‘flash’ models (or local models), it can be cheap, fast and efficient to send hundreds of queries over a data set to process each one individually and simultaneously. <a href="https://python.langchain.com/docs/how_to/parallel/">LangChain: How to invoke runnables in parallel</a></p>
  </li>
  <li>
    <p><strong>Tree of Thoughts</strong> – Many agents run variations on search processes. The agent can explore multiple possible paths of thinking, decisions, or hypotheses before settling on an output or an action. Agents can go beyond single-step or linear reasoning by allowing branching and revisiting of different trajectories. See papers: <a href="https://arxiv.org/abs/2305.10601">Tree of Thoughts (ToT)</a> and <a href="https://arxiv.org/abs/2308.09687">Graph of Thought (GoT)</a></p>
  </li>
  <li>
    <p><strong>Guardrails</strong> – Users may try to ‘jailbreak’ an app to use it in unexpected ways, and agentic processes can go off the rails and attempt costly or embarrassing or even dangerous actions. <a href="https://www.guardrailsai.com/">Guardrails.</a> a form of reflection, can allow you to assert that the agent is on track at each step, and correct, or stop, or prompt the human if it strays.</p>
  </li>
  <li>
    <p><strong>Orchestrator‑Worker Architecture</strong> – A central orchestrator maintains state, assigns work to specialized worker agents, and merges their outputs—a pragmatic bridge to complex multi‑agent systems.  <a href="https://academy.langchain.com/courses/intro-to-langgraph">The LangGraph state graph framework is one pattern.</a> The state graph paradigm provides transparency, maps well to structured processes with time travel, and potentially in the future to low-code frameworks and cloud deployment. <br />   <br />Alternatively, we can use the <a href="https://openai.github.io/openai-agents-python/">OpenAI Agents toolkit</a>, make each sub-agent node a tool, and have a top-level reasoning prompt describing a workflow and telling the LLM to run the workflow using the available tools.<br />   <br /> You can also use low-code frameworks like <a href="https://zapier.com">Zapier</a>, <a href="https://www.make.com/en">Make.com</a>, <a href="https://n8n.io">n8n</a>, and <a href="https://www.automationanywhere.com/">Automation Anywhere</a> (and a ton of others), which could then call an AI prompt to make control flow branching decisions, run loops, call OpenAI Assistants or agents deployed in the cloud.</p>
  </li>
  <li>
    <p><strong>Multi‑Agent Collaboration</strong> – An orchestration pattern that uses distinct role‑based agents (e.g., Planner, Coder, Tester) that converse to solve problems that exceed a single model’s capacity, in a peer or hierarchical organizational structure. Multi-agent systems can be a bit like using Docker/Kubernetes microservices vs. monolithic architectures. They can provide a helpful decomposition, or make the system more complex and harder to reason about. For my money, you can get a lot of mileage with AI in a structured workflow running in LangGraph, n8n, Zapier, etc. In general I would recommend starting with simple chained pipelines, over complex  multi-agent solutions. <a href="https://www.microsoft.com/en-us/research/publication/autogen-enabling-next-gen-llm-applications-via-multi-agent-conversation-framework/?utm_source=chatgpt.com">AutoGen is a leading multi-agent framework.</a> <a href="https://www.wired.com/story/chatbot-teamwork-makes-the-ai-dream-work/?utm_source=chatgpt.com">Wired article</a>.</p>
  </li>
  <li>
    <p><strong>Model Context Protocol and other communications protocols</strong> – When you create a tool, after implementing its functionality, you have to tell the LLM how to use it: the input schema, the output schema, when and why to use it. <a href="https://diamantai.substack.com/p/model-context-protocol-mcp-explained">Model Context Protocol (MCP)</a> is a standard for doing this. <br />   <br />Another important evolving standard is <a href="https://diamantai.substack.com/p/googles-agent2agent-a2a-explained">Agent2Agent protocol (A2A)</a>. If one agent calls another agent, it may be a long-running process and a multi-turn chat conversation, unlike the REST call typically described by MCP. So there may be a need for a different standard to monitor long-running processes that come back to ask for more information, or that you want to send a sequence of interactive requests to. See the paper: <a href="https://arxiv.org/abs/2504.16736">A Survey of AI Agent Protocols</a></p>
  </li>
</ol>

<h2 id="where-to-start">Where To Start</h2>

<p>If you want to start building an agent to automate your pain points, here are some ways to start:</p>

<ol>
  <li>Connect <a href="https://zapier.com/apps">Zapier</a> to your SaaS services and LLM, like write a mail autoresponder that applies a prompt to extract stuff from an email and updates the CRM.</li>
  <li>If you are enterprise as opposed to SMB, and putting credentials to all your SaaS in Zapier gives your the heebie-jeebies, use <a href="https://docs.n8n.io/">n8n</a> on-prem instead. (Or standardize on an on-prem or cloud no-code framework, of which there are many.)</li>
  <li>Write or grab some MCP wrappers (here is <a href="https://github.com/modelcontextprotocol/servers">a list</a>, or check out <a href="https://github.com/Dicklesworthstone/ultimate_mcp_server">Jeff Emanuel’s ultimate MCP server</a> with connections to tons of services), <a href="https://www.reddit.com/r/ClaudeAI/comments/1haxkrq/add_image_generation_audio_transcription_and_much/m1c5f33/">connect them in the Claude desktop client</a>, and ask Claude to do stuff in your favorite services.</li>
  <li>For the most advanced custom agent workflows, <a href="https://python.langchain.com/docs/concepts/">LangChain</a> and <a href="https://langchain-ai.github.io/langgraph">LangGraph</a> are great to get a POC up and running. If I want to figure out how to build an LLM workflow, typically I’ll look up how LangChain does it and try their variations, different LLMs and prompts, and take it from there. LangChain can be frustratingly complex and beta. Sometimes you realize all the magic is in the prompt and you can just write directly to e.g. OpenAI. They try to do all things for all people and have the most comprehensive ecosystem. But they can be architecture astronauts and try to do too much, make a lot of breaking changes, docs are not always great. <a href="https://openai.github.io/openai-agents-python/">OpenAI Agents SDK</a>, <a href="https://www.crewai.com/">CrewAI</a>, <a href="https://microsoft.github.io/autogen/stable/index.html">AutoGen</a>, <a href="https://www.llamaindex.ai/blog/introducing-llama-agents-a-powerful-framework-for-building-production-multi-agent-ai-systems">LlamaIndex</a>, <a href="https://huggingface.co/docs/smolagents/en/index">SmolAgents</a> are other alternatives.</li>
  <li>Don’t be afraid to do things that need a lot of sequential prompts or to send a lot of prompts in parallel asynchronously. It’s hard to do things well with one prompt, our job is to make a reliable agent from unreliable LLM calls.</li>
</ol>

<h2 id="final-thoughts">Final Thoughts</h2>

<p>The era of agents is here. If you can explain a process in plain English, you can probably find or build MCP servers around the tools it uses, and build an agent to take a crack at it. If it’s a simple process, you might be able to fully automate it most of the time; if it’s a more complex process, you might be able to build a structured human-in-the-loop process around it that will level up productivity.</p>

<p>When you see an agent doing something simple, like my daily <a href="https://github.com/druce/AInewsbot">AI news bot</a>, or something magical, like OpenAI’s <a href="https://openai.com/index/introducing-deep-research/">Deep Research</a>, it’s probably doing something that is a composition of patterns like these, and the right prompts applied to the right contexts. If you’ve read this far, you have an initial grasp of the basic concepts of agent engineering, and a few places to continue your learning journey!</p>

<h2 id="further-reading">Further Reading:</h2>

<ul>
  <li><a href="https://www.anthropic.com/engineering/building-effective-agents">Anthropic: Building effective agents</a></li>
  <li><a href="https://www.anthropic.com/engineering/multi-agent-research-system">Anthropic: How we built our multi-agent research system</a></li>
  <li><a href="https://langchain-ai.github.io/langgraph/tutorials/workflows/">LangChain: Workflows and Agents</a></li>
  <li><a href="https://www.anthropic.com/news/our-framework-for-developing-safe-and-trustworthy-agents">Anthropic: Our framework for developing safe and trustworthy agents</a></li>
  <li><a href="https://huyenchip.com/2025/01/07/agents.html">Chip Huyen on Agents</a></li>
  <li><a href="https://www.deeplearning.ai/the-batch/how-agents-can-improve-llm-performance/">Andrew Ng: The Batch</a></li>
  <li><a href="https://www.deeplearning.ai/courses/?courses_date_desc%5BrefinementList%5D%5Btopic%5D%5B0%5D=Agents&amp;courses_date_desc%5BrefinementList%5D%5Btopic%5D%5B1%5D=Vector%20Databases&amp;courses_date_desc%5BrefinementList%5D%5Btopic%5D%5B2%5D=Task%20Automation&amp;courses_date_desc%5BrefinementList%5D%5Btopic%5D%5B3%5D=Search%20and%20Retrieval&amp;courses_date_desc%5BrefinementList%5D%5Btopic%5D%5B4%5D=RAG&amp;courses_date_desc%5BrefinementList%5D%5Btopic%5D%5B5%5D=Prompt%20Engineering&amp;courses_date_desc%5BrefinementList%5D%5Btopic%5D%5B6%5D=GenAI%20Applications&amp;courses_date_desc%5BrefinementList%5D%5Btopic%5D%5B7%5D=Evaluation%20and%20Monitoring">DeepLearning.ai</a></li>
  <li><a href="https://medium.com/@maximilian.vogel/mastering-ai-agents-the-10-best-free-courses-tutorials-learning-tools-46bc380a19d1">Mastering AI Agents: The 10 Best Free Courses, Tutorials &amp; Learning Tools</a></li>
  <li><a href="https://www.researchgate.net/publication/387577302_A_Survey_of_Agentic_AI_Multi-Agent_Systems_and_Multimodal_Frameworks_Architectures_Applications_and_Future_Directions">A Survey of Agentic AI, Multi-Agent Systems, and Multimodal Frameworks Architectures, Applications, and Future Directions</a></li>
  <li>
    <p>AI Engineer summit 2025: Agent Engineering: <a href="https://www.youtube.com/watch?v=L89GzWEILkM">Day 1</a> <a href="https://www.youtube.com/watch?v=D7BzTxVVMuw">Day 2</a></p>
  </li>
  <li><strong>Agent Frameworks</strong>
    <ul>
      <li><a href="https://www.langchain.com/langgraph">LangGraph</a></li>
      <li><a href="https://openai.github.io/openai-agents-python/">OpenAI Agents SDK</a></li>
      <li><a href="https://google.github.io/adk-docs/">Google ADK</a></li>
      <li><a href="https://docs.llamaindex.ai/en/stable/use_cases/agents/">LlamaIndex</a></li>
      <li><a href="https://microsoft.github.io/autogen/stable/">AutoGen</a> / <a href="https://github.com/ag2ai/ag2">AG2</a> (confusing fork under way)</li>
      <li><a href="https://www.crewai.com/">CrewAI</a></li>
      <li><a href="https://huggingface.co/docs/smolagents/en/index">SmolAgents</a> are other alternatives.</li>
    </ul>
  </li>
  <li><strong>Druce’s related stuff</strong>
    <ul>
      <li><a href="https://docs.google.com/presentation/d/1vPF2TNj1GoXtMIPXnVoAwkziug-956GwF2uK6UKNWqs/edit#slide=id.p">A slide presentation</a></li>
      <li><a href="https://drive.google.com/drive/folders/1DgX9XaLe6ZhH0IxEyszf930dc7mbgjj8">I save articles here</a></li>
      <li><a href="skynet and chill.com">Skynet and Chill daily AI reading (agent-generated with HITL)</a></li>
      <li><a href="https://github.com/druce/AInewsbot/tree/main">AInewsbot agent to write an automated daily news letter</a>. Barely agentic, it’s a long chain of prompts, the AI chooses stories and summarizes them and writes clever titles but not a complex AI-driven control flow.
<img src="/assets/2025/news.png" /></li>
    </ul>
  </li>
  <li><strong>AI Engineering stuff (might break out into a separate post)</strong>
    <ul>
      <li><a href="https://mad.firstmark.com/">Matt Turck’s mega-landscape dataviz</a></li>
      <li> 
<img src="/assets/2025/AIengineering.png" />
<img src="/assets/2025/AIengineering2.png" />
<img src="/assets/2025/AIlifecycle.png" />
<img src="/assets/2025/LLMstack.png" /></li>
    </ul>
  </li>
  <li><strong>People to Follow</strong>
    <ul>
      <li><a href="https://simonwillison.net/">Simon Willison</a></li>
      <li><a href="https://hamel.dev/">Hamel Husein</a></li>
      <li><a href="https://www.latent.space/">Shawn ‘swyx’  Wang</a></li>
      <li><a href="https://diamantai.substack.com/">Nir Diamant</a></li>
      <li><a href="https://www.oneusefulthing.org/">Ethan Mollick</a></li>
      <li><a href="https://www.andrewng.org/">Andrew Ng</a></li>
      <li><a href="https://blog.langchain.dev/author/harrison/">Harrison Chase</a></li>
      <li><a href="https://x.com/jerryjliu0?lang=en">Jerry Liu</a></li>
      <li><a href="https://logank.ai/">Logan Kilpatrick</a></li>
      <li><a href="https://huyenchip.com/">Chip Huyen</a></li>
      <li><a href="https://cameronrwolfe.substack.com/p/automatic-prompt-optimization">Cameron Wolfe</a></li>
      <li><a href="https://www.youtube.com/andrejkarpathy">Andrej Karpathy</a></li>
      <li><a href="https://lilianweng.github.io/">Lilian Weng</a> (whose blog template I appropriated a few years ago, many thanks!)</li>
      <li><a href="https://heiko-hotz.medium.com/about">Heiko Hotz</a></li>
      <li><a href="https://aiweekly.substack.com/">Andriy Burkov</a></li>
      <li><a href="https://www.latent.space/">Latent Space Team</a></li>
    </ul>
  </li>
  <li><strong>Books</strong>
    <ul>
      <li><a href="https://www.amazon.com/Hands-Large-Language-Models-Understanding-ebook/dp/B0DGZ46G88">Jay Alammar - Hands-On Large Language Models: Language Understanding and Generation</a></li>
      <li><a href="https://www.amazon.com/Build-Large-Language-Model-Scratch/dp/1633437167/">Sebastian Raschka - Build a Large Language Model (From Scratch)</a></li>
      <li><a href="https://www.amazon.com/AI-Engineering-Building-Applications-Foundation-ebook/dp/B0DPLNK9GN?ref_=ast_author_cabib_dp">Chip Huyen - AI Engineering</a></li>
      <li><a href="https://www.amazon.com/LLM-Engineers-Handbook-engineering-production-ebook/dp/B0D1WR77BZ?ref_=ast_author_cabib_dp">Maxime Labonne - LLM Engineer’s handbook</a></li>
      <li><a href="https://www.amazon.com/Machine-Learning-Engineering-Andriy-Burkov-ebook/dp/B09Q18725P?ref_=ast_author_cabib_dp_rw&amp;dib=eyJ2IjoiMSJ9.anpJ4PuV9UYa3YK8oW0Od5D-FsuIPTtKkHB2XOWz4PRystFWAHGn1kkoZvVEck-fM0HsTc-BcCYQKJTklJma2f3lO9AEl3gYsOf7_WuUSEbDY1M4lx3i-aYBwikD2aIVoj0g098BAo3M44Cwiws8keShqgdl6emSa8eglfSOWig.NsDE21bOFGxJSZsNsX0eFSdPs4H6y3ym0KBDDaWkZUk&amp;dib_tag=AUTHOR">Andriy Burkov - Machine Learning Engineering</a></li>
    </ul>
  </li>
</ul>]]></content><author><name>Druce Vertes</name></author><category term="AI" /><category term="AI" /><summary type="html"><![CDATA[Any sufficiently advanced technology is indistinguishable from magic. — Arthur C. Clarke What are AI agents? Simon Willison crowdsourced a lot of definitions that focus on: 1) Using AI to take action on the user’s behalf in the real world (i.e. what the agent does) 2) Using AI to control a loop or complex flow (i.e. how the agent does it). An AI agent takes a sequence of actions based on an AI-determined control flow. Agents use prompts as the CPU of a Turing machine that can manage state, memory, I/O, and control flow. The agent can access the Internet and tools to perform compute tasks, retrieve info, take actions via APIs, and use the outputs to determine next steps in a loop or complex control flow. Maybe even control a browser or computer. In this post, we’ll try to develop a roadmap of agent concepts and patterns to learn, and resources to learn them.]]></summary></entry><entry><title type="html">The AI Economic Singularity is Near</title><link href="https://druce.ai/2025/04/economic_singularity" rel="alternate" type="text/html" title="The AI Economic Singularity is Near" /><published>2025-04-12T01:01:01+00:00</published><updated>2025-04-12T01:01:01+00:00</updated><id>https://druce.ai/2025/04/the%20economic%20singularity%20is%20near</id><content type="html" xml:base="https://druce.ai/2025/04/economic_singularity"><![CDATA[<figure>
  <picture>
    <source srcset="/assets/2025/robot_barista.webp" type="image/webp" />
    <img src="/assets/2025/robot_barista.png" alt="Robot barista declines job application from human" style="width: 100%; height: auto;" />
  </picture>
</figure>
<blockquote>
  <p>Economics is the painful elaboration of the obvious.</p>

  <p>Pundits sometimes say things like “AI is going to make our workers more productive, and they will reap the rewards with higher wages.”</p>

  <p>It’s mostly worked out the way in the past. But the labor share of income has varied. How much labor benefits, and how much capital benefits, depends on how technology complements labor, versus substitutes for it. There is little support in economic theory for the notion that technological progress always raises everyone’s wages and standard of living. It’s empirically been significantly true in the past. But the notion that it’s an iron rule is just pop economics, a Panglossian belief based on motivated thinking.</p>

  <p>AI is the most human-like technology ever invented, so it seems likely to be an effective substitute for human labor. It seems likely that we will get growth but also disruption, more income inequality, more concentration of wealth, and more people locked out of decent middle class and working class jobs. The worst case would be an ‘economic singularity’ of robots making more robots while masses are immiserated. We should think about how to detect the singularity and use policy to head it off.</p>

  <p>Let’s break it down (painful as it may be).</p>
</blockquote>

<!--more-->
<script src="https://cdn.plot.ly/plotly-latest.min.js"></script>

<p>In my first job out of college, I worked in the economics research department of a big investment bank. I wrote for the economics research reports, was occasionally quoted in the New York Times as ‘economist Druce Vertes’ if they spelled my name right, which they never did.</p>

<p>I also applied for economics PhD programs and was told to go back and get As in differential equations and linear algebra, and summarily rejected. All this to say, I’ve studied this stuff but I’m also kind of a midwit and it’s been a while.</p>

<p>AI might be as disruptive as previous industrial revolutions: steam, electricity, the internal combustion engine. Current AI impacts about 50% of jobs today. When we get really good robots mass-produced at scale in maybe 10 years or so, it will impact close to 100%.</p>

<p>Surprisingly, compared to previous revolutions, LLMs impact high-skill, high-education creative and analytical jobs like coders, writers, analysts, graphical artists more than low-skill, low-education jobs. And the AI community expects fast progress to continue: incremental improvements, bigger scale, maybe new breakthroughs in rapid training, knowledge representation, bridging the gap between Kahneman Type 1 perception and language and Type 2 algorithmic thinking.</p>

<p>AI can generate more human-like behavior than machines we’ve had before. It changes the relationship between capital and labor. Let’s look at the shape of the basic models economists use to think about how capital and labor interact, and then think about how AI changes those relationships and what it means.</p>

<h2 id="the-cobb-douglas-production-function">The Cobb-Douglas Production Function</h2>

<p>Economists use the Cobb-Douglas production function as a simple model of how capital and labor interact to produce GDP and national income.</p>

<p>If we assume complementarity between capital and labor, and also constant returns to scale so that doubling both capital and labor doubles output), then we can express the relationship with a production function of the form:</p>

\[Y = A \cdot L^{\alpha} \cdot K^{1-\alpha}\]

<p>which is called the <a href="https://en.wikipedia.org/wiki/Cobb%E2%80%93Douglas_production_function">Cobb-Douglas production function</a> (with constant returns to scale)</p>

<!-- 2D Isoquant Chart -->
<div class="slider-container-2d">
  <label for="alpha-slider-2d">α: </label>
  <input type="range" id="alpha-slider-2d" min="0.01" max="0.99" step="0.01" value="0.50" />
  <span id="alpha-value-2d">0.50</span>
</div>

<div id="isoquant-plot-2d"></div>

<script>
  // 2D variables
  const Y_levels2d    = [1,2,3,4,5,6,7];
  const BUDGET2d      = 8;     // K + L = 8
  const N2d           = 500;
  const XMAX2d        = 10;
  const Lgrid2d       = Array.from({length: N2d}, (_, i) => XMAX2d * (i+1)/N2d);

  function makeTraces2d(alpha2d) {
    const beta2d = 1 - alpha2d;

    // 1) Isoquants for Y=1…7
    const isoTraces2d = Y_levels2d.map(Y => ({
      x: Lgrid2d,
      y: Lgrid2d.map(l => Math.pow(Y / Math.pow(l, beta2d), 1/alpha2d)),
      mode: 'lines',
      name: `Y = ${Y}`
    }));

    // 2) Compute max Y* under K+L = BUDGET2d:
    const Yopt2d = BUDGET2d * Math.pow(alpha2d, alpha2d) * Math.pow(beta2d, beta2d);

    // 3) Isoquant at Y*
    const optTrace2d = {
      x: Lgrid2d,
      y: Lgrid2d.map(l => Math.pow(Yopt2d / Math.pow(l, beta2d), 1/alpha2d)),
      mode: 'lines',
      name: `Optimal Y* = ${Yopt2d.toFixed(2)}`,
      line: { width: 3 }
    };

    // 4) Budget line K+L = BUDGET2d
    const budgetTrace2d = {
      x: [0, BUDGET2d],
      y: [BUDGET2d, 0],
      mode: 'lines',
      name: `Budget (K+L = ${BUDGET2d})`,
      line: { dash: 'dash', width: 2, color: 'grey' },
      hoverinfo: 'none'
    };

    return [...isoTraces2d, optTrace2d, budgetTrace2d];
  }

  const layout2d = {
    width: 600,
    height: 600,
    xaxis: { title: 'Labor (L)', range: [0, XMAX2d] },
    yaxis: {
      title: 'Capital (K)',
      range: [0, XMAX2d],
      scaleanchor: 'x',
      scaleratio: 1
    },
    margin: { t: 50, l: 50, r: 20, b: 50 }
  };

  const slider2d = document.getElementById('alpha-slider-2d');
  const alphaValueSpan2d = document.getElementById('alpha-value-2d');
  let alpha2d = parseFloat(slider2d.value);

  function updateTitle2d(a) {
    const b    = 1 - a;
    const Yopt = BUDGET2d * Math.pow(a, a) * Math.pow(b, b);
    return `Isoquants (Y=1…7), Optimal Y*=${Yopt.toFixed(2)} at budget K+L=${BUDGET2d} (α=${a.toFixed(2)}, β=${b.toFixed(2)})`;
  }

  // Initial draw
  layout2d.title = updateTitle2d(alpha2d);
  Plotly.newPlot('isoquant-plot-2d', makeTraces2d(alpha2d), layout2d, {responsive: true});

  // On slider move
  slider2d.addEventListener('input', () => {
    alpha2d = parseFloat(slider2d.value);
    alphaValueSpan2d.textContent = alpha2d.toFixed(2);

    const newLayout = { title: updateTitle2d(alpha2d) };
    Plotly.react(
      'isoquant-plot-2d',
      makeTraces2d(alpha2d),
      Object.assign({}, layout2d, newLayout)
    );
  });
</script>

<p><br />
 
<br /></p>

<p>\(Y\) is real output (GDP). These are all flows per unit of time, like GDP per year.</p>

<p>\(L\) is the quantity of labor services—e.g., total hours worked, ideally human capital‑adjusted so that someone with more training delivers more labor services per hour worked.</p>

<p>\(K\) is the quantity of capital services that flow from factories, equipment, trucks, aircraft etc.</p>

<p>\(A\) scales the output. Higher \(A\) corresponds to better technology. You increase \(A\), then the same capital and labor produce more real output.</p>

<p>\(\alpha\) can be viewed as letting us express the shape of the technological relationship between capital and labor and tune the optimal ratio of capital and labor. Given a K+L budget, there is a maximum Y isoquant that can be achieved whose slope matches the slope of the budget line which is the relative price. The optimal ratio is a function of technology (ie shape of the isoquants) and the relative price of capital and labor.</p>

<p>We express everything in constant prices. We model the technological relationship between real factor quantities and output, not payments. But converting them to constant dollars expresses them in the same units. We must use constant prices to remove the influence of general or relative price‑level changes.</p>

<p>The curves are isoquants showing combinations of capital and labor producing the same output level \(Y\).</p>

<p>Isoquant slopes diminish as you move along them from left to right. This downward convexity, or convexity with respect to the origin, reflects the complementarity of capital and labor. Convexity expresses diminishing returns. Adding an additional unit of one input alone becomes increasingly less effective.</p>

<p>Over time,</p>

<ul>
  <li>Firms invest and accumulate capital, moving up the Y-axis to better isoquants.</li>
  <li>The labor force grows, moving right along the X-axis to better isoquants.</li>
  <li>And technology improves, moving isoquants up and to the right for the same amount of capital and labor.</li>
</ul>

<p>If we visualize this 2d topographical map in 3D, the Cobb-Douglas function describes a rolling hill.</p>

<!-- 3D Cobb–Douglas Surface -->
<div class="slider-container-3d">
  <label for="alpha-slider-3d">α: </label>
  <input type="range" id="alpha-slider-3d" min="0.01" max="0.99" step="0.01" value="0.50" />
  <span id="alpha-value-3d">0.50</span>
</div>

<div id="isoquant-plot-3d" style="height:300px;"></div>

<script>
  // 3D variables
  const N3d     = 50;
  const XMAX3d  = 10;
  const Lgrid3d = Array.from({ length: N3d }, (_, i) => XMAX3d * (i + 1) / N3d);
  const Kgrid3d = Array.from({ length: N3d }, (_, i) => XMAX3d * (i + 1) / N3d);

  function makeSurface3d(alpha3d) {
    const beta3d = 1 - alpha3d;
    const z = Kgrid3d.map(k =>
      Lgrid3d.map(l => 2 * Math.pow(l, beta3d) * Math.pow(k, alpha3d))
    );
    return [{
      type: 'surface',
      x: Lgrid3d,
      y: Kgrid3d,
      z: z,
      contours: {
        z: {
          show: true,
          usecolormap: true,
          highlightcolor: "#42f462",
          project: { z: true }
        }
      }
    }];
  }

  const layout3d = {
    title: 'Cobb–Douglas Surface (α=0.50, β=0.50)',
    scene: {
      xaxis: { title: 'Labor (L)', range: [0, XMAX3d] },
      yaxis: { title: 'Capital (K)', range: [0, XMAX3d] },
      zaxis: { title: 'Output Y', rangemode: 'tozero' },
      camera: {
        eye: { x: -1.5, y: -1.5, z: 1.2 }
      }
    },
    margin: { l: 0, r: 0, b: 0, t: 50 }
  };

  const slider3d = document.getElementById('alpha-slider-3d');
  const alphaValueSpan3d = document.getElementById('alpha-value-3d');
  let alpha3d = parseFloat(slider3d.value);

  Plotly.newPlot('isoquant-plot-3d', makeSurface3d(alpha3d), layout3d, { responsive: true });

  slider3d.addEventListener('input', () => {
    alpha3d = parseFloat(slider3d.value);
    alphaValueSpan3d.textContent = alpha3d.toFixed(2);
    const beta3d = 1 - alpha3d;
    const newTitle = `Cobb–Douglas Surface (α=${alpha3d.toFixed(2)}, β=${beta3d.toFixed(2)})`;

    Plotly.react(
      'isoquant-plot-3d',
      makeSurface3d(alpha3d),
      Object.assign({}, layout3d, { title: newTitle })
    );
  });
</script>

<p><br />
 
<br /></p>

<p>Consider building houses:</p>

<ul>
  <li>
    <p>Without power tools (capital), using tons of workers with manual tools is labor-inefficient in the US, where capital is fairly abundant and cheap, with low real interest rates. But capital intensity is lower in developing countries with abundant low-cost labor and also scarcer capital.</p>
  </li>
  <li>
    <p>Some kind of giant automated <a href="https://www.youtube.com/watch?v=vL2KoMNzGTo">3D printing machine</a> or <a href="AI-powered robots coming for construction workers' jobs">gundam robot</a> to make a house might be capital-inefficient.</p>
  </li>
  <li>
    <p>An optimal mix of capital and labor, like workers equipped with power tools, results in the most house for the money.</p>
  </li>
  <li>
    <p>There is a natural area of optimal total factor productivity, as you stray from it, total factor productivity diminishes.</p>
  </li>
</ul>

<p>Or consider truck drivers. You can have bigger or smaller trucks within reason, you could have teams of 2 drivers in 12-hour daily shifts, but you have one driver at a time. You couldn’t have one driver and a single giant truck driving all the day’s shipments between two major cities. There’s a natural, reasonable ratio between capital and labor.</p>

<p>There are critiques of the Cobb-Douglas function. At the level of an individual firm, there are myriad decisions that go into optimizing output. The unit cost of capital depends on capacity utilization. There are learning curves. Individuals are not lumps of labor. Neither are capital investments like a $100m ASML lithography machine. We may have breakpoints and variability in the isoquants over time.</p>

<p>But at the level of the macro economy, these assumptions are reasonable simplifications. Macro output is a function of how much capital, labor and tech you have, and diminishing returns to capital and labor individually make sense, and constant returns to scale make sense.</p>

<h2 id="the-ces-production-function">The CES Production Function</h2>

<p>The degree of convexity is fixed in the Cobb-Douglas function. The elasticity of substitution between capital and labor is always 1. This means that the slopes of the isoquants are equal to the ratios of capital and labor.</p>

<p>To tune the degree of convexity, we can use a more general function like the <a href="https://en.wikipedia.org/wiki/Constant_elasticity_of_substitution">Constant Elasticity of Substitution (CES) function</a>.</p>

\[Y = A \cdot \left[ \alpha K^{\rho} + (1 - \alpha) L^{\rho} \right]^{\frac{1}{\rho}}\]

<p>Now we have \(\alpha\) to tune the optimal ratio of labor and capital, and also \(\rho\) to tune the degree of convexity or complementarity between labor and capital.</p>

<!-- CES Isoquant Plot -->
<div style="margin-bottom:1em;">
  <label for="alpha-slider-ces">α: <span id="alpha-value-ces">0.50</span></label>
  <input id="alpha-slider-ces" type="range" min="0.01" max="0.99" step="0.01" value="0.5" />
</div>
<div style="margin-bottom:1em;">
  <label for="rho-slider-ces">ρ: <span id="rho-value-ces">0.00</span></label>
  <input id="rho-slider-ces" type="range" min="-1.00" max="1.00" step="0.01" value="0" />
</div>
<div id="isoquant-plot-ces" style="width:600px;height:600px;"></div>

<script>
  // === Parameters & Grids ===
  const CES_Y_LEVELS    = [1,2,3,4,5,6,7];
  const CES_N           = 500;
  const CES_XMAX        = 10;
  const CES_LGRID       = Array.from({length: CES_N}, (_, i) => CES_XMAX * (i+1)/CES_N);
  const CES_PLOT_ID     = 'isoquant-plot-ces';

  // === Build Isoquant Traces for CES, with ρ→0 fallback ===
  function makeCesTraces(alpha, rho) {
    const beta = 1 - alpha;
    return CES_Y_LEVELS.map(Y => {
      return {
        x: CES_LGRID,
        y: CES_LGRID.map(L => {
          if (Math.abs(rho) < 1e-6) {
            // ρ≈0 → Cobb‑Douglas: Y = L^β * K^α  ⇒  K = (Y / L^β)^(1/α)
            return Math.pow(Y / Math.pow(L, beta), 1/alpha);
          } else {
            // CES: Y^ρ = α K^ρ + β L^ρ  ⇒  K = [(Y^ρ - β L^ρ)/α]^(1/ρ)
            const inner = Math.pow(Y, rho) - beta * Math.pow(L, rho);
            return inner <= 0
              ? NaN
              : Math.pow(inner / alpha, 1 / rho);
          }
        }),
        mode: 'lines',
        name: `Y = ${Y}`
      };
    });
  }

  // === Layout ===
  const layoutCes = {
    width: 600,
    height: 600,
    title: `CES Isoquants (Y=1…7) (α=0.50, ρ=0.00)`,
    xaxis: { title: 'Labor (L)', range: [0, CES_XMAX] },
    yaxis: {
      title: 'Capital (K)',
      range: [0, CES_XMAX],
      scaleanchor: 'x',
      scaleratio: 1
    },
    margin: { t: 50, l: 50, r: 20, b: 50 }
  };

  // === Initial Draw ===
  let alphaCes = parseFloat(document.getElementById('alpha-slider-ces').value);
  let rhoCes   = parseFloat(document.getElementById('rho-slider-ces').value);

  Plotly.newPlot(
    CES_PLOT_ID,
    makeCesTraces(alphaCes, rhoCes),
    layoutCes,
    { responsive: true }
  );

  // === Update Function ===
  function updateCesPlot() {
    alphaCes = parseFloat(document.getElementById('alpha-slider-ces').value);
    rhoCes   = parseFloat(document.getElementById('rho-slider-ces').value);

    document.getElementById('alpha-value-ces').textContent = alphaCes.toFixed(2);
    document.getElementById('rho-value-ces').textContent   = rhoCes.toFixed(2);

    const newTitle = `CES Isoquants (Y=1…7) (α=${alphaCes.toFixed(2)}, ρ=${rhoCes.toFixed(2)})`;

    Plotly.react(
      CES_PLOT_ID,
      makeCesTraces(alphaCes, rhoCes),
      Object.assign({}, layoutCes, { title: newTitle })
    );
  }

  // === Wire Up Sliders ===
  document.getElementById('alpha-slider-ces')
          .addEventListener('input', updateCesPlot);
  document.getElementById('rho-slider-ces')
          .addEventListener('input', updateCesPlot);
</script>

<p>Explaining the function of \(\rho\):</p>

<ul>
  <li>When \(\rho\) = 0, we get the Cobb-Douglas function.</li>
  <li>When \(\rho\) is between 0 and 1, the isoquants are less convex (flatter) than Cobb-Douglas.</li>
  <li>When \(\rho\) &lt; 0, the isoquants are more convex than Cobb-Douglas.</li>
  <li>When \(\rho\) = 1, the isoquants are linear, and labor and capital are perfect substitutes.</li>
  <li>When \(\rho\) &lt; 1, we have convexity and diminishing returns as we add one unit of labor or capital.</li>
  <li>When \(\rho \rightarrow -\infty\), the isoquants are right angles, the ratio of capital and labor is fixed, capital and labor are perfect complements, additional capital or labor has 0 marginal product. (But we run into numerical precision problems when we make the slider range bigger)</li>
  <li>We always have constant returns to scale, doubling labor and capital doubles production.</li>
</ul>

<h2 id="the-singularity">The Singularity</h2>

<p>If you have capital that is a perfect substitute for labor (like a robot), then the form of the production function is:</p>

\[Y=A \cdot [\alpha L + (1 - \alpha) K]\]

<p>Try it, set \(\rho\) to 1 in the CES function. Isoquants are straight lines.</p>

<figure>
  <img src="/assets/2025/ces-flat-small.png" alt="CES production function with linear isocurves, ρ=1" />
	<figcaption>CES production function with linear isocurves, ρ=1</figcaption>
</figure>

<p>Think of this as the edge case where we can build a humanoid robot that anywhere and everywhere could work exactly like a human.</p>

<p>If the isoquants are flat, then in practice you really only have one factor of production since labor and capital are perfect substitutes. Labor can only demand a wage equal to the cost of renting the functionally identical robot.</p>

<p>If you have the convex unit-elastic Cobb-Douglas production function, and perfect competition in labor markets, leading to workers being paid their marginal product, then the labor share of national income will equal the capital share. In the idealized classical economics world, firms will keep hiring until the next worker they add does not increase production enough to offset their wages. And the slope of the isoquants defines how much additional labor is worth relative to capital, it determines the wage rate. And unit elasticity of substitution between labor and capital under Cobb-Douglas means that as wages go up and the labor demanded goes down, the wage increase offsets lower employment exactly, so labor income remains the same.</p>

<p>Under Cobb-Douglas, wages will always rise as technology improves productivity and the labor share of national income will stay constant. This has very roughly been the case in the past, <em>contra</em> thinkers like Marx. But possibly only with the help of unions and policy choices to help counter the threat of Communism. The important thing to note is that the Cobb-Douglas function forces income share equality between labor and capital factor incomes.</p>

<p>If you move to the more general CES function, math alone doesn’t force it to happen, you need parameters like e.g. \(\alpha=0.5, \rho=0\)  to achieve unit elasticity of substitution (or match \(\rho\) to a different \(\alpha \neq 0.5\)). More convexity and complementarity means a higher labor share, less convexity means a lower labor share.</p>

<p>There is no theoretical reason \(\rho\) must be equal to 0. And in fact the labor share has been <a href="https://fred.stlouisfed.org/graph/?id=LABSHPUSA156NRUG">declining since around 1970</a>, although it’s still above 50%.</p>

<p>As you move \(\rho\) toward 1, the labor share decreases.</p>

<p>Technology that is labor-assisting and highly complementary to labor sharpens the curves of the isoquants. A power tool increases the productivity of the individual who wields it. Or an AI assistant may increase the productivity of a radiologist analyzing images.</p>

<p>A technology that is labor-replacing flattens the curves of the isoquants. Tap-to-pay completely eliminates the jobs of subway token clerks. It perfectly substitutes for them.</p>

<p>More than most technologies in the past, AI is more human-like and probably more labor-replacing across a wider range of occupations.</p>

<p>All that is really required for AI to favor capital over labor is for AI to flatten the isoquants, to increase the elasticity of substitution, to be less complementary to human labor than existing technologies.</p>

<p>But it what if it collapses the diminishing returns tradeoff between labor and capital and makes them near-perfect substitutes?</p>

<h2 id="a-little-economic-history">A little Economic History</h2>

<figure>
  <img src="/assets/2025/ai111.png" alt="Robots v. horses" />
</figure>

<p>We’ve passed through a few industrial revolutions: </p>

<ul>
  <li>
    <p>The first industrial revolution of steam and rail and telegraphs starting in the late 1700s.</p>
  </li>
  <li>
    <p>The second industrial revolution of oil, cars, electric power, starting in the late 1800s.</p>
  </li>
  <li>
    <p>A third industrial revolution of analog electronics, TV and radio, and then digital electronics, computers, the web, mobile/cloud, starting in the 1950s.</p>
  </li>
  <li>
    <p>Now maybe we can consider AI the fourth.</p>
  </li>
</ul>

<p>When we transitioned from horses and buggies to automobiles, we no longer needed buggy drivers and whip makers and stable hands, but we needed (much more productive) truck drivers and auto mechanics.</p>

<p>When we went to factories on assembly lines with power tools, we needed electricians and workers who could handle them.</p>

<p>Every buggy driver could probably get retrained as a truck driver and certainly a lot of them could get trained as mechanics and even engineers.</p>

<p>That being said, labor adjustment takes a long time, there are winners and losers, and some people’s livelihoods don’t recover in their lifetimes. And that’s assuming the best case that there is an eventual adjustment. Potentially the new jobs might totally different and out of reach for retraining.</p>

<p>I’m here to tell you that the pop economics that technology always eventually leads to universal standard of living progress, always raises productivity and therefore wages in tandem, is bunk. Theory deoesn’t say that. History kind of said that, but it’s been a lot less true the last 50 years or so in the US, as the capital share has risen.</p>

<p>Consider the horse. The horse was a very versatile source of transportation and power. It ran on hay and water and could navigate bad roads and hostile off-road environments. Steam and then internal combustion engines came along, with railroads and better roads everwhere, and ultimately replaced horses by being better and cheaper. This time around, we might be the horse.</p>

<p>Even in ideal competitive markets, the optimistic view depends on a degree of complementarity between labor and capital that may no longer exist in a world full of AI. And in the imperfect real world, the balance of market and political power between labor and capital has a significant impact. If labor and capital were perfect complements, square isoquants, fixed ratio of labor and capital, then the factor in a stronger bargaining position, scarcer, better organized, more politically powerful, would extract the lion’s share of national income.</p>

<p>Most jobs don’t require all of humans’ creativity and knowledge. And your brain is just a slow, biased pattern-matcher trained on questionable data. Just like AI, but worse. In many but not all respects currently, but in 20 years, who knows?</p>

<h2 id="a-robot-boot-stamping-on-a-human-face-forever">A robot boot, stamping on a human face, forever?</h2>

<p>There are tasks where a good AI today is better than the average human under some time budget. <a href="https://www.medpagetoday.com/radiology/diagnosticradiology/110112">Take radiology</a>. Maybe a 90th-percentile radiologist is better than AI if you give them 30 seconds, and maybe the average doctor is better if you give them 2 minutes. (Made-up numbers, although there is literature on this).</p>

<p>But AI improves. Next year, the 90th percentile becomes the 95th, and the average doctor needs 15 minutes to match the AI or can’t beat the AI no matter how long you give them.</p>

<p>Every year AI becomes better than a larger percentage of humans, at a larger  percentage of tasks. AI scientists have learned the <a href="https://www.cs.utexas.edu/~eunsol/courses/data/bitter_lesson.pdf">bitter lesson</a>, which is that general methods and lots of data and compute are all it takes to beat humans at most tasks. GPU go brrr. Clever algorithms designed to mimic how humans solve problems generally just make things worse. Humans currently have an edge in adaptability, in fast learning without as much data and compute, in critical thinking. But we may not be special snowflakes who will always be a step or two ahead of the machines. In 20 years, who knows.</p>

<p>Now, radiology is a high-stakes, high skill use case. Typically in these use cases in 2025:</p>

\[AI &lt; human &lt; human + AI\]

<p>If a radiologist takes 10 minutes to review a case, they might continue to do that with an AI assistant as part of a structured workflow. First the radiologist reviews and highlights areas of concern, then the AI gives a probability of diagnosis on those areas and highlights other areas. AI can even bring up relevant literature and the doctor can ask for detailed comparisons with reference scans. AI writes the first draft of report based on doctor’s instructions, and the doctor edits.</p>

<p>In this way the human input remains similar but the output could be significantly higher quality with the help of AI. (Assuming the market and insurance companies don’t demand more automation and less human input.)</p>

<p>Something like medical care is a superior good, people consume more as their income goes up. It might be an income-proportional good, you might even demand the same amount in nominal terms if the price goes down. AI automates the work but there is a lot of demand for better work.</p>

<p>But in many occupations, we are not going to raise the quality bar. If you can have a long-distance truck convoy of 10 trucks supervised by 1 or 2 humans, or 10 robot hotel housekeepers supervised by one human, you get rid of the extra humans.</p>

<p>We can imagine a factory where the robots can maintain and repair each other. You still need humans to design factories and robots, write and debug and improve software. For now, anyway.</p>

<p>The level of skill that a human needs, in order to be able to do something better than AI, can increase beyond what the vast majority of humans can do, for the vast majority of the daily tasks needed to maintain civilization. You are only going to hire the human for a task and at a wage where they are cheaper and less trouble than a robot, which might not leave many jobs or much wages at all. There is always going to be some job, but it might be as an influencer (digital tout), or livestreaming yourself as a freak doing a gross-out act on <a href="https://en.wikipedia.org/wiki/Common_People_(Black_Mirror)">‘Dum Dummies’ from Black Mirror</a> and it might not pay much.</p>

<p>Maybe there is a modest demand response, society gets richer, there is more demand for hotels and goods transport. But you don’t automatically 10X demand when you 10X productivity, and it’s hard for the housekeepers to retrain into jobs AI can’t do.</p>

<p>It is not at all a given that when technology destroys some jobs, it creates other, higher-paying jobs. You need to parameterize the equations to make that happen. I would argue that there is a good chance that AI changes the parameters dramatically in the other direction.</p>

<p>Potentially we can end up with robots building more robots, and an economic singularity where capital grows exponentially and wealth concentrates completely, while humans are immiserated.</p>

<p>If you combine AI with globalization, neoliberalism, loss of organized labor power etc., it upends the economic assumptions that underlie past wage growth.</p>

<p>Maybe we aren’t quite there yet. Maybe everybody will just get better at their jobs, and even midwits and less educated people can do software development and analytical jobs with AI. And we can shorten workweeks. But what would be the incentive to shorten workweeks in the absence of labor laws requiring it?</p>

<p>As a thought experiment, what is the difference between the state owning all the capital and being run by a politburo or junta, and a tiny number of individuals owning it, and writing all the rules of an economy and culture and marketplace of political ideas fully mediated by technology? To the extent capitalism works for most people, it requires competitive markets and not unlimited concentration of capital owned by a few. And maybe serfdom and extraction for the rest.</p>

<p>That is what the robot singularity looks like in economic terms. That is the economic challenge we will eventually face as a civilization, along with questions of universal income, robot taxes, which citizens reap the benefits of AI, what happens to people and countries outside that circle, what happens to economic growth, freedom, fairness, civil liberties, democratic governance, human values and human purpose.</p>

<p>We are ill-equipped to confront these questions. Even the places people think about them, the press, the universities, are under siege.</p>

<p>There is a risk of the fall of Rome, technofeudalism, barbarism. Maybe not next year, maybe not in 10 years, but it might be where we are headed.</p>

<p>At least, not knowing exactly how the tech and the equations evolve, we should probably be mindful of that possibility.</p>

<p>In the final analysis, everything is endogenous. AI changes human sytems a lot, and it seems impossible to say how. It would behoove us to be a little humble, and cautious, and not rely purely on historical parallels where maybe there aren’t any. And try to put in some guardrails to avoid the worst possible outcomes.</p>

<h3 id="further-reading">Further reading:</h3>

<p><a href="https://a.co/d/65Ql7CO">Rise of the Robots: Technology and the Threat of a Jobless Future, by Martin Ford</a></p>

<p><a href="https://a.co/d/8EaMGeu">The Economic Singularity: Artificial intelligence and the death of capitalism, by Calum Chace</a></p>

<p><a href="https://www.hbs.edu/ris/Publication%20Files/25-039_05fbec84-1f23-459b-8410-e3cd7ab6c88a.pdf">Displacement or Complementarity? The Labor Market Impact of Generative AI, by Wilbur Xinyuan Chen, Suraj Srinivasan, Saleh Zakerinia</a></p>

<p><a href="https://economics.mit.edu/sites/default/files/2024-05/The%20Simple%20Macroeconomics%20of%20AI.pdf">The Simple Macroeconomics of AI, by David Autor</a></p>

<p><a href="https://economics.mit.edu/sites/default/files/publications/Automation%20and%20New%20Tasks%20-%20How%20Technology%20Displace.pdf">Automation and New Tasks: How Technology Displaces and Reinstates Labor, by Daron Acemoglu and Pascual Restrepo</a></p>

<p><a href="https://www.federalreserve.gov/newsevents/speech/barr20250509a.htm?utm_source=substack&amp;utm_medium=email">Fed Governor Michael Barr: Artificial Intelligence and the Labor Market: A Scenario-Based Approach</a></p>]]></content><author><name>Druce Vertes</name></author><category term="AI" /><category term="AI" /><summary type="html"><![CDATA[Economics is the painful elaboration of the obvious. Pundits sometimes say things like “AI is going to make our workers more productive, and they will reap the rewards with higher wages.” It’s mostly worked out the way in the past. But the labor share of income has varied. How much labor benefits, and how much capital benefits, depends on how technology complements labor, versus substitutes for it. There is little support in economic theory for the notion that technological progress always raises everyone’s wages and standard of living. It’s empirically been significantly true in the past. But the notion that it’s an iron rule is just pop economics, a Panglossian belief based on motivated thinking. AI is the most human-like technology ever invented, so it seems likely to be an effective substitute for human labor. It seems likely that we will get growth but also disruption, more income inequality, more concentration of wealth, and more people locked out of decent middle class and working class jobs. The worst case would be an ‘economic singularity’ of robots making more robots while masses are immiserated. We should think about how to detect the singularity and use policy to head it off. Let’s break it down (painful as it may be).]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://druce.ai/assets/2025/isoquants.png" /><media:content medium="image" url="https://druce.ai/assets/2025/isoquants.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">The State of AI in 2025</title><link href="https://druce.ai/2025/01/AI2025" rel="alternate" type="text/html" title="The State of AI in 2025" /><published>2025-01-12T01:01:01+00:00</published><updated>2025-01-12T01:01:01+00:00</updated><id>https://druce.ai/2025/01/AI-in-2025</id><content type="html" xml:base="https://druce.ai/2025/01/AI2025"><![CDATA[<blockquote>
  <p><a href="https://simonwillison.net/2024/Dec/31/llms-in-2024/">Simon Willison</a> has a great post on everything we learned about AI in 2024 (somewhat technical). Inspired by him, here is a roundup of the top events of 2024 in AI and where we are now.</p>
</blockquote>

<figure>
  <picture>
    <source srcset="/assets/2025/kitty.webp" type="image/webp" />
    <img src="/assets/2025/kitty.png" alt="AI generated cat welcoming 2025." style="width: 100%; height: auto;" />
  </picture>
</figure>
<!--more-->

<p><strong>1. Everybody caught up to OpenAI.</strong></p>

<ul>
  <li>
    <p>The top tier is OpenAI, Google, and Anthropic. They are very close, for most purposes the difference is insignificant, for some use cases one is better than the other.</p>
  </li>
  <li>
    <p>With Gemini 2.0, Google seems to be the current leader by a modest amount on overall base model quality. Gemini is better enough, and cheaper enough that I would switch to it for some jobs.</p>

    <ul>
      <li>
        <p>Flash is very good, very fast, and very cheap</p>
      </li>
      <li>
        <p>Long context</p>
      </li>
      <li>
        <p>Great native multimodality (although OpenAI has caught up on vision/audio/video)</p>
      </li>
      <li>
        <p>Deep research, thinking models, NotebookLM state-of-the-art text-to-speech.</p>
      </li>
    </ul>
  </li>
  <li>
    <p>OpenAI is still ahead on product, things like structured outputs, o1, overall ecosystem. <a href="https://searchengineland.com/googles-ceo-warns-chatgpt-may-become-synonymous-to-ai-the-way-google-is-to-search-449970">First-mover advantage is real</a>, ChatGPT is synonymous with advanced AI in the public’s mind for now. Google now supports the OpenAI API semantics, which attests to OpenAI being the leader and Google the fast follower.</p>
  </li>
  <li>
    <p>Claude is very strong on technical discussions and coding. Definitely try it for deep conversations about code or research papers. They pioneered the Canvas, are doing interesting stuff on API discovery. (Punching below their weight in Chatbot Arena)</p>
  </li>
  <li>
    <p>Use <a href="https://lmarena.ai/">Chatbot Arena</a> and <a href="https://artificialanalysis.ai/">artificialanalysis.ai</a> to compare models for different use cases.</p>
  </li>
</ul>

<p><strong>2. The rise of small and open-source models nipping at the leaders’ heels.</strong></p>

<ul>
  <li>
    <p>The thing that shocked me most in 2025 was <a href="https://huggingface.co/princeton-nlp/gemma-2-9b-it-SimPO">Gemma2-9b-it-SIMPO</a>. Gemma is Google’s excellent open source model. A group at Princeton fine-tuned it to score higher than early GPT-4, and shrank it to run adequately fast on a MacBook. Bananas.</p>
  </li>
  <li>
    <p>There are a slew of strong dark horses: Llama, Grok, Nova in the US; Qwen, Yi, DeepSeek from China, Mistral in Europe.</p>
  </li>
  <li>
    <p>The gap between the frontier models and the flash/mini or smaller open-source models shrank.</p>
  </li>
</ul>

<p><strong>3. The scaling laws hit the wall.</strong></p>

<ul>
  <li>
    <p>Gemini 2.0 is a significant improvement over 1.0 but not as big as GPT 3.5 to GPT-4</p>
  </li>
  <li>
    <p>OpenAI failed to deliver a foundation model that was a worthy successor to GPT-4 despite 2 gigantic training runs, according to <a href="https://www.wsj.com/tech/ai/openai-gpt5-orion-delays-639e7693">reports</a>. Anthropic also failed to update Opus, their largest model, leaving Sonnet as their flagship model.</p>
  </li>
  <li>
    <p>These top 3 bullet points reflect the commoditization of AI, no one has a monopoly, the price of pretty good AI has dropped by several orders of magnitude.</p>
  </li>
</ul>

<p><strong>4. OpenAI pivoted to inference-time compute with o1 and o3.</strong></p>

<ul>
  <li>
    <p>Faced with GPT-5 hitting the wall, OpenAI pivoted to models like o1 that think, run multiple LLM calls, use search algos to look for the best way to answer a question via a multi-step process.</p>
  </li>
  <li>
    <p>Probably the 2nd most shocking thing I saw in 2024 was this thread by math professor and Fields medalist Terence Tao, saying that <a href="https://mathstodon.xyz/@tao/113132502735585408">o1 can do math at the level of a strong math major</a>. I thought claims about it solving problems from the Putnam test (the leading US undergrad math competition) were probably overblown or training data contamination, but <a href="https://openreview.net/pdf?id=YXnwlZe0yf">even if you fuzz them it can still solve a few of them at least</a>. Bananas.</p>
  </li>
  <li>
    <p>o1 is very good but very expensive.</p>
  </li>
  <li>
    <p>o3 was announced, no one has seen it but OpenAI has hyped it for release in about a month, saying it is a superstar programmer and beat an AGI test. There is so much hype and so much pressure to beat Google that I am skeptical. I expect a notable improvement over o1. But with Google already releasing ‘thinking’ models, it’s not clear how big a lead OpenAI has. I don’t quite know what to make of the AGI claims, either it’s a bit overhyped or they found something important. To date LLMs are great with language but understanding is skin-deep, they don’t model complex abstractions deeply. There is so much pressure to be best and first that <a href="https://www.cnbc.com/2023/12/08/google-faces-controversy-over-edited-gemini-ai-demo-video.html">capabilities are overhyped</a> and corners are cut. But I have been surprised before.</p>
  </li>
  <li>
    <p>Interesting consequences in the chip world. Possibly tired: 100,000-GPU Nvidia training clusters. Wired: Fast inference chips like d-Matrix, Groq, Cerebras, and a slew of others.</p>
  </li>
</ul>

<p><strong>5. Everything is agents now.</strong></p>

<ul>
  <li>To me the definition of agent is when the LLM makes control flow decisions, whether with tool choice in a directed acyclic graph decision tree, or a full-blown autonomous loop. And every AI product does that now; when you use the chatbot it looks at your query and routes it to different models and tools. Devin-style full-service software developers are still a bit pie-in-the-sky but everything short of that, from low-code automation up to superintelligent assistants, is very much in play.</li>
</ul>

<p><strong>7. The Advanced Voice Mode with vision and other crazy sci-fi stuff.</strong></p>

<ul>
  <li><a href="https://www.youtube.com/watch?v=fhet4y1HyOE">Point your phone at anything and have a conversation about it.</a> Fast conversational multimodal FTW. There was a huge leap in video generation with Sora, Kling, Runway. Also associated tech like NotebookLM, Suno. We are not that far from a fully synthetic, realistic virtual or robotic avatar to interact with. (Apols for the NSFWish projection but I think OnlyFans creators might be the first victims of robots, before even truck drivers)</li>
</ul>

<p><strong>8. Self-driving cars achieved product-market fit, with one player left standing: Google’s Waymo.</strong></p>

<ul>
  <li>
    <p>And possibly a <a href="https://wayve.ai/">European</a> and <a href="https://www.wired.com/story/chinas-best-self-driving-car-platforms-tested-and-compared-xpeng-nio-li-auto/">Chinese</a> competitor. Tesla is not really in the game yet, no robotaxis on the road yet even with safety drivers, maybe that will change and maybe it won’t. Waymo has a big lead.</p>
  </li>
  <li>
    <p>IMHO we will see this type of highly autonomous robot, static or on wheels, for 5 or maybe 10 years before we see a lot of humanoid robots. And ofc fully virtual robots as discussed above. Power, cost issues, normie workplaces can’t keep copiers and printers working.</p>
  </li>
  <li>
    <p>As an aside, the meme of AI killing Google is overblown, more likely Google integrates AI in search and laps the competition, cures cancer with AI and leads the AI revolution, even as search declines a bit in favor of chatbots. As long as the thing we interact with is a text box, Google should do OK. When AI becomes ubiquitous and phones and homes and smart glasses are environments we talk to that watch us and interact with us, that’s a bigger bridge to cross.</p>
  </li>
</ul>

<p><strong>9. Safety took a back seat, and politics took center stage.</strong></p>

<ul>
  <li>US-China trade war, EU regs, California regs, major competition authority actions against all the Big Techs. With Musk in charge of tech policy in US, safe AI is so 2023, takes a back seat to accelerationism. But brace for the backlash, possibly the <a href="https://en.wikipedia.org/wiki/Dune_(franchise)#The_Butlerian_Jihad">Butlerian Jihad</a> (via Christopher Mims). Everything is mediated through big tech, and people view AI with suspicion as IP theft, surveillance state, manipulation and dark patterns. People look for scapegoats.</li>
</ul>

<p><strong>9. Dead internet and AI slop everywhere.</strong></p>

<ul>
  <li>Stack Overflow is in freefall. Most questions AI answers better, just because it reads the documentation carefully. Same for big social media like X and Facebook. Anything big enough gets overrun by slop and adverse selection. Back to artisanal social media like Discords, and painstakingly building your own small social and professional circle.</li>
</ul>

<p><strong>10. 2025 and beyond?</strong></p>

<ul>
  <li>
    <p>Smart glasses, pervasive AI</p>
  </li>
  <li>
    <p>Social issues around IP theft, surveillance, deepfake attacks. We need a new social contract around AI and it’s hard.</p>
  </li>
  <li>
    <p>Hyper-personalization.</p>
  </li>
  <li>
    <p>Medical advances with AI: diagnostics, clinical decision support, AI drug discovery, surgical robots, wearables, personalized medicine, administrative productivity AI.</p>
  </li>
  <li>
    <p>Eventually a financial crash because markets are insane even as AI powers everything.</p>
  </li>
  <li>
    <p>I think AGI and super-intelligence are actually pretty close. Take what we got and add better knowledge representation and world models, the ability to learn on the fly instead of moonshot training runs, and you get something like AGI. On a scale of a few years or decades, with the scale of brainpower and compute currently deployed, surely that is imminent. On a lot of benchmarks and tasks like say detecting tuberculosis on a scan, the AI is much better than most professionals on a tight time budget like 15 seconds. And the best professionals will be much better than the AI on a higher time budget like 5 minutes. So there is some time crossover where the humans start to beat AI. And over time probably the AI will beat more humans at more jobs at any given time limit, and the crossover where humans outperform the AI will shift to higher time limits. AI assistants will infiltrate more and more knowledge work. Use AI for what it’s good at, processing lots of language, use tools for what they are good at, looking up knowledge and running predictable tasks, and use humans for judgment and critical thinking. And over time the human component will shrink.</p>
  </li>
</ul>

<p>And the social upheaval will be unmanageable unfortunately. The tech bros think they will <a href="https://darioamodei.com/machines-of-loving-grace">solve all of society’s problems</a> if you just give them a few trillion. I think everything is breaking and tech is one big reason why, it’s the cause of as many problems as it solves and these Elon Musk and Sam Bankman-Fried types are mountebanks, or buffoons, or blinded by greed, or in some cases just want to burn everything down. <a href="https://www.amazon.com/Coming-Wave-Technology-Twenty-first-Centurys/dp/0593593952">Mustafa Suleyman</a> is correct that we need to spend a significant fraction of AI efforts on guardrails to avoid disasters, and preparing people and society for the impacts.</p>

<p>Every few years, the bandit, the revolutionary and the priest trade hats. And the tech folks have gone from revolutionaries to bandits. A guy I used to think highly of in tech, said that the one big thing in 2024 was Silicon Valley’s hostile takeover of the federal government, via an infiltration of Donald Trump’s MAGA movement, and Trump’s subsequent thrashing of Joe Biden’s “establishment” government in the November election. The thing is, if you are posting groyper memes, changing your name to <a href="https://www.bbc.com/news/articles/cy53vz1qpx1o">Kekius Maximus</a>, and pimping the AfD, who is infiltrating who? The word of the day is that Muslims, Mexicans, immigrants, whoever you don’t like, are not human, and democracy is for losers, and that does not end well. Never forget that Neville Chamberlain was a ‘realist’ conservative. These people are going to sell out democracy, sell out to Putin, and blow up the world, literally.</p>

<p>I had AI take a crack at the <a href="https://docs.google.com/document/d/1ClJ5_bot-GBJUv__-CNPY5hdkj_2kY934w1sN9blBV4/edit?usp=sharing">first version</a> of this, Gemini 1.5 with Deep Research. Did not use AI at all after reading that output, blame me for any typos and bad writing.</p>]]></content><author><name>Druce Vertes</name></author><category term="AI" /><category term="AI" /><summary type="html"><![CDATA[Simon Willison has a great post on everything we learned about AI in 2024 (somewhat technical). Inspired by him, here is a roundup of the top events of 2024 in AI and where we are now.]]></summary></entry></feed>