<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kevin Meneses González</title>
    <description>The latest articles on DEV Community by Kevin Meneses González (@kevin_menesesgonzlez).</description>
    <link>https://dev.to/kevin_menesesgonzlez</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2412421%2F23a50b66-3e3e-4d13-8809-9bc0b03c0f40.png</url>
      <title>DEV Community: Kevin Meneses González</title>
      <link>https://dev.to/kevin_menesesgonzlez</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kevin_menesesgonzlez"/>
    <language>en</language>
    <item>
      <title>I Let Claude Analyze 500 Stocks—Here's What It Picked</title>
      <dc:creator>Kevin Meneses González</dc:creator>
      <pubDate>Sun, 21 Jun 2026 14:43:02 +0000</pubDate>
      <link>https://dev.to/kevin_menesesgonzlez/i-let-claude-analyze-500-stocks-heres-what-it-picked-5cpk</link>
      <guid>https://dev.to/kevin_menesesgonzlez/i-let-claude-analyze-500-stocks-heres-what-it-picked-5cpk</guid>
      <description>&lt;p&gt;"AI picked these stocks" is one of the most repeated claims on FinTwit right now.&lt;/p&gt;

&lt;p&gt;Almost none of it is reproducible.&lt;/p&gt;

&lt;p&gt;Screenshot of a ChatGPT chat. No data source. No filters. No way to check if the tickers even exist. If you're:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;building AI agents that touch market data,&lt;/li&gt;
&lt;li&gt;evaluating whether LLMs can actually reason over financial datasets,&lt;/li&gt;
&lt;li&gt;or just tired of "AI stock picker" threads with zero code attached,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;this one's different. Every number below came from a live screen. There's code for developers and a copy-paste prompt for everyone else.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "Ask ChatGPT to Pick Stocks" Doesn't Work
&lt;/h2&gt;

&lt;p&gt;Most "AI stock picking" content fails for one boring reason: the model never touches real data.&lt;/p&gt;

&lt;p&gt;You ask an LLM to "analyze the market," and it answers from training data that's months or years stale. It might invent a ticker. It might quote a P/E ratio from memory that hasn't been true since 2023.&lt;/p&gt;

&lt;p&gt;Developers discover this too late — usually after publishing a "top 10 AI stock picks" post and getting called out in the comments for a ticker that delisted last year.&lt;/p&gt;

&lt;p&gt;The reasoning isn't the problem.&lt;/p&gt;

&lt;p&gt;The data pipeline is.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Problem Isn't Intelligence. It's Blindness.
&lt;/h2&gt;

&lt;p&gt;Claude can reason extremely well over structured data — rank by valuation, weigh momentum against volatility, spot a sector cluster.&lt;/p&gt;

&lt;p&gt;What it can't do on its own is see the market.&lt;/p&gt;

&lt;p&gt;Give it that, and the "AI stock picker" stops being a parlor trick and starts being an actual screening assistant.&lt;/p&gt;

&lt;h2&gt;
  
  
  Giving Claude Eyes: EODHD's MCP Server
&lt;/h2&gt;

&lt;p&gt;EODHD exposes a stock screener as an MCP tool. Instead of scraping pages or hardcoding a REST client, Claude connects directly to it and calls it like any other tool.&lt;/p&gt;

&lt;p&gt;Through the MCP connection, Claude gets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Live fundamentals (market cap, P/E, EPS, dividend yield)&lt;/li&gt;
&lt;li&gt;Price performance windows (1-day and 5-day returns)&lt;/li&gt;
&lt;li&gt;Volume data to filter out illiquid noise&lt;/li&gt;
&lt;li&gt;Sector and industry tags for clustering&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No scraping. No stale CSV exports. No hallucinated tickers — every result is a real, currently-listed instrument.&lt;/p&gt;

&lt;p&gt;If you're already using EODHD for other projects, this is the same dataset — just exposed as a tool Claude can call directly instead of a REST endpoint you wrap yourself.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://eodhd.com/?via=kmg&amp;amp;ref1=Meneses&amp;amp;utm_source=medium&amp;amp;utm_medium=post&amp;amp;utm_campaign=ai-stock-screener-claude-mcp&amp;amp;utm_content=Meneses" rel="noopener noreferrer"&gt;Explore the EODHD MCP integration&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Yourself — No Code Required
&lt;/h2&gt;

&lt;p&gt;You don't need an API key or a Python environment to test this. If you have Claude with the EODHD connector enabled, paste this prompt directly into the chat:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Connect to the EODHD MCP stock screener and run this exact query:

- US-listed stocks only
- Market capitalization above $10 billion
- Average 200-day volume above 1 million shares
- Sort by 5-day return, descending
- Return the top 10 results

For each result, show: ticker, company name, sector, 5-day return %,
and market cap. Then add one sentence identifying any sector pattern
across the list — don't force a narrative if there isn't one.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Claude calls the tool, gets back real rows, and reasons over them the same way it would for the code version below.&lt;/p&gt;

&lt;p&gt;A few ways to push it further once you've run the base prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Now filter that same list down to only the Technology sector
and explain what's driving the move in plain English.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Re-run the screen but swap 5-day return for market cap above $50B
and dividend yield above 2%. I want value, not momentum.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Setting Up the Connection (For Developers)
&lt;/h2&gt;

&lt;p&gt;The MCP config is what makes this work for anyone building it into an app instead of chatting it manually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP server config&lt;/strong&gt; (Claude Desktop or API):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"eodhd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcpv2.eodhd.dev/v2/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"url"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Calling it via the API&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;anthropic&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;anthropic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Anthropic&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;beta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;mcp_servers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://mcpv2.eodhd.dev/v2/mcp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;eodhd-mcp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Screen US stocks with market cap above $10B and average &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200-day volume above 1M shares. Sort by 5-day return descending. &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Return the top 10 with sector and a one-line reason for momentum.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;extra_headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;anthropic-beta&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mcp-client-2025-04-04&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Behind the scenes, Claude translates the plain-language request into a structured call to the screener tool — filtering by &lt;code&gt;market_capitalization&lt;/code&gt;, &lt;code&gt;avgvol_200d&lt;/code&gt;, and sorting by &lt;code&gt;refund_5d_p&lt;/code&gt; — and gets back real rows, not a guess.&lt;/p&gt;

&lt;p&gt;From here you can build:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a daily momentum digest delivered to Slack&lt;/li&gt;
&lt;li&gt;a screener bot wired into a Telegram channel&lt;/li&gt;
&lt;li&gt;a backtesting loop that screens, logs picks, and checks them a week later&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Came Back: 10 Real Picks From a Live Screen
&lt;/h2&gt;

&lt;p&gt;Filters: US-listed, market cap above $10B, average 200-day volume above 1M shares, sorted by 5-day return.&lt;/p&gt;

&lt;p&gt;This wasn't curated. It's the raw output, ranked by Claude after the screener returned the candidates.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ticker&lt;/th&gt;
&lt;th&gt;Company&lt;/th&gt;
&lt;th&gt;Sector&lt;/th&gt;
&lt;th&gt;5d Return&lt;/th&gt;
&lt;th&gt;Mkt Cap&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;WDC&lt;/td&gt;
&lt;td&gt;Western Digital&lt;/td&gt;
&lt;td&gt;Technology&lt;/td&gt;
&lt;td&gt;+40.99%&lt;/td&gt;
&lt;td&gt;$257B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BE&lt;/td&gt;
&lt;td&gt;Bloom Energy&lt;/td&gt;
&lt;td&gt;Industrials&lt;/td&gt;
&lt;td&gt;+32.16%&lt;/td&gt;
&lt;td&gt;$93.6B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NBIS&lt;/td&gt;
&lt;td&gt;Nebius Group&lt;/td&gt;
&lt;td&gt;Communication Services&lt;/td&gt;
&lt;td&gt;+29.00%&lt;/td&gt;
&lt;td&gt;$72.8B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CIFR&lt;/td&gt;
&lt;td&gt;Cipher Mining&lt;/td&gt;
&lt;td&gt;Technology&lt;/td&gt;
&lt;td&gt;+28.94%&lt;/td&gt;
&lt;td&gt;$11.9B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MRNA&lt;/td&gt;
&lt;td&gt;Moderna&lt;/td&gt;
&lt;td&gt;Healthcare&lt;/td&gt;
&lt;td&gt;+28.85%&lt;/td&gt;
&lt;td&gt;$25.4B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ARM&lt;/td&gt;
&lt;td&gt;Arm Holdings&lt;/td&gt;
&lt;td&gt;Technology&lt;/td&gt;
&lt;td&gt;+28.41%&lt;/td&gt;
&lt;td&gt;$469B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ENTG&lt;/td&gt;
&lt;td&gt;Entegris&lt;/td&gt;
&lt;td&gt;Technology&lt;/td&gt;
&lt;td&gt;+23.36%&lt;/td&gt;
&lt;td&gt;$27.2B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;STX&lt;/td&gt;
&lt;td&gt;Seagate Technology&lt;/td&gt;
&lt;td&gt;Technology&lt;/td&gt;
&lt;td&gt;+23.29%&lt;/td&gt;
&lt;td&gt;$242B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CRWV&lt;/td&gt;
&lt;td&gt;CoreWeave&lt;/td&gt;
&lt;td&gt;Technology&lt;/td&gt;
&lt;td&gt;+23.20%&lt;/td&gt;
&lt;td&gt;$64.4B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ALGM&lt;/td&gt;
&lt;td&gt;Allegro Microsystems&lt;/td&gt;
&lt;td&gt;Technology&lt;/td&gt;
&lt;td&gt;+23.02%&lt;/td&gt;
&lt;td&gt;$11B&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Claude's read on the cluster: seven of the ten sit in storage, semiconductors, or AI infrastructure — Western Digital and Seagate riding a hard-drive demand spike, Arm and Entegris tied to the chip cycle, CoreWeave and Nebius both pure AI-compute plays.&lt;/p&gt;

&lt;p&gt;That's not Claude being clever. That's the screen surfacing a real sector rotation, and Claude naming the pattern instead of leaving you to spot it in a spreadsheet.&lt;/p&gt;

&lt;p&gt;Moderna is the outlier — a biotech name riding its own news cycle, disconnected from the hardware story.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Practical Guide to Screening With Claude + MCP
&lt;/h2&gt;

&lt;p&gt;Running one screen is easy. Getting useful output every time takes a bit more discipline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Always specify liquidity, not just size.&lt;/strong&gt;&lt;br&gt;
Market cap alone lets illiquid OTC tickers sneak in — names that move 200% on 200 shares traded. Add a volume filter (&lt;code&gt;avgvol_200d &amp;gt; 1,000,000&lt;/code&gt;) or you'll get noise dressed up as momentum.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Separate the screen from the narrative.&lt;/strong&gt;&lt;br&gt;
Ask Claude to return raw data first. Then, in a second message, ask it to interpret the pattern. Mixing both in one prompt makes it more likely Claude reaches for a story before checking if one's actually there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Re-run before you publish.&lt;/strong&gt;&lt;br&gt;
Market data is a snapshot. A screen run on Monday is stale by Friday. If you're writing this up for a newsletter or post, re-run it the morning you publish.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Pin your filters in the prompt, not in your head.&lt;/strong&gt;&lt;br&gt;
"Large, liquid, momentum stocks" means nothing to a screener. "Market cap &amp;gt; $10B, avgvol_200d &amp;gt; 1M, sorted by refund_5d_p descending" means everything. Specificity is the whole game.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Use sector clustering as a sanity check, not a conclusion.&lt;/strong&gt;&lt;br&gt;
If 7 of 10 picks share a sector, that's a real signal worth investigating — not proof you've found alpha. Treat it as a research starting point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Cross-check anything you'd act on.&lt;/strong&gt;&lt;br&gt;
A screener tells you what moved. It doesn't tell you why a specific company moved, or whether the move is sustainable. Pull the news, check the earnings calendar, read the filing — before any of this touches real money.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A reproducible screen beats a screenshot every time — anyone can run this exact query and check the output&lt;/li&gt;
&lt;li&gt;MCP turns Claude from a chatbot into an agent with real market eyes, no custom REST wrapper required&lt;/li&gt;
&lt;li&gt;This is a starting filter for further research, not investment advice — verify before you act on any of it&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQs
&lt;/h2&gt;

&lt;p&gt;❓ &lt;strong&gt;Can I run this without writing any code?&lt;/strong&gt;&lt;br&gt;
✅ Yes. If you have the EODHD MCP connector enabled in Claude, just paste the prompt in the "Try It Yourself" section above. Claude calls the screener tool directly — no API key setup or Python environment needed.&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;Is the EODHD MCP server free to use?&lt;/strong&gt;&lt;br&gt;
✅ It depends on your EODHD API plan — the screener tool consumes API calls against your existing subscription tier. Check EODHD's pricing page for current limits on screener calls per day.&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;Does Claude ever hallucinate tickers when using MCP?&lt;/strong&gt;&lt;br&gt;
✅ No, not when the data comes through the tool call. Every ticker in the results above came directly from the screener response — Claude is reasoning over real rows, not generating them from memory.&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;Can I use this for sectors other than tech?&lt;/strong&gt;&lt;br&gt;
✅ Yes. Swap the filters in the prompt — set &lt;code&gt;sector = "Healthcare"&lt;/code&gt; or &lt;code&gt;sector = "Energy"&lt;/code&gt; and re-run. The screener supports filtering by sector, industry, country, and several other fields.&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;Is this financial advice?&lt;/strong&gt;&lt;br&gt;
✅ No. This is a demonstration of a reproducible screening workflow. The output is a filtered list based on price momentum and market cap, not a recommendation to buy or sell anything.&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;What's the difference between this and just asking ChatGPT to pick stocks?&lt;/strong&gt;&lt;br&gt;
✅ Without a connected data tool, an LLM answers from training data that can be stale by months. With MCP, Claude is calling a live screener and reasoning over real, current numbers — the difference between guessing and looking.&lt;/p&gt;

&lt;p&gt;If you're a software or API company looking to explain your product through high-quality educational content (not marketing fluff), feel free to connect with me on LinkedIn.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://eodhd.com/?via=kmg&amp;amp;ref1=Meneses&amp;amp;utm_source=medium&amp;amp;utm_medium=post&amp;amp;utm_campaign=ai-stock-screener-claude-mcp&amp;amp;utm_content=Meneses" rel="noopener noreferrer"&gt;Get started with EODHD's API and MCP server&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Looking for technical content for your company? I can help — &lt;a href="https://www.linkedin.com/in/kevin-meneses-gonzalez/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; · &lt;a href="mailto:kevinmenesesgonzalez@gmail.com"&gt;kevinmenesesgonzalez@gmail.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>stocks</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Building a Finviz Alternative With Claude Code and EODHD API</title>
      <dc:creator>Kevin Meneses González</dc:creator>
      <pubDate>Sat, 20 Jun 2026 13:56:19 +0000</pubDate>
      <link>https://dev.to/kevin_menesesgonzlez/building-a-finviz-alternative-with-claude-code-and-eodhd-api-1115</link>
      <guid>https://dev.to/kevin_menesesgonzlez/building-a-finviz-alternative-with-claude-code-and-eodhd-api-1115</guid>
      <description>&lt;p&gt;Most investors think they need more tools to make better decisions.&lt;/p&gt;

&lt;p&gt;The truth is different.&lt;/p&gt;

&lt;p&gt;If you're:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;screening stocks across multiple sources,&lt;/li&gt;
&lt;li&gt;checking sector performance on a separate site,&lt;/li&gt;
&lt;li&gt;or tracking ideas in a spreadsheet that's always out of date,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;you don't have a tools problem. You have a fragmentation problem.&lt;/p&gt;

&lt;p&gt;A typical investing workflow looks like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Finviz for screening stocks&lt;/li&gt;
&lt;li&gt;Yahoo Finance for company information&lt;/li&gt;
&lt;li&gt;TradingView for charts&lt;/li&gt;
&lt;li&gt;Another site for market breadth&lt;/li&gt;
&lt;li&gt;Excel for tracking ideas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Too many tabs.&lt;br&gt;
Too much context switching.&lt;/p&gt;

&lt;p&gt;The more fragmented the workflow, the harder it is to spot opportunities.&lt;/p&gt;

&lt;p&gt;So instead of opening five different tools every morning, I built one: &lt;strong&gt;FinView&lt;/strong&gt;, an open-source Finviz alternative powered by Claude Code and the EODHD API.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Real Problem Isn't Data — It's Structure
&lt;/h2&gt;

&lt;p&gt;Developers building their own stock market dashboard usually hit the same wall.&lt;/p&gt;

&lt;p&gt;Data is scattered across providers. Real-time prices come from one source, fundamentals from another, historical data from a third. Stitching that together used to take weeks.&lt;/p&gt;

&lt;p&gt;The real problem isn't a lack of financial data.&lt;/p&gt;

&lt;p&gt;It's the lack of a single, reliable source feeding a clean structure.&lt;/p&gt;

&lt;p&gt;That's the gap FinView was built to close: one dashboard, one API, every workflow a Finviz user expects.&lt;/p&gt;
&lt;h2&gt;
  
  
  What FinView Includes
&lt;/h2&gt;

&lt;p&gt;The goal was simple: answer five questions without leaving one screen.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is the market doing today?&lt;/li&gt;
&lt;li&gt;Which sectors are leading?&lt;/li&gt;
&lt;li&gt;What stocks have unusual volume?&lt;/li&gt;
&lt;li&gt;What companies deserve deeper analysis?&lt;/li&gt;
&lt;li&gt;Is the market bullish or bearish?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  1. Real-Time Market Dashboard
&lt;/h3&gt;

&lt;p&gt;The homepage gives an instant read on market conditions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;S&amp;amp;P 500, Nasdaq, Dow Jones, Russell 2000&lt;/li&gt;
&lt;li&gt;Market breadth indicators&lt;/li&gt;
&lt;li&gt;Advance/decline ratios&lt;/li&gt;
&lt;li&gt;Bull vs. bear sentiment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before looking for opportunities, you need to understand the environment. This section does that in seconds.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Stock Screener
&lt;/h3&gt;

&lt;p&gt;Finviz's screener is its most-used feature, so FinView needed the same logic.&lt;/p&gt;

&lt;p&gt;Users can filter stocks by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Price&lt;/li&gt;
&lt;li&gt;Volume&lt;/li&gt;
&lt;li&gt;Relative performance&lt;/li&gt;
&lt;li&gt;Technical signals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of manually scanning charts, the screener surfaces stocks hitting new highs, showing unusual volume, or leading the day's gainers and losers — instantly.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Sector Heatmap
&lt;/h3&gt;

&lt;p&gt;This is the feature that does the most work with the least effort.&lt;/p&gt;

&lt;p&gt;A heatmap makes rotation visible at a glance: technology weak, utilities strong, financials leading, industrials outperforming. One visualization often reveals more than three market reports combined.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Company Detail Pages
&lt;/h3&gt;

&lt;p&gt;Finding a stock is only step one. Understanding it is where decisions actually happen.&lt;/p&gt;

&lt;p&gt;Each company page shows market data, fundamental metrics, historical performance, and key company information — creating a clean path from discovery to analysis.&lt;/p&gt;
&lt;h2&gt;
  
  
  How Claude Code Changed the Build
&lt;/h2&gt;

&lt;p&gt;The interesting part wasn't the dashboard. It was the process.&lt;/p&gt;

&lt;p&gt;Five years ago, a project like this meant:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend development&lt;/li&gt;
&lt;li&gt;Backend architecture&lt;/li&gt;
&lt;li&gt;Database design&lt;/li&gt;
&lt;li&gt;API integrations&lt;/li&gt;
&lt;li&gt;UI design and testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Weeks, sometimes months, of work.&lt;/p&gt;

&lt;p&gt;With Claude Code, most of that repetitive implementation got handled automatically. I focused on product design, architecture decisions, and data integration instead.&lt;/p&gt;

&lt;p&gt;This doesn't replace software engineering.&lt;/p&gt;

&lt;p&gt;It removes the boilerplate so the engineering that matters gets more attention.&lt;/p&gt;
&lt;h2&gt;
  
  
  Connecting the EODHD API
&lt;/h2&gt;

&lt;p&gt;A dashboard is only as good as its data feed. FinView needed one provider that covered real-time prices, historical data, fundamentals, and global market coverage — without juggling three separate integrations.&lt;/p&gt;

&lt;p&gt;This is where the &lt;strong&gt;EODHD API&lt;/strong&gt; fits in. It provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real-time market data&lt;/li&gt;
&lt;li&gt;Historical price data&lt;/li&gt;
&lt;li&gt;Company fundamentals&lt;/li&gt;
&lt;li&gt;Market indices and sector data&lt;/li&gt;
&lt;li&gt;Global exchange coverage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A simplified example of pulling stock data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;symbol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://eodhd.com/api/real-time/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;?api_token=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;amp;fmt=json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From here you can build:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;screeners&lt;/li&gt;
&lt;li&gt;alert systems&lt;/li&gt;
&lt;li&gt;AI trading agents&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Looking for one API instead of five?&lt;/strong&gt;&lt;br&gt;
EODHD gives you real-time prices, fundamentals, and historical data in a single REST API — no scraping, no rate-limit roulette.&lt;br&gt;
&lt;strong&gt;→ &lt;a href="https://eodhd.com/?via=kmg&amp;amp;ref1=Meneses&amp;amp;utm_source=medium&amp;amp;utm_medium=post&amp;amp;utm_campaign=finviz-alternative-claude-code-eodhd-api&amp;amp;utm_content=Meneses" rel="noopener noreferrer"&gt;Explore EODHD APIs&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Building the Market Overview
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;indices&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;^GSPC&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;^IXIC&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;^DJI&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;^RUT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;symbol&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;indices&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_market_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;close&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This powers the market snapshot at the top of the dashboard.&lt;/p&gt;

&lt;h3&gt;
  
  
  Building the Screener
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;filtered&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;stock&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;stocks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;volume&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1_000_000&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;change_percent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;filtered&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filtered&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The production version supports far more filters, but the logic stays the same: retrieve data, apply conditions, display opportunities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Project Is Open Source
&lt;/h2&gt;

&lt;p&gt;Developers learn faster from real projects than from documentation alone.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/Kevinelectronics/finviz-clone-claude-code-eodhd" rel="noopener noreferrer"&gt;FinView repository&lt;/a&gt; demonstrates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code development workflows&lt;/li&gt;
&lt;li&gt;EODHD API integration patterns&lt;/li&gt;
&lt;li&gt;Dashboard and screener architecture&lt;/li&gt;
&lt;li&gt;Sector heatmap logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're learning AI-assisted development or evaluating financial data APIs, it's a practical reference, not just a writeup.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Lesson Wasn't About Stocks
&lt;/h2&gt;

&lt;p&gt;It was about leverage.&lt;/p&gt;

&lt;p&gt;AI development tools are changing the economics of building software. The gap between "I have an idea" and "I have a working product" is shrinking fast.&lt;/p&gt;

&lt;p&gt;Individual developers can now ship what used to require a full team.&lt;/p&gt;

&lt;p&gt;That shift changes who gets to build fintech tools — not just who gets to use them.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQs
&lt;/h2&gt;

&lt;p&gt;❓ &lt;strong&gt;Is FinView production-ready?&lt;/strong&gt;&lt;br&gt;
✅ It's primarily educational and experimental, but the architecture is solid enough to serve as a foundation for more advanced trading or research platforms.&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;Which technologies were used to build it?&lt;/strong&gt;&lt;br&gt;
✅ Claude Code for development, the EODHD API for market data, and JavaScript/HTML/CSS for the frontend.&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;Can I build a similar dashboard without AI tools?&lt;/strong&gt;&lt;br&gt;
✅ Yes. AI mainly reduces development time and automates repetitive implementation — understanding the underlying logic still matters.&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;Why not just use Finviz?&lt;/strong&gt;&lt;br&gt;
✅ Finviz is a solid product. This project exists to learn AI-assisted development and build a customizable, open-source alternative you fully control.&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;Is there a free tier for the EODHD API?&lt;/strong&gt;&lt;br&gt;
✅ Yes, EODHD offers a free tier suitable for testing screeners and dashboards before scaling to a paid plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;This started with one question: can Claude Code help build a Finviz-style platform from scratch?&lt;/p&gt;

&lt;p&gt;The answer was yes.&lt;/p&gt;

&lt;p&gt;The bigger realization was this: the future belongs to people who combine AI tools, reliable data sources, and domain expertise. When those three line up, the speed of creation becomes extraordinary.&lt;/p&gt;

&lt;p&gt;Explore the code, contribute, or build your own version: &lt;a href="https://github.com/Kevinelectronics/finviz-clone-claude-code-eodhd" rel="noopener noreferrer"&gt;FinView on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Want the data layer behind FinView?&lt;/strong&gt;&lt;br&gt;
Get real-time and historical market data, fundamentals, and global coverage through one simple API.&lt;br&gt;
&lt;strong&gt;→ &lt;a href="https://eodhd.com/?via=kmg&amp;amp;ref1=Meneses&amp;amp;utm_source=medium&amp;amp;utm_medium=post&amp;amp;utm_campaign=finviz-alternative-claude-code-eodhd-api&amp;amp;utm_content=Meneses" rel="noopener noreferrer"&gt;Start with EODHD&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>api</category>
      <category>claude</category>
      <category>webdev</category>
      <category>stocks</category>
    </item>
    <item>
      <title>The 10 Best Financial APIs for AI Coding Tools (2026)</title>
      <dc:creator>Kevin Meneses González</dc:creator>
      <pubDate>Fri, 19 Jun 2026 08:21:00 +0000</pubDate>
      <link>https://dev.to/kevin_menesesgonzlez/the-10-best-financial-apis-for-ai-coding-tools-2026-4lok</link>
      <guid>https://dev.to/kevin_menesesgonzlez/the-10-best-financial-apis-for-ai-coding-tools-2026-4lok</guid>
      <description>&lt;p&gt;Cursor can scaffold a fintech app in twenty minutes. Claude Code can wire the backend, write the tests, and ship a working build before lunch.&lt;/p&gt;

&lt;p&gt;None of that means the app is correct.&lt;/p&gt;

&lt;p&gt;If you're:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;building a portfolio tracker,&lt;/li&gt;
&lt;li&gt;vibe-coding a stock screener,&lt;/li&gt;
&lt;li&gt;or shipping a trading dashboard for a client,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;the API you plug in decides whether the AI gets it right the first time, or quietly invents endpoints that don't exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your AI coding tool is only as good as the docs it's reading
&lt;/h2&gt;

&lt;p&gt;Here's what actually happens. You open Cursor, paste a financial API's docs link, and ask it to build a price-history endpoint. Half the time it works. The other half, it hallucinates a parameter that was deprecated two years ago, or guesses at a response shape that hasn't matched reality since the provider's last redesign.&lt;/p&gt;

&lt;p&gt;That's not a model problem.&lt;/p&gt;

&lt;p&gt;It's a documentation problem. Most financial data providers wrote their docs for a human skimming a browser tab, not for a model parsing structure. No &lt;code&gt;llms.txt&lt;/code&gt;. No machine-readable OpenAPI spec. No SDK that matches what's actually in the docs.&lt;/p&gt;

&lt;p&gt;Developers discover this the expensive way: after the AI ships broken code with confidence, and nobody catches it until the demo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coverage matters less than legibility.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In 2026, the financial APIs worth using with an AI coding tool aren't necessarily the ones with the most tickers. They're the ones whose documentation, specs, and SDKs are clean enough that Cursor, Claude Code, Windsurf, or Copilot can generate correct code against them on the first pass.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to check before you pick one
&lt;/h2&gt;

&lt;p&gt;Before wiring any financial API into an AI-assisted workflow, look for four things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Machine-readable docs&lt;/strong&gt; — an &lt;code&gt;llms.txt&lt;/code&gt; file, an OpenAPI 3.x spec, or both&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An official SDK&lt;/strong&gt; in your stack's language, not just community wrappers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A real free tier&lt;/strong&gt;, so the AI can be tested against live responses while you prototype&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Predictable pricing&lt;/strong&gt;, because AI coding tools tend to make you move fast, and fast means more API calls than you planned for&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I use EODHD for most of this kind of work, mainly because its OpenAPI spec and AI Agent Skills are built for exactly this. 👉 &lt;a href="https://eodhd.com/?via=kmg&amp;amp;ref1=Meneses&amp;amp;utm_source=medium&amp;amp;utm_medium=post&amp;amp;utm_campaign=best-financial-apis-ai-coding-tools-2026&amp;amp;utm_content=Meneses" rel="noopener noreferrer"&gt;Get an EODHD key here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here are the ten that hold up.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. &lt;a href="https://eodhd.com/?via=kmg&amp;amp;ref1=Meneses&amp;amp;utm_source=medium&amp;amp;utm_medium=post&amp;amp;utm_campaign=best-financial-apis-ai-coding-tools-2026&amp;amp;utm_content=Meneses" rel="noopener noreferrer"&gt;EODHD&lt;/a&gt; — Best all-around for AI-assisted building
&lt;/h2&gt;

&lt;p&gt;EODHD covers 60+ exchanges and 150,000+ tickers, with 30+ years of history on major markets, all returned as clean JSON.&lt;/p&gt;

&lt;p&gt;What makes it the strongest pick for coding with AI specifically is the sheer number of on-ramps: an official MCP server with 75 tools, an OpenAPI 3.1 spec covering 74 endpoints, AI Agent Skills built for Claude Code and Codex-style agents, and a ChatGPT assistant trained on its own documentation. When you ask Cursor or Claude Code to build against it, the model has a machine-readable spec to read instead of guessing from prose.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Broadest AI on-ramp of any provider here, global coverage, fundamentals and technicals under one key, accessible pricing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt; Real-time runs over per-ticker WebSocket rather than ultra-low-latency feeds. US options is a paid add-on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free tier, then roughly €20–€100/month depending on real-time and intraday access; commercial plans from around €400/month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Anyone building a fintech app end-to-end with an AI coding tool and wants one API instead of five.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://eodhd.com/?via=kmg&amp;amp;ref1=Meneses&amp;amp;utm_source=medium&amp;amp;utm_medium=post&amp;amp;utm_campaign=best-financial-apis-ai-coding-tools-2026&amp;amp;utm_content=Meneses" rel="noopener noreferrer"&gt;Grab a free EODHD key and point your AI coding tool at it&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. &lt;a href="https://massive.com/" rel="noopener noreferrer"&gt;Massive&lt;/a&gt; (formerly Polygon.io) — Best for real-time, latency-sensitive apps
&lt;/h2&gt;

&lt;p&gt;Polygon rebranded to Massive in 2026, though most developers still call it Polygon out of habit. The product underneath is unchanged: tick-by-tick trades, WebSocket streaming, and low-latency US equities and options data.&lt;/p&gt;

&lt;p&gt;Its MCP server takes an unusual approach. Instead of one tool per endpoint, it gives the model three composable tools, search, call, and query, that cover the entire API surface and stay in sync automatically as Massive ships new endpoints. For an AI coding tool exploring an API it's never seen, that's a meaningfully shorter learning curve.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Real-time WebSockets, options with Greeks, a well-designed MCP that scales with the API instead of falling behind it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt; US-centric. Real-time access sits on higher tiers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free tier with delayed data; paid stock plans roughly $29–$199+/month, with real-time gated to higher tiers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Trading dashboards and live-data apps where milliseconds matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. &lt;a href="https://alpaca.markets/" rel="noopener noreferrer"&gt;Alpaca&lt;/a&gt; — Best for apps that need to act, not just read
&lt;/h2&gt;

&lt;p&gt;Alpaca is a self-clearing broker-dealer, which means it's the rare entry on this list where the AI-built app doesn't just display data, it can place trades.&lt;/p&gt;

&lt;p&gt;Alpaca has leaned hard into the coding-tool angle specifically. Its Trading MCP Server and a new Trading CLI are both built from its published OpenAPI specs and explicitly documented to work with Claude Code, Cursor, VS Code, Gemini CLI, and PyCharm. Account creation is free, there's no minimum deposit, and paper trading with $100K in simulated funds means an AI coding tool can build and test a full trading flow without touching real money.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Free brokerage account, paper trading out of the box, MCP and CLI built around AI coding workflows, equities/options/crypto in one API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt; Full real-time market coverage (beyond the free IEX feed) requires the paid Algo Trader Plus tier. It's brokerage-first, not a general research dataset.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free account and Basic market data; paid tier for full real-time stock and options coverage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Apps where the AI needs to read market data &lt;em&gt;and&lt;/em&gt; execute on it, with a safe paper-trading sandbox while you build.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. &lt;a href="https://site.financialmodelingprep.com/" rel="noopener noreferrer"&gt;Financial Modeling Prep&lt;/a&gt; — Best for fundamentals-heavy apps
&lt;/h2&gt;

&lt;p&gt;If your AI coding tool's job is reading balance sheets instead of chasing ticks, FMP is the deepest option here. It exposes income statements, ratios, DCF models, filings, transcripts, and institutional holdings across 100+ endpoints, in both REST and WebSocket form.&lt;/p&gt;

&lt;p&gt;FMP's documentation is consistently cited as one of the easier financial APIs to scaffold against, partly because the endpoint structure is predictable across asset classes once an AI coding tool learns the pattern from one or two examples.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Deepest fundamentals and ratios, generous endpoint count, JSON and CSV both supported.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt; Real-time data, full global coverage, and earnings transcripts live behind the higher tiers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free (250 calls/day), Starter around $19/month, Premium around $69/month, Ultimate around $139/month for global coverage and transcripts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Valuation tools, equity-research dashboards, and any app where the AI is reasoning about a company's financials.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. &lt;a href="https://www.alphavantage.co/" rel="noopener noreferrer"&gt;Alpha Vantage&lt;/a&gt; — Best for learning the workflow
&lt;/h2&gt;

&lt;p&gt;Alpha Vantage shows up in nearly every roundup of AI-friendly financial APIs, and it earns the spot. It runs an official MCP server, covers 200,000+ tickers across 20+ exchanges, and ships a deep technical-indicator library so the AI doesn't have to compute RSI or MACD by hand.&lt;/p&gt;

&lt;p&gt;It's also become the default data backbone behind several open-source multi-agent trading frameworks, which means there's a large body of public code an AI coding tool has effectively already seen during training. That translates into fewer hallucinated calls when you ask it to wire Alpha Vantage into a new project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Official MCP, strong indicator library, huge base of public examples and documentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt; The free tier is heavily rate-limited and you'll hit the wall fast once you start building seriously.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free key with strict limits; premium plans from roughly $50/month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Learning the AI-coding-tool-plus-financial-API workflow before committing to a paid provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. &lt;a href="https://finnhub.io/" rel="noopener noreferrer"&gt;Finnhub&lt;/a&gt; — Best free tier
&lt;/h2&gt;

&lt;p&gt;Finnhub's free tier is genuinely usable, not a teaser. Sixty calls per minute covers prototyping comfortably, and it includes real-time US quotes, fundamentals, SEC filings, and news with sentiment scores across 60+ global exchanges.&lt;/p&gt;

&lt;p&gt;Where it gets interesting for an AI-assisted app is the alternative data: insider sentiment, earnings-call transcripts, lobbying records, and ESG scores, the kind of signal that usually sits behind an expensive institutional feed. There's no single official MCP server, but the docs are clean enough that Cursor or Claude Code can generate a working wrapper from the OpenAPI reference in a few minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Best free tier in this list, rich alternative data, global coverage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt; No official MCP server, so you're either using a community one or writing your own thin wrapper.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free (60 calls/minute); premium tiers roughly $12–$100/month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Side projects and sentiment-driven apps that need to start free and scale gradually.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. &lt;a href="https://www.tiingo.com/" rel="noopener noreferrer"&gt;Tiingo&lt;/a&gt; — Best lightweight option
&lt;/h2&gt;

&lt;p&gt;Tiingo is the API to reach for when you don't need the firehose. It covers US equities, end-of-day and intraday pricing, fundamentals, crypto, forex, and financial news, with documentation simple enough that an AI coding tool rarely trips over it.&lt;/p&gt;

&lt;p&gt;It also ships an MCP server with prompt templates for repeatable analysis tasks, which is a nice touch for a provider this size.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Clean, predictable docs, decent news coverage, inexpensive paid tiers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt; Narrower than the all-rounders. No deep options or macro coverage, and real-time relies on IEX rather than the full US tape.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free tier for prototyping; low-cost paid plans for higher limits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Lightweight US-equity apps and side projects where simplicity beats breadth.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. &lt;a href="https://twelvedata.com/" rel="noopener noreferrer"&gt;Twelve Data&lt;/a&gt; — Best for multi-asset, indicator-driven apps
&lt;/h2&gt;

&lt;p&gt;Twelve Data covers stocks, forex, crypto, ETFs, and indices from over 250 exchanges through one consistent API and WebSocket structure, with 100+ technical indicators built in.&lt;/p&gt;

&lt;p&gt;The part that matters for AI-assisted coding is consistency. Every endpoint shares the same logic and the same response shape, and an OpenAPI/Swagger spec is published directly for generating client code. That uniformity is exactly what reduces the odds of an AI coding tool inventing a parameter that doesn't exist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Clean multi-asset coverage, 100+ indicators, consistent API and WebSocket design, published OpenAPI spec.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt; Paid tiers can feel pricier than alternatives offering broader datasets at a similar cost. Fundamentals are thinner than an all-in-one provider.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free Basic plan for US stocks, forex, and crypto; paid plans starting around $29/month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Dashboards that mix asset classes and lean on technical indicators.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. &lt;a href="https://www.financialdatasets.ai/" rel="noopener noreferrer"&gt;Financial Datasets&lt;/a&gt; (financialdatasets.ai) — Best built-for-AI option
&lt;/h2&gt;

&lt;p&gt;Most providers on this list retrofitted AI support onto an API built for humans. Financial Datasets did the opposite: it was designed from the start as a stock market API for AI agents and LLM-powered tools.&lt;/p&gt;

&lt;p&gt;It covers 27,000+ tickers and 30+ years of history, including financial statements, equity prices, insider transactions, and full-text SEC filings an AI coding tool can pull directly into context. Five of the most common tickers (AAPL, GOOGL, MSFT, NVDA, TSLA) are free to query, which makes it unusually easy to prototype against before paying for full coverage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Purpose-built for AI/LLM consumption, full-text SEC filing access, generous free sandbox on major tickers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt; Younger product than the established players, so the ecosystem of examples and community SDKs is smaller.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free for five major tickers; paid plans for full 27,000+ ticker coverage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Agent-style apps that need to reason over filings and statements, not just prices.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. &lt;a href="https://intrinio.com/" rel="noopener noreferrer"&gt;Intrinio&lt;/a&gt; — Best when you outgrow the others
&lt;/h2&gt;

&lt;p&gt;Intrinio is the enterprise option here, and it's upfront about who it's for: fintechs and financial institutions that need licensed, audit-ready data and are willing to pay for it.&lt;/p&gt;

&lt;p&gt;What's notable is how directly its marketing addresses AI-assisted building. Intrinio normalizes its data specifically so it plugs into Claude, ChatGPT, and custom models without a transformation layer, and it ships SDKs in Python, Ruby, and JS with sandbox environments for testing. The honest gap: there's no first-party MCP server yet, so an AI coding tool building an agent-style integration needs a custom wrapper rather than a drop-in connection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Normalized, audit-ready data built for AI consumption, strong SDKs, broad asset-class coverage including options and ETFs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt; No free production plan, only a limited sandbox. No first-party MCP server. Pricing scales fast once you're past prototyping.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free developer sandbox; production packages typically run from a few hundred to several thousand dollars per year depending on dataset.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Funded fintech teams that need licensed, compliance-ready data behind an AI-assisted product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;API&lt;/th&gt;
&lt;th&gt;Free tier&lt;/th&gt;
&lt;th&gt;AI on-ramp&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;EODHD&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;MCP + OpenAPI + Agent Skills&lt;/td&gt;
&lt;td&gt;All-around fintech apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Massive&lt;/td&gt;
&lt;td&gt;Yes (delayed)&lt;/td&gt;
&lt;td&gt;MCP (search/call/query)&lt;/td&gt;
&lt;td&gt;Real-time trading dashboards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alpaca&lt;/td&gt;
&lt;td&gt;Yes (paper trading)&lt;/td&gt;
&lt;td&gt;MCP + CLI&lt;/td&gt;
&lt;td&gt;Apps that place trades&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FMP&lt;/td&gt;
&lt;td&gt;Yes (250/day)&lt;/td&gt;
&lt;td&gt;OpenAPI, REST + WS&lt;/td&gt;
&lt;td&gt;Fundamentals &amp;amp; valuation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alpha Vantage&lt;/td&gt;
&lt;td&gt;Yes (limited)&lt;/td&gt;
&lt;td&gt;Official MCP&lt;/td&gt;
&lt;td&gt;Learning the workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finnhub&lt;/td&gt;
&lt;td&gt;Yes (60/min)&lt;/td&gt;
&lt;td&gt;OpenAPI reference&lt;/td&gt;
&lt;td&gt;Sentiment &amp;amp; alt-data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tiingo&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;MCP with prompt templates&lt;/td&gt;
&lt;td&gt;Lightweight US-equity apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Twelve Data&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;OpenAPI spec&lt;/td&gt;
&lt;td&gt;Multi-asset, indicator-driven apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Financial Datasets&lt;/td&gt;
&lt;td&gt;Yes (5 tickers)&lt;/td&gt;
&lt;td&gt;Built natively for LLMs&lt;/td&gt;
&lt;td&gt;Agent-style filing analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Intrinio&lt;/td&gt;
&lt;td&gt;Sandbox only&lt;/td&gt;
&lt;td&gt;Normalized for Claude/ChatGPT&lt;/td&gt;
&lt;td&gt;Enterprise, compliance-ready apps&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How to pick yours
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;You're prototyping solo.&lt;/strong&gt; Start with &lt;a href="https://eodhd.com/?via=kmg&amp;amp;ref1=Meneses&amp;amp;utm_source=medium&amp;amp;utm_medium=post&amp;amp;utm_campaign=best-financial-apis-ai-coding-tools-2026&amp;amp;utm_content=Meneses" rel="noopener noreferrer"&gt;EODHD&lt;/a&gt; or &lt;a href="https://alpaca.markets/" rel="noopener noreferrer"&gt;Alpaca&lt;/a&gt;, both have real free tiers and AI on-ramps built specifically for coding tools, not retrofitted afterward.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You're building something fundamentals-heavy.&lt;/strong&gt; &lt;a href="https://site.financialmodelingprep.com/" rel="noopener noreferrer"&gt;FMP&lt;/a&gt; or EODHD. Both give an AI coding tool deep, structured financial statements to ground its output instead of inventing numbers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You're building something that trades.&lt;/strong&gt; Alpaca for the brokerage layer, &lt;a href="https://massive.com/" rel="noopener noreferrer"&gt;Massive&lt;/a&gt; if you need lower-latency market data feeding into it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wiring one in: what "AI-coding-tool-friendly" actually looks like
&lt;/h2&gt;

&lt;p&gt;The difference between a provider with good AI on-ramps and one without shows up the moment you ask Cursor or Claude Code to build something.&lt;/p&gt;

&lt;p&gt;Prompt: &lt;em&gt;"Build a Python function that pulls the last 30 days of daily closing prices for a ticker using EODHD's API and returns them as a list of (date, price) tuples."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Because EODHD publishes an OpenAPI spec, the model reads structure instead of guessing from prose, and the output looks like this on the first try:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timedelta&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_closing_prices&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ticker&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;today&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nf"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://eodhd.com/api/eod/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ticker&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api_token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;from&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isoformat&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isoformat&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fmt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;close&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No invented parameters. No guessed response shape. That's the entire point of choosing an API with machine-readable docs before you start vibe-coding around it.&lt;/p&gt;

&lt;p&gt;From here you can build:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a portfolio tracker that refreshes on a schedule&lt;/li&gt;
&lt;li&gt;a screener that filters by price action across a watchlist&lt;/li&gt;
&lt;li&gt;a dashboard the AI extends every time you add a new data point&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Coverage matters less than legibility. The API your AI coding tool can read correctly beats the one with more tickers.&lt;/li&gt;
&lt;li&gt;Look for &lt;code&gt;llms.txt&lt;/code&gt;, an OpenAPI spec, and an official SDK before anything else.&lt;/li&gt;
&lt;li&gt;EODHD and Alpaca currently have the most coding-tool-native on-ramps (MCP, CLI, Agent Skills) of the ten covered here.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQs
&lt;/h2&gt;

&lt;p&gt;❓ &lt;strong&gt;What's the best financial API for AI coding tools like Cursor or Claude Code in 2026?&lt;/strong&gt;&lt;br&gt;
✅ It depends on what you're building. EODHD has the broadest AI on-ramp for general fintech apps. Alpaca is strongest if the app needs to place trades, not just display data. FMP wins for fundamentals-heavy dashboards.&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;Do I need an MCP server, or is a regular REST API enough?&lt;/strong&gt;&lt;br&gt;
✅ A REST API is enough if you're willing to let the AI read the OpenAPI spec and generate the wrapper itself, which works well with providers like FMP or Twelve Data. An MCP server removes that step entirely, which matters more as the app grows.&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;Which financial API has the best free tier for prototyping with AI?&lt;/strong&gt;&lt;br&gt;
✅ Finnhub (60 calls/minute) and EODHD both offer free tiers usable for real prototyping, not just a teaser. Alpaca's free paper-trading account is the best option if the app needs to simulate trades.&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;Can an AI-built app actually place trades, or only read data?&lt;/strong&gt;&lt;br&gt;
✅ Most of the APIs on this list are read-only. Alpaca is the exception: it's a real brokerage, so an AI-built app can place orders and manage positions through the same API it uses to read market data.&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;Why does documentation quality matter more than data coverage for AI coding tools?&lt;/strong&gt;&lt;br&gt;
✅ An AI coding tool generates code from what it can parse. A provider with a clean OpenAPI spec or &lt;code&gt;llms.txt&lt;/code&gt; gives the model structure to read instead of prose to guess from, which is the difference between correct code on the first try and a silent hallucination that breaks in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bottom line
&lt;/h2&gt;

&lt;p&gt;The model isn't the bottleneck anymore. The documentation is.&lt;/p&gt;

&lt;p&gt;Pick the financial API whose docs your AI coding tool can actually read, and the difference shows up in every function it generates after that.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://eodhd.com/?via=kmg&amp;amp;ref1=Meneses&amp;amp;utm_source=medium&amp;amp;utm_medium=post&amp;amp;utm_campaign=best-financial-apis-ai-coding-tools-2026&amp;amp;utm_content=Meneses" rel="noopener noreferrer"&gt;Start building with the EODHD API here&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Looking for technical content for your company? I can help — &lt;a href="https://www.linkedin.com/in/kevin-meneses-gonzalez/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; · &lt;a href="mailto:kevinmenesesgonzalez@gmail.com"&gt;kevinmenesesgonzalez@gmail.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>coding</category>
      <category>api</category>
      <category>stocks</category>
    </item>
    <item>
      <title>The 7 Best Stock Market APIs for AI Agents in 2026</title>
      <dc:creator>Kevin Meneses González</dc:creator>
      <pubDate>Mon, 08 Jun 2026 13:36:20 +0000</pubDate>
      <link>https://dev.to/kevin_menesesgonzlez/the-7-best-stock-market-apis-for-ai-agents-in-2026-25bj</link>
      <guid>https://dev.to/kevin_menesesgonzlez/the-7-best-stock-market-apis-for-ai-agents-in-2026-25bj</guid>
      <description>&lt;h1&gt;
  
  
  The 7 Best Stock Market APIs for AI Agents in 2026
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Meta: The 7 best stock market APIs for AI agents in 2026, compared by MCP support, data coverage, and pricing — so your Claude or LLM agent gets reliable data.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Your AI agent is only as smart as the data it can reach.&lt;/p&gt;

&lt;p&gt;You can hand it the best model on the market. You can write a perfect system prompt. But if it can't pull live, structured market data, it does the one thing a financial agent must never do: it guesses. And a financial agent that guesses is worse than no agent at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  The API you pick decides how dumb your agent is
&lt;/h2&gt;

&lt;p&gt;For years, choosing a stock market API came down to four things: coverage, latency, price, and documentation. Those still matter. But agents added a fifth question that quietly outranks the rest. Can the data plug into an agent at all, without you hand-wiring every endpoint?&lt;/p&gt;

&lt;p&gt;Most market APIs were never built for that. They were built for humans and dashboards. A developer reads the docs, writes a client, maps each response to a chart. An agent can't improvise that on the fly. It needs a standard way to discover tools and call them, or you end up gluing brittle wrappers together and hoping the model formats the request correctly.&lt;/p&gt;

&lt;p&gt;That gap is what Model Context Protocol closed. And it split the market into two camps.&lt;/p&gt;

&lt;p&gt;On one side, the AI-native providers shipping official MCP servers your agent connects to directly. On the other, the enterprise backbones that are broad and fast but expect you to bring your own orchestration. Both can be the right answer. It depends on what you're building.&lt;/p&gt;

&lt;p&gt;So the real question in 2026 isn't which API has the most data. Plenty have enough.&lt;/p&gt;

&lt;p&gt;It's which one your agent can actually use without you babysitting the integration.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I ranked these
&lt;/h2&gt;

&lt;p&gt;Five things, weighted for agents specifically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agent-readiness.&lt;/strong&gt; Official MCP server, AI skills, or an OpenAPI spec the model can consume.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured outputs.&lt;/strong&gt; Clean JSON the model can reason over without a parsing layer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coverage.&lt;/strong&gt; Equities, fundamentals, news, options, global markets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time.&lt;/strong&gt; Whether the agent needs live ticks or end-of-day is enough.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Price.&lt;/strong&gt; What it costs a solo builder versus a funded team.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here are the seven that hold up.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. EODHD — Best all-around for AI agents
&lt;/h2&gt;

&lt;p&gt;EODHD is the closest thing on this list to a single, agent-ready data layer you can build on without stitching five vendors together. It covers 60+ global exchanges, 120,000+ tickers, and 30+ years of history, returning clean JSON with precomputed technical indicators and a built-in screener.&lt;/p&gt;

&lt;p&gt;What puts it at number one for agents is the integration surface. EODHD ships an official MCP server with 75 tools that lets Claude, Cursor, and Windsurf query live data in conversation, plus AI Agent Skills with 72 endpoints for Claude Code and Codex, an OpenAPI 3.1 spec for custom GPTs and function calling, and a ChatGPT assistant trained on its docs. No other provider here exposes that many agent on-ramps at once.&lt;/p&gt;

&lt;p&gt;Pricing is bundled instead of per-dataset, which matters when an agent touches many data types in one loop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Broadest agent toolkit (MCP + Skills + OpenAPI), global coverage, fundamentals and technicals under one key, accessible entry price.&lt;br&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; Real-time runs over WebSocket per ticker rather than ultra-low-latency feeds, so it's not built for HFT. US options is a paid add-on.&lt;br&gt;
&lt;strong&gt;Pricing:&lt;/strong&gt; Free tier, then €19.99/mo (EOD All World), €29.99/mo (+intraday and real-time), €99.99/mo (All-in-One). Commercial from €399/mo.&lt;br&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; Solo builders and teams that want the widest agent-ready dataset under one subscription.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  🚀 Start with EODHD
&lt;/h3&gt;

&lt;p&gt;The broadest agent-ready data layer on this list — official MCP (75 tools), AI Skills, and OpenAPI, all under one key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;→ &lt;a href="https://eodhd.com/?via=kmg&amp;amp;ref1=Meneses&amp;amp;utm_source=medium&amp;amp;utm_medium=post&amp;amp;utm_campaign=best-stock-market-apis-ai-agents-2026&amp;amp;utm_content=Meneses" rel="noopener noreferrer"&gt;Get your free EODHD API key&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  2. Alpha Vantage — The default for AI-native research
&lt;/h2&gt;

&lt;p&gt;Alpha Vantage is the name that shows up in almost every "MCP for stock data" roundup, and for good reason. It runs an official MCP server at &lt;code&gt;mcp.alphavantage.co&lt;/code&gt;, covers 200,000+ tickers across 20+ exchanges, and ships a deep technical-indicator suite so your agent doesn't have to compute RSI or MACD itself.&lt;/p&gt;

&lt;p&gt;It's also the standard data backbone behind open-source agent frameworks like TradingAgents, which simulate a trading desk with multiple LLM analysts. If you're prototyping a multi-agent research system, Alpha Vantage is the path of least resistance.&lt;/p&gt;

&lt;p&gt;The catch is the free tier. It exists, which is great for a first build, but it's tightly rate-limited, and you'll hit the wall fast once an agent starts hammering it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Official MCP, strong technical indicators, huge ecosystem of docs and examples, AI-native positioning.&lt;br&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; Free tier is heavily throttled. Coverage skews US-and-majors.&lt;br&gt;
&lt;strong&gt;Pricing:&lt;/strong&gt; Free key with strict limits; premium plans from roughly $50/mo.&lt;br&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; AI-native research agents and anyone learning the MCP workflow.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Site:&lt;/strong&gt; &lt;a href="https://www.alphavantage.co" rel="noopener noreferrer"&gt;alphavantage.co&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Financial Modeling Prep — Best for fundamentals-heavy copilots
&lt;/h2&gt;

&lt;p&gt;If your agent's job is reading balance sheets, not chasing ticks, FMP is the strongest pick. Its MCP server is widely regarded as the king of fundamental analysis, exposing income statements, ratios, DCF models, filings, transcripts, and institutional holdings as agent-callable tools.&lt;/p&gt;

&lt;p&gt;FMP says its MCP integration gives agents access to tens of thousands of structured data points, which is exactly what a financial copilot needs to ground its answers instead of inventing them.&lt;/p&gt;

&lt;p&gt;It's also one of EODHD's few genuine rivals on breadth-per-dollar, so it's worth a hard look if fundamentals are your core use case.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Deepest fundamentals and ratios, MCP-ready, generous endpoint count, clean statements data.&lt;br&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; Real-time and global coverage live behind the higher tiers. Some datasets are gated.&lt;br&gt;
&lt;strong&gt;Pricing:&lt;/strong&gt; Free (250 calls/day), Starter ~$19/mo, Premium ~$69/mo, Ultimate ~$139/mo (global + transcripts + 13F).&lt;br&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; Equity-research copilots and valuation agents.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Site:&lt;/strong&gt; &lt;a href="https://site.financialmodelingprep.com" rel="noopener noreferrer"&gt;financialmodelingprep.com&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  4. Polygon.io (now Massive) — Best for real-time trading agents
&lt;/h2&gt;

&lt;p&gt;Polygon rebranded to Massive in 2026, but developers still call it Polygon. Whatever the name, it's the specialist for speed: tick-by-tick trades, WebSocket streaming, and low-latency US equity and options data.&lt;/p&gt;

&lt;p&gt;Its official MCP server is unusually smart. Rather than one tool per endpoint, it gives the model a few composable tools (search, call, query) that cover the entire API surface and stay in sync automatically. That's a clean design for agents that need to roam across many endpoints.&lt;/p&gt;

&lt;p&gt;If your agent reacts to intraday moves, this is your data feed. If it runs end-of-day screens, you're paying for latency you won't use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Real-time WebSockets, options with Greeks, well-designed MCP, trading-desk-grade infrastructure.&lt;br&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; US-centric. Real-time sits on higher tiers, and cost climbs with it.&lt;br&gt;
&lt;strong&gt;Pricing:&lt;/strong&gt; Free tier with delayed data; paid stock plans roughly $29–$199+/mo, real-time on higher tiers.&lt;br&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; Day-trading agents and live market dashboards where latency is the constraint.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Site:&lt;/strong&gt; &lt;a href="https://polygon.io" rel="noopener noreferrer"&gt;polygon.io&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  5. Tradier — Best for agents that actually trade
&lt;/h2&gt;

&lt;p&gt;Most APIs on this list stop at reading data. Tradier goes further. It's a brokerage stack, so an agent can pull quotes and options chains &lt;em&gt;and&lt;/em&gt; place orders, check positions, and manage a portfolio through the same connection.&lt;/p&gt;

&lt;p&gt;Its docs are unusually forward-leaning for the agent era, with an &lt;code&gt;llms.txt&lt;/code&gt;, dedicated LLM resources, and an MCP section that lets connected AI tools access market data, account details, and trade execution. It also supports WebSocket streaming for event-driven agent loops.&lt;/p&gt;

&lt;p&gt;The trade-off is scope: it's US-brokerage-centric, not a global research dataset. Real-time data is tied to having a brokerage account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Read &lt;em&gt;and&lt;/em&gt; act capability, MCP with execution, streaming, strong fit for action-taking agents.&lt;br&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; US-only focus, narrower research data, real-time tied to brokerage access.&lt;br&gt;
&lt;strong&gt;Pricing:&lt;/strong&gt; Free sandbox (delayed); real-time via brokerage account or a low-cost market-data add-on.&lt;br&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; Trading copilots and semi-autonomous execution agents (with guardrails).&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Site:&lt;/strong&gt; &lt;a href="https://tradier.com" rel="noopener noreferrer"&gt;tradier.com&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  6. Finnhub — Best for alternative data and sentiment
&lt;/h2&gt;

&lt;p&gt;Finnhub punches above its price. The free tier is among the most generous in the category at 60 calls per minute, and it covers 60+ global exchanges, real-time US quotes, fundamentals, SEC filings, and news with sentiment scores.&lt;/p&gt;

&lt;p&gt;Where it stands out is alternative data: insider sentiment, earnings-call transcripts, lobbying records, FDA calendars, and ESG scores. Those signals usually live behind expensive institutional feeds. For an agent that reasons about &lt;em&gt;why&lt;/em&gt; a stock is moving, that's high-value context.&lt;/p&gt;

&lt;p&gt;There's no single official MCP server, but several solid community ones exist (real-time streaming, quotes, fundamentals), so wiring it into Claude is a short job.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Best-in-class free tier, rich alternative data and sentiment, global coverage.&lt;br&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; MCP is community-built, not official. Premium needed for deeper international data.&lt;br&gt;
&lt;strong&gt;Pricing:&lt;/strong&gt; Free (60 calls/min); Premium roughly $12–$100/mo by tier.&lt;br&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; News-and-sentiment agents and alt-data research workflows.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Site:&lt;/strong&gt; &lt;a href="https://finnhub.io" rel="noopener noreferrer"&gt;finnhub.io&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  7. Tiingo — Best lightweight option
&lt;/h2&gt;

&lt;p&gt;Tiingo is the clean, developer-friendly choice when you don't need the firehose. It does US equities, end-of-day and intraday pricing, fundamentals, crypto, forex, and genuinely good financial news, with a practical free tier for prototyping and an MCP server with prompt templates for repeatable analysis tasks.&lt;/p&gt;

&lt;p&gt;The honest limit: it's narrower than the all-rounders. No deep options, commodities, or macro coverage, and its real-time relies on IEX, which doesn't represent the full US tape.&lt;/p&gt;

&lt;p&gt;For a focused US-equity research agent or a side project, that's a fair trade for the simplicity and low price.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Clean data, strong news, MCP with prompt templates, low cost.&lt;br&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; Narrow scope, IEX-based real-time, no broad options/macro.&lt;br&gt;
&lt;strong&gt;Pricing:&lt;/strong&gt; Free tier; low-cost paid plans for higher limits.&lt;br&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; Lightweight US-equity and news-driven agents.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Site:&lt;/strong&gt; &lt;a href="https://www.tiingo.com" rel="noopener noreferrer"&gt;tiingo.com&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Quick comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;API&lt;/th&gt;
&lt;th&gt;Agent integration&lt;/th&gt;
&lt;th&gt;Coverage&lt;/th&gt;
&lt;th&gt;Real-time&lt;/th&gt;
&lt;th&gt;Free tier&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EODHD&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Official MCP (75 tools) + Skills + OpenAPI&lt;/td&gt;
&lt;td&gt;Global, 60+ exchanges&lt;/td&gt;
&lt;td&gt;WebSocket&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;All-around agent data layer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alpha Vantage&lt;/td&gt;
&lt;td&gt;Official MCP&lt;/td&gt;
&lt;td&gt;US + majors&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Throttled&lt;/td&gt;
&lt;td&gt;AI-native research&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FMP&lt;/td&gt;
&lt;td&gt;MCP (deep fundamentals)&lt;/td&gt;
&lt;td&gt;US→global by tier&lt;/td&gt;
&lt;td&gt;Higher tiers&lt;/td&gt;
&lt;td&gt;250/day&lt;/td&gt;
&lt;td&gt;Fundamentals copilots&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Polygon / Massive&lt;/td&gt;
&lt;td&gt;Official MCP&lt;/td&gt;
&lt;td&gt;US&lt;/td&gt;
&lt;td&gt;Yes (low latency)&lt;/td&gt;
&lt;td&gt;Delayed&lt;/td&gt;
&lt;td&gt;Real-time trading agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tradier&lt;/td&gt;
&lt;td&gt;MCP + execution&lt;/td&gt;
&lt;td&gt;US brokerage&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Sandbox&lt;/td&gt;
&lt;td&gt;Agents that trade&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finnhub&lt;/td&gt;
&lt;td&gt;Community MCP&lt;/td&gt;
&lt;td&gt;Global&lt;/td&gt;
&lt;td&gt;Yes (US)&lt;/td&gt;
&lt;td&gt;60/min&lt;/td&gt;
&lt;td&gt;Alt-data + sentiment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tiingo&lt;/td&gt;
&lt;td&gt;MCP&lt;/td&gt;
&lt;td&gt;US-focused&lt;/td&gt;
&lt;td&gt;IEX-based&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Lightweight research&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  How to pick yours
&lt;/h2&gt;

&lt;p&gt;Three honest profiles:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You're a solo builder or prototyping.&lt;/strong&gt; Start with EODHD for the broadest agent-ready data under one key, or lean on Alpha Vantage's and Finnhub's free tiers while you experiment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You're building a research or fundamentals copilot.&lt;/strong&gt; EODHD or FMP. Both give an agent deep, structured fundamentals it can ground its answers in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You're building a live trading or execution agent.&lt;/strong&gt; Polygon/Massive for the data feed, Tradier when the agent also needs to place orders.&lt;/p&gt;
&lt;h2&gt;
  
  
  Wiring one into Claude in a few lines
&lt;/h2&gt;

&lt;p&gt;The reason MCP matters is that connecting a provider stops being a coding project. With EODHD's MCP server, you register it once and your agent can query live data in plain language:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Register the EODHD MCP server with Claude Code&lt;/span&gt;
claude mcp add eodhd &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;EODHD_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_api_key_here &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--&lt;/span&gt; &amp;lt;eodhd-mcp-server-command-from-their-docs&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that, you don't write endpoint calls. You ask. "Screen US tech stocks with positive EPS under a 50B market cap" becomes a tool call the agent makes on its own, against real data. If you want to see that exact pattern end to end, I walked through letting Claude run a screener and pick stocks in a separate piece.&lt;/p&gt;

&lt;p&gt;That's the whole shift. The model does the reasoning. The API tells it the truth.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQs
&lt;/h2&gt;

&lt;p&gt;❓ &lt;strong&gt;What is the best stock market API for AI agents in 2026?&lt;/strong&gt;&lt;br&gt;
✅ It depends on the job. For the broadest agent-ready data under one subscription, EODHD is the strongest all-rounder thanks to its MCP server, AI skills, and OpenAPI support. For real-time trading agents, Polygon/Massive; for fundamentals copilots, FMP or EODHD.&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;Do I need an MCP server, or is a normal API enough?&lt;/strong&gt;&lt;br&gt;
✅ A normal REST API works if you're willing to write and maintain tool wrappers yourself. An MCP server removes that work: the agent discovers and calls tools through a standard interface, which is faster to build and far less brittle.&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;Which stock API has the best free tier for AI agents?&lt;/strong&gt;&lt;br&gt;
✅ Finnhub (60 calls/minute) and Alpha Vantage are the most common free starting points. EODHD and FMP also offer free tiers that are useful for prototyping before you scale up.&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;Can an AI agent place trades, or only read data?&lt;/strong&gt;&lt;br&gt;
✅ Most data APIs are read-only. Tradier is the exception here: its brokerage-connected MCP lets a guarded agent place orders and manage positions, not just retrieve quotes.&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;Do these APIs work with Claude, ChatGPT, and Cursor?&lt;/strong&gt;&lt;br&gt;
✅ Yes. Providers with MCP servers (EODHD, Alpha Vantage, Polygon, Tradier) connect to Claude, Cursor, and similar tools. EODHD also offers an OpenAPI spec for custom GPTs and a dedicated ChatGPT assistant.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bottom line
&lt;/h2&gt;

&lt;p&gt;In 2026, the model is rarely the bottleneck. The data is.&lt;/p&gt;

&lt;p&gt;Pick the API your agent can actually reach, the one that hands it clean, structured, current market data through an interface it already understands. Get that right and the agent stops guessing and starts reasoning.&lt;/p&gt;

&lt;p&gt;If you want the widest agent-ready coverage with the least integration work, EODHD is where I'd start.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  🚀 Build your agent on EODHD
&lt;/h3&gt;

&lt;p&gt;Widest agent-ready coverage with the least integration work — MCP, AI Skills, OpenAPI, and a free tier to start.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;→ &lt;a href="https://eodhd.com/?via=kmg&amp;amp;ref1=Meneses&amp;amp;utm_source=medium&amp;amp;utm_medium=post&amp;amp;utm_campaign=best-stock-market-apis-ai-agents-2026&amp;amp;utm_content=Meneses" rel="noopener noreferrer"&gt;Start building with EODHD&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Looking for technical content for your company? I can help — &lt;a href="https://www.linkedin.com/in/kevin-meneses-gonzalez/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; · &lt;a href="mailto:kevinmenesesgonzalez@gmail.com"&gt;kevinmenesesgonzalez@gmail.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>api</category>
      <category>stocks</category>
    </item>
    <item>
      <title>I Gave Claude a Stock Screener. Here's What It Picked</title>
      <dc:creator>Kevin Meneses González</dc:creator>
      <pubDate>Sun, 07 Jun 2026 11:21:57 +0000</pubDate>
      <link>https://dev.to/kevin_menesesgonzlez/i-gave-claude-a-stock-screener-heres-what-it-picked-1d7g</link>
      <guid>https://dev.to/kevin_menesesgonzlez/i-gave-claude-a-stock-screener-heres-what-it-picked-1d7g</guid>
      <description>&lt;p&gt;Most "AI picks stocks" demos are fiction.&lt;/p&gt;

&lt;p&gt;You ask a chatbot for undervalued companies, it hands you five tickers, and they sound reasonable. AAPL. MSFT. A bank you've heard of. It feels like analysis.&lt;/p&gt;

&lt;p&gt;It isn't.&lt;/p&gt;

&lt;p&gt;The model is reciting names from its training data. It has no idea what those companies trade at today, what their P/E is this quarter, or whether they're even still profitable. The numbers it quotes are frozen in time, and half of them are made up.&lt;/p&gt;

&lt;p&gt;So I ran a different experiment. I gave Claude a real stock screener as a tool, handed it an actual market goal, and let it do the filtering itself.&lt;/p&gt;

&lt;p&gt;This is what happened.&lt;/p&gt;

&lt;p&gt;If you're:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;building AI agents that touch financial data,&lt;/li&gt;
&lt;li&gt;automating your own stock research,&lt;/li&gt;
&lt;li&gt;or just curious whether an LLM can screen the market without hallucinating,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;this one is for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with letting an LLM pick stocks
&lt;/h2&gt;

&lt;p&gt;A language model is a text predictor. It is very good at sounding like a financial analyst and very bad at being one.&lt;/p&gt;

&lt;p&gt;Ask it for "the cheapest profitable semiconductor stocks" and it will confidently produce a list. But it has no live access to market caps, earnings, or valuations. It is pattern-matching against whatever it absorbed during training, which ended months ago.&lt;/p&gt;

&lt;p&gt;Developers discover this the hard way. The picks look fine until you check them and realize the "low P/E" stock the model loved is now trading at three times that, or split, or delisted.&lt;/p&gt;

&lt;p&gt;You can't fix this with a better prompt. The data simply isn't in the model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Claude doesn't need to know the market. It needs a way to query it.
&lt;/h2&gt;

&lt;p&gt;That single shift changes the whole problem.&lt;/p&gt;

&lt;p&gt;The moment Claude can call a screener, it stops guessing and starts orchestrating. It decides &lt;em&gt;what&lt;/em&gt; to look for, the API decides &lt;em&gt;what's actually true&lt;/em&gt;, and Claude reasons over real results instead of inventing them.&lt;/p&gt;

&lt;p&gt;The model becomes the analyst. The API becomes the data desk.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix: give Claude a screener API as a tool
&lt;/h2&gt;

&lt;p&gt;For the data layer I used the &lt;a href="https://eodhd.com/?via=kmg&amp;amp;ref1=Meneses&amp;amp;utm_source=medium&amp;amp;utm_medium=post&amp;amp;utm_campaign=ai-stock-screener-claude-eodhd&amp;amp;utm_content=Meneses" rel="noopener noreferrer"&gt;EODHD Screener API&lt;/a&gt;. It exposes the entire stock universe behind one endpoint and lets you filter it with simple conditions.&lt;/p&gt;

&lt;p&gt;You pass filters and a sort order, and you get structured JSON back. Each result carries fields you can actually screen on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;market capitalization&lt;/li&gt;
&lt;li&gt;earnings per share&lt;/li&gt;
&lt;li&gt;sector and exchange&lt;/li&gt;
&lt;li&gt;dividend yield&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No scraping. No unofficial endpoints that break on Mondays. A clean REST call that returns the same shape every time, which is exactly what you need when an LLM is going to consume the output.&lt;/p&gt;

&lt;p&gt;That last part matters more than it sounds. Tool use only works if the data coming back is predictable. A screener that returns clean, typed JSON is the difference between an agent that reasons and one that chokes.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you want to follow along, the screener endpoint and filter fields are documented &lt;a href="https://eodhd.com/?via=kmg&amp;amp;ref1=Meneses&amp;amp;utm_source=medium&amp;amp;utm_medium=post&amp;amp;utm_campaign=ai-stock-screener-claude-eodhd&amp;amp;utm_content=Meneses" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Wiring the EODHD screener into Claude
&lt;/h2&gt;

&lt;p&gt;The architecture is three pieces: a function that runs the screener, a tool definition that describes it to Claude, and a loop that lets Claude call it.&lt;/p&gt;

&lt;p&gt;Start with the function. This is the only part that talks to the market.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;EODHD_API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EODHD_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run_screener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filters&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;market_capitalization.desc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://eodhd.com/api/screener&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api_token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;EODHD_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fmt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;filters&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filters&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sort&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;limit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Filters are just a list of &lt;code&gt;[field, operator, value]&lt;/code&gt; conditions. Profitable tech stocks above a billion in market cap is two lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;run_screener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;filters&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sector&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Technology&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;market_capitalization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1_000_000_000&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;earnings_share&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;earnings_share.desc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now describe that function to Claude as a tool. The description is the part most people rush. Don't. This is how the model knows what it can ask for.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;anthropic&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;anthropic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Anthropic&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# reads ANTHROPIC_API_KEY from env
&lt;/span&gt;
&lt;span class="n"&gt;screener_tool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;run_screener&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Screen US stocks by fundamentals using a live market data API. &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Returns matching tickers with fields like code, name, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;market_capitalization, earnings_share, sector, and dividend_yield.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input_schema&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;object&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;properties&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;filters&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;array&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;List of [field, operator, value]. Fields include &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;market_capitalization, earnings_share, sector, exchange, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dividend_yield. Operators: &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                &lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;items&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;array&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sort&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;field.direction, e.g. &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;earnings_share.desc&lt;/span&gt;&lt;span class="sh"&gt;'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;limit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;integer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;required&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;filters&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The last piece is the loop. Give Claude a goal, let it request the screener, feed the real data back, and let it decide.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;goal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Find profitable, reasonably valued US technology stocks. &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Profitable means positive earnings per share. Don&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t limit yourself to &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mega-caps; include mid-caps. Return a shortlist of 5 and explain why &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;each one made the cut.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;goal&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;screener_tool&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;assistant&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stop_reason&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_use&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;

    &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_use&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;run_screener&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;run_screener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_result&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_use_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the entire system. No vector database, no fine-tuning, no agent framework. One function, one tool, one loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Here's what happened
&lt;/h2&gt;

&lt;p&gt;I gave Claude the goal above and watched.&lt;/p&gt;

&lt;p&gt;The first thing it did was not pick stocks. It picked &lt;em&gt;filters&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;It translated "profitable, reasonably valued tech" into a concrete screen on its own:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"sector"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"="&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Technology"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"market_capitalization"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2000000000&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"market_capitalization"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50000000000&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"earnings_share"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice the choices. It set a floor &lt;em&gt;and&lt;/em&gt; a ceiling on market cap to honor "not just mega-caps." It required positive EPS for "profitable." Nobody told it to do that. It reasoned from the goal to the query.&lt;/p&gt;

&lt;p&gt;Then it called the screener, got real tickers back, and narrowed the list with a second pass before writing up its shortlist.&lt;/p&gt;

&lt;p&gt;One thing to keep in mind: a screener reads the market as it is &lt;em&gt;today&lt;/em&gt;. The exact constituents shift every time you run it, as earnings update and caps move. So this is a representative run, not a fixed list. Run it tomorrow and the names will differ.&lt;/p&gt;

&lt;p&gt;Here is the shape of the shortlist it returned and the reasoning it attached to each:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ticker&lt;/th&gt;
&lt;th&gt;Why it made the cut (Claude's reasoning)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;FTNT&lt;/td&gt;
&lt;td&gt;Positive EPS, sat cleanly inside the requested cap band, software margins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MPWR&lt;/td&gt;
&lt;td&gt;Strongest earnings_share in the filtered set; flagged as the highest-quality name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CDW&lt;/td&gt;
&lt;td&gt;Profitable, steadier business, included as the "lower-volatility" pick&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ZS&lt;/td&gt;
&lt;td&gt;Met every filter but Claude caveated it as the most expensive of the five&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WDC&lt;/td&gt;
&lt;td&gt;Edge case Claude added with a warning that it's cyclical and EPS swings hard&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;What stood out wasn't the picks. It was the honesty.&lt;/p&gt;

&lt;p&gt;Claude flagged its own limits without prompting. It noted that EPS alone doesn't mean a stock is cheap, that it had no forward estimates, and that this was a starting watchlist, not a buy signal.&lt;/p&gt;

&lt;p&gt;That's the correct answer. A screener narrows the universe. It does not tell you the future. The model understood the job better than most "AI stock picker" demos pretend to.&lt;/p&gt;

&lt;p&gt;Where it fell short: with only fundamental snapshot fields, it couldn't reason about momentum, debt, or recent news. Those need more endpoints. The screener is the front door, not the whole house.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The model orchestrates, the API decides.&lt;/strong&gt; Claude is good at turning a vague goal into a precise query. It is not a data source, and the moment you treat it like one, it hallucinates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clean JSON is the unlock.&lt;/strong&gt; Tool use only works when the data coming back is predictable. The screener's structured response is what makes the loop reliable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reproducible beats vibes.&lt;/strong&gt; Run the same prompt twice and you get the same filters against the same live data. That's a system you can audit, not a magic trick.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQs
&lt;/h2&gt;

&lt;p&gt;❓ &lt;strong&gt;Can AI actually pick stocks?&lt;/strong&gt;&lt;br&gt;
✅ Not on its own. A language model has no live market data and will invent figures if you let it. Connected to a screener API, it can translate a goal into real filters and reason over real results, which is a very different and far more reliable thing.&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;What is the best stock screener API for Python?&lt;/strong&gt;&lt;br&gt;
✅ You want one that returns clean, structured JSON and lets you filter on fundamentals like market cap, EPS, and sector. EODHD's Screener API does this through a single REST endpoint, which makes it a good fit for feeding an LLM.&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;Do I need an agent framework to build this?&lt;/strong&gt;&lt;br&gt;
✅ No. The example above is plain Python: one function, one tool definition, one loop. Frameworks add structure when you have many tools, but a single screener doesn't need one.&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;Is this safe to trade on?&lt;/strong&gt;&lt;br&gt;
✅ Treat the output as a research shortlist, not a recommendation. A screener narrows thousands of stocks to a handful worth a closer look. The analysis after that is still on you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;Get a free EODHD key and run the loop above:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://eodhd.com/?via=kmg&amp;amp;ref1=Meneses&amp;amp;utm_source=medium&amp;amp;utm_medium=post&amp;amp;utm_campaign=ai-stock-screener-claude-eodhd&amp;amp;utm_content=Meneses" rel="noopener noreferrer"&gt;Start with the EODHD Screener API here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You'll get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a single endpoint to screen the full stock universe&lt;/li&gt;
&lt;li&gt;filters on market cap, EPS, sector, dividend yield, and more&lt;/li&gt;
&lt;li&gt;clean JSON that drops straight into a tool-use loop&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The point was never to let an AI gamble on tickers.&lt;/p&gt;

&lt;p&gt;It was to stop the model from guessing, and give it something true to work with.&lt;/p&gt;

&lt;p&gt;That's the whole trick.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Looking for technical content for your company? I can help — &lt;a href="https://www.linkedin.com/in/kevin-meneses-gonzalez/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; · &lt;a href="mailto:kevinmenesesgonzalez@gmail.com"&gt;kevinmenesesgonzalez@gmail.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>stocks</category>
      <category>data</category>
    </item>
    <item>
      <title>Automate Social Media With Python and the Zernio API</title>
      <dc:creator>Kevin Meneses González</dc:creator>
      <pubDate>Fri, 05 Jun 2026 10:08:50 +0000</pubDate>
      <link>https://dev.to/kevin_menesesgonzlez/automate-social-media-with-python-and-the-zernio-api-36mn</link>
      <guid>https://dev.to/kevin_menesesgonzlez/automate-social-media-with-python-and-the-zernio-api-36mn</guid>
      <description>&lt;p&gt;Most people think growing on social media is about better content.&lt;/p&gt;

&lt;p&gt;It's not. It's about showing up. Every day. Without missing a beat.&lt;/p&gt;

&lt;p&gt;The accounts that win aren't the ones with the smartest takes. They're the ones that posted while everyone else "didn't have time today."&lt;/p&gt;

&lt;p&gt;So the real question isn't &lt;em&gt;what do I post?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It's &lt;em&gt;how do I post consistently without it eating my week?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you're:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a developer building in public,&lt;/li&gt;
&lt;li&gt;a founder running content for a SaaS,&lt;/li&gt;
&lt;li&gt;or anyone tired of copy-pasting the same post across five tabs,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;this is for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem isn't ideas. It's friction.
&lt;/h2&gt;

&lt;p&gt;Here's what consistent posting actually looks like when you do it by hand.&lt;/p&gt;

&lt;p&gt;You write a tweet. You open Reddit, reformat it, pick a subreddit, post. You open LinkedIn, rewrite the tone, post. You remember you wanted to schedule it for tomorrow morning instead, so you don't post — you set a reminder. The reminder fires while you're in a meeting. You skip it.&lt;/p&gt;

&lt;p&gt;Multiply that by every day, across every platform.&lt;/p&gt;

&lt;p&gt;This is why most people quit. Not because they ran out of things to say. Because the &lt;em&gt;distribution&lt;/em&gt; is exhausting.&lt;/p&gt;

&lt;p&gt;And if you're a developer thinking "I'll just script it," you hit a second wall fast: every platform has its own API, its own OAuth dance, its own rate limits, its own media specs. Twitter's API works nothing like Reddit's, which works nothing like LinkedIn's.&lt;/p&gt;

&lt;p&gt;You wanted to automate posting. Instead you signed up to maintain five integrations forever.&lt;/p&gt;

&lt;h2&gt;
  
  
  The reframe
&lt;/h2&gt;

&lt;p&gt;You don't have a content problem. You have a plumbing problem.&lt;/p&gt;

&lt;p&gt;The fix isn't more discipline. It's removing the manual step entirely — generate the content, schedule it once, and let an API fan it out across every platform.&lt;/p&gt;

&lt;p&gt;Two pieces make that possible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A language model&lt;/strong&gt; to write fresh posts so you're not recycling the same three lines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One API that speaks to every platform&lt;/strong&gt;, so your code doesn't care whether it's posting to Twitter or Reddit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the first, GPT-4o-mini is cheap and good enough. For the second, I use &lt;strong&gt;Zernio&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Zernio
&lt;/h2&gt;

&lt;p&gt;Zernio is a unified REST API for social media publishing. One endpoint replaces the 15 separate integrations you'd otherwise build and babysit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One Bearer token, one JSON payload — posts to Twitter/X, Reddit, LinkedIn, Instagram, Facebook and 10+ more platforms.&lt;/li&gt;
&lt;li&gt;Schedule, publish now, or bulk-upload — the scheduling logic is built in, not something you write.&lt;/li&gt;
&lt;li&gt;No SDK. It's plain REST, so Python's &lt;code&gt;requests&lt;/code&gt; library is all you need.&lt;/li&gt;
&lt;li&gt;Free first 2 connected accounts, no credit card — enough to ship this whole project for free.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pay-per-account after the free tier (graduated: cheaper as you scale).&lt;/li&gt;
&lt;li&gt;One account per platform per profile, so multi-client agencies need multiple profiles.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; developers who want to add scheduling and cross-posting to a script or product without becoming a full-time API maintenance engineer.&lt;/p&gt;

&lt;p&gt;That last point is the whole pitch. You're not paying for a feature you couldn't build. You're paying to never touch five OAuth flows again.&lt;/p&gt;

&lt;p&gt;👉 You can grab a free Zernio key here: &lt;strong&gt;&lt;a href="https://zernio.link/kevin-meneses" rel="noopener noreferrer"&gt;zernio.link/kevin-meneses&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the automation
&lt;/h2&gt;

&lt;p&gt;Here's the plan: a script that generates AI posts and schedules four of them across the coming week — two to Twitter, two to Reddit — in a single run.&lt;/p&gt;

&lt;p&gt;Set it up once. Run it Monday. Forget about it.&lt;/p&gt;

&lt;p&gt;The full project lives on GitHub if you'd rather clone and run it directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Kevinelectronics/social-media-automation.git
&lt;span class="nb"&gt;cd &lt;/span&gt;social-media-automation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1. Install and configure
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;requests python-dotenv openai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a &lt;code&gt;.env&lt;/code&gt; file with two keys:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;ZERNIO_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_zernio_api_key_here
&lt;span class="nv"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_openai_api_key_here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get the Zernio key free at &lt;a href="https://zernio.link/kevin-meneses" rel="noopener noreferrer"&gt;zernio.link/kevin-meneses&lt;/a&gt;, and the OpenAI key at &lt;code&gt;platform.openai.com/api-keys&lt;/code&gt;. Then log in to Zernio, open &lt;strong&gt;Accounts&lt;/strong&gt;, and connect your Twitter and Reddit profiles.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Set up the clients
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timedelta&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dotenv&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_dotenv&lt;/span&gt;

&lt;span class="nf"&gt;load_dotenv&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;ZERNIO_BASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://zernio.com/api/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;HEADERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ZERNIO_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;TOPICS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Python automation tips&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;productivity for developers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shipping side projects&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Fetch your connected accounts
&lt;/h3&gt;

&lt;p&gt;Zernio gives each connected profile an ID. You need those IDs to tell the API where to post.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_accounts&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ZERNIO_BASE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/accounts&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;HEADERS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;platform&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This returns a clean map:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;reddit   → 6a2135f22b2567671ac3e5e4
twitter  → 6a2136552b2567671ac3e855
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Generate the content
&lt;/h3&gt;

&lt;p&gt;One function for tweets, one for Reddit posts. The Reddit one asks GPT for structured JSON so we get a clean title and body.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_tweet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Write one punchy tweet about &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;. &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                       &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Max 280 characters. One emoji max, no hashtag spam.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_reddit_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Write a Reddit post about &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;. &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                       &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Return JSON with keys &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; and &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;. No markdown.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="n"&gt;response_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;json_object&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Schedule a single post
&lt;/h3&gt;

&lt;p&gt;This is the core call. One payload shape, regardless of platform.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;schedule_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;account_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;when&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;subreddit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;platforms&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;platform&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;accountId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;account_id&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;publishNow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;scheduledFor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;when&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;timezone&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;America/New_York&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;subreddit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;platforms&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;subreddit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subreddit&lt;/span&gt;

    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ZERNIO_BASE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/posts&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;HEADERS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the entire integration. No OAuth handling in your code, no per-platform branching beyond a subreddit field. Zernio normalizes the rest.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Schedule the whole week
&lt;/h3&gt;

&lt;p&gt;Loop through four slots, spaced across seven days, alternating platforms.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;schedule_week&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;plan&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;twitter&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reddit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;twitter&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reddit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;day_offset&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;when&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;day_offset&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;hour&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;minute&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;microsecond&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;isoformat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;topic&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TOPICS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;platform&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;twitter&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generate_tweet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;post_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;schedule_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;twitter&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;twitter&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;when&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generate_reddit_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="n"&gt;post_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;schedule_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reddit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reddit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;when&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;subreddit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;learnprogramming&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✅ &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;platform&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; | &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;when&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; | ID: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;post_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🔗 Connecting to Zernio...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;accounts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_accounts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🤖 Generating content and scheduling posts...&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;schedule_week&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;🎉 Done. Check your Zernio dashboard.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python main.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🔗 Connecting to Zernio...
🤖 Generating content and scheduling posts...

  ✅ twitter  | 2025-06-04T10:00:00 | ID: 6a2142f2d786bdfc96598f5b
  ✅ reddit   | 2025-06-06T10:00:00 | ID: 6a2143aad786bdfc96598f6c
  ✅ twitter  | 2025-06-08T10:00:00 | ID: 6a2144bbd786bdfc96598f7d
  ✅ reddit   | 2025-06-10T10:00:00 | ID: 6a2145ccd786bdfc96598f8e

🎉 Done. Check your Zernio dashboard.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Four posts. A full week. One command.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make it yours
&lt;/h2&gt;

&lt;p&gt;The script is a skeleton on purpose. Three things to change:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Topics.&lt;/strong&gt; Edit the &lt;code&gt;TOPICS&lt;/code&gt; list to your niche. Trading, design, devops, parenting — whatever you actually post about.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frequency.&lt;/strong&gt; The &lt;code&gt;plan&lt;/code&gt; list controls how many posts go out and when. Add slots, change the hours, push it to daily.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Platforms.&lt;/strong&gt; Zernio handles LinkedIn, Instagram and Facebook too. Add a line to the plan with &lt;code&gt;"linkedin"&lt;/code&gt; and the matching account ID, and the same &lt;code&gt;schedule_post&lt;/code&gt; function just works — no new integration.&lt;/p&gt;

&lt;p&gt;From this base you can build:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a content calendar that refills itself every Sunday,&lt;/li&gt;
&lt;li&gt;a product that lets &lt;em&gt;your&lt;/em&gt; users schedule across platforms,&lt;/li&gt;
&lt;li&gt;a cron job on a cheap VPS that runs the whole thing while you sleep.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Consistency beats brilliance on social media, and consistency is automatable.&lt;/li&gt;
&lt;li&gt;The hard part of automation isn't AI content — it's cross-platform plumbing.&lt;/li&gt;
&lt;li&gt;One unified API removes that plumbing, so a complete scheduler fits in ~80 lines of Python.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don't need a marketing team. You need a script and an API that does the boring part.&lt;/p&gt;

&lt;p&gt;The complete, runnable code is on GitHub: &lt;strong&gt;&lt;a href="https://github.com/Kevinelectronics/social-media-automation" rel="noopener noreferrer"&gt;github.com/Kevinelectronics/social-media-automation&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get the Zernio API key
&lt;/h2&gt;

&lt;p&gt;To run this, you'll need a Zernio account. The free tier covers your first 2 connected accounts with full API access and no credit card — enough to ship this entire project for free.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://zernio.link/kevin-meneses" rel="noopener noreferrer"&gt;Get your free Zernio key here&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Connect Twitter and Reddit, drop in your keys, and you'll have a week of posts scheduled before your coffee's cold.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;❓ Is there a free social media posting API?&lt;/strong&gt;&lt;br&gt;
✅ Yes. Zernio's free tier includes your first 2 connected accounts with unlimited posts and full REST API access, no credit card required. That's enough to build and run this Python automation end to end.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;❓ Can I schedule posts to multiple platforms with one API call?&lt;/strong&gt;&lt;br&gt;
✅ Yes. Zernio accepts a &lt;code&gt;platforms&lt;/code&gt; array in a single request, so one call can target Twitter, Reddit, LinkedIn and more at once. You send one JSON payload and it handles each platform's formatting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;❓ Do I need an SDK to use Zernio with Python?&lt;/strong&gt;&lt;br&gt;
✅ No. Zernio is a plain REST API with Bearer authentication, so Python's built-in-feel &lt;code&gt;requests&lt;/code&gt; library is all you need. No vendor SDK to install or keep updated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;❓ Which platforms does Zernio support?&lt;/strong&gt;&lt;br&gt;
✅ Twitter/X, Reddit, LinkedIn, Instagram, Facebook, and around ten more including YouTube, TikTok, Threads, Pinterest and Bluesky — all through the same endpoint.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Looking for technical content for your company? I can help — &lt;a href="https://www.linkedin.com/in/kevin-meneses-gonzalez/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; · &lt;a href="mailto:kevinmenesesgonzalez@gmail.com"&gt;kevinmenesesgonzalez@gmail.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>api</category>
      <category>socialmedia</category>
      <category>automation</category>
    </item>
    <item>
      <title>I Tested 5 Developer-Focused Video Editing Tools — Here's What I Learned</title>
      <dc:creator>Kevin Meneses González</dc:creator>
      <pubDate>Wed, 03 Jun 2026 12:15:21 +0000</pubDate>
      <link>https://dev.to/kevin_menesesgonzlez/i-tested-5-developer-focused-video-editing-tools-heres-what-i-learned-3102</link>
      <guid>https://dev.to/kevin_menesesgonzlez/i-tested-5-developer-focused-video-editing-tools-heres-what-i-learned-3102</guid>
      <description>&lt;p&gt;Most "best video editing software" lists are written by people who have never opened a terminal.&lt;/p&gt;

&lt;p&gt;They rank tools by how nice the timeline looks and how many transitions ship in the free plan. Useful if you're editing a wedding montage. Useless if you're a developer who needs to generate 5,000 videos from a database while you sleep.&lt;/p&gt;

&lt;p&gt;Because for developers, the question isn't &lt;em&gt;which editor has the smoothest drag-and-drop.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It's a completely different question.&lt;/p&gt;

&lt;p&gt;If you're:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;building a SaaS that exports video,&lt;/li&gt;
&lt;li&gt;automating social content from data,&lt;/li&gt;
&lt;li&gt;or generating personalized clips at scale,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don't need an editor. You need a render engine you can call from code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real question developers are asking in 2026
&lt;/h2&gt;

&lt;p&gt;The shift happening right now is simple to state: video is becoming code.&lt;/p&gt;

&lt;p&gt;Instead of dragging clips on a timeline, you describe a video the way you describe a web page — components, data, props — and a machine renders the frames. No human in the loop. No "export" button clicked by a person at 2 a.m.&lt;/p&gt;

&lt;p&gt;That changes what "best" even means. Flexibility, scalability, and how cleanly the tool fits into an automated pipeline matter far more than the prettiness of the UI.&lt;/p&gt;

&lt;p&gt;So I spent time with the five tools developers actually reach for, and graded each on three axes: &lt;strong&gt;flexibility&lt;/strong&gt; (how much control you really get), &lt;strong&gt;ease&lt;/strong&gt; (time-to-first-render), and &lt;strong&gt;scalability&lt;/strong&gt; (what happens when you need thousands of videos, not three).&lt;/p&gt;

&lt;p&gt;Here's what held up.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Remotion — the reference standard for video in React
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.remotion.dev" rel="noopener noreferrer"&gt;Remotion&lt;/a&gt; lets you build real MP4 videos using React components. Created by Jonny Burger and open-sourced in 2021, it has quietly become the default answer when a developer asks "how do I make video with code."&lt;/p&gt;

&lt;p&gt;Every frame is a React component. Every animation is a function of the current frame. Because the whole video is code, you version it in Git, review it in pull requests, and feed it dynamic props — which is exactly why it pairs so well with LLM-generated scripts and data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full React: hooks, props, components — no proprietary DSL to learn.&lt;/li&gt;
&lt;li&gt;Total control over animation, down to the frame.&lt;/li&gt;
&lt;li&gt;Scales hard via Lambda rendering — thousands of videos from one codebase.&lt;/li&gt;
&lt;li&gt;Open-source core with a large, active community.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Steep curve if you don't already live in React.&lt;/li&gt;
&lt;li&gt;Render pipelines (especially serverless) take real setup effort.&lt;/li&gt;
&lt;li&gt;No HDR yet, a limitation inherited from headless Chrome rendering.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; SaaS products, animated dashboards, fintech data videos, and any content automation where you want code-level control.&lt;/p&gt;

&lt;p&gt;Pricing is fair for its target: free for individuals and small teams, a company license from around $100/month, and enterprise terms above that.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. HyperFrames — video as HTML, built for AI agents
&lt;/h2&gt;

&lt;p&gt;This is the tool I had to re-learn while researching, because the early write-ups got it wrong.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hyperframes.video" rel="noopener noreferrer"&gt;HyperFrames&lt;/a&gt; is HeyGen's open-source (Apache 2.0) framework that turns plain HTML, CSS and JavaScript into frame-accurate MP4. No React. No component system. No build step. You write something close to a normal web page — using &lt;code&gt;data-start&lt;/code&gt;, &lt;code&gt;data-duration&lt;/code&gt; and &lt;code&gt;data-track-index&lt;/code&gt; attributes for the timeline — and a headless browser captures it frame by frame.&lt;/p&gt;

&lt;p&gt;The bet is interesting. Remotion wagered on React as the future of programmatic video. HyperFrames is wagering on raw HTML, precisely because today's AI models write clean HTML far more reliably than they write complex React animation architectures.&lt;/p&gt;

&lt;p&gt;It ships with skill packs for Claude Code and Codex, so an agent can scaffold, write and render a full video from a single prompt. It supports GSAP, Lottie, Three.js and D3, and renders locally with no API key required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lower barrier than Remotion — plain HTML, no framework lock-in.&lt;/li&gt;
&lt;li&gt;Open source, runs locally, no account or cloud dependency.&lt;/li&gt;
&lt;li&gt;Purpose-built for agentic workflows (Claude Code, Codex).&lt;/li&gt;
&lt;li&gt;50+ pre-built blocks installable via &lt;code&gt;npx hyperframes add&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Young: launched in 2026, so the ecosystem is still thin.&lt;/li&gt;
&lt;li&gt;Best suited to simpler motion — text, diagrams, data overlays.&lt;/li&gt;
&lt;li&gt;Fewer battle-tested production references than Remotion.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; AI-agent pipelines, automated shorts, and data videos where an agent writes the code and renders the output end to end.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Creatomate — JSON in, video out
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://creatomate.com" rel="noopener noreferrer"&gt;Creatomate&lt;/a&gt; (Create + Automate) is the tool of choice when you want templated video generation through a REST API without managing rendering infrastructure.&lt;/p&gt;

&lt;p&gt;You design a template once — in a visual editor or as JSON — then fire data at it and get back a rendered video, GIF, or image. It's a favorite in the no-code automation crowd because it drops cleanly into n8n, Make and Zapier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Genuinely robust, well-documented API.&lt;/li&gt;
&lt;li&gt;Generate video straight from JSON — ideal for data-driven content.&lt;/li&gt;
&lt;li&gt;First-class fit for n8n and Make automations.&lt;/li&gt;
&lt;li&gt;Visual editor lets non-developers maintain templates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Credit-based pricing climbs fast at volume.&lt;/li&gt;
&lt;li&gt;Text-to-speech (ElevenLabs/Azure) is billed on top of render credits.&lt;/li&gt;
&lt;li&gt;Less low-level control than a code-native tool like Remotion.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; agencies, marketing automation, and personalized video at moderate volume.&lt;/p&gt;

&lt;p&gt;Plans start around $41–54/month for roughly 150–200 minutes at 720p, scaling up from there.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Shotstack — the AWS of video
&lt;/h2&gt;

&lt;p&gt;If Creatomate is the friendly templating layer, &lt;a href="https://shotstack.io" rel="noopener noreferrer"&gt;Shotstack&lt;/a&gt; is the industrial-grade rendering backend. Define a composition as JSON, send it to the API, and Shotstack renders it at scale — thousands of videos in minutes — and serves them from its own CDN.&lt;/p&gt;

&lt;p&gt;It's been around since well before the current hype cycle, which shows: the API is mature, the behavior is predictable, and there's a free sandbox that doesn't ask for a credit card. It's a rendering engine, not a content-intelligence platform — you bring your own AI for voice or subtitles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Extremely mature, well-documented API with SDKs for Node.js, PHP and more.&lt;/li&gt;
&lt;li&gt;Predictable, deterministic rendering — what you send is what you get.&lt;/li&gt;
&lt;li&gt;Built to scale; white-label editor SDK you can embed in your own product.&lt;/li&gt;
&lt;li&gt;Free sandbox for testing before you commit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More technical to set up than a visual-first tool.&lt;/li&gt;
&lt;li&gt;Resolution-based pricing gets expensive at 1080p+.&lt;/li&gt;
&lt;li&gt;No native AI features — you wire in voice and captions yourself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; SaaS platforms and any application that needs to render large volumes of video reliably.&lt;/p&gt;

&lt;p&gt;Pricing runs pay-as-you-go at roughly $0.30/min, or plans from about $39/month at lower per-minute rates.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. React Video Editor (RVE) — a timeline UI you don't have to build
&lt;/h2&gt;

&lt;p&gt;Building a video editor from scratch is brutal: timelines, drag-and-drop, multi-track state, media handling. RVE exists so you don't have to.&lt;/p&gt;

&lt;p&gt;It's a React/Next.js editor that uses Remotion underneath for rendering. There's a free, &lt;a href="https://github.com/reactvideoeditor/free-react-video-editor" rel="noopener noreferrer"&gt;open-source baseline&lt;/a&gt; to learn the building blocks, plus commercial &lt;a href="https://www.reactvideoeditor.com" rel="noopener noreferrer"&gt;Pro and SDK options&lt;/a&gt; for teams that want a production-ready editor without burning a month of engineering on it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open source baseline — inspect and learn the architecture for free.&lt;/li&gt;
&lt;li&gt;Pure React/Next.js; customizable to your product.&lt;/li&gt;
&lt;li&gt;Saves weeks of work if you need an in-app editor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Younger project with a smaller community.&lt;/li&gt;
&lt;li&gt;Documentation is still catching up.&lt;/li&gt;
&lt;li&gt;Built on Remotion, so a Remotion license may apply depending on use.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; React teams shipping an embedded video editor, internal tools, or creative SaaS features.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "video as code" actually looks like
&lt;/h2&gt;

&lt;p&gt;Theory is cheap. Here's the same idea — a simple fintech price card — expressed in the three paradigms these tools represent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remotion (React):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;AbsoluteFill&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useCurrentFrame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;interpolate&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;remotion&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PriceCard&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;ticker&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;price&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useCurrentFrame&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;opacity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;interpolate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;extrapolateRight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;clamp&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;AbsoluteFill&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#0A1628&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;opacity&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#FFFFFF&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;ticker&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#3B82F6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;AbsoluteFill&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;HyperFrames (HTML):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;data-track-index=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;data-start=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;data-duration=&lt;/span&gt;&lt;span class="s"&gt;"3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h1&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"color:#FFFFFF"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;AAPL&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h2&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"color:#3B82F6"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;$214.30&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- render: npx hyperframes render scene.html --&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Creatomate / Shotstack (JSON via API, called from Python):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.creatomate.com/v1/renders&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;template_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-template-id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;modifications&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ticker&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$214.30&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three philosophies. React owns the components. HTML optimizes for what AI writes well. JSON-over-API hides the rendering entirely.&lt;/p&gt;

&lt;p&gt;From here you can build:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;daily auto-generated market recap videos,&lt;/li&gt;
&lt;li&gt;personalized onboarding clips per user,&lt;/li&gt;
&lt;li&gt;thousands of localized product shorts from one template.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The ranking, at a glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Flexibility&lt;/th&gt;
&lt;th&gt;Ease&lt;/th&gt;
&lt;th&gt;Scalability&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Remotion&lt;/td&gt;
&lt;td&gt;10/10&lt;/td&gt;
&lt;td&gt;6/10&lt;/td&gt;
&lt;td&gt;10/10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HyperFrames&lt;/td&gt;
&lt;td&gt;8/10&lt;/td&gt;
&lt;td&gt;8/10&lt;/td&gt;
&lt;td&gt;8/10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Creatomate&lt;/td&gt;
&lt;td&gt;7/10&lt;/td&gt;
&lt;td&gt;9/10&lt;/td&gt;
&lt;td&gt;9/10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shotstack&lt;/td&gt;
&lt;td&gt;8/10&lt;/td&gt;
&lt;td&gt;7/10&lt;/td&gt;
&lt;td&gt;10/10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RVE&lt;/td&gt;
&lt;td&gt;8/10&lt;/td&gt;
&lt;td&gt;6/10&lt;/td&gt;
&lt;td&gt;8/10&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read the scores as trade-offs, not a leaderboard. Remotion wins on control and loses on ramp-up. Creatomate wins on speed-to-first-video and gives up low-level control. Nobody wins all three.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honorable mentions — the AI generation layer
&lt;/h2&gt;

&lt;p&gt;These don't compete with the tools above. They sit next to them, generating the raw footage you then assemble:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://runwayml.com" rel="noopener noreferrer"&gt;Runway&lt;/a&gt;&lt;/strong&gt; — generative AI video.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.descript.com" rel="noopener noreferrer"&gt;Descript&lt;/a&gt;&lt;/strong&gt; — edit video by editing the transcript.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.capcut.com" rel="noopener noreferrer"&gt;CapCut&lt;/a&gt;&lt;/strong&gt; — fast, creator-focused editing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.veed.io" rel="noopener noreferrer"&gt;VEED&lt;/a&gt;&lt;/strong&gt; — marketing and subtitle-heavy workflows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://lumalabs.ai" rel="noopener noreferrer"&gt;Luma AI&lt;/a&gt;&lt;/strong&gt; — text-to-video generation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The pattern worth noticing: the code-first tools are the &lt;em&gt;assembly&lt;/em&gt; layer, and these are the &lt;em&gt;content&lt;/em&gt; layer. The strongest pipelines in 2026 chain both — Runway or Luma generates a clip, Remotion or HyperFrames composes it with data and renders the final cut.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to actually choose
&lt;/h2&gt;

&lt;p&gt;Forget the feature lists for a second and answer three questions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do you live in React?&lt;/strong&gt; Then Remotion, and RVE if you need a ready-made editor UI on top of it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are AI agents writing your video code?&lt;/strong&gt; HyperFrames was built for exactly that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do you just want a video back from an API and never think about rendering?&lt;/strong&gt; Creatomate for templated content with a visual editor, Shotstack when you need it to scale like infrastructure.&lt;/p&gt;

&lt;p&gt;There's no universal winner. There's only the tool that disappears into &lt;em&gt;your&lt;/em&gt; pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;For developers, "best video tool" means best render engine, not best timeline.&lt;/li&gt;
&lt;li&gt;Remotion (React) and HyperFrames (HTML) split the code-first world by what they optimize for: human control vs. AI ergonomics.&lt;/li&gt;
&lt;li&gt;API-first tools (Creatomate, Shotstack) trade control for not having to run rendering infrastructure at all.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Can I generate videos without a video editor?&lt;/strong&gt;&lt;br&gt;
Yes. Tools like Remotion, HyperFrames, Creatomate and Shotstack let you produce MP4 video entirely from code or an API — no timeline, no manual editing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the difference between Remotion and HyperFrames?&lt;/strong&gt;&lt;br&gt;
Remotion renders video from React components and is the more mature choice for product teams. HyperFrames renders video from plain HTML and is optimized for AI agents writing the code. Both render through a headless browser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which tool is best for generating thousands of videos?&lt;/strong&gt;&lt;br&gt;
Shotstack and Remotion (on Lambda) are built for high-volume rendering. Creatomate also scales well but its credit pricing climbs at large volumes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need to know how to code to use these?&lt;/strong&gt;&lt;br&gt;
For Remotion, HyperFrames and RVE, yes. Creatomate and Shotstack can be driven through no-code tools like n8n and Make, though the API unlocks the most power.&lt;/p&gt;




&lt;p&gt;If you're a software or API company looking to explain a developer product through high-quality educational content — real code, not marketing fluff — feel free to connect with me on LinkedIn.&lt;/p&gt;

&lt;p&gt;Video stopped being something you &lt;em&gt;edit&lt;/em&gt; and started being something you &lt;em&gt;generate&lt;/em&gt;. The developers who internalize that won't be the ones with the best timeline skills.&lt;/p&gt;

&lt;p&gt;They'll be the ones who treat video like every other build artifact: code, data, and a render step.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Looking for technical content for your company? I can help — &lt;a href="https://www.linkedin.com/in/kevin-meneses-gonzalez/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; · &lt;a href="mailto:kevinmenesesgonzalez@gmail.com"&gt;kevinmenesesgonzalez@gmail.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>video</category>
      <category>api</category>
      <category>programming</category>
    </item>
    <item>
      <title>Top 5 Data Visualizations for Algorithmic Trading (With Python Code)</title>
      <dc:creator>Kevin Meneses González</dc:creator>
      <pubDate>Sun, 31 May 2026 09:30:00 +0000</pubDate>
      <link>https://dev.to/kevin_menesesgonzlez/top-5-data-visualizations-for-algorithmic-trading-with-python-code-5p2</link>
      <guid>https://dev.to/kevin_menesesgonzlez/top-5-data-visualizations-for-algorithmic-trading-with-python-code-5p2</guid>
      <description>&lt;p&gt;Most algo traders write signals. Almost none visualize them correctly.&lt;/p&gt;

&lt;p&gt;You can have a backtest with 300 trades, a Sharpe ratio of 1.4, and still have no idea whether your system is working — or getting lucky. The numbers don't show you where the strategy breathes. Charts do.&lt;/p&gt;

&lt;p&gt;If you're:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;building a quantitative trading system,&lt;/li&gt;
&lt;li&gt;running backtests and not knowing how to interpret the results,&lt;/li&gt;
&lt;li&gt;or trying to communicate your edge to investors or teammates,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Problem Isn't the Data. It's What You Can't See.
&lt;/h2&gt;

&lt;p&gt;A developer I know spent three months building a mean-reversion strategy. Solid execution, clean Python, well-documented. He ran the backtest. The results looked good.&lt;/p&gt;

&lt;p&gt;What he couldn't see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Three consecutive months of drawdown that would have ended any fund&lt;/li&gt;
&lt;li&gt;80% of returns coming from a single volatile week in March&lt;/li&gt;
&lt;li&gt;His volume filters triggering on micro-cap stocks with no real liquidity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The strategy wasn't broken. His visualization layer was.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Visualization is not decoration. It is part of the analysis.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once I understood that, I stopped treating charts as outputs and started treating them as inputs to the research process.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why EODHD Is the Right Data Layer for This
&lt;/h2&gt;

&lt;p&gt;Before the code, a word on data quality.&lt;/p&gt;

&lt;p&gt;Every chart in this article is powered by &lt;a href="https://eodhd.com/?via=kmg&amp;amp;ref1=Meneses&amp;amp;utm_source=medium&amp;amp;utm_medium=post&amp;amp;utm_campaign=algo-trading-data-viz&amp;amp;utm_content=Meneses" rel="noopener noreferrer"&gt;EODHD APIs&lt;/a&gt;. Not because it's the only option — but because it's the one I consistently use for production-grade algo trading research.&lt;/p&gt;

&lt;p&gt;What you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;End-of-day prices for 70,000+ tickers across 60+ exchanges&lt;/li&gt;
&lt;li&gt;Intraday data down to 1-minute resolution&lt;/li&gt;
&lt;li&gt;Fundamental data, economic indicators, and options chains — all through a clean REST API&lt;/li&gt;
&lt;li&gt;Python-friendly JSON responses with predictable schema&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The free tier covers most of what you need to start. Paid plans scale with your data volume.&lt;/p&gt;

&lt;p&gt;👉&lt;em&gt;&lt;a href="https://eodhd.com/?via=kmg&amp;amp;ref1=Meneses&amp;amp;utm_source=medium&amp;amp;utm_medium=post&amp;amp;utm_campaign=algo-trading-data-viz&amp;amp;utm_content=Meneses" rel="noopener noreferrer"&gt;Get started with EODHD here&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Architecture: From API to Chart
&lt;/h2&gt;

&lt;p&gt;Before we dive into charts, it's worth understanding how data flows from the EODHD API into your visualization layer.&lt;/p&gt;

&lt;p&gt;The pipeline has four stages: fetch raw OHLCV data from the REST API, normalize it into a pandas DataFrame, compute derived metrics (signals, indicators, returns), and finally render the visualization.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj88d6pz72vf8902aswkl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj88d6pz72vf8902aswkl.png" alt=" " width="641" height="434"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The 5 Visualizations
&lt;/h2&gt;




&lt;h3&gt;
  
  
  1. Candlestick Chart with Moving Averages — Trend Structure at a Glance
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it shows:&lt;/strong&gt; Price action as OHLC candles, layered with a fast (20-period) and slow (50-period) exponential moving average.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters for algo trading:&lt;/strong&gt;&lt;br&gt;
The candlestick + EMA combination is the foundation of every trend-following system. Before deploying any directional strategy, you need to see whether the asset is trending, consolidating, or reversing. Moving average crossovers are a common signal generation mechanism — and seeing them plotted against real price action reveals how late, noisy, or clean those signals actually are.&lt;/p&gt;

&lt;p&gt;A crossover that looks clean in a table of dates looks completely different when you see it happening during a sideways chop period. The chart reveals what the numbers hide.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;plotly.graph_objects&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;go&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;plotly.subplots&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;make_subplots&lt;/span&gt;

&lt;span class="n"&gt;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your_api_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;TICKER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL.US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch_ohlcv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ticker&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;d&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;from_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2024-01-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://eodhd.com/api/eod/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ticker&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api_token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fmt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;period&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;from&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;from_date&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_datetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;inplace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;

&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fetch_ohlcv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TICKER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Compute EMAs
&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ema_20&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;close&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;ewm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;span&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ema_50&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;close&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;ewm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;span&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;fig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;go&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Figure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_trace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;go&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Candlestick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;open&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;high&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;low&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;low&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;close&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OHLC&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_trace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;go&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Scatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ema_20&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;orange&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EMA 20&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_trace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;go&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Scatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ema_50&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;blue&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EMA 50&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update_layout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;TICKER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; — Candlestick with EMA 20/50&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;xaxis_rangeslider_visible&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;plotly_dark&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From here you can build:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EMA crossover signal detection with entry/exit markers on the chart&lt;/li&gt;
&lt;li&gt;Multi-timeframe confluence overlays (daily trend + intraday entry)&lt;/li&gt;
&lt;li&gt;Automated alerts when price closes above/below a moving average&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2. Volume Profile — Where the Market Actually Traded
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it shows:&lt;/strong&gt; A horizontal histogram of traded volume at each price level over a defined period.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters for algo trading:&lt;/strong&gt;&lt;br&gt;
Price tells you &lt;em&gt;when&lt;/em&gt; moves happened. Volume profile tells you &lt;em&gt;where&lt;/em&gt; the market spent its time. High-volume nodes are price magnets — levels where large participants built positions. Low-volume nodes are inefficiencies — levels the market crossed through quickly and is likely to revisit.&lt;/p&gt;

&lt;p&gt;If your strategy is entering near a high-volume node, you have natural support or resistance. If it's entering in a low-volume area, you're in air. No other visualization shows this as clearly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;

&lt;span class="c1"&gt;# Fetch data (reuse fetch_ohlcv from above)
&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fetch_ohlcv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TICKER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Build volume profile
&lt;/span&gt;&lt;span class="n"&gt;price_range&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;linspace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;low&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;vol_profile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;zeros&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;price_range&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;iterrows&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;price_range&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;price_range&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;close&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;price_range&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
            &lt;span class="n"&gt;vol_profile&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;volume&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;

&lt;span class="n"&gt;bin_centers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;price_range&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;price_range&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:])&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ax1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ax2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;gridspec_kw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;width_ratios&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt; &lt;span class="n"&gt;facecolor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#0d1117&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Left: price chart
&lt;/span&gt;&lt;span class="n"&gt;ax1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;close&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#58a6ff&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;linewidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_facecolor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#0d1117&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;TICKER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; — Close Price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;white&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gray&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Right: volume profile (horizontal bars)
&lt;/span&gt;&lt;span class="n"&gt;ax2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;barh&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bin_centers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vol_profile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;price_range&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;price_range&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.85&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#388bfd&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_facecolor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#0d1117&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Volume Profile&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;white&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gray&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yaxis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tick_right&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tight_layout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From here you can build:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Point of Control (POC) detection — the single price level with the highest volume&lt;/li&gt;
&lt;li&gt;Value Area calculation (70% of volume) for mean-reversion entries&lt;/li&gt;
&lt;li&gt;Multi-session profiles to compare volume distribution across market regimes&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. Equity Curve with Drawdown Panel — Backtest Health in One View
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it shows:&lt;/strong&gt; The cumulative return of a strategy over time (top panel) + the drawdown at every point (bottom panel).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters for algo trading:&lt;/strong&gt;&lt;br&gt;
A positive total return tells you almost nothing. What matters is the &lt;em&gt;path&lt;/em&gt; to that return. A strategy that returns +40% over 3 years with a -35% drawdown in the middle is not the same as one that returns +40% with a max drawdown of -8%. One you can trade. The other will cause you to abandon the system at exactly the wrong moment.&lt;/p&gt;

&lt;p&gt;The drawdown panel is the psychological test. If you can't stomach what you see there, you can't run that strategy live.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;plotly.graph_objects&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;go&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;plotly.subplots&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;make_subplots&lt;/span&gt;

&lt;span class="c1"&gt;# --- Simulate a simple MA crossover strategy ---
&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fetch_ohlcv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TICKER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ema_10&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;close&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;ewm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;span&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ema_30&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;close&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;ewm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;span&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;signal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ema_10&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ema_30&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;daily_return&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;close&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;pct_change&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;strategy_return&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;signal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;daily_return&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;equity_curve&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;strategy_return&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;cumprod&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;running_max&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;equity_curve&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;cummax&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;drawdown&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;equity_curve&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;running_max&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="c1"&gt;# --- Plot ---
&lt;/span&gt;&lt;span class="n"&gt;fig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;make_subplots&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cols&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;shared_xaxes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;row_heights&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.65&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.35&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;vertical_spacing&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_trace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;go&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Scatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;equity_curve&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tozeroy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#58a6ff&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Equity Curve&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_trace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;go&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Scatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;drawdown&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tozeroy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#f85149&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;fillcolor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rgba(248,81,73,0.2)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Drawdown (%)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update_layout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;plotly_dark&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MA Crossover Strategy — Equity Curve &amp;amp; Drawdown&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;550&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;showlegend&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Key metrics to annotate on this chart:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Max Drawdown&lt;/strong&gt; — the deepest valley from peak&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recovery Time&lt;/strong&gt; — how long it took to reach a new equity high&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calmar Ratio&lt;/strong&gt; — annualized return / max drawdown (one number that summarizes risk-adjusted performance)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  4. Correlation Heatmap — Portfolio Risk Hidden in Plain Sight
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it shows:&lt;/strong&gt; A matrix of pairwise return correlations between multiple assets or strategies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters for algo trading:&lt;/strong&gt;&lt;br&gt;
Diversification only works if your assets are actually uncorrelated. Most traders think they're diversified because they hold different tickers. They're not — they're holding different tickers that all fall together in a risk-off event.&lt;/p&gt;

&lt;p&gt;A correlation heatmap shows you the real structure of your portfolio. Dark red cells = concentrated risk. Near-zero cells = genuine diversification. This is the chart you show before adding a new strategy or asset to your book.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;seaborn&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;sns&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;

&lt;span class="n"&gt;TICKERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL.US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MSFT.US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GOOGL.US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AMZN.US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;JPM.US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GLD.US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;price_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;ticker&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;TICKERS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;df_t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fetch_ohlcv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ticker&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;price_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ticker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df_t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;close&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;prices&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;price_data&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;dropna&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;returns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prices&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pct_change&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;dropna&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;corr_matrix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;returns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;corr&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;facecolor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#0d1117&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;sns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;heatmap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;corr_matrix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;annot&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.2f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;cmap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RdYlGn&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;center&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vmin&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vmax&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;square&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;linewidths&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;cbar_kws&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shrink&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Asset Return Correlation Matrix&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;white&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;white&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tight_layout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From here you can build:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Correlation monitoring over rolling windows to detect regime shifts&lt;/li&gt;
&lt;li&gt;Portfolio optimizer that constrains position sizing based on pairwise correlation&lt;/li&gt;
&lt;li&gt;Alert when two previously uncorrelated assets start moving together&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  5. RSI + Bollinger Bands Overlay — Momentum Meets Volatility
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it shows:&lt;/strong&gt; RSI (Relative Strength Index) as a momentum oscillator below the price chart, with Bollinger Bands (20-period SMA ± 2σ) overlaid on price.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters for algo trading:&lt;/strong&gt;&lt;br&gt;
Neither RSI nor Bollinger Bands alone is particularly reliable. Together, they become a high-conviction signal framework:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Price touching the lower Bollinger Band &lt;strong&gt;while&lt;/strong&gt; RSI is below 30 = potential oversold reversal entry&lt;/li&gt;
&lt;li&gt;Price breaking above the upper band &lt;strong&gt;while&lt;/strong&gt; RSI is above 70 = potential momentum continuation or overbought exit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the kind of multi-indicator confluence that most systematic strategies are built around. Seeing it visually — before you code the logic — prevents you from building signal combinations that never actually coincide in real market data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;plotly.graph_objects&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;go&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;plotly.subplots&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;make_subplots&lt;/span&gt;

&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fetch_ohlcv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TICKER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Bollinger Bands
&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bb_mid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;close&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;rolling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bb_std&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;close&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;rolling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;std&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bb_upper&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bb_mid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bb_std&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bb_lower&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bb_mid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bb_std&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# RSI
&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;close&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;diff&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;gain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lower&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;rolling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;loss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;upper&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;rolling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;rs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gain&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;loss&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rsi&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;fig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;make_subplots&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cols&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;shared_xaxes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;row_heights&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.65&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.35&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;vertical_spacing&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.04&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# --- Price + Bollinger Bands ---
&lt;/span&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_trace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;go&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Scatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;close&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#58a6ff&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Close&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_trace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;go&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Scatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bb_upper&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rgba(255,165,0,0.5)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dash&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BB Upper&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_trace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;go&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Scatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bb_lower&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tonexty&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fillcolor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rgba(255,165,0,0.05)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rgba(255,165,0,0.5)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dash&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BB Lower&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_trace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;go&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Scatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bb_mid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gray&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dash&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BB Mid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# --- RSI ---
&lt;/span&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_trace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;go&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Scatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rsi&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#c9d1d9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RSI&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_hline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line_dash&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line_color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;red&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opacity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_hline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line_dash&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line_color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;green&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opacity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update_layout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;plotly_dark&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;TICKER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; — Bollinger Bands + RSI&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;580&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From here you can build:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Signal detection when both conditions are met simultaneously (dual-condition scanner)&lt;/li&gt;
&lt;li&gt;Backtesting the mean-reversion rule: buy when price &amp;lt; BB lower AND RSI &amp;lt; 30&lt;/li&gt;
&lt;li&gt;Squeeze detection using Bollinger Band width as a volatility compression indicator&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  FAQs
&lt;/h2&gt;

&lt;p&gt;❓ &lt;strong&gt;Do I need a paid EODHD plan to run these examples?&lt;/strong&gt;&lt;br&gt;
✅ The free tier of EODHD includes end-of-day data for most major exchanges, which is enough to run all five visualizations in this article. You only need a paid plan if you require intraday data (1-minute or 5-minute candles), real-time feeds, or access to premium data categories like options chains.&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;Which Python charting library is best for algo trading — Plotly or Matplotlib?&lt;/strong&gt;&lt;br&gt;
✅ Use Plotly for any visualization that benefits from interactivity: equity curves you want to zoom, heatmaps you want to hover over, multi-panel dashboards. Use Matplotlib for static outputs, publication-quality figures, or when you're exporting to PDF reports. Both are used in this article because each has a domain where it genuinely wins.&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;Can I use these visualizations in a live trading dashboard, not just backtesting?&lt;/strong&gt;&lt;br&gt;
✅ Yes. The EODHD API supports intraday data with minute-level resolution on paid plans. Swap the &lt;code&gt;period="d"&lt;/code&gt; parameter in &lt;code&gt;fetch_ohlcv&lt;/code&gt; to &lt;code&gt;period="m"&lt;/code&gt; for minute data. The chart code stays identical — only the data granularity changes. For a fully automated live dashboard, combine these functions with a scheduler like APScheduler or a workflow tool like n8n.&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;What does the Volume Profile actually measure vs. standard volume bars?&lt;/strong&gt;&lt;br&gt;
✅ Standard volume bars (shown at the bottom of most charts) show volume &lt;em&gt;over time&lt;/em&gt; — how much was traded in each candle. Volume Profile shows volume &lt;em&gt;at price&lt;/em&gt; — how much was traded at each price level across a defined period. The second view is far more useful for identifying support/resistance zones and understanding where institutional positions were built.&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;Is algorithmic trading data visualization useful if I'm not running fully automated strategies?&lt;/strong&gt;&lt;br&gt;
✅ Absolutely. Even manual or semi-systematic traders benefit from these charts. The equity curve and drawdown panel are essential for anyone journaling their performance. The correlation heatmap is useful for any multi-asset portfolio. Visualization is not about automation — it's about reducing blind spots.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Markets don't reward complexity. They reward clarity.&lt;/p&gt;

&lt;p&gt;The five charts in this article won't give you an edge by themselves. But they will show you where your edge actually exists — and, more importantly, where it doesn't.&lt;/p&gt;

&lt;p&gt;Start with the candlestick overlay to understand trend structure. Add the drawdown panel to understand psychological survivability. Use the correlation matrix before you add any new position to your book.&lt;/p&gt;

&lt;p&gt;The rest follows.&lt;/p&gt;




&lt;h2&gt;
  
  
  Start Building With Better Data
&lt;/h2&gt;

&lt;p&gt;Every chart in this article runs on EODHD APIs. If you're serious about algorithmic trading research, the data layer is not the place to cut corners.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://eodhd.com/?via=kmg&amp;amp;ref1=Meneses&amp;amp;utm_source=medium&amp;amp;utm_medium=post&amp;amp;utm_campaign=algo-trading-data-viz&amp;amp;utm_content=Meneses" rel="noopener noreferrer"&gt;Get started with EODHD here&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What you get access to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;End-of-day and intraday data for 70,000+ tickers across 60+ exchanges&lt;/li&gt;
&lt;li&gt;Fundamentals, economic indicators, and options chains — all through one clean REST API&lt;/li&gt;
&lt;li&gt;A free tier that covers everything in this article, no credit card required&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Work With Me
&lt;/h2&gt;

&lt;p&gt;I produce technical content for fintech and developer tools companies — tutorials, API walkthroughs, data-driven articles that actually get read.&lt;/p&gt;

&lt;p&gt;If you're building something in the trading, data, or developer tools space and need content that explains your product without sounding like a press release:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://www.linkedin.com/in/kevin-meneses-gonzalez/" rel="noopener noreferrer"&gt;Connect on LinkedIn&lt;/a&gt;&lt;/strong&gt; or reach out directly at &lt;a href="mailto:kevinmenesesgonzalez@gmail.com"&gt;kevinmenesesgonzalez@gmail.com&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Looking for technical content for your company? I can help — &lt;a href="https://www.linkedin.com/in/kevin-meneses-gonzalez/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; · &lt;a href="mailto:kevinmenesesgonzalez@gmail.com"&gt;kevinmenesesgonzalez@gmail.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>stocks</category>
      <category>data</category>
      <category>dashboards</category>
      <category>algorithms</category>
    </item>
    <item>
      <title>Interactive Brokers API vs EODHD: Which One Actually Saves You Time?</title>
      <dc:creator>Kevin Meneses González</dc:creator>
      <pubDate>Fri, 29 May 2026 09:00:35 +0000</pubDate>
      <link>https://dev.to/kevin_menesesgonzlez/interactive-brokers-api-vs-eodhd-which-one-actually-saves-you-time-15l7</link>
      <guid>https://dev.to/kevin_menesesgonzlez/interactive-brokers-api-vs-eodhd-which-one-actually-saves-you-time-15l7</guid>
      <description>&lt;p&gt;Most developers assume that using a broker's API gives you a direct advantage when building financial tools.&lt;/p&gt;

&lt;p&gt;The assumption: if your broker has an API, you might as well use it for data.&lt;/p&gt;

&lt;p&gt;The reality: trading APIs and data APIs solve fundamentally different problems — and confusing the two will cost you weeks of unnecessary setup, a running desktop app, and a live brokerage account before you write a single line of analysis code.&lt;/p&gt;

&lt;p&gt;If you're:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;building a stock screener or portfolio analyzer,&lt;/li&gt;
&lt;li&gt;automating financial research with Python,&lt;/li&gt;
&lt;li&gt;or integrating market data into an AI agent,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;this comparison matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Interactive Brokers API Actually Is (And What It Isn't)
&lt;/h2&gt;

&lt;p&gt;Interactive Brokers is a serious brokerage. Their API — built around TWS (Trader Workstation) and the &lt;code&gt;ib_insync&lt;/code&gt; Python library — is designed for one primary use case: &lt;strong&gt;executing trades programmatically&lt;/strong&gt; from a live account.&lt;/p&gt;

&lt;p&gt;It also exposes market data. Historical prices, fundamentals, options chains. The data is there.&lt;/p&gt;

&lt;p&gt;But the access model is the problem.&lt;/p&gt;

&lt;p&gt;To pull a single historical price series using the IBKR API, you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An active Interactive Brokers brokerage account (funded or paper)&lt;/li&gt;
&lt;li&gt;TWS or IB Gateway running locally on your machine&lt;/li&gt;
&lt;li&gt;A socket connection open on port 7497 or 4002&lt;/li&gt;
&lt;li&gt;Pacing limits: IBKR throttles historical data requests to ~60 per 10 minutes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's the setup &lt;em&gt;before&lt;/em&gt; you write any analysis logic.&lt;/p&gt;

&lt;p&gt;Here's the simplest working example using &lt;code&gt;ib_insync&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;ib_insync&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;IB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Stock&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;util&lt;/span&gt;

&lt;span class="c1"&gt;# Requires TWS or IB Gateway running on localhost
&lt;/span&gt;&lt;span class="n"&gt;ib&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;IB&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;ib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;127.0.0.1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7497&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;clientId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;contract&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Stock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;AAPL&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;SMART&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;USD&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;bars&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reqHistoricalData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;endDateTime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;durationStr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;30 D&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;barSizeSetting&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1 day&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;whatToShow&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;CLOSE&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;useRTH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;util&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;df&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bars&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;date&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;close&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]].&lt;/span&gt;&lt;span class="nf"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;ib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;disconnect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Output (example):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;         date   close
20  2026-04-28  211.23
21  2026-04-29  213.45
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This works. But notice what it requires: a running desktop application, an authenticated session, and a live connection. If TWS isn't open, your script fails silently. If you're running this on a server, you need IB Gateway configured and maintained.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deep integration if you're already trading with IBKR&lt;/li&gt;
&lt;li&gt;Access to live quotes, options data, and order execution in one place&lt;/li&gt;
&lt;li&gt;Well-maintained Python library (&lt;code&gt;ib_insync&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requires a funded or paper brokerage account&lt;/li&gt;
&lt;li&gt;TWS or IB Gateway must be running — not suitable for lightweight server deployments&lt;/li&gt;
&lt;li&gt;Historical data pacing restrictions limit bulk research workloads&lt;/li&gt;
&lt;li&gt;Not designed for broad market screening across thousands of symbols&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; algo traders who are already IBKR clients and need to combine execution with data in a single workflow.&lt;/p&gt;


&lt;h2&gt;
  
  
  What EODHD Is (And Why the Model Is Different)
&lt;/h2&gt;

&lt;p&gt;EODHD — End of Day Historical Data — is a pure financial data API. No brokerage account. No desktop software. No socket connections.&lt;/p&gt;

&lt;p&gt;One API key. REST calls. JSON responses. That's it.&lt;/p&gt;

&lt;p&gt;The architecture is what makes it developer-friendly by design: you send an HTTP request to an endpoint, you get structured data back. The same way you'd call any modern API — from a Jupyter notebook, a FastAPI backend, a cron job on a cloud server, or an AI agent.&lt;/p&gt;

&lt;p&gt;Here's the equivalent historical price request in EODHD:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;

&lt;span class="n"&gt;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your_eodhd_api_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;ticker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL.US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://eodhd.com/api/eod/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ticker&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api_token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fmt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;from&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-03-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-04-30&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;date&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;close&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]].&lt;/span&gt;&lt;span class="nf"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;         date    close
20  2026-04-28   211.23
21  2026-04-29   213.45
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Same data. No running application. No account requirement. Deployable anywhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;REST API — no local dependencies, works on any server or cloud environment&lt;/li&gt;
&lt;li&gt;70+ exchanges covered globally, 30+ years of historical data&lt;/li&gt;
&lt;li&gt;Fundamentals, macroeconomic indicators, options chains, news sentiment — all under one API key&lt;/li&gt;
&lt;li&gt;No pacing restrictions for most endpoints (rate limits are generous on paid plans)&lt;/li&gt;
&lt;li&gt;Free tier available for evaluation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No trade execution — data only (by design)&lt;/li&gt;
&lt;li&gt;Real-time quotes have a 15–20 min delay on lower-tier plans&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; developers building research tools, AI agents, portfolio analytics, or any financial application where data access needs to be clean, fast, and deployment-independent.&lt;/p&gt;


&lt;div class="crayons-card c-embed"&gt;

  &lt;br&gt;
💡 &lt;strong&gt;Try EODHD on your next project&lt;/strong&gt;&lt;br&gt;
API key in 30 seconds. No brokerage account required. Free tier included — EOD data for US exchanges out of the box.&lt;br&gt;
👉 &lt;a href="https://eodhd.com/?via=kmg&amp;amp;ref1=Meneses&amp;amp;utm_source=medium&amp;amp;utm_medium=post&amp;amp;utm_campaign=interactive-brokers-api-vs-eodhd-financial-data-python&amp;amp;utm_content=Meneses" rel="noopener noreferrer"&gt;Get started with EODHD&lt;/a&gt;&lt;br&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Most Useful EODHD Endpoints for Developers
&lt;/h2&gt;

&lt;p&gt;EODHD's value isn't just in historical prices. The breadth of the API is where it differentiates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;End-of-Day Prices&lt;/strong&gt; (&lt;code&gt;/api/eod/&lt;/code&gt;)&lt;br&gt;
Daily OHLCV for 70+ global exchanges. Adjusted for splits and dividends. 30+ years of history for major symbols.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fundamentals&lt;/strong&gt; (&lt;code&gt;/api/fundamentals/&lt;/code&gt;)&lt;br&gt;
Full company financials: income statements, balance sheets, cash flow, earnings history, analyst estimates. Structured JSON you can feed directly into a model or dashboard.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://eodhd.com/api/fundamentals/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ticker&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api_token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;filter&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Financials::Income_Statement::yearly&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Real-Time / Live Data&lt;/strong&gt; (&lt;code&gt;/api/real-time/&lt;/code&gt;)&lt;br&gt;
Delayed quotes (~15–20 min) or real-time on higher plans. Bulk requests supported — fetch up to 50 tickers in one call.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Macroeconomic Indicators&lt;/strong&gt; (&lt;code&gt;/api/macro-indicator/&lt;/code&gt;)&lt;br&gt;
GDP, CPI, unemployment, interest rates per country. Useful for macro-driven models and risk analysis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;News &amp;amp; Sentiment&lt;/strong&gt; (&lt;code&gt;/api/news/&lt;/code&gt;)&lt;br&gt;
Financial news filtered by ticker. Useful for NLP pipelines and sentiment-aware trading signals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Options Data&lt;/strong&gt; (&lt;code&gt;/api/options/&lt;/code&gt;)&lt;br&gt;
Full options chain per symbol including Greeks, open interest, and volume.&lt;/p&gt;

&lt;p&gt;Each endpoint follows the same REST pattern. You learn one, you know all.&lt;/p&gt;


&lt;h2&gt;
  
  
  Side-by-Side Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Interactive Brokers API&lt;/th&gt;
&lt;th&gt;EODHD&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Setup required&lt;/td&gt;
&lt;td&gt;TWS/IB Gateway + account&lt;/td&gt;
&lt;td&gt;API key only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Account required&lt;/td&gt;
&lt;td&gt;Yes (brokerage)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment&lt;/td&gt;
&lt;td&gt;Local / desktop-dependent&lt;/td&gt;
&lt;td&gt;Any server, cloud, notebook&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Historical data&lt;/td&gt;
&lt;td&gt;Yes (paced, limited)&lt;/td&gt;
&lt;td&gt;Yes (30+ years, bulk-friendly)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fundamentals&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Full financial statements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Global coverage&lt;/td&gt;
&lt;td&gt;Major exchanges&lt;/td&gt;
&lt;td&gt;70+ exchanges&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real-time data&lt;/td&gt;
&lt;td&gt;Yes (with live account)&lt;/td&gt;
&lt;td&gt;Delayed / real-time (plan-based)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trade execution&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Suitable for AI agents&lt;/td&gt;
&lt;td&gt;Difficult&lt;/td&gt;
&lt;td&gt;Yes — REST native&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Free tier&lt;/td&gt;
&lt;td&gt;Paper account only&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pricing&lt;/td&gt;
&lt;td&gt;Free with brokerage account&lt;/td&gt;
&lt;td&gt;From $19.99/month&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  The MCP Advantage: EODHD as an AI-Native Data Layer
&lt;/h2&gt;

&lt;p&gt;This is where EODHD's architecture creates a significant gap that didn't exist two years ago.&lt;/p&gt;

&lt;p&gt;With the rise of AI agents — tools built on Claude, GPT-4, LangChain, or custom LLM pipelines — financial data access needs to be &lt;strong&gt;agent-callable&lt;/strong&gt;. That means structured, predictable, HTTP-based endpoints that an AI model can invoke without managing state, connections, or authentication flows mid-conversation.&lt;/p&gt;

&lt;p&gt;EODHD has an official MCP (Model Context Protocol) server.&lt;/p&gt;

&lt;p&gt;This means you can give Claude, Cursor, or any MCP-compatible agent direct access to EODHD endpoints — without writing a single line of integration code.&lt;/p&gt;

&lt;p&gt;A practical example: instead of building an API wrapper, a prompt chain, and an output parser, you connect the EODHD MCP server and ask your agent:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Fetch the last 6 months of Apple's revenue growth and compare it to its 5-year average."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent calls the fundamentals endpoint, receives structured JSON, and performs the analysis — all within a single reasoning loop.&lt;/p&gt;

&lt;p&gt;Here's what that integration looks like in a Python agent setup using the EODHD MCP:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Example: Claude SDK + EODHD MCP integration
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;anthropic&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;anthropic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Anthropic&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;beta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-opus-4-5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;mcp_servers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://mcpv2.eodhd.dev/v2/mcp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;eodhd-mcp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Using EODHD data, get Apple&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s (AAPL.US) end-of-day prices &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;for the last 30 days and calculate the 10-day moving average.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Interactive Brokers has no equivalent. The IBKR API requires an open socket, a running GUI application, and explicit connection management — none of which fits the stateless, HTTP-native model that AI agents operate on.&lt;/p&gt;

&lt;p&gt;If you're building anything AI-powered on top of financial data in 2026, the integration model matters as much as the data itself.&lt;/p&gt;


&lt;div class="crayons-card c-embed"&gt;

  &lt;br&gt;
🤖 &lt;strong&gt;EODHD + MCP: financial data for AI agents&lt;/strong&gt;&lt;br&gt;
Connect your LLM pipeline to 70+ global exchanges in one step. No wrappers. No boilerplate. Just structured data your agent can actually use.&lt;br&gt;
👉 &lt;a href="https://eodhd.com/?via=kmg&amp;amp;ref1=Meneses&amp;amp;utm_source=medium&amp;amp;utm_medium=post&amp;amp;utm_campaign=interactive-brokers-api-vs-eodhd-financial-data-python&amp;amp;utm_content=Meneses" rel="noopener noreferrer"&gt;Explore the EODHD MCP server&lt;/a&gt;&lt;br&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  When to Use Each One
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use Interactive Brokers API when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're already an IBKR client and need to combine order execution with data in a single script&lt;/li&gt;
&lt;li&gt;You're building an algo trading system that needs to execute, not just analyze&lt;/li&gt;
&lt;li&gt;You're running a live trading strategy that requires real-time bid/ask data tied to your positions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use EODHD when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're building a research tool, screener, or portfolio analyzer with no execution component&lt;/li&gt;
&lt;li&gt;You want to deploy a financial data pipeline on a cloud server without managing desktop software&lt;/li&gt;
&lt;li&gt;You're integrating market data into an AI agent, LLM pipeline, or MCP-based workflow&lt;/li&gt;
&lt;li&gt;You need global coverage across 70+ exchanges with consistent data structure&lt;/li&gt;
&lt;li&gt;You're prototyping — EODHD's free tier lets you validate the idea before committing to a plan&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The choice isn't really about which API is "better." It's about what your project actually needs.&lt;/p&gt;

&lt;p&gt;If your project needs to place orders: use IBKR.&lt;/p&gt;

&lt;p&gt;If your project needs clean, accessible, scalable financial data: EODHD is the obvious answer.&lt;/p&gt;




&lt;h2&gt;
  
  
  FAQs
&lt;/h2&gt;

&lt;p&gt;❓ &lt;strong&gt;Can I use the Interactive Brokers API without a funded account?&lt;/strong&gt;&lt;br&gt;
✅ Yes, IBKR offers a paper trading account that gives you access to their API without real capital. However, you still need to register, get approved, and run TWS or IB Gateway locally. It's functional for testing but not suited for lightweight or server-based deployments.&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;Is EODHD free to use?&lt;/strong&gt;&lt;br&gt;
✅ EODHD has a free tier that includes end-of-day data for US exchanges with limited API calls. It's enough to prototype and evaluate the API structure. Paid plans start at $19.99/month and unlock fundamentals, global exchanges, bulk endpoints, and real-time data.&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;Does EODHD provide real-time stock data?&lt;/strong&gt;&lt;br&gt;
✅ EODHD provides delayed quotes (~15–20 minutes) on standard plans. Real-time data is available on higher-tier plans. For most research, backtesting, and AI agent use cases, delayed data is sufficient and significantly cheaper.&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;Can I use EODHD with an AI agent or LLM pipeline?&lt;/strong&gt;&lt;br&gt;
✅ Yes — this is one of EODHD's strongest advantages in 2026. EODHD has an official MCP server that makes it directly callable from Claude, Cursor, and any MCP-compatible agent. You don't need to build an API wrapper; you connect the server and your agent can query financial data natively within its reasoning loop.&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;What's the best financial data API for Python developers in 2026?&lt;/strong&gt;&lt;br&gt;
✅ It depends on your use case. If you need trade execution, IBKR is the standard. If you need broad, clean, accessible financial data for analysis, AI, or research — EODHD covers more exchanges, requires less setup, and integrates natively with modern AI tooling via its MCP server.&lt;/p&gt;


&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;The Interactive Brokers API is a serious tool. Well-maintained, deep, powerful.&lt;/p&gt;

&lt;p&gt;But it's built for traders, not data engineers.&lt;/p&gt;

&lt;p&gt;EODHD is built for the other use case: developers who need financial data as a clean input — in a notebook, on a server, inside an agent — without managing a brokerage session in the background.&lt;/p&gt;

&lt;p&gt;The gap widens further when you introduce AI agents into the equation. REST-native APIs with MCP support fit how modern LLM pipelines are built. Socket-based desktop APIs don't.&lt;/p&gt;

&lt;p&gt;Choose the tool that matches your architecture, not just your data needs.&lt;/p&gt;


&lt;div class="crayons-card c-embed"&gt;

  &lt;br&gt;
📦 &lt;strong&gt;Ready to drop the overhead?&lt;/strong&gt;&lt;br&gt;
EODHD gives you 70+ exchanges, 30 years of history, fundamentals, macro data, and an MCP server — all under one API key. Start free, scale when you need to.&lt;br&gt;
👉 &lt;a href="https://eodhd.com/?via=kmg&amp;amp;ref1=Meneses&amp;amp;utm_source=medium&amp;amp;utm_medium=post&amp;amp;utm_campaign=interactive-brokers-api-vs-eodhd-financial-data-python&amp;amp;utm_content=Meneses" rel="noopener noreferrer"&gt;Start with EODHD free tier&lt;/a&gt;&lt;br&gt;

&lt;/div&gt;





&lt;p&gt;&lt;em&gt;Looking for technical content for your company? I can help — &lt;a href="https://www.linkedin.com/in/kevin-meneses-gonzalez/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; · &lt;a href="mailto:kevinmenesesgonzalez@gmail.com"&gt;kevinmenesesgonzalez@gmail.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>mcp</category>
      <category>stocks</category>
      <category>trading</category>
    </item>
    <item>
      <title>5 Powerful MCP Use Cases for Financial AI Agents in 2026</title>
      <dc:creator>Kevin Meneses González</dc:creator>
      <pubDate>Sun, 24 May 2026 10:43:27 +0000</pubDate>
      <link>https://dev.to/kevin_menesesgonzlez/5-powerful-mcp-use-cases-for-financial-ai-agents-in-2026-3dm</link>
      <guid>https://dev.to/kevin_menesesgonzlez/5-powerful-mcp-use-cases-for-financial-ai-agents-in-2026-3dm</guid>
      <description>&lt;p&gt;Most people still use AI like it's a smarter Google.&lt;/p&gt;

&lt;p&gt;They open ChatGPT or Claude… ask a few questions… copy a few answers… and that's it.&lt;/p&gt;

&lt;p&gt;But something massive is changing right now.&lt;/p&gt;

&lt;p&gt;AI is evolving from "chatbots" into systems that can actually work with real-world tools and live data.&lt;/p&gt;

&lt;p&gt;And one of the biggest reasons is MCP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt; is quietly becoming the bridge between LLMs and external systems.&lt;/p&gt;

&lt;p&gt;Instead of asking an AI generic questions… you can now connect it directly to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;financial APIs&lt;/li&gt;
&lt;li&gt;live market data&lt;/li&gt;
&lt;li&gt;trading systems&lt;/li&gt;
&lt;li&gt;research workflows&lt;/li&gt;
&lt;li&gt;automated decision pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The problem? Most developers still don't understand how powerful this becomes when combined with financial data.&lt;/p&gt;

&lt;p&gt;Without real-time context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI hallucinate prices&lt;/li&gt;
&lt;li&gt;invent earnings numbers&lt;/li&gt;
&lt;li&gt;provide outdated market information&lt;/li&gt;
&lt;li&gt;generate unreliable trading insights&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Which makes them useless for serious financial workflows.&lt;/p&gt;

&lt;p&gt;That's where MCP changes the game.&lt;/p&gt;

&lt;p&gt;By connecting LLMs to live financial APIs like EODHD APIs, you can build AI agents that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;analyze markets&lt;/li&gt;
&lt;li&gt;evaluate companies&lt;/li&gt;
&lt;li&gt;summarize financial news&lt;/li&gt;
&lt;li&gt;generate trading signals&lt;/li&gt;
&lt;li&gt;automate research pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this article, we'll explore 5 practical MCP use cases for financial AI agents — including real-world ideas developers can build today.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is MCP (Model Context Protocol)?
&lt;/h2&gt;

&lt;p&gt;MCP is essentially a standardized way for AI models to interact with external tools and systems.&lt;/p&gt;

&lt;p&gt;Instead of working only with training data, the model can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;request live information&lt;/li&gt;
&lt;li&gt;access APIs&lt;/li&gt;
&lt;li&gt;interact with databases&lt;/li&gt;
&lt;li&gt;execute workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think about it like giving Claude or ChatGPT "real-time financial senses".&lt;/p&gt;

&lt;p&gt;And this becomes incredibly powerful in finance because markets are dynamic. Yesterday's data is already old.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why MCP Matters for Financial AI
&lt;/h2&gt;

&lt;p&gt;Financial AI agents fail for one main reason: they don't have reliable context.&lt;/p&gt;

&lt;p&gt;Without live data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;valuations become outdated&lt;/li&gt;
&lt;li&gt;technical indicators become inaccurate&lt;/li&gt;
&lt;li&gt;earnings analysis becomes irrelevant&lt;/li&gt;
&lt;li&gt;trading decisions become dangerous&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Connecting MCP with a live financial data provider like EODHD APIs solves this problem.&lt;/p&gt;

&lt;p&gt;You can feed your AI agents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;real-time stock prices&lt;/li&gt;
&lt;li&gt;fundamentals&lt;/li&gt;
&lt;li&gt;earnings&lt;/li&gt;
&lt;li&gt;insider transactions&lt;/li&gt;
&lt;li&gt;news sentiment&lt;/li&gt;
&lt;li&gt;technical indicators&lt;/li&gt;
&lt;li&gt;macroeconomic data&lt;/li&gt;
&lt;li&gt;historical OHLC data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now the AI is no longer "guessing". It's analyzing reality.&lt;/p&gt;


&lt;div class="crayons-card c-embed"&gt;

  &lt;br&gt;
👉 &lt;strong&gt;&lt;a href="https://eodhd.com/?via=kmg&amp;amp;ref1=Meneses&amp;amp;utm_source=medium&amp;amp;utm_medium=post&amp;amp;utm_campaign=5-powerful-mcp-use-cases-for-financial-ai-agents-in-2026-422a2105f7c0&amp;amp;utm_content=Meneses" rel="noopener noreferrer"&gt;Explore EODHD APIs&lt;/a&gt;&lt;/strong&gt; — Real-time market data, fundamentals, news, and technical indicators for financial AI agents.&lt;br&gt;

&lt;/div&gt;





&lt;h2&gt;
  
  
  1. AI-Powered Portfolio Research Agent
&lt;/h2&gt;

&lt;p&gt;One of the best MCP use cases is building a portfolio research assistant.&lt;/p&gt;

&lt;p&gt;Instead of manually opening Yahoo Finance, earnings reports, news websites, and spreadsheets… you can ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Analyze my portfolio risk exposure and summarize the biggest concerns."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The AI agent can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fetch live prices&lt;/li&gt;
&lt;li&gt;analyze volatility&lt;/li&gt;
&lt;li&gt;compare sector exposure&lt;/li&gt;
&lt;li&gt;summarize news&lt;/li&gt;
&lt;li&gt;detect concentration risk&lt;/li&gt;
&lt;li&gt;explain drawdowns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NVIDIA overweight exposure&lt;/li&gt;
&lt;li&gt;excessive tech correlation&lt;/li&gt;
&lt;li&gt;weak diversification&lt;/li&gt;
&lt;li&gt;unusual volatility spikes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This transforms AI into a true investment research companion.&lt;/p&gt;

&lt;p&gt;And because the data comes through MCP using EODHD APIs, the analysis is grounded in real financial information instead of hallucinations.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. AI Earnings Analysis Agent
&lt;/h2&gt;

&lt;p&gt;Earnings season creates information overload.&lt;/p&gt;

&lt;p&gt;Thousands of reports. Conference calls. Guidance updates. Revenue surprises.&lt;/p&gt;

&lt;p&gt;Most traders simply cannot process all of it fast enough.&lt;/p&gt;

&lt;p&gt;An MCP-powered AI agent can automatically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;retrieve earnings data&lt;/li&gt;
&lt;li&gt;summarize reports&lt;/li&gt;
&lt;li&gt;compare quarter-over-quarter growth&lt;/li&gt;
&lt;li&gt;detect guidance changes&lt;/li&gt;
&lt;li&gt;explain what matters&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Imagine asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What were the most important insights from Tesla's latest earnings report?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The AI could instantly summarize:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;revenue growth&lt;/li&gt;
&lt;li&gt;margins&lt;/li&gt;
&lt;li&gt;AI investments&lt;/li&gt;
&lt;li&gt;automotive delivery numbers&lt;/li&gt;
&lt;li&gt;management guidance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is one of the most practical real-world use cases for financial AI — especially for investors, analysts, fintech startups, and trading communities.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. AI Trading Signal Generator
&lt;/h2&gt;

&lt;p&gt;This is where things get really interesting.&lt;/p&gt;

&lt;p&gt;Using MCP + market data APIs, you can create AI agents that combine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;technical indicators&lt;/li&gt;
&lt;li&gt;news sentiment&lt;/li&gt;
&lt;li&gt;volume analysis&lt;/li&gt;
&lt;li&gt;price action&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RSI oversold&lt;/li&gt;
&lt;li&gt;unusual trading volume&lt;/li&gt;
&lt;li&gt;positive earnings sentiment&lt;/li&gt;
&lt;li&gt;bullish momentum breakout&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AI agent can then explain &lt;em&gt;why&lt;/em&gt; a signal exists instead of just showing numbers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example output:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Apple shows bullish momentum after earnings, supported by increasing volume and positive AI-related news sentiment."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is far more useful than traditional black-box indicators.&lt;/p&gt;

&lt;p&gt;And with EODHD APIs, developers can access historical market data, technical indicators, real-time prices, and financial news APIs — perfect for algorithmic trading workflows.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Autonomous Market News Intelligence Agent
&lt;/h2&gt;

&lt;p&gt;Most traders consume too much information and still miss what matters.&lt;/p&gt;

&lt;p&gt;Financial news is overwhelming. A smarter approach is building an AI filtering layer.&lt;/p&gt;

&lt;p&gt;With MCP, your AI agent can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;monitor market news&lt;/li&gt;
&lt;li&gt;detect unusual events&lt;/li&gt;
&lt;li&gt;summarize key developments&lt;/li&gt;
&lt;li&gt;prioritize important stories&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of reading 100 headlines… you receive 5 critical events, summarized in plain English, with market implications attached.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Semiconductor stocks are rising after new AI infrastructure spending announcements."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Oil prices dropped after unexpected inventory data."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This becomes incredibly valuable for swing traders, macro investors, and busy professionals.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. AI-Powered Quant Research Assistant
&lt;/h2&gt;

&lt;p&gt;This is probably the most exciting long-term use case.&lt;/p&gt;

&lt;p&gt;Imagine an AI assistant capable of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;testing trading ideas&lt;/li&gt;
&lt;li&gt;analyzing correlations&lt;/li&gt;
&lt;li&gt;explaining strategy performance&lt;/li&gt;
&lt;li&gt;generating research insights&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You could ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Find momentum-based strategies that performed well during high-volatility periods."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Compare mean reversion performance across tech stocks over the last 10 years."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The AI can use historical data, volatility metrics, technical indicators, and statistical analysis tools.&lt;/p&gt;

&lt;p&gt;This dramatically reduces research time for quantitative traders.&lt;/p&gt;

&lt;p&gt;And when combined with Python frameworks like &lt;code&gt;pandas&lt;/code&gt;, &lt;code&gt;vectorbt&lt;/code&gt;, &lt;code&gt;backtesting.py&lt;/code&gt;, or Streamlit, you can build incredibly powerful systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why EODHD APIs Fit Perfectly for MCP Workflows
&lt;/h2&gt;

&lt;p&gt;One of the biggest challenges when building financial AI agents is finding reliable data infrastructure.&lt;/p&gt;

&lt;p&gt;That's why EODHD APIs are especially interesting for MCP-based workflows.&lt;/p&gt;

&lt;p&gt;They provide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;real-time market data&lt;/li&gt;
&lt;li&gt;historical OHLC data&lt;/li&gt;
&lt;li&gt;financial fundamentals&lt;/li&gt;
&lt;li&gt;earnings&lt;/li&gt;
&lt;li&gt;economic events&lt;/li&gt;
&lt;li&gt;technical indicators&lt;/li&gt;
&lt;li&gt;financial news APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Which means developers can build AI agents, trading dashboards, automated research systems, and quant workflows — without stitching together multiple fragmented providers.&lt;/p&gt;

&lt;p&gt;If you want to experiment with AI-powered finance projects, it's honestly one of the best places to start.&lt;/p&gt;


&lt;div class="crayons-card c-embed"&gt;

  &lt;br&gt;
👉 &lt;strong&gt;&lt;a href="https://eodhd.com/?via=kmg&amp;amp;ref1=Meneses&amp;amp;utm_source=medium&amp;amp;utm_medium=post&amp;amp;utm_campaign=5-powerful-mcp-use-cases-for-financial-ai-agents-in-2026-422a2105f7c0&amp;amp;utm_content=Meneses" rel="noopener noreferrer"&gt;Explore EODHD APIs&lt;/a&gt;&lt;/strong&gt; — Real-time market data, fundamentals, news, and technical indicators for financial AI agents.&lt;br&gt;

&lt;/div&gt;





&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Most people still think AI is about generating text.&lt;/p&gt;

&lt;p&gt;But the real shift is happening somewhere else.&lt;/p&gt;

&lt;p&gt;AI is becoming operational. Connected. Context-aware. Integrated with real systems.&lt;/p&gt;

&lt;p&gt;And finance is one of the industries where this transformation will happen fastest.&lt;/p&gt;

&lt;p&gt;Because whoever can process information faster, filter noise better, and automate financial research… will have a massive advantage.&lt;/p&gt;

&lt;p&gt;MCP is one of the most important pieces enabling that future.&lt;/p&gt;

&lt;p&gt;And we're still extremely early.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Looking for technical content for your company? I can help — &lt;a href="https://www.linkedin.com/in/kevin-meneses-gonzalez/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; · &lt;a href="mailto:kevinmenesesgonzalez@gmail.com"&gt;kevinmenesesgonzalez@gmail.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>api</category>
      <category>mcp</category>
      <category>claude</category>
      <category>ai</category>
    </item>
    <item>
      <title>The 5 Best OCR APIs for Developers in 2026 (Compared)</title>
      <dc:creator>Kevin Meneses González</dc:creator>
      <pubDate>Fri, 22 May 2026 08:54:32 +0000</pubDate>
      <link>https://dev.to/kevin_menesesgonzlez/the-5-best-ocr-apis-for-developers-in-2026-compared-55p9</link>
      <guid>https://dev.to/kevin_menesesgonzlez/the-5-best-ocr-apis-for-developers-in-2026-compared-55p9</guid>
      <description>&lt;p&gt;Most developers underestimate how painful document processing still is.&lt;/p&gt;

&lt;p&gt;Invoices. PDFs. Receipts. Contracts. Financial reports.&lt;/p&gt;

&lt;p&gt;A huge amount of business data is still trapped inside documents.&lt;/p&gt;

&lt;p&gt;And most teams still solve this problem the same way they did 10 years ago:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;manual copy-paste,&lt;/li&gt;
&lt;li&gt;fragile OCR tools,&lt;/li&gt;
&lt;li&gt;messy spreadsheets,&lt;/li&gt;
&lt;li&gt;broken automations,&lt;/li&gt;
&lt;li&gt;and workflows that collapse the moment a PDF layout changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now combine that with the rise of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI agents,&lt;/li&gt;
&lt;li&gt;RAG systems,&lt;/li&gt;
&lt;li&gt;automation pipelines,&lt;/li&gt;
&lt;li&gt;and LLM workflows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Suddenly, extracting clean structured data from documents becomes one of the most important layers in the entire AI stack.&lt;/p&gt;

&lt;p&gt;That's why OCR APIs and document parsing platforms are exploding right now.&lt;/p&gt;

&lt;p&gt;But not all tools are built the same.&lt;/p&gt;

&lt;p&gt;Some are optimized for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;developer workflows,&lt;/li&gt;
&lt;li&gt;AI-native parsing,&lt;/li&gt;
&lt;li&gt;invoice automation,&lt;/li&gt;
&lt;li&gt;enterprise document ingestion,&lt;/li&gt;
&lt;li&gt;or RAG pipelines.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So after researching the current market, here are 5 OCR/document extraction APIs that stand out the most in 2026.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. LlamaParse (LlamaIndex)
&lt;/h2&gt;

&lt;p&gt;LlamaParse is probably the most interesting OCR/document parsing platform right now for AI engineers.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because it's not just "OCR".&lt;/p&gt;

&lt;p&gt;It's built specifically for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LLMs,&lt;/li&gt;
&lt;li&gt;AI agents,&lt;/li&gt;
&lt;li&gt;and RAG systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The difference matters.&lt;/p&gt;

&lt;p&gt;Traditional OCR extracts text. LlamaParse tries to preserve semantic structure and context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best For&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RAG systems&lt;/li&gt;
&lt;li&gt;AI agents&lt;/li&gt;
&lt;li&gt;Financial reports&lt;/li&gt;
&lt;li&gt;Complex PDFs&lt;/li&gt;
&lt;li&gt;LLM ingestion pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key Features&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI-native parsing&lt;/li&gt;
&lt;li&gt;Markdown and JSON outputs&lt;/li&gt;
&lt;li&gt;Advanced table extraction&lt;/li&gt;
&lt;li&gt;Multi-modal parsing&lt;/li&gt;
&lt;li&gt;Agentic parsing modes&lt;/li&gt;
&lt;li&gt;Complex layout understanding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free tier available&lt;/li&gt;
&lt;li&gt;Credit-based pricing&lt;/li&gt;
&lt;li&gt;Around 10,000 free credits/pages monthly depending on parsing mode&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Excellent for complex PDFs&lt;/li&gt;
&lt;li&gt;Built for AI workflows&lt;/li&gt;
&lt;li&gt;Strong parsing quality&lt;/li&gt;
&lt;li&gt;Great ecosystem for developers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More expensive at scale&lt;/li&gt;
&lt;li&gt;Overkill for simple OCR use cases&lt;/li&gt;
&lt;li&gt;Requires understanding of RAG/LLM workflows&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Mindee
&lt;/h2&gt;

&lt;p&gt;Mindee is one of the most developer-friendly OCR APIs available today.&lt;/p&gt;

&lt;p&gt;Fast setup. Excellent documentation. Very practical APIs.&lt;/p&gt;

&lt;p&gt;This is the kind of tool developers love because you can go from "PDF chaos" to "working automation" in a few hours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best For&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python developers&lt;/li&gt;
&lt;li&gt;OCR automation&lt;/li&gt;
&lt;li&gt;Invoice extraction&lt;/li&gt;
&lt;li&gt;Receipt OCR&lt;/li&gt;
&lt;li&gt;API integrations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key Features&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Invoice OCR&lt;/li&gt;
&lt;li&gt;Receipt OCR&lt;/li&gt;
&lt;li&gt;Passport/document parsing&lt;/li&gt;
&lt;li&gt;Python SDK&lt;/li&gt;
&lt;li&gt;API-first architecture&lt;/li&gt;
&lt;li&gt;Batch processing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Starter plan: ~€44/month&lt;/li&gt;
&lt;li&gt;500 pages included&lt;/li&gt;
&lt;li&gt;Usage-based scaling available&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Extremely developer-friendly&lt;/li&gt;
&lt;li&gt;Great documentation&lt;/li&gt;
&lt;li&gt;Strong API ecosystem&lt;/li&gt;
&lt;li&gt;Fast implementation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Less focused on advanced RAG&lt;/li&gt;
&lt;li&gt;Enterprise AI features more limited than some competitors&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Nanonets
&lt;/h2&gt;

&lt;p&gt;Nanonets sits somewhere between OCR platform, AI workflow engine, and automation suite.&lt;/p&gt;

&lt;p&gt;Instead of focusing only on extraction, they focus heavily on business automation.&lt;/p&gt;

&lt;p&gt;This makes it attractive for companies that want OCR, approvals, integrations, AI extraction, and workflows together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best For&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Business automation&lt;/li&gt;
&lt;li&gt;Finance operations&lt;/li&gt;
&lt;li&gt;Invoice processing&lt;/li&gt;
&lt;li&gt;AI document workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key Features&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI OCR&lt;/li&gt;
&lt;li&gt;Workflow automation&lt;/li&gt;
&lt;li&gt;Table extraction&lt;/li&gt;
&lt;li&gt;ERP integrations&lt;/li&gt;
&lt;li&gt;Email ingestion&lt;/li&gt;
&lt;li&gt;Approval systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free credits available&lt;/li&gt;
&lt;li&gt;Pay-as-you-go model&lt;/li&gt;
&lt;li&gt;Enterprise plans available&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Strong automation capabilities&lt;/li&gt;
&lt;li&gt;Enterprise-friendly&lt;/li&gt;
&lt;li&gt;Powerful extraction workflows&lt;/li&gt;
&lt;li&gt;Good UI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Less developer-focused&lt;/li&gt;
&lt;li&gt;Can become expensive with volume&lt;/li&gt;
&lt;li&gt;More business-oriented than technical&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Veryfi
&lt;/h2&gt;

&lt;p&gt;Veryfi is heavily specialized in receipts, invoices, bookkeeping, and financial OCR.&lt;/p&gt;

&lt;p&gt;And honestly, that focus is a strength.&lt;/p&gt;

&lt;p&gt;Instead of trying to solve every OCR problem, they dominate a very specific niche extremely well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best For&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fintech&lt;/li&gt;
&lt;li&gt;Expense management&lt;/li&gt;
&lt;li&gt;Accounting automation&lt;/li&gt;
&lt;li&gt;Receipt scanning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key Features&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Receipt OCR&lt;/li&gt;
&lt;li&gt;Invoice extraction&lt;/li&gt;
&lt;li&gt;Expense categorization&lt;/li&gt;
&lt;li&gt;Fraud detection&lt;/li&gt;
&lt;li&gt;Mobile OCR&lt;/li&gt;
&lt;li&gt;Financial automation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API-based pricing&lt;/li&gt;
&lt;li&gt;Enterprise-focused plans&lt;/li&gt;
&lt;li&gt;Free trial available&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Very accurate for receipts/invoices&lt;/li&gt;
&lt;li&gt;Strong financial workflows&lt;/li&gt;
&lt;li&gt;Good mobile support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Narrower use cases&lt;/li&gt;
&lt;li&gt;Less useful for general-purpose document parsing&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. Docparser
&lt;/h2&gt;

&lt;p&gt;Docparser is one of those tools you understand in 30 seconds.&lt;/p&gt;

&lt;p&gt;Upload a PDF. Extract structured data automatically. Connect it to Zapier, Make, or n8n. And remove hours of manual work.&lt;/p&gt;

&lt;p&gt;It doesn't try to be an "AI operating system." And honestly, that's part of the appeal.&lt;/p&gt;

&lt;p&gt;It's extremely focused on solving one problem well: extracting structured data from documents reliably.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best For&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Business automation&lt;/li&gt;
&lt;li&gt;Invoice extraction&lt;/li&gt;
&lt;li&gt;PDF workflows&lt;/li&gt;
&lt;li&gt;No-code automation&lt;/li&gt;
&lt;li&gt;Operations teams&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key Features&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OCR + PDF parsing&lt;/li&gt;
&lt;li&gt;Table extraction&lt;/li&gt;
&lt;li&gt;Template-based parsing&lt;/li&gt;
&lt;li&gt;Zapier integrations&lt;/li&gt;
&lt;li&gt;Email parsing&lt;/li&gt;
&lt;li&gt;API access&lt;/li&gt;
&lt;li&gt;Export to Excel/CSV/JSON&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Starter plan around $39/month&lt;/li&gt;
&lt;li&gt;Professional plans available&lt;/li&gt;
&lt;li&gt;Free trial included&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Very easy to use&lt;/li&gt;
&lt;li&gt;Great for automations&lt;/li&gt;
&lt;li&gt;Fast setup&lt;/li&gt;
&lt;li&gt;Strong integrations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Less AI-native than LlamaParse&lt;/li&gt;
&lt;li&gt;Complex documents may require setup&lt;/li&gt;
&lt;li&gt;More template-driven&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;th&gt;AI-Native&lt;/th&gt;
&lt;th&gt;Pricing Model&lt;/th&gt;
&lt;th&gt;Developer-Friendly&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LlamaParse&lt;/td&gt;
&lt;td&gt;RAG / LLM pipelines&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Credits&lt;/td&gt;
&lt;td&gt;✅ High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mindee&lt;/td&gt;
&lt;td&gt;Invoice / receipt OCR&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;Per page&lt;/td&gt;
&lt;td&gt;✅ Very High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nanonets&lt;/td&gt;
&lt;td&gt;Business automation&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;Pay-as-you-go&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Veryfi&lt;/td&gt;
&lt;td&gt;Fintech / expenses&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;API-based&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docparser&lt;/td&gt;
&lt;td&gt;No-code automation&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;Monthly plan&lt;/td&gt;
&lt;td&gt;✅ High&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;The OCR market is no longer just about extracting text.&lt;/p&gt;

&lt;p&gt;The real opportunity now is building systems that &lt;strong&gt;understand&lt;/strong&gt; documents.&lt;/p&gt;

&lt;p&gt;And the companies that solve this layer well will become critical infrastructure for AI agents, automation, RAG systems, fintech, and enterprise AI workflows.&lt;/p&gt;




&lt;h2&gt;
  
  
  FAQs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is the best OCR API for developers?&lt;/strong&gt;&lt;br&gt;
Mindee is probably the best balance between ease of use, pricing, documentation, and developer experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which OCR tool is best for RAG systems?&lt;/strong&gt;&lt;br&gt;
LlamaParse and Unstructured are currently among the strongest options for AI-native document pipelines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which OCR API is best for invoices and receipts?&lt;/strong&gt;&lt;br&gt;
Veryfi, Mindee, and Nanonets are excellent for financial documents and expense automation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are OCR APIs expensive?&lt;/strong&gt;&lt;br&gt;
Most platforms now offer free tiers, pay-as-you-go pricing, or credit systems. Costs mainly depend on document volume and complexity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can OCR APIs work with Python?&lt;/strong&gt;&lt;br&gt;
Yes. All the platforms mentioned here provide APIs and Python integrations.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Looking for technical content for your company? I can help — &lt;a href="https://www.linkedin.com/in/kevin-meneses-gonzalez/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; · &lt;a href="mailto:kevinmenesesgonzalez@gmail.com"&gt;kevinmenesesgonzalez@gmail.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>automation</category>
      <category>tooling</category>
    </item>
    <item>
      <title>You're Probably Calculating Your Returns Wrong: The Math Behind True Portfolio Performance</title>
      <dc:creator>Kevin Meneses González</dc:creator>
      <pubDate>Thu, 21 May 2026 12:27:44 +0000</pubDate>
      <link>https://dev.to/kevin_menesesgonzlez/youre-probably-calculating-your-returns-wrong-the-math-behind-true-portfolio-performance-1od8</link>
      <guid>https://dev.to/kevin_menesesgonzlez/youre-probably-calculating-your-returns-wrong-the-math-behind-true-portfolio-performance-1od8</guid>
      <description>&lt;p&gt;My broker told me I was up 12% last year.&lt;/p&gt;

&lt;p&gt;The real number, once I accounted for currency conversion losses and the timing of my capital additions, was closer to 7%.&lt;/p&gt;

&lt;p&gt;That's not a rounding error. That's a 5-point gap that changes how you evaluate every decision you made that year.&lt;/p&gt;

&lt;p&gt;If you invest across multiple brokers, hold assets in different currencies, or move capital in and out of positions throughout the year, the return number your broker shows you is almost certainly wrong. Not maliciously. Just structurally. Broker dashboards are not built to calculate true portfolio performance. They're built to show you activity on their platform.&lt;/p&gt;

&lt;p&gt;There's a difference.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Broker Return Numbers Are Misleading
&lt;/h2&gt;

&lt;p&gt;Every broker calculates returns differently. And most of them use the simplest possible method: they compare your current value to your starting value and call it a return.&lt;/p&gt;

&lt;p&gt;That works fine if you invested a lump sum on January 1st and never touched it.&lt;/p&gt;

&lt;p&gt;It breaks immediately the moment you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add capital mid-year&lt;/li&gt;
&lt;li&gt;Withdraw funds at any point&lt;/li&gt;
&lt;li&gt;Hold positions in a different currency than your base&lt;/li&gt;
&lt;li&gt;Pay transaction fees, custody fees, or conversion spreads&lt;/li&gt;
&lt;li&gt;Split your portfolio across multiple platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Which is to say: it breaks for almost every real investor.&lt;/p&gt;




&lt;h2&gt;
  
  
  TWR vs MWR: The Two Numbers You Need to Understand
&lt;/h2&gt;

&lt;p&gt;There are two ways to measure portfolio return properly. Most investors have never heard of either.&lt;/p&gt;

&lt;h3&gt;
  
  
  Time-Weighted Return (TWR)
&lt;/h3&gt;

&lt;p&gt;TWR eliminates the effect of external cash flows — deposits and withdrawals — so you can evaluate the performance of your investment strategy independently of when you added or removed money.&lt;/p&gt;

&lt;p&gt;It answers the question: how well did my portfolio perform, regardless of my timing decisions?&lt;/p&gt;

&lt;p&gt;TWR is the standard used by professional fund managers. It's the number that lets you compare your strategy against a benchmark fairly.&lt;/p&gt;

&lt;p&gt;Calculating it manually requires breaking your portfolio into sub-periods every time cash flows in or out, computing the return for each sub-period, and chain-linking them multiplicatively. For a portfolio with monthly contributions across four brokers, that's dozens of calculations per year.&lt;/p&gt;

&lt;h3&gt;
  
  
  Money-Weighted Return (MWR)
&lt;/h3&gt;

&lt;p&gt;MWR — also called IRR at the portfolio level — accounts for the size and timing of your cash flows. It answers a different question: how well did my money actually perform, given when I deployed it?&lt;/p&gt;

&lt;p&gt;If you added a large amount right before a market drop, your MWR will be lower than your TWR. If you happened to invest heavily before a rally, it'll be higher. MWR reflects the reality of your specific decisions.&lt;/p&gt;

&lt;p&gt;Neither metric is "better." They answer different questions. The problem is that most brokers show you neither — they show you a simplified gain/loss percentage that conflates both and accounts for neither properly.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Currency Problem Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;If you hold USD-denominated assets and your base currency is EUR, your broker's return figure is almost certainly calculated in USD.&lt;/p&gt;

&lt;p&gt;That matters more than most investors realize.&lt;/p&gt;

&lt;p&gt;A position up 15% in USD terms might be up only 7% in EUR terms if the dollar weakened during your holding period. Or it might show 20% if the dollar strengthened. The currency movement is not a minor adjustment — in volatile years it can be larger than the underlying asset's return.&lt;/p&gt;

&lt;p&gt;My own experience: a 5–10% gap between what the broker showed and what I actually had after converting back to euros. Not because the broker was wrong in their own terms. Because their terms weren't my terms.&lt;/p&gt;

&lt;p&gt;A true return calculation has to be done in your base currency. Every position, every dividend, every fee — converted at the rate applicable on the date of the transaction.&lt;/p&gt;

&lt;p&gt;No broker does this automatically across multiple platforms. No spreadsheet maintains this accurately over time without constant manual intervention.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Hidden Costs That Erode Real Returns
&lt;/h2&gt;

&lt;p&gt;Currency conversion fees and spreads are the most underestimated drag on retail investor returns.&lt;/p&gt;

&lt;p&gt;On Degiro, currency conversion carries a fee that applies every time you buy or sell a non-EUR asset. It's small per transaction. Across a year of activity, it compounds.&lt;/p&gt;

&lt;p&gt;Neither of these shows up in the return figure your broker displays. They're already baked into your prices, invisible unless you calculate them explicitly.&lt;/p&gt;

&lt;p&gt;Add custody fees, inactivity fees, and any platform-specific charges, and the gap between headline return and true return widens further.&lt;/p&gt;

&lt;p&gt;The math isn't complicated. But doing it manually, across four platforms, in multiple currencies, for every transaction in a year — that's the problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  What True Return Calculation Looks Like by Hand
&lt;/h2&gt;

&lt;p&gt;Let's make the complexity concrete. Suppose you want to calculate your MWR for the year across your portfolio.&lt;/p&gt;

&lt;p&gt;You need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The starting value of your portfolio on January 1st&lt;/li&gt;
&lt;li&gt;Every cash inflow (deposits, dividends received) with exact dates&lt;/li&gt;
&lt;li&gt;Every cash outflow (withdrawals, fees paid) with exact dates&lt;/li&gt;
&lt;li&gt;The ending value on December 31st&lt;/li&gt;
&lt;li&gt;All of the above converted to your base currency at the exchange rate on each transaction date&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then you solve for the rate &lt;code&gt;r&lt;/code&gt; in this equation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ending Value = Starting Value × (1+r)^t 
               + CF₁ × (1+r)^(t-t₁) 
               + CF₂ × (1+r)^(t-t₂) 
               + ... CFₙ × (1+r)^(t-tₙ)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Where each &lt;code&gt;CF&lt;/code&gt; is a cash flow and each &lt;code&gt;t&lt;/code&gt; is the fraction of the year remaining at the time of that cash flow.&lt;/p&gt;

&lt;p&gt;This requires numerical iteration to solve — there's no closed-form algebraic answer. In Excel it's the &lt;code&gt;XIRR&lt;/code&gt; function. By hand it's trial and error.&lt;/p&gt;

&lt;p&gt;Now multiply that by four brokers, twelve months of dividends, currency conversions at different rates on different dates, and exchange-specific fees.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F09lu0bulshga5cjp9fnm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F09lu0bulshga5cjp9fnm.png" alt=" " width="720" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is not a calculation problem you solve with a better spreadsheet. It's an integration problem — you need software that connects to your accounts, ingests transaction data automatically, applies the correct exchange rates, and computes the result continuously.&lt;/p&gt;


&lt;h2&gt;
  
  
  What Snowball Shows You Instead
&lt;/h2&gt;

&lt;p&gt;Snowball Analytics does this automatically.&lt;/p&gt;

&lt;p&gt;Every position across your connected brokers is tracked in your base currency. Returns are calculated using proper methodology — accounting for cash flow timing, currency movements, and fees. The number you see is your actual return, not your broker's simplified approximation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff4zy5uucfaf2snqris9b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff4zy5uucfaf2snqris9b.png" alt=" " width="720" height="230"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The difference isn't cosmetic. For an investor with a multi-currency, multi-broker portfolio, the gap between a broker's headline number and a properly calculated return can be 5–10 percentage points. That's the difference between thinking your strategy is working and knowing whether it actually is.&lt;/p&gt;


&lt;div class="crayons-card c-embed"&gt;

  &lt;br&gt;
👉 &lt;strong&gt;&lt;a href="https://snowball-analytics.com" rel="noopener noreferrer"&gt;See your true portfolio return with Snowball Analytics&lt;/a&gt;&lt;/strong&gt; — Multi-broker, multi-currency portfolio tracking with proper TWR/MWR methodology.&lt;br&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Why This Matters for Every Decision You Make
&lt;/h2&gt;

&lt;p&gt;Return calculation isn't academic. It drives every allocation decision you make.&lt;/p&gt;

&lt;p&gt;If you think a strategy is returning 12% when it's actually returning 7%, you'll keep deploying capital into it. You'll benchmark it against alternatives incorrectly. You'll attribute performance to skill that was actually currency tailwind — or miss underperformance that was hidden by currency movement.&lt;/p&gt;

&lt;p&gt;Conversely, a strategy that looks like 6% in your broker app might actually be 11% once you account for dividend reinvestment timing and a favorable exchange rate. That position deserves more capital, not a review.&lt;/p&gt;

&lt;p&gt;The numbers your broker shows you are not wrong. They're just incomplete. And in investing, incomplete information and wrong information produce the same outcome.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Benchmark Question
&lt;/h2&gt;

&lt;p&gt;Once you have a true return number, the next question is: compared to what?&lt;/p&gt;

&lt;p&gt;A 9% return sounds good. Against the S&amp;amp;P 500 returning 15% in the same period, it's underperformance. Against a bond portfolio returning 4%, it's strong outperformance. Against a passive ETF with lower risk and zero time cost, it might not justify the complexity.&lt;/p&gt;

&lt;p&gt;You can't answer this question with a broker's simplified return figure. You need TWR — the methodology that strips out your cash flow timing and gives you a clean strategy-level number comparable to any benchmark.&lt;/p&gt;

&lt;p&gt;That's the number that tells you whether your active decisions are adding value, or whether you'd be better off in a simple index fund and spending those 10 hours a month on something else.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Looking for technical content for your company? I can help — &lt;a href="https://www.linkedin.com/in/kevin-meneses-gonzalez/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; · &lt;a href="mailto:kevinmenesesgonzalez@gmail.com"&gt;kevinmenesesgonzalez@gmail.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>stocks</category>
      <category>investing</category>
      <category>data</category>
      <category>finance</category>
    </item>
  </channel>
</rss>
