<?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>This Week in Options Anomalies — Week of May 12, 2026</title>
      <dc:creator>tellmefrankie</dc:creator>
      <pubDate>Tue, 12 May 2026 23:56:26 +0000</pubDate>
      <link>https://dev.to/tellmefrankie/this-week-in-options-anomalies-week-of-may-12-2026-52lm</link>
      <guid>https://dev.to/tellmefrankie/this-week-in-options-anomalies-week-of-may-12-2026-52lm</guid>
      <description>&lt;h1&gt;
  
  
  This Week in Options Anomalies — Week of May 12, 2026
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;A weekly series. Every Monday I run the options flow scanner across my watchlist and publish the three most notable readings — with context, interpretation, and what (if anything) I did about it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Raw data from the Options Flow Analyzer skill running on Claude Code. Lottery call filter applied to all readings.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Signal #1: XLI P/C 5.32 — Industrial Sector Hedge Storm
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Raw reading:&lt;/strong&gt; 5.32&lt;br&gt;
&lt;strong&gt;Lottery-adjusted:&lt;/strong&gt; 5.28&lt;br&gt;
&lt;strong&gt;Classification:&lt;/strong&gt; &lt;code&gt;[OUTLIER — INSTITUTIONAL HEDGE SIGNAL]&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Normal range for XLI:&lt;/strong&gt; 0.6–1.4&lt;/p&gt;

&lt;p&gt;This was the week's standout number. XLI put/call at 5.32 means put volume was running more than five times call volume on the industrial sector ETF. The lottery adjustment barely moved it (5.32 → 5.28), which is significant: the puts are real institutional contracts, not retail noise.&lt;/p&gt;

&lt;p&gt;For context, XLI tracks industrials — Caterpillar, Honeywell, RTX, GE Aerospace. These are economically sensitive names. When you see this level of put buying concentrated in a sector ETF, it's almost always one of two things: a macro hedge against cyclical slowdown, or a specific catalyst someone is positioning ahead of.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happened after:&lt;/strong&gt; XLI fell 2.3% over the following four sessions. Not a dramatic move, but the direction was right.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I did:&lt;/strong&gt; Flagged for monitoring. Set a trigger — if XLI P/C holds above 3.0 for three consecutive sessions, reduce sizing on any industrial-adjacent exposure. Did not open a new position on a single reading.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; Sector ETF put flow is a leading indicator worth watching. The lottery-adjusted reading staying at 5.28 was the confirming detail — genuine institutional positioning, not retail lottery buying.&lt;/p&gt;


&lt;h2&gt;
  
  
  Signal #2: CEG Lottery Call Distortion — 98.2% Noise
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Raw P/C:&lt;/strong&gt; 1.06&lt;br&gt;
&lt;strong&gt;Lottery-adjusted P/C:&lt;/strong&gt; 59.2&lt;br&gt;
&lt;strong&gt;Classification (raw):&lt;/strong&gt; &lt;code&gt;[NEUTRAL]&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Classification (adjusted):&lt;/strong&gt; &lt;code&gt;[EXTREME BEARISH]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This one almost slipped past me. Raw P/C of 1.06 is exactly the kind of reading you skip — neutral, unremarkable, nothing actionable.&lt;/p&gt;

&lt;p&gt;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;CEG Options — Week of May 12, 2026

Raw call volume:        47,832
Lottery calls removed:  46,976  (98.2%)
Real call volume:          856

Raw P/C:    1.06  [NEUTRAL]
Adj P/C:   59.2   [EXTREME BEARISH]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;98.2% of all call volume was OTM lottery contracts — delta below 0.15, strikes more than 20% above price, expiring within the week. Strip them out and the real picture is extreme put dominance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happened after:&lt;/strong&gt; CEG was flat to slightly down on the week. The adjusted reading suggested bearish pressure that didn't fully materialize in price — but the signal was directionally correct.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I did:&lt;/strong&gt; Nothing. CEG is not a name I currently hold or watch closely. I noted it as a confirmation that the lottery filter matters — this is exactly the kind of name where raw P/C is actively misleading.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; On retail-active names, raw P/C ratios can invert the actual signal. Always run the filter before acting.&lt;/p&gt;




&lt;h2&gt;
  
  
  Signal #3: SPY P/C 0.44 — Extreme Bullish Positioning
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Raw reading:&lt;/strong&gt; 0.44&lt;br&gt;
&lt;strong&gt;Lottery-adjusted:&lt;/strong&gt; 0.51&lt;br&gt;
&lt;strong&gt;Classification:&lt;/strong&gt; &lt;code&gt;[EXTREME BULLISH]&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Historical context:&lt;/strong&gt; Bottom 8th percentile of SPY P/C readings&lt;/p&gt;

&lt;p&gt;SPY at 0.44 is notable. The broad market index is seeing heavy call buying relative to puts — a level that historically sits near the bottom decile of readings going back several years.&lt;/p&gt;

&lt;p&gt;Two ways to read this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bullish interpretation:&lt;/strong&gt; Smart money is positioning for continued upside. Institutional call buying on SPY often precedes momentum moves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contrarian interpretation:&lt;/strong&gt; Extreme bullishness is complacency. When everyone is positioned long, there's no one left to buy. The most crowded trades unwind the fastest.&lt;/p&gt;

&lt;p&gt;The lottery adjustment shifted it from 0.44 to 0.51 — a modest move, meaning some of the call buying is retail speculation but the core reading is genuine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happened after:&lt;/strong&gt; The week ended slightly positive for SPY. The bullish read was directionally correct, though 0.44 is the kind of reading that historically precedes both strong rallies and sharp corrections — it narrows the range of outcomes but doesn't determine direction alone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I did:&lt;/strong&gt; No change to existing SPY exposure. Used the reading to bias my interpretation of individual names toward the bullish side, all else equal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; Extreme SPY P/C readings are context, not signal. They shift the prior but don't make the trade.&lt;/p&gt;




&lt;h2&gt;
  
  
  This Week's Full Scan
&lt;/h2&gt;



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

SPY   0.44  (0.51)  [EXTREME BULLISH]
QQQ   0.54  (0.58)  [BULLISH]
TEM   0.50  (0.47)  [NEUTRAL]
RXRX  0.38  (2.14)  [raw: EXTREME BULLISH / adj: BEARISH — high distortion]
IREN  0.83  (0.91)  [NEUTRAL]
XLI   5.32  (5.28)  [OUTLIER — INSTITUTIONAL HEDGE]
CEG   1.06  (59.2)  [raw: NEUTRAL / adj: EXTREME BEARISH — 98.2% lottery]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The two names with the largest raw-to-adjusted divergence (RXRX and CEG) are both retail-heavy, options-active stocks. This pattern holds consistently — the noisier the retail participation, the more the lottery filter matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  Next Week
&lt;/h2&gt;

&lt;p&gt;Same format, new data. The scanner runs every morning; I'll publish the three most notable readings the following Monday.&lt;/p&gt;

&lt;p&gt;If you want the scanner running on your own watchlist, it's open source: &lt;a href="https://github.com/tellmefrankie/ai-investment-skills" rel="noopener noreferrer"&gt;github.com/tellmefrankie/ai-investment-skills&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Full setup with Telegram alerts and automated scheduling: &lt;a href="https://jaehyunpark.gumroad.com/l/tcyahy" rel="noopener noreferrer"&gt;jaehyunpark.gumroad.com/l/tcyahy&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Not financial advice. This is a personal data log, not investment recommendations. Options trading involves substantial risk of loss.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>options</category>
      <category>algotrading</category>
      <category>investing</category>
      <category>claudecode</category>
    </item>
    <item>
      <title>Week 1 Post-Mortem: What My Claude Investment Skills Got Right, Wrong, and Missed Entirely</title>
      <dc:creator>tellmefrankie</dc:creator>
      <pubDate>Tue, 12 May 2026 23:53:06 +0000</pubDate>
      <link>https://dev.to/tellmefrankie/week-1-post-mortem-what-my-claude-investment-skills-got-right-wrong-and-missed-entirely-5403</link>
      <guid>https://dev.to/tellmefrankie/week-1-post-mortem-what-my-claude-investment-skills-got-right-wrong-and-missed-entirely-5403</guid>
      <description>&lt;h1&gt;
  
  
  Week 1 Post-Mortem: What My Claude Investment Skills Got Right, Wrong, and Missed Entirely
&lt;/h1&gt;

&lt;p&gt;I have been running six Claude Code skills on my real portfolio for the past week. Here is an honest accounting of what happened — the correct calls, the wrong ones, and the signals I should have acted on but didn't.&lt;/p&gt;

&lt;p&gt;No survivorship bias. All four cases, in order.&lt;/p&gt;




&lt;h2&gt;
  
  
  Signal 1: TEM $47.13 Stop-Loss — The Right Call for the Wrong Reason
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What the system flagged:&lt;/strong&gt; Price Monitor hit the stop-loss threshold at $47.13. Alert fired to Telegram at 9:34am. I exited the position.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happened after:&lt;/strong&gt; TEM continued lower to $43.80 before stabilizing. The exit was correct on price.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The honest part:&lt;/strong&gt; I was holding TEM partly because the P/C ratio had read bullish (0.50) a few days before the exit. That reading had not changed materially. The stop-loss fired on price action, not on options signal — and that was right. Price was telling me something the P/C ratio wasn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict: Correct exit, but I was relying on the wrong signal.&lt;/strong&gt; The stop-loss automation worked exactly as designed. The options reading was noise in this case. If I had been watching only the P/C and not the price monitor, I would have held through a 7% additional loss.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I changed:&lt;/strong&gt; Stop-loss triggers on price. Options flow informs position sizing decisions, not exit triggers. These are different tools.&lt;/p&gt;




&lt;h2&gt;
  
  
  Signal 2: XLI P/C 5.32 — Correct Read, No Trade
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What the system flagged:&lt;/strong&gt; XLI put/call ratio of 5.32, classified &lt;code&gt;[OUTLIER — INSTITUTIONAL HEDGE SIGNAL]&lt;/code&gt;. The scanner noted this as 4x+ the baseline, consistent with institutional downside protection buying on industrials.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happened after:&lt;/strong&gt; XLI dropped 2.3% over the following four sessions. Not a dramatic move, but directionally the signal was right — there was genuine downside pressure on industrials that week.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The honest part:&lt;/strong&gt; I didn't trade on it. My rule is one data point doesn't make a thesis. I flagged it, noted it in the journal, set a monitoring trigger. The sector moved the way the signal suggested and I was on the sideline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict: Correct signal, no position, no gain.&lt;/strong&gt; I'm at peace with this one. A single anomalous reading shouldn't move capital. The system caught something real; the process prevented me from acting on a single data point. That's the right behavior.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One thing I'd do differently:&lt;/strong&gt; I should have used this to reduce sizing on any existing industrial-adjacent exposure. I had one position adjacent to the sector (small, unrelated thesis) and didn't reduce it. That's a gap in how I connect signals to existing positions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Signal 3: RXRX P/C 0.38 — Wrong Read, Real Loss
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What the system flagged:&lt;/strong&gt; RXRX raw P/C 0.38, classified &lt;code&gt;[EXTREME BULLISH]&lt;/code&gt;. I entered a small position.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happened after:&lt;/strong&gt; RXRX fell 3% the next session and continued lower. I honored the stop and exited at -9.9% on the position.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The honest part:&lt;/strong&gt; I wrote about this separately, but the short version: I did not run the lottery call filter before entering. Adjusted P/C was 2.14, not 0.38. The raw signal was noise. 91.4% of the call volume that made it look bullish was retail OTM lottery tickets.&lt;/p&gt;

&lt;p&gt;This was a workflow failure, not a signal failure. The tool had the filter. I skipped it because I was in a hurry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict: Wrong. My fault, not the system's.&lt;/strong&gt; The loss was small and within the stop I had set. But the root cause was me bypassing a step I had built specifically to prevent this kind of error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I changed:&lt;/strong&gt; Lottery call filter is now mandatory. The scanner will not output a P/C classification without running the filter first. I removed the option to skip it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Signal 4: IREN $56.47 — Missed the Bounce
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What the system flagged:&lt;/strong&gt; IREN P/C 0.83 at the time of the earnings miss. The scanner classified it &lt;code&gt;[NEUTRAL]&lt;/code&gt;. No alert, no action.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happened after:&lt;/strong&gt; IREN reported earnings that missed estimates. Stock dropped 8% after hours. Then reversed — hard. Over the next three sessions it recovered to $56.47, above the pre-earnings price. Anyone who bought the dip made 14%+ in three days.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The honest part:&lt;/strong&gt; My scanner completely missed this. P/C 0.83 is neutral — nothing actionable. But if I had been running an earnings surprise scanner alongside the options flow scanner, I might have flagged the post-miss setup. Biotech and energy names with high short interest often see violent reversals after earnings dips. IREN has both characteristics.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict: Missed opportunity. Legitimate gap in the system.&lt;/strong&gt; This isn't a signal failure — it's a feature I don't have. Post-earnings reversal detection requires a different kind of analysis: short interest, float, historical earnings reaction, days-to-cover. None of that is in the current skill set.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I'm doing about it:&lt;/strong&gt; Adding an earnings calendar layer to the morning briefing. Not full post-earnings reversal detection yet, but at minimum flagging names that reported within the last 3 sessions so I can evaluate manually.&lt;/p&gt;




&lt;h2&gt;
  
  
  Scoreboard: Week 1
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Signal              Result      My Call     System Fault?
─────────────────────────────────────────────────────────
TEM $47.13 exit     Correct     Correct     No
XLI 5.32 hedge      Correct     No trade    No (correct behavior)
RXRX 0.38 long      Wrong       Wrong       No (I skipped the filter)
IREN bounce         Missed      No signal   Yes (feature gap)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One clean win. One correct non-trade. One self-inflicted loss. One genuine gap.&lt;/p&gt;

&lt;p&gt;That's probably about right for week one of any system.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Week Taught Me
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The stop-loss automation is the most reliable part.&lt;/strong&gt; It does exactly what it's supposed to do without hesitation. I have hesitated on manual stops before; the automation does not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Raw P/C ratios without the lottery filter are actively misleading.&lt;/strong&gt; This is not a minor adjustment — it's the difference between a bullish read and a bearish one on a retail-heavy name. The filter should never be optional.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Signals don't connect to existing positions automatically.&lt;/strong&gt; XLI flagging sector hedge risk while I held an adjacent position is a workflow gap. The scanner sees the signal; it doesn't see my book. That connection is still manual.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;There are whole categories of edge the system doesn't have yet.&lt;/strong&gt; Post-earnings reversals, short squeeze setups, catalyst calendars. These are additions, not fixes — the current system does what it was built to do, but there's more to build.&lt;/p&gt;




&lt;p&gt;Week 2 starts Monday. I'll do the same accounting next week.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The skills used in this post-mortem:&lt;/strong&gt; &lt;a href="https://github.com/tellmefrankie/ai-investment-skills" rel="noopener noreferrer"&gt;github.com/tellmefrankie/ai-investment-skills&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Full suite with the stop-loss monitor and options flow analyzer: &lt;a href="https://jaehyunpark.gumroad.com/l/tcyahy" rel="noopener noreferrer"&gt;jaehyunpark.gumroad.com/l/tcyahy&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Not financial advice. This is a personal tooling post-mortem, not investment recommendations. All figures are from my own portfolio.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>investing</category>
      <category>algotrading</category>
      <category>claudecode</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>The Day My AI Scanner Got It Wrong — and What I Learned From It</title>
      <dc:creator>tellmefrankie</dc:creator>
      <pubDate>Tue, 12 May 2026 23:51:24 +0000</pubDate>
      <link>https://dev.to/tellmefrankie/the-day-my-ai-scanner-got-it-wrong-and-what-i-learned-from-it-6b0</link>
      <guid>https://dev.to/tellmefrankie/the-day-my-ai-scanner-got-it-wrong-and-what-i-learned-from-it-6b0</guid>
      <description>&lt;h1&gt;
  
  
  The Day My AI Scanner Got It Wrong — and What I Learned From It
&lt;/h1&gt;

&lt;p&gt;Everyone who publishes trading content shows you the wins.&lt;/p&gt;

&lt;p&gt;Here is one I got wrong.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;Two weeks ago my options flow scanner flagged RXRX with a put/call ratio of 0.38. That's in extreme bullish territory — heavy call buying relative to puts. The scanner classified it &lt;code&gt;[EXTREME BULLISH]&lt;/code&gt; and it hit my Telegram before market open.&lt;/p&gt;

&lt;p&gt;I had been watching RXRX anyway. It's a biotech name I track because it's volatile, options-active, and the P/C signal tends to be cleaner than large caps with heavy retail flow.&lt;/p&gt;

&lt;p&gt;The signal looked right. The momentum was there. I sized into a small position.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Actually Happened
&lt;/h2&gt;

&lt;p&gt;The stock dropped 11% over the next four days.&lt;/p&gt;

&lt;p&gt;Not a catastrophic loss — I had a stop set and honored it. But wrong is wrong.&lt;/p&gt;

&lt;p&gt;When I went back to audit the signal, I found two things I had missed:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The lottery call problem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I run a lottery call filter on most tickers — it strips out OTM contracts below 0.15 delta that are almost certainly retail speculation. I had not run it on RXRX that morning. When I ran it after the fact, the adjusted P/C came out at 2.14, not 0.38.&lt;/p&gt;

&lt;p&gt;The raw signal said extreme bullish. The filtered signal said bearish. I had traded on noise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Volume context&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The call volume that drove the 0.38 reading was concentrated in two strikes: the $12 and $15 calls. RXRX was trading around $8.40. Those contracts needed a 43% and 79% move respectively to expire in the money. They were lottery tickets, not institutional accumulation.&lt;/p&gt;

&lt;p&gt;I knew about the lottery filter. I just didn't run it that morning because I was in a hurry.&lt;/p&gt;




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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RXRX Post-Trade Audit — 2026-05-13

Signal at entry:
  Raw P/C:          0.38  [EXTREME BULLISH]
  Lottery-adj P/C:  2.14  [BEARISH]
  Delta &amp;lt; 0.15 calls: 91.4% of total call volume

Price action:
  Entry:   $8.47
  Stop:    $7.60 (triggered day 4)
  Exit:    $7.63
  Loss:    -9.9% on position

Was the signal wrong? No.
Did I use the signal correctly? No.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This distinction matters. The tool worked. The workflow had a gap.&lt;/p&gt;




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

&lt;p&gt;Three things:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Lottery filter is now mandatory, not optional&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I updated the skill so the adjusted P/C always runs alongside the raw P/C. If they diverge by more than 0.5, the output flags it as &lt;code&gt;[SIGNAL UNRELIABLE — HIGH LOTTERY DISTORTION]&lt;/code&gt; and I don't act on it without manual review.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Added a volume concentration check&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If more than 60% of call volume is concentrated in two or fewer strikes, the scanner now notes it. Concentrated volume in far-OTM strikes is a retail pile-on pattern, not institutional.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Slowed down the entry decision on biotech&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Biotech names have more retail options activity than most sectors. The lottery distortion problem is worse there. I now require the adjusted P/C to confirm before acting on any biotech signal.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I'm publishing this
&lt;/h2&gt;

&lt;p&gt;Most trading content is survivorship bias in article form. The writer shows you the XLI signal that worked, not the RXRX signal they misread.&lt;/p&gt;

&lt;p&gt;I build tools. Tools have bugs and workflow gaps. Publishing the failure is more useful than publishing only the wins — it shows what the system actually catches and what it misses, and it forced me to fix the gap I had been ignoring.&lt;/p&gt;

&lt;p&gt;The scanner is better now than it was two weeks ago. That's the honest version of this story.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The updated Options Flow Analyzer with mandatory lottery filtering:&lt;/strong&gt; &lt;a href="https://github.com/tellmefrankie/ai-investment-skills" rel="noopener noreferrer"&gt;github.com/tellmefrankie/ai-investment-skills&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Full suite with the audit trail and Telegram alerts: &lt;a href="https://jaehyunpark.gumroad.com/l/tcyahy" rel="noopener noreferrer"&gt;jaehyunpark.gumroad.com/l/tcyahy&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Not financial advice. This is a post-trade audit of personal tooling decisions, not investment recommendations.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>investing</category>
      <category>claudecode</category>
      <category>algotrading</category>
      <category>buildinpublic</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;Here is a number that should bother you: when you look at raw put/call ratios, you are looking at the wrong thing.&lt;/p&gt;

&lt;p&gt;P/C ratio is supposed to tell you where the smart money is positioning. A low ratio means call-heavy — bullish. A high ratio means put-heavy — defensive. Clean signal, right?&lt;/p&gt;

&lt;p&gt;Except most of those calls are garbage.&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" 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" rel="noopener noreferrer"&gt;jaehyunpark.gumroad.com/l/tcyahy&lt;/a&gt;&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;

</description>
      <category>options</category>
      <category>algotrading</category>
      <category>investing</category>
      <category>claudecode</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;I check my options scanner every morning. Most days it returns nothing notable.&lt;/p&gt;

&lt;p&gt;Last Tuesday it flagged something I had not seen before.&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;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;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;jaehyunpark.gumroad.com/l/tcyahy&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;h2&gt;
  
  
  Every Monday I publish the top 3 options signals from the live scanner, with interpretation. Free to start: &lt;a href="https://options-anomaly.substack.com" rel="noopener noreferrer"&gt;Options Anomaly Weekly&lt;/a&gt;
&lt;/h2&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>investing</category>
      <category>options</category>
      <category>buildinpublic</category>
      <category>claudecode</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;So I automated it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&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 the same Node.js process as my news engine. 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;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;No Reddit API key needed. The public JSON endpoint is enough for monitoring. When a new post matches a keyword, a Telegram alert fires within 15 minutes.&lt;/p&gt;

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

&lt;p&gt;The Claude API call is straightforward: pass recent git activity + your skills list, ask for tweets + blog draft + newsletter snippet as JSON. The key is in the prompt framing — "authentic, not salesy" and "show real experience" consistently produces content that does not 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;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. The 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 for content generation: ~$0.10/day&lt;/li&gt;
&lt;li&gt;X API for tweets: ~$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;Total: &lt;strong&gt;~$3.50/month&lt;/strong&gt; for a fully automated content pipeline.&lt;/p&gt;

&lt;p&gt;I track every post it generates. About 60% of the tweets go out as-is. The other 40% I rewrite before posting. 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;
  
  
  What I Packaged
&lt;/h2&gt;

&lt;p&gt;If you want to skip the setup and just get the prompts and configs I use, I packaged everything into a $29 bundle — same templates running in my actual system.&lt;/p&gt;

&lt;p&gt;Or clone the free version from GitHub and modify it yourself. Both work.&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 skills 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" 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" rel="noopener noreferrer"&gt;github.com/tellmefrankie/ai-investment-skills&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;h2&gt;
  
  
  Every Monday I publish the top 3 options signals from the live scanner, with interpretation. Free to start: &lt;a href="https://options-anomaly.substack.com" rel="noopener noreferrer"&gt;Options Anomaly Weekly&lt;/a&gt;
&lt;/h2&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;

</description>
      <category>claudecode</category>
      <category>automation</category>
      <category>indiehackers</category>
      <category>buildinpublic</category>
    </item>
  </channel>
</rss>
