<?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: tellmefrankie</title>
    <description>The latest articles on DEV Community by tellmefrankie (@tellmefrankie).</description>
    <link>https://dev.to/tellmefrankie</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3928076%2F4984dff7-1159-4247-91c3-a0170f12e754.png</url>
      <title>DEV Community: tellmefrankie</title>
      <link>https://dev.to/tellmefrankie</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tellmefrankie"/>
    <language>en</language>
    <item>
      <title>When the Market Whispers Through Sector ETFs: The XLI P/C 5.32 Signal</title>
      <dc:creator>tellmefrankie</dc:creator>
      <pubDate>Sun, 31 May 2026 16:00:01 +0000</pubDate>
      <link>https://dev.to/tellmefrankie/when-the-market-whispers-through-sector-etfs-the-xli-pc-532-signal-4073</link>
      <guid>https://dev.to/tellmefrankie/when-the-market-whispers-through-sector-etfs-the-xli-pc-532-signal-4073</guid>
      <description>&lt;h1&gt;
  
  
  When the Market Whispers Through Sector ETFs: The XLI P/C 5.32 Signal
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Published on dev.to | Tags: #algotrading #options #claudecode #investing&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Most retail traders watch individual stocks. They'll track the put/call ratio on TSLA or NVDA, look for unusual options activity on a specific ticker, and build their thesis around single-name flow.&lt;/p&gt;

&lt;p&gt;What they often miss is the sector level.&lt;/p&gt;

&lt;p&gt;Last week my options flow scanner — one of the Claude Code skills I run every morning — returned a reading I hadn't seen before: &lt;strong&gt;XLI put/call ratio of 5.32&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That number stopped me.&lt;/p&gt;




&lt;h2&gt;
  
  
  What XLI is, and why 5.32 matters
&lt;/h2&gt;

&lt;p&gt;XLI is the Industrial Select Sector SPDR ETF. It tracks industrials: aerospace, defense, machinery, transportation, construction. The names you'd expect — Caterpillar, Honeywell, RTX, GE Aerospace.&lt;/p&gt;

&lt;p&gt;A normal put/call ratio sits somewhere between 0.5 and 1.2 for most ETFs. Anything below 0.5 is aggressively bullish (heavy call buying). Anything above 1.5 is cautious. Above 2.0 is a meaningful signal.&lt;/p&gt;

&lt;p&gt;5.32 is not a retail read.&lt;/p&gt;

&lt;p&gt;At that level, you're looking at institutional positioning — funds buying downside protection on industrial exposure at a scale that moves the aggregate ratio by more than 4x the baseline. This isn't someone hedging a small position. This is deliberate, significant protection buying on a broad basket of cyclical names.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the scanner output looked like
&lt;/h2&gt;

&lt;p&gt;For context, here's what the morning scan showed across my watchlist that day:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Options Flow Summary — 2026-05-13

SPY  P/C: 0.44   [EXTREME BULLISH]
QQQ  P/C: 0.54   [BULLISH]
TEM  P/C: 0.50   [BULLISH]
RXRX P/C: 0.38   [EXTREME BULLISH]
IREN P/C: 0.83   [NEUTRAL]
XLI  P/C: 5.32   [OUTLIER — INSTITUTIONAL HEDGE SIGNAL]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The individual names are telling a bullish story. SPY at 0.44 is one of the more extreme readings I've tracked — the options market on the broad index is pricing in continued upside.&lt;/p&gt;

&lt;p&gt;And yet there's a single data point that cuts against the grain: someone is paying significant premium for downside protection on industrials specifically.&lt;/p&gt;




&lt;h2&gt;
  
  
  Three interpretations
&lt;/h2&gt;

&lt;p&gt;When you see a reading like this, there are a few ways to think about it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Macro hedge against cyclical slowdown&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Industrials are economically sensitive. They underperform when growth expectations contract. A fund with large equity exposure across the market might be buying XLI puts not because they're bearish on industrials specifically, but because it's an efficient way to hedge broader slowdown risk. Cyclical ETFs move with GDP expectations; cheap sector puts can protect a broader book.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Specific catalyst hedge&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Something is coming that specifically affects the industrial sector — a regulatory announcement, a tariff decision, a defense budget revision. The buyer knows something about timing that makes sector-specific protection worth paying for, even when the broad market is signaling bullish.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Volatility play&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Put/call ratio can be distorted by unusual options strategies — ratio spreads, collars, complex institutional hedges — that inflate put volume without being straightforwardly bearish. Less likely at this magnitude, but worth considering.&lt;/p&gt;

&lt;p&gt;I don't know which of these is true. That's not the point.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I actually did with the information
&lt;/h2&gt;

&lt;p&gt;I didn't change any positions based on this signal alone. One data point isn't a thesis.&lt;/p&gt;

&lt;p&gt;What I did:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flagged any industrial-adjacent names in my portfolio for closer attention&lt;/li&gt;
&lt;li&gt;Noted the reading in my trade journal with a "watch" tag&lt;/li&gt;
&lt;li&gt;Set a trigger: if XLI P/C stays above 3.0 for three consecutive sessions, review sizing on cyclical exposure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The value of the signal isn't that it tells you what to do. It's that it tells you what to watch. It interrupts complacency.&lt;/p&gt;

&lt;p&gt;Before I built this scanner, I would have missed it entirely. Not because I wasn't paying attention — but because I was focused on my individual names and never would have thought to check sector ETF flow as part of my morning routine.&lt;/p&gt;




&lt;h2&gt;
  
  
  How the scanner works
&lt;/h2&gt;

&lt;p&gt;The skill is one of six I run daily. Here's the core logic in plain terms:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pull options chain data for each ticker in my watchlist&lt;/li&gt;
&lt;li&gt;Sum total put volume and call volume across all expiries&lt;/li&gt;
&lt;li&gt;Calculate the ratio, classify it against threshold bands&lt;/li&gt;
&lt;li&gt;Flag anything outside two standard deviations of that ticker's historical average as an outlier&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The outlier detection is the part that caught XLI. It's not just "is the ratio high" — it's "is this ratio unusual relative to what this specific instrument normally looks like." XLI's baseline P/C is much lower than 5.32. That's what made it worth flagging.&lt;/p&gt;

&lt;p&gt;The skill runs in Claude Code as a custom command. The underlying data fetch is a Python script. The output hits my Telegram before market open.&lt;/p&gt;




&lt;h2&gt;
  
  
  The broader point
&lt;/h2&gt;

&lt;p&gt;Options flow at the sector level tells a different story than single-name flow. Institutions hedge through ETFs, not always through individual names, because the liquidity and cost efficiency is better. If you're only watching stock-specific options activity, you're reading half the conversation.&lt;/p&gt;

&lt;p&gt;The XLI read might amount to nothing. The puts could expire worthless, the industrials sector could rip higher, and whoever bought that protection will have paid for peace of mind they didn't need.&lt;/p&gt;

&lt;p&gt;But I'd rather know the signal exists and decide to ignore it than never see it in the first place.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The scanner is open source on GitHub:&lt;/strong&gt; &lt;a href="https://github.com/tellmefrankie/ai-investment-skills" rel="noopener noreferrer"&gt;https://github.com/tellmefrankie/ai-investment-skills&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The full suite including Telegram alerts and the complete watchlist configuration is available as a bundle: &lt;a href="https://jaehyunpark.gumroad.com/l/tcyahy" rel="noopener noreferrer"&gt;https://jaehyunpark.gumroad.com/l/tcyahy&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Not financial advice. Personal tooling and research. Do your own due diligence.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>buildinpublic</category>
      <category>webdev</category>
    </item>
    <item>
      <title>When the Market Whispers Through Sector ETFs: The XLI P/C 5.32 Signal</title>
      <dc:creator>tellmefrankie</dc:creator>
      <pubDate>Sun, 24 May 2026 16:00:00 +0000</pubDate>
      <link>https://dev.to/tellmefrankie/when-the-market-whispers-through-sector-etfs-the-xli-pc-532-signal-1m88</link>
      <guid>https://dev.to/tellmefrankie/when-the-market-whispers-through-sector-etfs-the-xli-pc-532-signal-1m88</guid>
      <description>&lt;h1&gt;
  
  
  When the Market Whispers Through Sector ETFs: The XLI P/C 5.32 Signal
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Published on dev.to | Tags: #algotrading #options #claudecode #investing&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Most retail traders watch individual stocks. They'll track the put/call ratio on TSLA or NVDA, look for unusual options activity on a specific ticker, and build their thesis around single-name flow.&lt;/p&gt;

&lt;p&gt;What they often miss is the sector level.&lt;/p&gt;

&lt;p&gt;Last week my options flow scanner — one of the Claude Code skills I run every morning — returned a reading I hadn't seen before: &lt;strong&gt;XLI put/call ratio of 5.32&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That number stopped me.&lt;/p&gt;




&lt;h2&gt;
  
  
  What XLI is, and why 5.32 matters
&lt;/h2&gt;

&lt;p&gt;XLI is the Industrial Select Sector SPDR ETF. It tracks industrials: aerospace, defense, machinery, transportation, construction. The names you'd expect — Caterpillar, Honeywell, RTX, GE Aerospace.&lt;/p&gt;

&lt;p&gt;A normal put/call ratio sits somewhere between 0.5 and 1.2 for most ETFs. Anything below 0.5 is aggressively bullish (heavy call buying). Anything above 1.5 is cautious. Above 2.0 is a meaningful signal.&lt;/p&gt;

&lt;p&gt;5.32 is not a retail read.&lt;/p&gt;

&lt;p&gt;At that level, you're looking at institutional positioning — funds buying downside protection on industrial exposure at a scale that moves the aggregate ratio by more than 4x the baseline. This isn't someone hedging a small position. This is deliberate, significant protection buying on a broad basket of cyclical names.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the scanner output looked like
&lt;/h2&gt;

&lt;p&gt;For context, here's what the morning scan showed across my watchlist that day:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Options Flow Summary — 2026-05-13

SPY  P/C: 0.44   [EXTREME BULLISH]
QQQ  P/C: 0.54   [BULLISH]
TEM  P/C: 0.50   [BULLISH]
RXRX P/C: 0.38   [EXTREME BULLISH]
IREN P/C: 0.83   [NEUTRAL]
XLI  P/C: 5.32   [OUTLIER — INSTITUTIONAL HEDGE SIGNAL]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The individual names are telling a bullish story. SPY at 0.44 is one of the more extreme readings I've tracked — the options market on the broad index is pricing in continued upside.&lt;/p&gt;

&lt;p&gt;And yet there's a single data point that cuts against the grain: someone is paying significant premium for downside protection on industrials specifically.&lt;/p&gt;




&lt;h2&gt;
  
  
  Three interpretations
&lt;/h2&gt;

&lt;p&gt;When you see a reading like this, there are a few ways to think about it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Macro hedge against cyclical slowdown&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Industrials are economically sensitive. They underperform when growth expectations contract. A fund with large equity exposure across the market might be buying XLI puts not because they're bearish on industrials specifically, but because it's an efficient way to hedge broader slowdown risk. Cyclical ETFs move with GDP expectations; cheap sector puts can protect a broader book.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Specific catalyst hedge&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Something is coming that specifically affects the industrial sector — a regulatory announcement, a tariff decision, a defense budget revision. The buyer knows something about timing that makes sector-specific protection worth paying for, even when the broad market is signaling bullish.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Volatility play&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Put/call ratio can be distorted by unusual options strategies — ratio spreads, collars, complex institutional hedges — that inflate put volume without being straightforwardly bearish. Less likely at this magnitude, but worth considering.&lt;/p&gt;

&lt;p&gt;I don't know which of these is true. That's not the point.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I actually did with the information
&lt;/h2&gt;

&lt;p&gt;I didn't change any positions based on this signal alone. One data point isn't a thesis.&lt;/p&gt;

&lt;p&gt;What I did:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flagged any industrial-adjacent names in my portfolio for closer attention&lt;/li&gt;
&lt;li&gt;Noted the reading in my trade journal with a "watch" tag&lt;/li&gt;
&lt;li&gt;Set a trigger: if XLI P/C stays above 3.0 for three consecutive sessions, review sizing on cyclical exposure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The value of the signal isn't that it tells you what to do. It's that it tells you what to watch. It interrupts complacency.&lt;/p&gt;

&lt;p&gt;Before I built this scanner, I would have missed it entirely. Not because I wasn't paying attention — but because I was focused on my individual names and never would have thought to check sector ETF flow as part of my morning routine.&lt;/p&gt;




&lt;h2&gt;
  
  
  How the scanner works
&lt;/h2&gt;

&lt;p&gt;The skill is one of six I run daily. Here's the core logic in plain terms:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pull options chain data for each ticker in my watchlist&lt;/li&gt;
&lt;li&gt;Sum total put volume and call volume across all expiries&lt;/li&gt;
&lt;li&gt;Calculate the ratio, classify it against threshold bands&lt;/li&gt;
&lt;li&gt;Flag anything outside two standard deviations of that ticker's historical average as an outlier&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The outlier detection is the part that caught XLI. It's not just "is the ratio high" — it's "is this ratio unusual relative to what this specific instrument normally looks like." XLI's baseline P/C is much lower than 5.32. That's what made it worth flagging.&lt;/p&gt;

&lt;p&gt;The skill runs in Claude Code as a custom command. The underlying data fetch is a Python script. The output hits my Telegram before market open.&lt;/p&gt;




&lt;h2&gt;
  
  
  The broader point
&lt;/h2&gt;

&lt;p&gt;Options flow at the sector level tells a different story than single-name flow. Institutions hedge through ETFs, not always through individual names, because the liquidity and cost efficiency is better. If you're only watching stock-specific options activity, you're reading half the conversation.&lt;/p&gt;

&lt;p&gt;The XLI read might amount to nothing. The puts could expire worthless, the industrials sector could rip higher, and whoever bought that protection will have paid for peace of mind they didn't need.&lt;/p&gt;

&lt;p&gt;But I'd rather know the signal exists and decide to ignore it than never see it in the first place.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The scanner is open source on GitHub:&lt;/strong&gt; &lt;a href="https://github.com/tellmefrankie/ai-investment-skills" rel="noopener noreferrer"&gt;https://github.com/tellmefrankie/ai-investment-skills&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The full suite including Telegram alerts and the complete watchlist configuration is available as a bundle: &lt;a href="https://jaehyunpark.gumroad.com/l/tcyahy" rel="noopener noreferrer"&gt;https://jaehyunpark.gumroad.com/l/tcyahy&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Not financial advice. Personal tooling and research. Do your own due diligence.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>buildinpublic</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How I run a 9-wave AI investment briefing every morning in 90 seconds (full architecture)</title>
      <dc:creator>tellmefrankie</dc:creator>
      <pubDate>Wed, 13 May 2026 19:52:08 +0000</pubDate>
      <link>https://dev.to/tellmefrankie/how-i-run-a-9-wave-ai-investment-briefing-every-morning-in-90-seconds-full-architecture-1434</link>
      <guid>https://dev.to/tellmefrankie/how-i-run-a-9-wave-ai-investment-briefing-every-morning-in-90-seconds-full-architecture-1434</guid>
      <description>&lt;h2&gt;
  
  
  The problem with morning research
&lt;/h2&gt;

&lt;p&gt;Before market open, I used to spend 45–60 minutes reading news, checking charts, reviewing positions. Most of it was noise. I was making decisions based on whatever I happened to read last, not a systematic view.&lt;/p&gt;

&lt;p&gt;Now I run a 9-wave Claude Code pipeline that takes 90 seconds and covers everything.&lt;/p&gt;

&lt;p&gt;Here's the full architecture.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 9-wave pipeline
&lt;/h2&gt;

&lt;p&gt;Each "wave" is a separate Claude API call with a specific role. Running them sequentially means each wave can reference the previous ones.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wave 1: Macro Context
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inputs: S&amp;amp;P 500, Nasdaq, VIX, 10Y yield, DXY, oil, recent Fed statements
Output: Macro regime classification (risk-on / risk-off / transitional)
        Key levels to watch today
        Probability-weighted scenario (bull/base/bear)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Wave 2: Sector Rotation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inputs: All 11 S&amp;amp;P sectors (XLK, XLF, XLE, XLV, XLI, ...)
Output: Leaders vs laggards this week
        Rotation signal (defensive → growth or vice versa)
        Sectors with anomalous volume
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Wave 3: Technical Scanner
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;For each holding:
- RSI(14): overbought/oversold flag
- Price vs SMA20, SMA50, SMA200
- MACD crossover status
- Key support/resistance levels
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Wave 4: News Sweep
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;For each ticker in portfolio:
- 48h earnings / guidance / upgrades / downgrades
- Insider activity (buy/sell, size)
- Short interest changes
- Options flow anomalies (from Wave 4b — see below)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Wave 4b: Options Flow (sub-wave)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// This runs as part of Wave 4 for tickers with options activity&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;realPCRatio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;calculateRealPC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;stockPrice&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;lotteryPct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;calls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isLottery&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;calls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// Only surface if real P/C ratio shows conviction&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;realPCRatio&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;flagAnomaly&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;realPCRatio&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The real/lottery separation (explained in &lt;a href="https://dev.to/tellmefrankie/i-built-a-real-time-options-flow-scanner-with-claude-code-and-it-caught-a-signal-i-almost-missed-3lm6"&gt;this post&lt;/a&gt;) is critical here.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wave 5: Opportunity Finder
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scan watchlist (not current holdings) for:
- RSI &amp;lt; 35 with volume spike (potential reversal)
- Earnings within 5 days (catalyst)
- Sector alignment with Wave 2 rotation signal
Output: Ranked list of new swing trade candidates
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Wave 6: Critic Review
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Adversarial role. Rules:
- Challenge every bullish signal from Waves 1-5
- Require 2+ source confirmation for any claim
- Find the counter-evidence first
- What would make this thesis wrong?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the most important wave. Without it, the pipeline just confirms whatever I already believe.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wave 7: Portfolio Simulation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;For current holdings:
- Bull scenario (prob: X%): portfolio value = $Y
- Base scenario (prob: X%): portfolio value = $Y  
- Bear scenario (prob: X%): portfolio value = $Y
Key risk: position concentration, sector overlap
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Wave 8: Deep Connections
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cross-asset analysis:
- What is DXY doing to commodity plays?
- Is yield curve signaling growth/recession risk?
- Hidden correlations in current portfolio
- What smart money rotation implies for individual names
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Wave 9: Meta-Critic + Action Plan
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Final synthesis:
1. One thing I must act on today
2. One thing I should watch but not trade yet
3. One thing I was wrong about yesterday
4. Positions to reduce / add / hold with conviction levels
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The anti-narrative harness
&lt;/h2&gt;

&lt;p&gt;The hardest engineering problem was preventing the system from telling me what I wanted to hear.&lt;/p&gt;

&lt;p&gt;Every wave runs under these rules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Numbers required — "P/C 0.55, real call 28%" not "bullish sentiment"
2. Cross-verification — 2+ sources for any price or claim
3. Counter-evidence first — find the bear case before the bull
4. No sell on emotion — check if at bottom, verify with Wave 6 critic before any sell
5. No narrative repetition — each run uses fresh analysis, not yesterday's story
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rule 4 has saved me from panic-selling bottoms twice.&lt;/p&gt;




&lt;h2&gt;
  
  
  Implementation: TypeScript + Claude SDK
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;runBriefingWave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;wave&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;previousWaves&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&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;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;previousWaves&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`=== Wave &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&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="s2"&gt; Output ===\n&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="dl"&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;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;claude&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&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="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;claude-opus-4-5&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2048&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
      &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;previousWaves&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;\n\n=== Wave &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;wave&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; Task ===\n&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
        &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;prompt&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="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&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="kd"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&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="nx"&gt;text&lt;/span&gt; &lt;span class="p"&gt;:&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Total cost per run: ~$0.08–0.12 with Claude Opus (9 waves × ~1500 tokens avg).&lt;br&gt;
At daily runs: ~$2.50/month.&lt;/p&gt;


&lt;h2&gt;
  
  
  Output format
&lt;/h2&gt;

&lt;p&gt;The final briefing goes to Telegram at 06:00 KST:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;📊 MORNING BRIEFING — 2026-05-14

MACRO: Risk-off. VIX 18.4 (+12%). 10Y at 4.52%.
REGIME: Transitional. Watch CPI Thursday.

TOP SIGNAL: XLI P/C 5.32 (outlier). Institutional 
hedge on industrials. Not actionable yet — needs 
sector confirmation.

PORTFOLIO TODAY:
✓ AAPL: Hold. SMA50 support holding.
⚠ NVDA: RSI 72. Trim 20% if opens above $145.
✗ TEM: Stop-loss at $47.44 — DO NOT lower.

NEW OPPORTUNITIES: CELH (RSI 31, earnings May 18)

CRITIC NOTE: Bull thesis for AAPL depends on 
China reopening. That narrative is 60 days stale.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every field is a number or an action. No vibes.&lt;/p&gt;




&lt;h2&gt;
  
  
  The skill bundle
&lt;/h2&gt;

&lt;p&gt;All 9 waves + the anti-narrative harness + the options flow scanner are packaged in one Claude Code skill bundle:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://jaehyunpark.gumroad.com/l/tcyahy?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;AI Investment Skills — $29 one-time on Gumroad →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Free tier: Waves 1-2 (Macro + Sector). Full bundle: All 9 waves.&lt;/p&gt;

&lt;p&gt;This is production tooling I run every morning. Not a demo.&lt;/p&gt;




&lt;h2&gt;
  
  
  What surprised me
&lt;/h2&gt;

&lt;p&gt;The Wave 6 Critic is the most valuable wave and the one I almost skipped. Without adversarial review, the pipeline just produces confident-sounding analysis that matches whatever the macro environment already implies.&lt;/p&gt;

&lt;p&gt;The meta-critic output "what was I wrong about yesterday" is where the real learning happens. It forces me to track my own errors rather than just moving on.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Running since March 2026. ~60 morning briefings completed. The portfolio is up, but more importantly, the decision process is systematic.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>python</category>
      <category>claudecode</category>
      <category>investing</category>
    </item>
    <item>
      <title>I built a news sentiment engine that delivers market-relevant headlines to Telegram every morning</title>
      <dc:creator>tellmefrankie</dc:creator>
      <pubDate>Wed, 13 May 2026 19:22:59 +0000</pubDate>
      <link>https://dev.to/tellmefrankie/i-built-a-news-sentiment-engine-that-delivers-market-relevant-headlines-to-telegram-every-morning-59ip</link>
      <guid>https://dev.to/tellmefrankie/i-built-a-news-sentiment-engine-that-delivers-market-relevant-headlines-to-telegram-every-morning-59ip</guid>
      <description>&lt;p&gt;Most financial news apps give you everything. Bloomberg, Reuters, CNBC — the feed is constant and mostly noise.&lt;/p&gt;

&lt;p&gt;I wanted one thing: five headlines a day that are actually relevant to what I'm holding, with a sentiment score and a 2-sentence summary. Delivered to Telegram by 6am.&lt;/p&gt;

&lt;p&gt;The Claude Code skill that does this costs about $0.003/day to run.&lt;/p&gt;




&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;Every morning at 05:45 KST, the skill:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pulls from 4 RSS feeds (TechCrunch, The Verge, Hacker News, Bloomberg tech)&lt;/li&gt;
&lt;li&gt;Filters for keywords matching configured tickers and sectors&lt;/li&gt;
&lt;li&gt;Scores each article: positive / negative / neutral + magnitude (1-5)&lt;/li&gt;
&lt;li&gt;Selects the top 5 by combined relevance + sentiment magnitude&lt;/li&gt;
&lt;li&gt;Generates a 2-sentence summary per article&lt;/li&gt;
&lt;li&gt;Delivers to Telegram as a formatted card&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  The Telegram output
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;📰 Morning Briefing — May 14, 2026

━━━━━━━━━━━━━━
&lt;span class="p"&gt;
1.&lt;/span&gt; NVIDIA raises data center guidance ahead of Q2 earnings
   Sentiment: 📈 Positive (4/5)
   NVDA may see gap-up open. Options flow showing call buying yesterday.
   [Reuters]

━━━━━━━━━━━━━━
&lt;span class="p"&gt;
2.&lt;/span&gt; Fed speakers signal July cut timing uncertain
   Sentiment: ⚠️ Neutral (3/5)
   Rate sensitivity elevated in tech positions. Watch IWM/TLT spread.
   [Bloomberg]

...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Five cards. Each with a sentiment score, a 2-sentence interpretation, and the source. No app to open, no feed to scroll.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;This is built as a Node.js pipeline that Claude Code orchestrates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;RSS feeds → Collector → Claude filter/rank → Claude summarize → Telegram
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Collector&lt;/strong&gt;: rss-parser pulls feeds, deduplicates by URL, stores to SQLite.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Filter/rank&lt;/strong&gt;: Claude API call with the full list of articles. Prompt asks for the top 5 by relevance to configured sectors and tickers, ranked by impact.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Summarize&lt;/strong&gt;: Second Claude API call, one per selected article. Generates the 2-sentence summary and sentiment score.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Telegram&lt;/strong&gt;: Formatted message via bot API.&lt;/p&gt;

&lt;p&gt;Total Claude API cost per run: ~$0.003 at Haiku pricing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Configuration
&lt;/h2&gt;

&lt;p&gt;Natural language in the SKILL.md:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Track these sectors: AI infrastructure, semiconductors, rates/macro
Track these tickers: NVDA, AAPL, IWM, TLT
Deliver at 05:45 KST via Telegram
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude parses this and passes it as context to the filter prompt. No JSON config file.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why RSS instead of a news API
&lt;/h2&gt;

&lt;p&gt;Polygon.io, Bloomberg API, and similar services cost $50-500/month for news access. Yahoo Finance's news endpoint is unreliable and rate-limited.&lt;/p&gt;

&lt;p&gt;RSS is free, predictable, and the major publications maintain their feeds. The signal-to-noise ratio is lower than a paid API, but the filter step handles it — Claude selects based on relevance, not just keywords.&lt;/p&gt;




&lt;h2&gt;
  
  
  Latency and reliability
&lt;/h2&gt;

&lt;p&gt;The pipeline runs in under 60 seconds end-to-end on a $6/month VPS. If it fails (RSS timeout, Telegram API error), it retries once and logs the failure.&lt;/p&gt;

&lt;p&gt;I've been running this for 3 weeks. Three failures — two RSS timeouts during holidays, one Telegram rate limit during a market volatility spike.&lt;/p&gt;




&lt;h2&gt;
  
  
  Installation (free)
&lt;/h2&gt;

&lt;p&gt;The News Sentiment Engine is in the free tier:&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/tellmefrankie/ai-investment-skills?utm_source&lt;span class="o"&gt;=&lt;/span&gt;devto&amp;amp;utm_medium&lt;span class="o"&gt;=&lt;/span&gt;article
&lt;span class="nb"&gt;cp &lt;/span&gt;news-sentiment-engine/SKILL.md ~/.claude/skills/news-sentiment-engine.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You need a Telegram bot token (free from &lt;a class="mentioned-user" href="https://dev.to/botfather"&gt;@botfather&lt;/a&gt;) and an Anthropic API key.&lt;/p&gt;

&lt;p&gt;Then in Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;/news-sentiment-engine
Track: AI, semiconductors, NVDA, AAPL
Deliver to Telegram at 6am
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The full morning briefing (9-wave analysis including options flow, technicals, and portfolio stress test) is in the &lt;a href="https://jaehyunpark.gumroad.com/l/tcyahy?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;Pro Bundle ($29)&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Repo: &lt;a href="https://github.com/tellmefrankie/ai-investment-skills?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;github.com/tellmefrankie/ai-investment-skills&lt;/a&gt; — MIT licensed.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Not financial advice.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>typescript</category>
      <category>node</category>
      <category>investing</category>
    </item>
    <item>
      <title>Expected value calculation for stock positions — a Claude Code skill that does the math</title>
      <dc:creator>tellmefrankie</dc:creator>
      <pubDate>Wed, 13 May 2026 19:17:40 +0000</pubDate>
      <link>https://dev.to/tellmefrankie/expected-value-calculation-for-stock-positions-a-claude-code-skill-that-does-the-math-1kk4</link>
      <guid>https://dev.to/tellmefrankie/expected-value-calculation-for-stock-positions-a-claude-code-skill-that-does-the-math-1kk4</guid>
      <description>&lt;p&gt;Before entering any position, I run three scenarios: bull case, base case, bear case. Multiply each by its probability. Sum the results. If the EV is negative, don't enter.&lt;/p&gt;

&lt;p&gt;This sounds simple. In practice, when you're looking at a live chart with a position about to move, you skip it.&lt;/p&gt;

&lt;p&gt;I built a Claude Code skill to make the calculation automatic and honest.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the EV Calculator does
&lt;/h2&gt;

&lt;p&gt;You give it a position description in plain language. It generates three scenarios with probability-weighted outcomes and returns a go/no-go with the expected value calculation shown.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Input:&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;NVDA current price $120
Bull case: AI infrastructure spend accelerates, price $145, probability 35%
Base case: Consolidation, price $118, probability 45%
Bear case: Macro deterioration, positions rotate out, price $95, probability 20%
Entry: $120, position size: 5% of portfolio
&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;Expected Value Analysis — NVDA

Bull:  $145 × 0.35 = $50.75
Base:  $118 × 0.45 = $53.10
Bear:  $95  × 0.20 = $19.00

EV:    $122.85  vs entry $120.00
EV%:   +2.4%

Risk-adjusted return: +$2.85/share
Max drawdown (bear case): -$25/share (-20.8%)
Kelly fraction (full): 11.5%  → suggested size: 50% Kelly = 5.7% portfolio

Verdict: Positive EV. Risk/reward skewed bearish on downside magnitude.
Consider reducing position size if bear case materializes quickly.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Why probability-weighting matters more than price targets
&lt;/h2&gt;

&lt;p&gt;Most retail investors have price targets but no probability weights. A $145 bull case sounds great until you realize you're assigning it 70% probability — implicitly, by not thinking about it — and the bear case is actually more likely.&lt;/p&gt;

&lt;p&gt;Forcing yourself to assign explicit percentages that sum to 100% does two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You have to make your assumptions explicit&lt;/li&gt;
&lt;li&gt;The math tells you if your thesis is actually bullish or just optimistic&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The EV calculation makes it harder to enter a position with a positive price target but negative expected value.&lt;/p&gt;




&lt;h2&gt;
  
  
  Claude's role in the calculation
&lt;/h2&gt;

&lt;p&gt;The skill uses Claude to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Parse natural language&lt;/strong&gt; — you don't need to use a specific format&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate scenarios&lt;/strong&gt; — if you only give one scenario, Claude asks clarifying questions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check probability calibration&lt;/strong&gt; — if your probabilities don't sum to 100%, it flags it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provide commentary&lt;/strong&gt; — the verdict includes a plain-language interpretation of the risk/reward&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The math itself is trivial. The value is in the workflow: a structured format that forces you to think before you trade.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Kelly Criterion integration
&lt;/h2&gt;

&lt;p&gt;The skill also calculates a Kelly fraction — the theoretically optimal position size given your edge and win probability.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;Kelly = (bp - q) / b

Where:
b = odds received (EV gain / potential loss)
p = probability of bull case
q = 1 - p (probability of loss)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because full Kelly is aggressive, the skill defaults to half-Kelly (50% of the calculated fraction) with a note that this is conservative.&lt;/p&gt;

&lt;p&gt;I use this as a sanity check, not a mandate. If Kelly says 15% and I'm thinking 5%, that's a mismatch worth examining.&lt;/p&gt;




&lt;h2&gt;
  
  
  Limitations I built in deliberately
&lt;/h2&gt;

&lt;p&gt;The skill doesn't pull live prices — you enter them manually. This is intentional: it forces you to look at the chart, not automate the decision.&lt;/p&gt;

&lt;p&gt;It also doesn't tell you what probabilities to use. That's the hard part of analysis, and it's yours to do. The skill takes your numbers and does the math honestly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Installation (free)
&lt;/h2&gt;

&lt;p&gt;The EV Calculator is in the free tier of the repo:&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/tellmefrankie/ai-investment-skills?utm_source&lt;span class="o"&gt;=&lt;/span&gt;devto&amp;amp;utm_medium&lt;span class="o"&gt;=&lt;/span&gt;article
&lt;span class="nb"&gt;cp &lt;/span&gt;ev-calculator/SKILL.md ~/.claude/skills/ev-calculator.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then in Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/ev-calculator
NVDA at $120. Bull $145 (35%), Base $118 (45%), Bear $95 (20%).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Works with Claude Code 1.0+, Cursor, Codex CLI — any agent supporting the SKILL.md standard.&lt;/p&gt;

&lt;p&gt;The full options flow analyzer and morning briefing agent are in the &lt;a href="https://jaehyunpark.gumroad.com/l/tcyahy?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;Pro Bundle ($29)&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Repo: &lt;a href="https://github.com/tellmefrankie/ai-investment-skills?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;github.com/tellmefrankie/ai-investment-skills&lt;/a&gt; — MIT licensed.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Not financial advice. Expected value calculations are only as good as the inputs.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>investing</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How I automated stop-loss monitoring with Claude Code and Telegram (no broker API needed)</title>
      <dc:creator>tellmefrankie</dc:creator>
      <pubDate>Wed, 13 May 2026 19:17:25 +0000</pubDate>
      <link>https://dev.to/tellmefrankie/how-i-automated-stop-loss-monitoring-with-claude-code-and-telegram-no-broker-api-needed-1nfh</link>
      <guid>https://dev.to/tellmefrankie/how-i-automated-stop-loss-monitoring-with-claude-code-and-telegram-no-broker-api-needed-1nfh</guid>
      <description>&lt;p&gt;The problem with manual stop-loss monitoring: you check your phone, the market moves while you're not watching, and you exit a position three points below where you meant to.&lt;/p&gt;

&lt;p&gt;Here's how I built an automated stop-loss monitor that sends a Telegram alert within 2 seconds of a threshold breach — using Claude Code, Yahoo Finance's free API, and a SKILL.md file.&lt;/p&gt;

&lt;p&gt;No broker API. No paid data service. No authentication flow.&lt;/p&gt;




&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;The skill polls Yahoo Finance's undocumented quote endpoint every 5 minutes during market hours:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;https://query1.finance.yahoo.com/v8/finance/chart/{ticker}?range=1d&amp;amp;interval=1m
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the current price crosses a configured threshold, it fires a Telegram alert and logs to a 30-minute deduplication cache (so you don't get spammed if a stock bounces around a level).&lt;/p&gt;




&lt;h2&gt;
  
  
  Market hours detection
&lt;/h2&gt;

&lt;p&gt;No point running the monitor at 3am or on weekends. The skill checks market session before each poll:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pre-market:   04:00 — 09:30 ET  (alerts enabled, wider thresholds)
Regular:      09:30 — 16:00 ET  (alerts enabled, normal thresholds)
After-hours:  16:00 — 20:00 ET  (alerts enabled, wider thresholds)
Closed:       all other times   (skip)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Weekend detection prevents the monitor from running at all on Saturday/Sunday.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Telegram alert format
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ALERT] TEM — Stop-loss triggered
Price: $47.13  |  Threshold: $47.50
Session: Regular hours  |  Time: 14:23 ET

Distance from threshold: -0.78%
Action: Review position sizing. Exit if conviction unchanged.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This format is intentional: price, threshold, distance from threshold, and a suggested action in one message. No dashboard to open.&lt;/p&gt;




&lt;h2&gt;
  
  
  Configuration
&lt;/h2&gt;

&lt;p&gt;The skill accepts natural language configuration in Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Monitor these positions:
- AAPL: stop-loss $170, take-profit $200
- NVDA: stop-loss $110
- TEM: stop-loss $47.50, take-profit $55
- IREN: stop-loss $50

Alert me via Telegram when any threshold is hit.
Check every 5 minutes during market hours.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude parses this into a position config object and starts the monitoring loop.&lt;/p&gt;




&lt;h2&gt;
  
  
  What it caught in production
&lt;/h2&gt;

&lt;p&gt;Two live examples from running this on a real portfolio:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TEM at $47.44&lt;/strong&gt; — stop-loss set at $47.50. Alert fired 4 minutes after the open. Exited before the next leg down to $44.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IREN at $50 support&lt;/strong&gt; — set an alert at $50 exactly. Alert fired at $49.97 during after-hours. Position size reduced ahead of open.&lt;/p&gt;

&lt;p&gt;Neither of these required me to watch a chart. The alert came to my phone, I checked the news, made a decision.&lt;/p&gt;




&lt;h2&gt;
  
  
  Deduplication logic
&lt;/h2&gt;

&lt;p&gt;Without deduplication, a stock bouncing around your stop-loss level sends an alert every 5 minutes. The 30-minute cache solves this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;First breach: alert fires, timestamp logged
Next poll (5 min later): price still below threshold → skip (within 30-min window)
35 minutes later: if price recovered and then drops again → alert fires again
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The cache resets if price recovers above threshold and then breaches again — so you're not silenced on a genuine second breach.&lt;/p&gt;




&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;The free version monitors up to 3 tickers. It's in the open-source repo:&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;# Clone and install the free skill&lt;/span&gt;
git clone https://github.com/tellmefrankie/ai-investment-skills?utm_source&lt;span class="o"&gt;=&lt;/span&gt;devto&amp;amp;utm_medium&lt;span class="o"&gt;=&lt;/span&gt;article
&lt;span class="nb"&gt;cp &lt;/span&gt;price-monitor-alert/SKILL.md ~/.claude/skills/price-monitor-alert.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then in Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/price-monitor-alert
Monitor AAPL stop-loss &lt;span class="nv"&gt;$170&lt;/span&gt;, NVDA stop-loss &lt;span class="nv"&gt;$110&lt;/span&gt;
Alert me via Telegram
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The full version (unlimited tickers + options flow alerts) is in the &lt;a href="https://jaehyunpark.gumroad.com/l/tcyahy?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;Pro Bundle ($29)&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Yahoo Finance instead of a paid API
&lt;/h2&gt;

&lt;p&gt;Yahoo Finance's quote endpoint has been publicly accessible for years. It's not documented, not guaranteed, but it works. For a personal portfolio monitor, the latency (under 1 second) and 5-minute polling interval are both fine.&lt;/p&gt;

&lt;p&gt;If you need tick-level data or guaranteed uptime, Polygon.io Basic ($29/month) is the right tool. The Options Flow Analyzer in the same repo uses Polygon for that reason.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The repo is MIT licensed: &lt;a href="https://github.com/tellmefrankie/ai-investment-skills?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;github.com/tellmefrankie/ai-investment-skills&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Not financial advice. Monitor your own positions responsibly.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>investing</category>
      <category>tutorial</category>
      <category>typescript</category>
    </item>
    <item>
      <title>I built a 9-wave morning briefing agent with Claude Code — here is the architecture</title>
      <dc:creator>tellmefrankie</dc:creator>
      <pubDate>Wed, 13 May 2026 18:47:24 +0000</pubDate>
      <link>https://dev.to/tellmefrankie/i-built-a-9-wave-morning-briefing-agent-with-claude-code-here-is-the-architecture-gl0</link>
      <guid>https://dev.to/tellmefrankie/i-built-a-9-wave-morning-briefing-agent-with-claude-code-here-is-the-architecture-gl0</guid>
      <description>&lt;p&gt;Every trading day at 06:00 KST, a Claude Code skill runs a 9-wave analysis pipeline and delivers a structured briefing to my Telegram.&lt;/p&gt;

&lt;p&gt;Not a single-shot prompt. Nine distinct analytical passes, each informing the next.&lt;/p&gt;

&lt;p&gt;Here's how it works.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why 9 waves?
&lt;/h2&gt;

&lt;p&gt;A single LLM call for "give me a market analysis" produces generic output. It has no memory of what came before, no way to let macro context inform a sector read, no critique pass to catch errors.&lt;/p&gt;

&lt;p&gt;Nine waves solve this. Each wave receives the outputs of all prior waves as context.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 9 waves
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Wave 1: Macro
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inputs: Fed data, yield curve, DXY, VIX
Output: Risk-on/risk-off stance + confidence level
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anchor context for everything that follows. If Wave 1 says "risk-off with 70% confidence," every subsequent wave adjusts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wave 2: Sector
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inputs: Wave 1 output + sector ETF flows (XLI, XLK, XLE, XLF, XLV)
Output: Leading/lagging sectors + rotation signal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is where the XLI P/C 5.32 anomaly surfaced — Wave 2 flagged industrial put pressure while Wave 1 showed broad market risk-on. Contradiction = signal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wave 3: Technical
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inputs: Wave 1-2 + SPY/QQQ/IWM price vs 20/50/200-day MA
Output: Trend alignment score, key levels
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Technical context in isolation is noise. Inside macro+sector context, it's actionable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wave 4: Portfolio
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inputs: Waves 1-3 + current holdings
Output: Position stress test against current macro regime
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which positions are aligned with the Wave 1-3 read? Which are exposed?&lt;/p&gt;

&lt;h3&gt;
  
  
  Wave 5: News
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inputs: Waves 1-4 + RSS sentiment, earnings calendar
Output: Catalysts that could override technical signals
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fed speaker today? Earnings tonight? Wave 5 flags conflicts with the current thesis.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wave 6: Options
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inputs: Waves 1-5 + P/C ratios from scanner (post lottery-filter)
Output: Institutional sentiment overlay
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where is smart money positioned? Wave 6 compares options flow to the technical + macro thesis from prior waves.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wave 7: Critique
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inputs: Waves 1-6
Output: What's the bull case for being wrong?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explicit adversarial pass. Forces a counterargument before committing to any trade thesis.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wave 8: Simulation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inputs: Waves 1-7 + target positions
Output: EV-weighted scenario modeling
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the macro bear case plays out: what's the drawdown? Bull case: what's the gain? Expected value calculation per position.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wave 9: Synthesis
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inputs: All prior waves
Output: 3-sentence briefing + action list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Final output. Concise. Actionable. Informed by 8 prior analytical passes.&lt;/p&gt;




&lt;h2&gt;
  
  
  What this looks like in practice
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;[2026-05-13 06:00 KST] Investment Briefing — Wave 9 Synthesis

Macro-sector tension: XLI hedge signal persistent (Wave 2) against broad risk-on
read (Wave 1). Options flow confirms institutional downside protection on industrials
while retail lottery-buying inflated CEG call volume (Wave 6).

Action: Hold current allocation. Flag XLI for session 3 monitoring. No new entries
until Wave 2/6 tension resolves.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eight waves of analysis distilled into three sentences and one action item.&lt;/p&gt;




&lt;h2&gt;
  
  
  How it's built
&lt;/h2&gt;

&lt;p&gt;This is a &lt;a href="https://github.com/tellmefrankie/ai-investment-skills?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;Claude Code skill&lt;/a&gt; — a SKILL.md file that orchestrates:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Data fetch (Polygon.io options chains, RSS feeds, price APIs)&lt;/li&gt;
&lt;li&gt;Nine sequential Claude API calls, each passing prior outputs&lt;/li&gt;
&lt;li&gt;Telegram delivery via bot
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;investment-briefing-agent/
├── SKILL.md          ← the skill definition
├── waves/
│   ├── wave-1-macro.md
│   ├── wave-2-sector.md
│   └── ...           ← each wave has its own prompt template
└── pipeline.ts       ← orchestration logic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The full skill is in the &lt;a href="https://jaehyunpark.gumroad.com/l/tcyahy?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;Pro Bundle&lt;/a&gt; — $29 one-time. The free EV Calculator and News Sentiment Engine are in the same repo if you want to see the architecture first.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the wave design gets right
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Contradiction detection is automatic.&lt;/strong&gt; When Wave 1 says risk-on and Wave 6 says institutional put buying, the Wave 9 synthesis surfaces that conflict — you don't have to look for it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context accumulates.&lt;/strong&gt; Every wave builds on real outputs, not assumptions. The critique (Wave 7) sees the full analysis before trying to break it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No hallucinated confidence.&lt;/strong&gt; Single-shot market analysis tends toward false certainty. Nine passes with explicit uncertainty propagation produces better-calibrated output.&lt;/p&gt;




&lt;h2&gt;
  
  
  The signal that validated the design
&lt;/h2&gt;

&lt;p&gt;Week of May 13, 2026: Wave 1 showed risk-on (SPY P/C 0.44, QQQ 0.54). Wave 2 flagged XLI P/C 5.32 — 4-5x above the 0.5-1.2 normal range. Wave 6 confirmed: the put volume was post-lottery-filter, meaning real institutional hedging, not noise.&lt;/p&gt;

&lt;p&gt;Wave 9 synthesis: "Macro risk-on with sector-specific industrial hedge. Hold tech longs, reduce cyclical exposure until XLI signal resolves."&lt;/p&gt;

&lt;p&gt;Three sessions later, XLI underperformed SPY by 2.3%. The tech longs were fine.&lt;/p&gt;

&lt;p&gt;Not prediction. Pattern recognition with structured context.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The repo is open source: &lt;a href="https://github.com/tellmefrankie/ai-investment-skills?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;github.com/tellmefrankie/ai-investment-skills&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Investment Briefing Agent is in the &lt;a href="https://jaehyunpark.gumroad.com/l/tcyahy?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;Pro Bundle ($29)&lt;/a&gt;. The free skills are cloneable immediately.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Not financial advice.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>tutorial</category>
      <category>claudecode</category>
      <category>investing</category>
    </item>
    <item>
      <title>How I run a 9-wave AI investment briefing every morning in 90 seconds (full architecture)</title>
      <dc:creator>tellmefrankie</dc:creator>
      <pubDate>Wed, 13 May 2026 13:56:29 +0000</pubDate>
      <link>https://dev.to/tellmefrankie/how-i-run-a-9-wave-ai-investment-briefing-every-morning-in-90-seconds-full-architecture-3c51</link>
      <guid>https://dev.to/tellmefrankie/how-i-run-a-9-wave-ai-investment-briefing-every-morning-in-90-seconds-full-architecture-3c51</guid>
      <description>&lt;h2&gt;
  
  
  The problem with morning research
&lt;/h2&gt;

&lt;p&gt;Before market open, I used to spend 45–60 minutes reading news, checking charts, reviewing positions. Most of it was noise. I was making decisions based on whatever I happened to read last, not a systematic view.&lt;/p&gt;

&lt;p&gt;Now I run a 9-wave Claude Code pipeline that takes 90 seconds and covers everything.&lt;/p&gt;

&lt;p&gt;Here's the full architecture.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 9-wave pipeline
&lt;/h2&gt;

&lt;p&gt;Each "wave" is a separate Claude API call with a specific role. Running them sequentially means each wave can reference the previous ones.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wave 1: Macro Context
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inputs: S&amp;amp;P 500, Nasdaq, VIX, 10Y yield, DXY, oil, recent Fed statements
Output: Macro regime classification (risk-on / risk-off / transitional)
        Key levels to watch today
        Probability-weighted scenario (bull/base/bear)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Wave 2: Sector Rotation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inputs: All 11 S&amp;amp;P sectors (XLK, XLF, XLE, XLV, XLI, ...)
Output: Leaders vs laggards this week
        Rotation signal (defensive → growth or vice versa)
        Sectors with anomalous volume
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Wave 3: Technical Scanner
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;For each holding:
- RSI(14): overbought/oversold flag
- Price vs SMA20, SMA50, SMA200
- MACD crossover status
- Key support/resistance levels
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Wave 4: News Sweep
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;For each ticker in portfolio:
- 48h earnings / guidance / upgrades / downgrades
- Insider activity (buy/sell, size)
- Short interest changes
- Options flow anomalies (from Wave 4b — see below)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Wave 4b: Options Flow (sub-wave)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// This runs as part of Wave 4 for tickers with options activity&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;realPCRatio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;calculateRealPC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;stockPrice&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;lotteryPct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;calls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isLottery&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;calls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// Only surface if real P/C ratio shows conviction&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;realPCRatio&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;flagAnomaly&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;realPCRatio&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The real/lottery separation (explained in &lt;a href="https://dev.to/tellmefrankie/i-built-a-real-time-options-flow-scanner-with-claude-code-and-it-caught-a-signal-i-almost-missed-3lm6"&gt;this post&lt;/a&gt;) is critical here.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wave 5: Opportunity Finder
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scan watchlist (not current holdings) for:
- RSI &amp;lt; 35 with volume spike (potential reversal)
- Earnings within 5 days (catalyst)
- Sector alignment with Wave 2 rotation signal
Output: Ranked list of new swing trade candidates
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Wave 6: Critic Review
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Adversarial role. Rules:
- Challenge every bullish signal from Waves 1-5
- Require 2+ source confirmation for any claim
- Find the counter-evidence first
- What would make this thesis wrong?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the most important wave. Without it, the pipeline just confirms whatever I already believe.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wave 7: Portfolio Simulation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;For current holdings:
- Bull scenario (prob: X%): portfolio value = $Y
- Base scenario (prob: X%): portfolio value = $Y  
- Bear scenario (prob: X%): portfolio value = $Y
Key risk: position concentration, sector overlap
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Wave 8: Deep Connections
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cross-asset analysis:
- What is DXY doing to commodity plays?
- Is yield curve signaling growth/recession risk?
- Hidden correlations in current portfolio
- What smart money rotation implies for individual names
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Wave 9: Meta-Critic + Action Plan
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Final synthesis:
1. One thing I must act on today
2. One thing I should watch but not trade yet
3. One thing I was wrong about yesterday
4. Positions to reduce / add / hold with conviction levels
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The anti-narrative harness
&lt;/h2&gt;

&lt;p&gt;The hardest engineering problem was preventing the system from telling me what I wanted to hear.&lt;/p&gt;

&lt;p&gt;Every wave runs under these rules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Numbers required — "P/C 0.55, real call 28%" not "bullish sentiment"
2. Cross-verification — 2+ sources for any price or claim
3. Counter-evidence first — find the bear case before the bull
4. No sell on emotion — check if at bottom, verify with Wave 6 critic before any sell
5. No narrative repetition — each run uses fresh analysis, not yesterday's story
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rule 4 has saved me from panic-selling bottoms twice.&lt;/p&gt;




&lt;h2&gt;
  
  
  Implementation: TypeScript + Claude SDK
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;runBriefingWave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;wave&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;previousWaves&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&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;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;previousWaves&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`=== Wave &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&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="s2"&gt; Output ===\n&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="dl"&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;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;claude&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&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="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;claude-opus-4-5&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2048&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
      &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;previousWaves&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;\n\n=== Wave &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;wave&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; Task ===\n&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
        &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;prompt&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="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&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="kd"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&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="nx"&gt;text&lt;/span&gt; &lt;span class="p"&gt;:&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Total cost per run: ~$0.08–0.12 with Claude Opus (9 waves × ~1500 tokens avg).&lt;br&gt;
At daily runs: ~$2.50/month.&lt;/p&gt;


&lt;h2&gt;
  
  
  Output format
&lt;/h2&gt;

&lt;p&gt;The final briefing goes to Telegram at 06:00 KST:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;📊 MORNING BRIEFING — 2026-05-14

MACRO: Risk-off. VIX 18.4 (+12%). 10Y at 4.52%.
REGIME: Transitional. Watch CPI Thursday.

TOP SIGNAL: XLI P/C 5.32 (outlier). Institutional 
hedge on industrials. Not actionable yet — needs 
sector confirmation.

PORTFOLIO TODAY:
✓ AAPL: Hold. SMA50 support holding.
⚠ NVDA: RSI 72. Trim 20% if opens above $145.
✗ TEM: Stop-loss at $47.44 — DO NOT lower.

NEW OPPORTUNITIES: CELH (RSI 31, earnings May 18)

CRITIC NOTE: Bull thesis for AAPL depends on 
China reopening. That narrative is 60 days stale.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every field is a number or an action. No vibes.&lt;/p&gt;




&lt;h2&gt;
  
  
  The skill bundle
&lt;/h2&gt;

&lt;p&gt;All 9 waves + the anti-narrative harness + the options flow scanner are packaged in one Claude Code skill bundle:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://jaehyunpark.gumroad.com/l/tcyahy?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;AI Investment Skills — $29 one-time on Gumroad →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Free tier: Waves 1-2 (Macro + Sector). Full bundle: All 9 waves.&lt;/p&gt;

&lt;p&gt;This is production tooling I run every morning. Not a demo.&lt;/p&gt;




&lt;h2&gt;
  
  
  What surprised me
&lt;/h2&gt;

&lt;p&gt;The Wave 6 Critic is the most valuable wave and the one I almost skipped. Without adversarial review, the pipeline just produces confident-sounding analysis that matches whatever the macro environment already implies.&lt;/p&gt;

&lt;p&gt;The meta-critic output "what was I wrong about yesterday" is where the real learning happens. It forces me to track my own errors rather than just moving on.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Running since March 2026. ~60 morning briefings completed. The portfolio is up, but more importantly, the decision process is systematic.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>python</category>
      <category>claudecode</category>
      <category>investing</category>
    </item>
    <item>
      <title>I built 6 AI agent skills that run before my morning coffee. Here is what they caught last week.</title>
      <dc:creator>tellmefrankie</dc:creator>
      <pubDate>Wed, 13 May 2026 13:04:43 +0000</pubDate>
      <link>https://dev.to/tellmefrankie/i-built-6-ai-agent-skills-that-run-before-my-morning-coffee-here-is-what-they-caught-last-week-3m2m</link>
      <guid>https://dev.to/tellmefrankie/i-built-6-ai-agent-skills-that-run-before-my-morning-coffee-here-is-what-they-caught-last-week-3m2m</guid>
      <description>&lt;h1&gt;
  
  
  I built 6 AI agent skills that run before my morning coffee. Here is what they caught last week.
&lt;/h1&gt;

&lt;p&gt;I wake up at 6:50am. By 7:00am, before I have opened Twitter or checked the news, four Claude Code skills have already run and sent me a Telegram summary.&lt;/p&gt;

&lt;p&gt;This is what last Tuesday looked like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=== MORNING BRIEFING — 2026-05-13 ===

OPTIONS FLOW SUMMARY
SPY  P/C: 0.44   [EXTREME BULLISH]
QQQ  P/C: 0.54   [BULLISH]
TEM  P/C: 0.50   [BULLISH]
RXRX P/C: 0.38   [EXTREME BULLISH]
IREN P/C: 0.83   [NEUTRAL]
XLI  P/C: 5.32   [OUTLIER — INSTITUTIONAL HEDGE SIGNAL] ⚠️

STOP-LOSS STATUS
TEM  $48.67 → stop at $49.75 [WATCH]
IREN $51.20 → stop at $50.00 [OK]

BRIEFING COMPLETE — 4 skills, 90 seconds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That XLI line made me stop.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I built and why
&lt;/h2&gt;

&lt;p&gt;I have been managing a real-money stock portfolio since late 2025. Not a lot — a few positions, real capital, real risk. And I kept making the same mistake: spending 90 minutes every morning manually checking prices, reading options summaries, looking at charts, and then making decisions based on whatever I happened to notice.&lt;/p&gt;

&lt;p&gt;The problem is not effort. The problem is coverage. Manual review has blind spots. I was watching individual names and missing the sector level entirely.&lt;/p&gt;

&lt;p&gt;So I built four skills:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Options Flow Scanner
&lt;/h3&gt;

&lt;p&gt;Pulls the full options chain for each ticker in my watchlist, calculates the put/call ratio, and classifies each reading:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt; 0.40  → EXTREME BULLISH
0.40–0.60 → BULLISH  
0.60–1.20 → NEUTRAL
1.20–2.00 → CAUTIOUS
&amp;gt; 2.00  → BEARISH / HEDGE SIGNAL
&amp;gt; 3.00  → INSTITUTIONAL HEDGE SIGNAL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key part: it flags outliers against each instrument's own historical baseline. XLI's normal P/C sits around 0.8–1.1. At 5.32, the outlier flag fires even though the absolute threshold for "bearish" is lower.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Stop-Loss Monitor
&lt;/h3&gt;

&lt;p&gt;Polls my positions every 15 minutes during market hours. If a price crosses a threshold, it sends a Telegram message immediately. No checking required.&lt;/p&gt;

&lt;p&gt;I set TEM's stop at $49.75. It is currently at $48.67. The skill watches it so I do not have to.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Daily Investment Briefing
&lt;/h3&gt;

&lt;p&gt;Nine waves of analysis in sequence:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Overnight macro (futures, global markets)&lt;/li&gt;
&lt;li&gt;Options flow (from skill #1)&lt;/li&gt;
&lt;li&gt;Sentiment overlay&lt;/li&gt;
&lt;li&gt;Technical setup (support/resistance)&lt;/li&gt;
&lt;li&gt;Risk assessment&lt;/li&gt;
&lt;li&gt;Opportunity scan&lt;/li&gt;
&lt;li&gt;Alert triggers&lt;/li&gt;
&lt;li&gt;Trade ideas&lt;/li&gt;
&lt;li&gt;Execution checklist&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Total runtime: 90 seconds. Output: one structured Telegram message.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Portfolio Greeks Dashboard
&lt;/h3&gt;

&lt;p&gt;Tracks delta exposure, concentration by sector, and leverage across all open positions. The question it answers: "If the market drops 5% today, what happens to my book?" Knowing that before open is worth a lot.&lt;/p&gt;




&lt;h2&gt;
  
  
  The XLI signal
&lt;/h2&gt;

&lt;p&gt;XLI is the Industrial Select Sector SPDR ETF. Aerospace, defense, machinery, transportation. Normal put/call ratio: 0.5–1.2.&lt;/p&gt;

&lt;p&gt;Last Tuesday: 5.32.&lt;/p&gt;

&lt;p&gt;At that level, someone is buying institutional-scale downside protection on industrials. That is not a retail trade. The signal could mean a macro hedge against cyclical slowdown, a specific catalyst hedge (tariff decision, budget), or a volatility play. I do not know which.&lt;/p&gt;

&lt;p&gt;What I know: before this scanner, I would not have seen it.&lt;/p&gt;

&lt;p&gt;I did not change any positions. One data point is not a thesis. But I noted it, set a watch trigger, and paid closer attention to industrial exposure for the next week.&lt;/p&gt;

&lt;p&gt;That is the value: it interrupts complacency.&lt;/p&gt;




&lt;h2&gt;
  
  
  The technical setup
&lt;/h2&gt;

&lt;p&gt;Each skill is a TypeScript module that runs via &lt;code&gt;node-cron&lt;/code&gt; inside a single Node.js process. No Lambda, no queue, no Kubernetes. One &lt;code&gt;pm2 start&lt;/code&gt; and it runs forever.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Simplified options scanner core&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;scanTicker&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="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;FlowReading&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;chain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchOptionsChain&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;putVolume&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;put&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;volume&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;callVolume&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;call&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;volume&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ratio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;putVolume&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;callVolume&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;historical&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getHistoricalBaseline&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isOutlier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ratio&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;historical&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mean&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;historical&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stdDev&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="nx"&gt;ticker&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ratio&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;classification&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;classify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ratio&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;isOutlier&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 outlier detection is the part that caught XLI. Not "is the ratio high" — but "is this ratio unusual for this specific instrument."&lt;/p&gt;




&lt;h2&gt;
  
  
  What I got wrong first
&lt;/h2&gt;

&lt;p&gt;I built the briefing skill first. It was beautiful and useless — comprehensive analysis of data I did not have a good way to source.&lt;/p&gt;

&lt;p&gt;Then I built the options scanner. Then the stop-loss monitor. Then I rebuilt the briefing to use real data from the other skills.&lt;/p&gt;

&lt;p&gt;The lesson: build the data layer first. The analysis layer is easy once you have reliable inputs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Open source
&lt;/h2&gt;

&lt;p&gt;The scanner and stop-loss monitor are on GitHub: &lt;a href="https://github.com/tellmefrankie/news-engine" rel="noopener noreferrer"&gt;github.com/tellmefrankie/news-engine&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pull requests welcome — especially for Discord alert support and Polygon.io free tier (both have open issues).&lt;/p&gt;




&lt;h2&gt;
  
  
  The scanner that caught this
&lt;/h2&gt;

&lt;p&gt;The full bundle includes 4 production-tested skills:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Options Flow Scanner&lt;/strong&gt; — flags unusual P/C ratios like the XLI 5.32 read&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stop-Loss Monitor&lt;/strong&gt; — real-time price alerts via Telegram (caught my TEM position at $47.44)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Daily Investment Briefing&lt;/strong&gt; — 9-wave morning analysis, runs in 90 seconds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portfolio Greeks Dashboard&lt;/strong&gt; — tracks concentration risk and leverage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I have been running these on a real portfolio for 6 months. Not a demo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://jaehyunpark.gumroad.com/l/tcyahy?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;$29 one-time — no subscription&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href="https://www.agensi.io/skills/news-sentiment-engine-ai-tech-news-analyzer" rel="noopener noreferrer"&gt;Install on Agensi →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the price ever goes up, existing buyers keep the current version forever.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Every Monday I publish the top options signals from the live scanner. Free to follow: &lt;a href="https://options-anomaly.substack.com" rel="noopener noreferrer"&gt;Options Anomaly Weekly&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Not financial advice. Personal tooling and research. Do your own due diligence.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>ai</category>
      <category>python</category>
      <category>agents</category>
    </item>
    <item>
      <title>98% of These Call Options Are Lottery Tickets. Here's How to Filter Them.</title>
      <dc:creator>tellmefrankie</dc:creator>
      <pubDate>Tue, 12 May 2026 23:48:01 +0000</pubDate>
      <link>https://dev.to/tellmefrankie/98-of-these-call-options-are-lottery-tickets-heres-how-to-filter-them-18f9</link>
      <guid>https://dev.to/tellmefrankie/98-of-these-call-options-are-lottery-tickets-heres-how-to-filter-them-18f9</guid>
      <description>&lt;h1&gt;
  
  
  98% of These Call Options Are Lottery Tickets. Here's How to Filter Them.
&lt;/h1&gt;

&lt;p&gt;CEG showed a put/call ratio of 1.06 on my scanner. Neutral. I almost skipped it.&lt;/p&gt;

&lt;p&gt;Then I ran the lottery filter.&lt;/p&gt;

&lt;p&gt;98.2% of the call volume was garbage — contracts so far out of the money they needed a 3-sigma move just to break even. Strip those out, and the P/C ratio goes from 1.06 to 59.2. Neutral flips to extreme bearish.&lt;/p&gt;

&lt;p&gt;I had been reading the wrong number for months.&lt;/p&gt;

&lt;p&gt;I found this out the hard way when I started logging every options trade my scanner flagged. The call volume was there. The bullish signal was there. But when I filtered for what I call "lottery calls" — contracts with strike prices so far out of the money that they need a 3-sigma move to ever pay off — the picture looked completely different.&lt;/p&gt;




&lt;h2&gt;
  
  
  The CEG Case Study
&lt;/h2&gt;

&lt;p&gt;CEG (Constellation Energy) hit my scanner with a P/C ratio of 1.06. Neutral read. Nothing exciting. I almost skipped it.&lt;/p&gt;

&lt;p&gt;But I ran the lottery filter.&lt;/p&gt;

&lt;p&gt;Here's what the raw numbers looked like vs. the filtered numbers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CEG Options Analysis — Week of May 12, 2026

--- RAW DATA ---
Total Call Volume:   47,832
Total Put Volume:    50,701
Raw P/C Ratio:       1.06   [NEUTRAL]

--- AFTER LOTTERY FILTER ---
Lottery Calls Removed:   46,976  (98.2% of all calls)
Real Call Volume:            856
Adjusted P/C Ratio:        59.2   [EXTREME BEARISH]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nearly every call option traded that day was a lottery ticket. Retail buyers loading up on low-delta, far-OTM contracts that expire worthless 90%+ of the time. Remove them, and the signal completely reverses: institutions were quietly buying puts while retail chased calls.&lt;/p&gt;

&lt;p&gt;The raw ratio said neutral. The filtered ratio said extreme bearish. One of those is the real signal.&lt;/p&gt;




&lt;h2&gt;
  
  
  What counts as a lottery call
&lt;/h2&gt;

&lt;p&gt;The filter I use has three criteria. A call is classified as "lottery" if it meets any of these:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Delta below 0.15&lt;/strong&gt; — less than 15% probability of expiring in the money&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strike more than 20% above current price&lt;/strong&gt; — needs a massive move just to break even&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Days to expiration under 7&lt;/strong&gt; — weekly lotto tickets with no time value&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These aren't arbitrary thresholds. They're the parameters where win rates collapse. Below delta 0.15, the average retail buyer loses money on over 85% of trades. The contracts exist because people buy them — not because they're good bets.&lt;/p&gt;

&lt;p&gt;Institutions know this. They sell premium into retail lottery-buying. When you see a spike in OTM call volume, you're often watching the other side of an institutional premium-selling operation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why raw P/C ratios are broken
&lt;/h2&gt;

&lt;p&gt;The problem is that P/C ratio was designed for a different market. In the 1990s, options were expensive and mostly used by sophisticated hedgers. Volume was lower, participants were more informed.&lt;/p&gt;

&lt;p&gt;Now, zero-commission trading and weekly expirations have flooded the market with lottery activity. On a given day, 60-80% of total options volume on individual names can be retail-driven, low-delta, near-expiry contracts. They move the P/C ratio dramatically without conveying any real information about positioning.&lt;/p&gt;

&lt;p&gt;When you see RXRX at P/C 0.38 (what my scanner flagged this week), that could mean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Institutional accumulation via calls&lt;/li&gt;
&lt;li&gt;Retail piling into lottery calls&lt;/li&gt;
&lt;li&gt;Both simultaneously&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The raw ratio can't tell you which. The lottery filter can.&lt;/p&gt;




&lt;h2&gt;
  
  
  This Week's Scan — filtered readings
&lt;/h2&gt;

&lt;p&gt;Here's what the adjusted P/C looked like across my watchlist after running the lottery filter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Options Flow — Week of May 12, 2026 (Lottery-Adjusted)

SPY  Raw: 0.44  →  Adj: 0.51   [BULLISH — confirms, retail not distorting]
QQQ  Raw: 0.54  →  Adj: 0.58   [BULLISH — clean signal]
RXRX Raw: 0.38  →  Adj: 2.14   [REVERSAL — lottery calls hiding bearish pressure]
TEM  Raw: 0.50  →  Adj: 0.47   [NEUTRAL — no distortion]
IREN Raw: 0.83  →  Adj: 0.91   [NEUTRAL — minor adjustment]
XLI  Raw: 5.32  →  Adj: 5.28   [BEARISH HEDGE — puts are real, not retail noise]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The interesting one here is RXRX. Raw P/C of 0.38 looks extremely bullish. Adjusted P/C of 2.14 says the opposite — there's significant put positioning once you strip out the OTM call lottery activity. That's a completely different trade thesis.&lt;/p&gt;

&lt;p&gt;XLI barely moves from 5.32 to 5.28. The puts there are institutional — they're real contracts, not lottery noise. That's actually a confirming signal: the XLI hedge is genuine.&lt;/p&gt;




&lt;h2&gt;
  
  
  How I built this filter
&lt;/h2&gt;

&lt;p&gt;The Options Flow Analyzer skill runs in Claude Code as a daily command. Here's the core logic:&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;is_lottery_call&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="nf"&gt;return &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="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;delta&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="mf"&gt;0.15&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt;
        &lt;span class="n"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;strike&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;contract&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;underlying_price&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="mf"&gt;1.20&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt;
        &lt;span class="n"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;days_to_expiry&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="mi"&gt;7&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;adjusted_pc_ratio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;real_calls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;calls&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="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;is_lottery_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="n"&gt;real_call_vol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&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;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;real_calls&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;total_put_vol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&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;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;puts&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;real_call_vol&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="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;inf&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# All calls are lottery — extreme bearish signal
&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;total_put_vol&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;real_call_vol&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The skill runs on my full watchlist every morning before market open. Output hits Telegram. Takes about 90 seconds end to end.&lt;/p&gt;




&lt;h2&gt;
  
  
  The uncomfortable truth about most options analysis
&lt;/h2&gt;

&lt;p&gt;Most retail options analysis — including what you see on Reddit, StockTwits, and financial Twitter — uses raw P/C ratios. The tools are built on raw data because it's easy to source and easy to display.&lt;/p&gt;

&lt;p&gt;This means every time someone says "the P/C ratio is bullish on XYZ," there's a real chance they're reading lottery noise as signal. The more retail-heavy the name, the worse the distortion.&lt;/p&gt;

&lt;p&gt;I don't think most people publishing options analysis are lying. I think they don't have a lottery filter. The raw number looks clean, so they report it.&lt;/p&gt;

&lt;p&gt;The filter changes what you trade. It changed mine.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The Options Flow Analyzer with lottery call filtering is open source:&lt;/strong&gt; &lt;a href="https://github.com/tellmefrankie/ai-investment-skills?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;github.com/tellmefrankie/ai-investment-skills&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The full implementation including adjusted P/C calculations, Telegram alerts, and watchlist configuration is in the Pro Bundle: &lt;a href="https://jaehyunpark.gumroad.com/l/tcyahy?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;jaehyunpark.gumroad.com/l/tcyahy&lt;/a&gt;&lt;/p&gt;







&lt;h2&gt;
  
  
  The scanner that caught this
&lt;/h2&gt;

&lt;p&gt;This signal came from a Claude Code skill I run every morning before market open. It pulls options chain data, calculates P/C ratios across my watchlist, and flags anything statistically unusual — automatically, before I have had coffee.&lt;/p&gt;

&lt;p&gt;The full bundle includes 4 production-tested skills:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Options Flow Scanner&lt;/strong&gt; — flags unusual P/C ratios like the XLI 5.32 read&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stop-Loss Monitor&lt;/strong&gt; — real-time price alerts via Telegram (caught my TEM position at $47.44)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Daily Investment Briefing&lt;/strong&gt; — 9-wave morning analysis, runs in 90 seconds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portfolio Greeks Dashboard&lt;/strong&gt; — tracks concentration risk and leverage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I have been running these on a real portfolio for 6 months. Not a demo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://jaehyunpark.gumroad.com/l/tcyahy?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;$29 one-time — no subscription&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the price ever goes up, existing buyers keep the current version forever.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Not financial advice. Personal research and tooling. Options trading involves substantial risk of loss.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Free to try:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.agensi.io/skills/news-sentiment-engine-ai-tech-news-analyzer" rel="noopener noreferrer"&gt;Agensi — News Sentiment Engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.agensi.io/skills/ev-calculator-expected-value-stock-analyzer" rel="noopener noreferrer"&gt;Agensi — EV Calculator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jaehyunpark.gumroad.com/l/tcyahy?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;Full bundle — Gumroad $29&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Part 3 of 8 in the **AI Investment Skills: Building in Public&lt;/em&gt;* series.*&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;← Part 2&lt;/strong&gt;: &lt;a href="https://dev.to/tellmefrankie/when-the-market-whispers-through-sector-etfs-the-xli-pc-532-signal-14l8"&gt;XLI options hit a 5.32 put/call ratio. Here is what our scanner found — and why I did not trade on it.&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Part 4 →&lt;/strong&gt;: &lt;a href="https://dev.to/tellmefrankie/the-day-my-ai-scanner-got-it-wrong-and-what-i-learned-from-it-6b0"&gt;The Day My AI Scanner Got It Wrong — and What I Learned From It&lt;/a&gt;&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>tutorial</category>
      <category>investing</category>
      <category>ai</category>
    </item>
    <item>
      <title>XLI options hit a 5.32 put/call ratio. Here is what our scanner found — and why I did not trade on it.</title>
      <dc:creator>tellmefrankie</dc:creator>
      <pubDate>Tue, 12 May 2026 23:12:26 +0000</pubDate>
      <link>https://dev.to/tellmefrankie/when-the-market-whispers-through-sector-etfs-the-xli-pc-532-signal-14l8</link>
      <guid>https://dev.to/tellmefrankie/when-the-market-whispers-through-sector-etfs-the-xli-pc-532-signal-14l8</guid>
      <description>&lt;p&gt;Last Tuesday my scanner showed a number I'd never seen before: &lt;strong&gt;XLI put/call ratio of 5.32&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I had to Google whether that was even possible.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(For context: a normal P/C ratio sits between 0.5 and 1.2. That means for every 5 puts someone buys — bets that the price will fall — there's about 1 call. At 5.32, someone is buying roughly 5 puts for every 1 call on the entire US industrial sector. That's not a typo.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I didn't trade on it. But I couldn't stop thinking about what it meant.&lt;/p&gt;




&lt;h2&gt;
  
  
  What XLI is, and why this matters even if you don't trade options
&lt;/h2&gt;

&lt;p&gt;XLI is the Industrial Select Sector SPDR ETF — it tracks big US industrials: Caterpillar, Honeywell, GE Aerospace, RTX. The kind of companies that build planes, run supply chains, and make the physical stuff the economy runs on.&lt;/p&gt;

&lt;p&gt;Here's what made 5.32 unusual. The broad market was telling a completely different story that same morning:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Options Flow Summary — 2026-05-13

SPY  P/C: 0.44   [EXTREME BULLISH]
QQQ  P/C: 0.54   [BULLISH]
TEM  P/C: 0.50   [BULLISH]
RXRX P/C: 0.38   [EXTREME BULLISH]
IREN P/C: 0.83   [NEUTRAL]
XLI  P/C: 5.32   [OUTLIER — INSTITUTIONAL HEDGE SIGNAL]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SPY at 0.44 means the options market was pricing in continued upside on the broad index. Almost everything was bullish.&lt;/p&gt;

&lt;p&gt;Except industrials. Someone was paying serious money to protect against a fall in that one sector specifically.&lt;/p&gt;




&lt;h2&gt;
  
  
  Three things this could mean
&lt;/h2&gt;

&lt;p&gt;I don't know which of these is true — and that's actually the point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. A macro hedge&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Industrials are economically sensitive. When growth slows, they underperform. A fund with broad market exposure might buy XLI puts as a cheap way to hedge a slowdown scenario — not because they're bearish on industrials specifically, but because it's an efficient hedge on cyclical risk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. A catalyst hedge&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Something specific is coming — a tariff decision, a defense budget announcement, a regulatory change. The buyer knows the timing. The rest of us don't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. A volatility position&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Complex options strategies (spreads, collars) can inflate put volume without being straightforwardly bearish. Less likely at this magnitude, but worth noting.&lt;/p&gt;

&lt;p&gt;One number doesn't give you the answer. It gives you a question worth tracking.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I actually did
&lt;/h2&gt;

&lt;p&gt;Nothing dramatic. One data point isn't a thesis.&lt;/p&gt;

&lt;p&gt;What I did:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flagged industrial-adjacent names in my portfolio for closer attention&lt;/li&gt;
&lt;li&gt;Logged it with a "watch" tag in my trade journal&lt;/li&gt;
&lt;li&gt;Set a rule: if XLI P/C stays above 3.0 for three consecutive sessions, review my cyclical exposure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The value isn't that the signal tells you what to do. It's that it interrupts complacency. Before I built this scanner, I would have missed it entirely — not because I wasn't paying attention, but because I never thought to check sector ETF flow as part of my morning routine.&lt;/p&gt;




&lt;h2&gt;
  
  
  How the scanner caught it
&lt;/h2&gt;

&lt;p&gt;The skill does four things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pulls options chain data for each ticker in my watchlist&lt;/li&gt;
&lt;li&gt;Sums put and call volume across all expiries&lt;/li&gt;
&lt;li&gt;Calculates the ratio and classifies it against threshold bands&lt;/li&gt;
&lt;li&gt;Flags anything outside two standard deviations of that ticker's historical baseline as an outlier&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That last step is what matters. XLI's normal P/C baseline is well below 5.32. The scanner isn't just asking "is this ratio high?" — it's asking "is this ratio unusual for &lt;em&gt;this specific instrument&lt;/em&gt;?" That's the difference between catching a real signal and crying wolf.&lt;/p&gt;

&lt;p&gt;Output hits my Telegram before market open. Takes about 40 seconds to run.&lt;/p&gt;




&lt;h2&gt;
  
  
  The broader point
&lt;/h2&gt;

&lt;p&gt;Institutions hedge through ETFs more often than through individual names — better liquidity, lower cost. If you're only watching single-stock options flow, you're reading half the conversation.&lt;/p&gt;

&lt;p&gt;The XLI puts might expire worthless. The industrial sector might rip higher. Whoever bought that protection may have paid for peace of mind they didn't need.&lt;/p&gt;

&lt;p&gt;But I'd rather see the signal and decide to ignore it than never see it at all. That's the whole point of building this thing.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Have you ever tracked sector-level P/C ratios?&lt;/strong&gt; Drop a comment — curious whether others watch ETF flow or just single-name options.&lt;/p&gt;

&lt;p&gt;The scanner is open source: &lt;a href="https://github.com/tellmefrankie/ai-investment-skills?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;github.com/tellmefrankie/ai-investment-skills&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want the full setup with Telegram alerts and pre-configured watchlists: &lt;a href="https://jaehyunpark.gumroad.com/l/tcyahy?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;AI Agent Skills Pack — $29&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The scanner that caught this
&lt;/h2&gt;

&lt;p&gt;This signal came from a Claude Code skill I run every morning before market open. It pulls options chain data, calculates P/C ratios across my watchlist, and flags anything statistically unusual — automatically, before I have had coffee.&lt;/p&gt;

&lt;p&gt;The full bundle includes 4 production-tested skills:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Options Flow Scanner&lt;/strong&gt; — flags unusual P/C ratios like the XLI 5.32 read&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stop-Loss Monitor&lt;/strong&gt; — real-time price alerts via Telegram (caught my TEM position at $47.44)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Daily Investment Briefing&lt;/strong&gt; — 9-wave morning analysis, runs in 90 seconds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portfolio Greeks Dashboard&lt;/strong&gt; — tracks concentration risk and leverage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I have been running these on a real portfolio for 6 months. Not a demo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://jaehyunpark.gumroad.com/l/tcyahy?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;$29 one-time — no subscription&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the price ever goes up, existing buyers keep the current version forever.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Every Monday I document the top signals from the live scanner. Free to follow: &lt;a href="https://options-anomaly.substack.com" rel="noopener noreferrer"&gt;Options Anomaly Weekly&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Not financial advice. Personal tooling and research. Do your own due diligence.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try for free:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.agensi.io/skills/news-sentiment-engine-ai-tech-news-analyzer" rel="noopener noreferrer"&gt;Agensi — News Sentiment Engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.agensi.io/skills/ev-calculator-expected-value-stock-analyzer" rel="noopener noreferrer"&gt;Agensi — EV Calculator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jaehyunpark.gumroad.com/l/tcyahy?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;Full bundle — Gumroad $29&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Part 2 of 8 in the **AI Investment Skills: Building in Public&lt;/em&gt;* series.*&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;← Part 1&lt;/strong&gt;: &lt;a href="https://dev.to/tellmefrankie/how-i-built-a-247-ai-growth-engine-with-claude-code-no-devops-required-1hhc"&gt;I replaced my marketing stack with 200 lines of Node.js and Claude. Total cost: $3.50/month.&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Part 3 →&lt;/strong&gt;: &lt;a href="https://dev.to/tellmefrankie/98-of-these-call-options-are-lottery-tickets-heres-how-to-filter-them-18f9"&gt;98% of These Call Options Are Lottery Tickets. Here's How to Filter Them.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>algotrading</category>
      <category>options</category>
      <category>investing</category>
    </item>
    <item>
      <title>I replaced my marketing stack with 200 lines of Node.js and Claude. Total cost: $3.50/month.</title>
      <dc:creator>tellmefrankie</dc:creator>
      <pubDate>Tue, 12 May 2026 22:46:07 +0000</pubDate>
      <link>https://dev.to/tellmefrankie/how-i-built-a-247-ai-growth-engine-with-claude-code-no-devops-required-1hhc</link>
      <guid>https://dev.to/tellmefrankie/how-i-built-a-247-ai-growth-engine-with-claude-code-no-devops-required-1hhc</guid>
      <description>&lt;p&gt;I spent three weeks trying to figure out why nobody was clicking my GitHub links.&lt;/p&gt;

&lt;p&gt;Posted on dev.to. Got 40 views. Zero installs. Zero stars.&lt;/p&gt;

&lt;p&gt;The content was fine. The problem was that I was doing it manually — writing posts, checking Reddit for relevant threads, posting at random times. There was no system. Just me, refreshing analytics and feeling bad about it.&lt;/p&gt;

&lt;p&gt;The worst part: I'd spend 45 minutes writing a post, publish it, get 3 views, and then not post again for a week because it felt pointless. That inconsistency was the real killer. Algorithms don't reward one good post. They reward showing up every day.&lt;/p&gt;

&lt;p&gt;So I automated it. Here's exactly what I built and what it actually cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;

&lt;p&gt;Three moving parts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Reddit/HN Monitor (every 15 min)
        ↓
Keyword match? → Telegram alert

Content Generator (daily 15:00 KST)
        ↓
Claude API → tweets + blog draft + newsletter
        ↓
Twitter poster → X API v2
        ↓ (weekly Monday)
dev.to poster → dev.to API
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All of it runs with &lt;code&gt;node-cron&lt;/code&gt; inside a single Node.js process. No Lambda, no queue, no Kubernetes. Just &lt;code&gt;pm2 start&lt;/code&gt; and forget it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Reddit Monitor
&lt;/h2&gt;

&lt;p&gt;The monitor runs every 15 minutes, scanning 8 subreddits for keywords like "claude skills", "mcp server", "options flow ai". When something matches, a Telegram alert fires. No API key needed — the public Reddit JSON endpoint is enough.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;KEYWORDS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;claude skills&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mcp server&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;claude agent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;investment agent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;trading bot ai&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;options analysis ai&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;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;searchReddit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;keyword&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;RedditPost&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="k"&gt;for &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;sub&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;SUBREDDITS&lt;/span&gt;&lt;span class="p"&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;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="s2"&gt;`https://www.reddit.com/r/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/search.json?q=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;keyword&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;sort=new&amp;amp;t=day`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User-Agent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GrowthEngine/1.0&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="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// ... parse and return posts&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 15-minute window matters. Reddit threads get most of their engagement in the first hour. If you show up at hour 3, you're invisible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Content Generation with Claude
&lt;/h2&gt;

&lt;p&gt;Pass recent git activity + your skills list to Claude, ask for tweets + blog draft + newsletter snippet as JSON. The key is prompt framing — "authentic, not salesy" and "show real experience" consistently produces content that doesn't feel AI-generated.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&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="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;claude-sonnet-4-5&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`You are a developer marketing writer...

    Generate:
    1. 3 tweets for #BuildInPublic
    2. Blog post draft (300 words)
    3. Newsletter snippet (100 words)

    Output as JSON.`&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;I don't post everything it generates. About 60% of the tweets go out as-is. The other 40% I rewrite. The blog drafts are more like outlines — useful starting points, not finished pieces. That ratio feels right. The automation handles the grind; I handle the judgment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Posting to dev.to
&lt;/h2&gt;

&lt;p&gt;dev.to's API is free and takes about 10 lines to integrate. One critical detail: always set &lt;code&gt;canonical_url&lt;/code&gt; to your own domain to prevent SEO duplicate content penalties.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;article&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;published&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;body_markdown&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;bodyWithCTA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ai&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;claude&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;buildinpublic&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;canonical_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://yourdomain.com/blog/slug&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="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://dev.to/api/articles&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="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;api-key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DEVTO_API_KEY&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&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;h2&gt;
  
  
  What It Costs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Claude API: ~$0.10/day&lt;/li&gt;
&lt;li&gt;X API: ~$0.015/tweet × 30 = $0.45/month&lt;/li&gt;
&lt;li&gt;dev.to API: free&lt;/li&gt;
&lt;li&gt;Hosting: $0 (runs alongside existing server)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Total: ~$3.50/month.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I've been running this for three weeks. It's not magic — I still have 40 views and 0 installs. But I'm now posting every day instead of every week, and I'm showing up in Reddit threads within 15 minutes of relevant conversations. That consistency didn't exist before. The results haven't come yet. The system is in place.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Packaged
&lt;/h2&gt;

&lt;p&gt;All of these patterns — plus the investment analysis, price monitoring, and options flow skills — are bundled into a Claude Code skills pack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's in the $29 bundle:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Investment Briefing Agent&lt;/strong&gt; — 9-wave coordinated analysis (macro, sector, technicals, news, critique, simulation)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Options Flow Analyzer&lt;/strong&gt; — Distinguishes institutional trades from lottery calls (caught the XLI P/C 5.32 anomaly live)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Price Monitor &amp;amp; Alert&lt;/strong&gt; — Real-time stop-loss/take-profit via Telegram&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Agent Orchestrator&lt;/strong&gt; — Parallel agent team with quality assurance layer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;News Sentiment Engine&lt;/strong&gt; (free) — RSS-based AI/tech briefing with sentiment scoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All plug-and-play with Claude Code, Cursor, and any SKILL.md-compatible agent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://jaehyunpark.gumroad.com/l/tcyahy?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;Get the AI Agent Skills Pack — $29 →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Or start free: &lt;a href="https://github.com/tellmefrankie/ai-investment-skills?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;github.com/tellmefrankie/ai-investment-skills&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What would you automate first if you had this stack?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Drop a comment — curious what other indie hackers are spending time on manually that doesn't need to be manual.&lt;/p&gt;




&lt;h2&gt;
  
  
  The scanner that caught this
&lt;/h2&gt;

&lt;p&gt;This signal came from a Claude Code skill I run every morning before market open. It pulls options chain data, calculates P/C ratios across my watchlist, and flags anything statistically unusual — automatically, before I have had coffee.&lt;/p&gt;

&lt;p&gt;The full bundle includes 4 production-tested skills:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Options Flow Scanner&lt;/strong&gt; — flags unusual P/C ratios like the XLI 5.32 read&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stop-Loss Monitor&lt;/strong&gt; — real-time price alerts via Telegram (caught my TEM position at $47.44)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Daily Investment Briefing&lt;/strong&gt; — 9-wave morning analysis, runs in 90 seconds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portfolio Greeks Dashboard&lt;/strong&gt; — tracks concentration risk and leverage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I have been running these on a real portfolio for 6 months. Not a demo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://jaehyunpark.gumroad.com/l/tcyahy?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;$29 one-time — no subscription&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the price ever goes up, existing buyers keep the current version forever.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Every Monday I publish the top 3 options signals from the live scanner. Free to follow: &lt;a href="https://options-anomaly.substack.com" rel="noopener noreferrer"&gt;Options Anomaly Weekly&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Not financial advice. The investment-related skills are personal tooling — do your own research.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Related deep-dive:&lt;/strong&gt; &lt;a href="https://dev.to/tellmefrankie/i-built-a-real-time-options-flow-scanner-with-claude-code-and-it-caught-a-signal-i-almost-missed-3lm6"&gt;How I built the real-time options scanner — the real vs lottery call separation that changed how I read options flow&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try for free:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.agensi.io/skills/news-sentiment-engine-ai-tech-news-analyzer" rel="noopener noreferrer"&gt;Agensi — News Sentiment Engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.agensi.io/skills/ev-calculator-expected-value-stock-analyzer" rel="noopener noreferrer"&gt;Agensi — EV Calculator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jaehyunpark.gumroad.com/l/tcyahy?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;Full bundle — Gumroad $29&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Part 1 of 8 in the **AI Investment Skills: Building in Public&lt;/em&gt;* series.*&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 2 →&lt;/strong&gt;: &lt;a href="https://dev.to/tellmefrankie/when-the-market-whispers-through-sector-etfs-the-xli-pc-532-signal-14l8"&gt;XLI options hit a 5.32 put/call ratio. Here is what our scanner found — and why I did not trade on it.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>showdev</category>
      <category>indiehackers</category>
    </item>
  </channel>
</rss>
