<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Quant Galore on Medium]]></title>
        <description><![CDATA[Stories by Quant Galore on Medium]]></description>
        <link>https://medium.com/@quant-galore?source=rss-f1c7c4923c52------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*Q8q-CH8VECSLENbJ5AsKlQ.png</url>
            <title>Stories by Quant Galore on Medium</title>
            <link>https://medium.com/@quant-galore?source=rss-f1c7c4923c52------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 06:47:14 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@quant-galore/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Why 9 Out of 10 SPAC Stocks Lose Money in Their First Year]]></title>
            <link>https://quant-galore.medium.com/why-9-out-of-10-spac-stocks-lose-money-in-their-first-year-226b5666d196?source=rss-f1c7c4923c52------2</link>
            <guid isPermaLink="false">https://medium.com/p/226b5666d196</guid>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[finance]]></category>
            <dc:creator><![CDATA[Quant Galore]]></dc:creator>
            <pubDate>Mon, 02 Nov 2026 22:01:01 GMT</pubDate>
            <atom:updated>2026-11-02T22:01:01.622Z</atom:updated>
            <content:encoded><![CDATA[<h4>The numbers seem to be getting worse, which makes the trade here pretty obvious.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*s7tr-oYMJ6qtNURer756Gw.png" /></figure><p>Today, shareholders of Churchill Capital Corp XI (CCXI) <a href="https://pulse2.com/agility-robotics-and-churchill-capital-corp-xi-move-620-million-spac-deal-toward-november-vote/">vote on merging with Agility Robotics</a>, the humanoid robot company, and if it passes, the stock <a href="https://www.agilityrobotics.com/content/agility-robotics-and-churchill-capital-corp-xi-announce-expected-gross-capital-raise-of-approximately-465-million-and-anticipated-closing-of-business-combination">starts trading as </a><a href="https://www.agilityrobotics.com/content/agility-robotics-and-churchill-capital-corp-xi-announce-expected-gross-capital-raise-of-approximately-465-million-and-anticipated-closing-of-business-combination">AGLT on Thursday</a>.</p><p>It’s a $2.5 billion deal with Foxconn leading the private money, so there’s going to be a <em>lot</em> of excitement around that first trade, but before that happens, I wanted to take a look at history to see what usually comes next.</p><p>So, I pulled every SPAC merger that closed and started trading since the start of 2023, <strong>171 deals</strong> in all, and tracked each stock through its first year.</p><p>A year after the first trade, <strong>131 of the 139</strong> deals old enough to measure were lower, the typical one was down <strong>81%</strong>, and <strong>96%</strong> were trading below the $10 the SPAC shares were originally sold for.</p><p>That’s a lot worse than I expected, but once you see how many people get a cut before you ever place a trade, things get a lot less surprising.</p><h4>What are you ACTUALLY buying?</h4><p>A SPAC is basically a shell company that lists on an exchange with no business, raises cash at <strong>$10 a share</strong>, and parks that cash in a trust account while it hunts for a private company to merge with.</p><p>Once the merger closes, the shell becomes the operating company under a new name and ticker, which is why you’ll hear the new stock called a <a href="https://www.alphanume.com/de-spac-events"><strong>de-SPAC</strong></a>.</p><p>The trouble is that a lot of people get a piece of that $10 along the way:</p><ol><li><strong>The sponsor</strong> <br>The team that sets up the SPAC typically pays around <a href="https://mergersandinquisitions.com/great-spac-scam">$25,000 for 20% of the shares</a>, which is called the “promote,” and since those shares cost almost nothing, they dilute everyone who paid $10</li><li><strong>Warrants<br></strong>Early SPAC buyers and the sponsor usually get warrants, which are essentially the right to buy more stock at <strong>$11.50</strong>, so if the stock ever gets above that, new shares get created</li><li><strong>The PIPE<br></strong>Big investors often put money in privately right before the merger (<a href="https://www.alphanume.com/private-placements">a PIPE agreement</a>), sometimes at better terms than the public gets</li><li><strong>Fees<br></strong>The bankers who took the SPAC public get paid when the merger closes, out of the same pot</li><li><strong>Redemptions<br></strong>This is the most important one, so we’ll go into more detail on it a bit later</li></ol><h4>Where The Cash Goes</h4><p>Now, before the merger vote, every public SPAC shareholder gets the right to hand their shares back for roughly <strong>$10 plus interest</strong>, which is basically a free exit, so if you don’t <em>love </em>the deal you just take the cash, and plenty of people do (often while keeping the warrants).</p><p>I checked the 62 deals in my sample where <a href="https://www.alphanume.com/de-spac-events">Alphanume’s De-SPAC dataset</a> had both the trust size and the redemptions, and in the typical one, <strong>82%</strong> of the trust money got pulled out.</p><p>Agility is a nice live example, since Churchill XI’s trust would have delivered <a href="https://pulse2.com/agility-robotics-and-churchill-capital-corp-xi-move-620-million-spac-deal-toward-november-vote/">about <strong>$424 million</strong></a> if nobody redeemed, and after the redemption deadline passed, the companies said <a href="https://www.agilityrobotics.com/content/agility-robotics-and-churchill-capital-corp-xi-announce-expected-gross-capital-raise-of-approximately-465-million-and-anticipated-closing-of-business-combination">about <strong>$164 million</strong></a> of it would actually make it to the company.</p><p>That comes out to roughly <strong>60%</strong> of investors asking for its $10 back.</p><p>So, think about who’s left holding shares when the new ticker starts trading:</p><ul><li>The sponsor, who paid pennies</li><li>PIPE investors, who negotiated their price</li><li>The private company’s old owners, usually locked up for a while (<a href="https://www.agilityrobotics.com/content/agility-robotics-and-churchill-capital-corp-xi-announce-expected-gross-capital-raise-of-approximately-465-million-and-anticipated-closing-of-business-combination">180 days in Agility’s case</a>)</li><li>A <em>small</em> slice of public holders who chose not to take the $10</li></ul><p>Because the float, which is essentially the shares that can actually change hands, is so small, the first few days can get wild, and about <strong>1 in 6</strong> of these stocks (27 of 171) closed their first day at $15 or higher.</p><p>Most didn’t get anywhere near that, though, and <strong>61%</strong> closed their very first day already <em>below</em> $10.</p><h4>Where It Goes Terribly Wrong</h4><p>So, now that you get the high-level mechanism, let’s take a look at what the typical de-SPAC looked like over its first year (chart below), with every price adjusted for later reverse splits so a split never shows up as a fake jump.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fel-Kjfog5iTreJ7bZAhag.png" /></figure><p>Measured from the close of the first trading day:</p><ul><li><strong>After 20 trading days (about a month):</strong> down a median <strong>46%</strong>, and 88% are lower</li><li><strong>After 60 days (about three months):</strong> down <strong>52%</strong>, 88% lower</li><li><strong>After 120 days (about six months):</strong> down <strong>63%</strong>, 93% lower</li><li><strong>After 250 days (about a year):</strong> down <strong>81%</strong>, 94% lower</li></ul><p>And in plain dollar terms, <strong>79%</strong> of them were trading under $5 a year in.</p><p>Our longer study on the <a href="https://www.alphanume.com/de-spac-events">De-SPAC Events page</a> goes back to 2020 with a larger sample and measures from the merger’s completion instead of the first close, and it points the same direction, with the median name down 47% six months after completion.</p><h4>Isn’t SPAC 2.0 supposed to be better?</h4><p>The obvious rebuttal is that the newer wave of SPACs, the so-called<em> SPAC 2.0</em>, is supposed to come with better sponsors and better deals, so I split the one-year results by the year each stock started trading (chart below).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_-5z8Nsmu4TvzJf0SLWsDA.png" /></figure><ul><li><strong>2023 listings:</strong> down a median <strong>73%</strong>, 96% lower (68 deals)</li><li><strong>2024 listings:</strong> down <strong>83%</strong>, 93% lower (44 deals)</li><li><strong>2025 listings:</strong> down <strong>87%</strong>, 89% lower (27 deals)</li></ul><p>To be fair, there are <em>some</em> exceptions to the rule:</p><ul><li><strong>Oklo (</strong><strong>OKLO):</strong> up <strong>232%</strong> in its first year after listing in May 2024.</li><li><strong>Sable Offshore (</strong><strong>SOC):</strong> up <strong>147%</strong>.</li><li><strong>QT Imaging (</strong><strong>QTI):</strong> up <strong>344%</strong>, though from a first close of $1.35.</li></ul><p>So, that comes out to <strong>3</strong> names out of 139 that more than doubled, and only <strong>8</strong> that finished the year higher at all.</p><h4>How you’d actually trade this</h4><p>The obvious read is to short every new de-SPAC and wait, which works great on paper until you go looking for shares to borrow.</p><p>Before you can short, your broker needs a locate, which is basically confirmation that there are shares out there for you to borrow.</p><p>So, I checked <a href="https://www.alphanume.com/short-locates">Alphanume’s short-locate data</a> for the 50 de-SPACs that started trading since June 2025, using the morning snapshot from October 30:</p><ul><li><strong>38 of 50</strong> showed up on the hard-to-borrow list</li><li><strong>5</strong> of those had no shares on offer at all</li><li>For the ones with shares, the typical one-time locate fee was about <strong>0.26%</strong> of the stock price, and the most expensive was <strong>5.5%</strong></li></ul><p>That fee is manageable on a stock that falls 50% in three months, as long as you can actually find shares, which wasn’t the case for 5 of the 50.</p><p>So, here’s roughly how I’d run it:</p><ol><li><strong>Watch the calendar<br></strong>The vote, the close and the first trade usually happen within a few days of each other, so you want to know about them before the new ticker shows up.</li><li><strong>Read the redemption number first<br></strong>It tells you how much cash actually made it to the company and how small the float will be.</li><li><strong>Don’t chase the day-one pop<br></strong>The small float makes the early moves violent in both directions, and the typical stock is down <strong>24%</strong> from its first close by day five anyway.</li><li><strong>Check borrow before you plan a short<br></strong>If there are no shares, there’s no trade.</li><li><strong>Mark the lockup date</strong> <br>When the old owners can sell, there can be a lot of new supply.</li></ol><p>Here’s a small script that pulls the upcoming SPAC milestones from the De-SPAC Events dataset, soonest first:</p><pre>import os<br>import requests<br><br>r = requests.get(<br>    &quot;https://api.alphanume.com/v1/de-spac-events&quot;,<br>    params={&quot;status&quot;: &quot;pending&quot;, &quot;upcoming&quot;: &quot;true&quot;},<br>    headers={&quot;X-API-Key&quot;: os.environ[&quot;ALPHANUME_API_KEY&quot;]},<br>)<br><br>deals = sorted(r.json()[&quot;data&quot;], key=lambda d: d[&quot;next_event_date&quot;])<br><br>for d in deals:<br>    print(d[&quot;next_event_date&quot;], d[&quot;next_event_type&quot;], d[&quot;prior_ticker&quot;], &quot;-&gt;&quot;, d[&quot;new_ticker&quot;], d[&quot;new_company_name&quot;])</pre><p>When I ran it this morning, it returned today’s CCXI to AGLT vote, plus three more shareholder meetings later this month:</p><ul><li><strong>CubeBio</strong> on the 11th</li><li><strong>Blockfusion</strong> on the 17th</li><li><strong>Quantum Space</strong> on the 20th</li></ul><h4>Final Thoughts</h4><p>I went in expecting SPACs to be bad, and I still came out surprised by how <em>consistent</em> it is.</p><p>Agility could easily end up among the exceptions, since it’s a real company with real customers and a lot of private money behind it, and the names above prove that <em>some </em>of these do work.</p><p>The base rate is still brutal, though, so anyone buying AGLT on Thursday should at least know that <strong>131 of the last 139</strong> were lower a year later.</p><p>If you want to track these yourself, the <a href="https://www.alphanume.com/de-spac-events">De-SPAC Events dataset</a> follows every deal from announcement to first trade, including the redemption and trust numbers I used here, while <a href="https://www.alphanume.com/short-locates">Short Locates</a> covers the borrow side.</p><p>Both come with Alphanume Pro, which has a <strong>3-day free trial</strong>, so you can run the script above on this month’s votes yourself.</p><p>As always, thanks for reading, and we’ll see you in the next one.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=226b5666d196" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Trades That Work Because Nobody Wants to Do Them, Part 2]]></title>
            <link>https://quant-galore.medium.com/the-trades-that-work-because-nobody-wants-to-do-them-part-2-57f1748d34e7?source=rss-f1c7c4923c52------2</link>
            <guid isPermaLink="false">https://medium.com/p/57f1748d34e7</guid>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[investing]]></category>
            <category><![CDATA[finance]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <dc:creator><![CDATA[Quant Galore]]></dc:creator>
            <pubDate>Wed, 28 Oct 2026 23:59:58 GMT</pubDate>
            <atom:updated>2026-10-28T23:59:58.690Z</atom:updated>
            <content:encoded><![CDATA[<h4>This whole time, all you needed to do was read a filing.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1Mg-UA9px0i4csbdLGK3FQ.png" /></figure><p>On September 28, <a href="https://quant-galore.medium.com/running-sophisticated-trading-strategies-with-tradezero-code-included-f191a15111b2">our bot </a>shorted GYGY at <strong>$1.23</strong> in the opening auction and bought it back a little after 2 PM at <strong>97 cents</strong>, which is about <strong>+21%</strong> on a stock that had been up <strong>72%</strong> before the bell.</p><p>Now, we’re cherry-picking that result for a reason.</p><p>Back in July, GYGY had sold <strong>$8 million</strong> of convertible preferred stock to Streeterville Capital, priced at the <em>lesser</em> of a fixed price or a discount to wherever the stock happened to be trading. In August it <a href="https://www.sec.gov/Archives/edgar/data/2111846/000121390026092695/0001213900-26-092695-index.htm">registered 22.2 million shares for resale</a>, on a company worth about <strong>$24 million</strong> at the time, and that registration went effective on September 16.</p><p>So when GYGY ripped 72% in the pre-market 12 days later, there was someone sitting on a pile of <em>freshly sellable</em> shares who had every reason to hit the bid.</p><p>In <a href="https://quant-galore.medium.com/the-trades-that-work-because-nobody-wants-to-do-them-c536a1f01d2a">part 1</a>, we went through why some trades keep working for <strong>years </strong>after they’re known: the names are too small, the plumbing is annoying, the payout takes forever, and shorting carries a stigma.</p><p>However, when you’re in the business of edge, no edge is too small or too much work. So today, we’re going to take it a level deeper and show you some of the grittier mechanics of more of these types of trades.</p><h4>Not All Money is Good Money</h4><p>“Toxic financing” might sound like jargon-slop at first, but the reason it’s called that is pretty simple.</p><p>Basically, a small company that can’t raise money the normal way signs a deal with a specialty fund, and the deal usually works like this:</p><ol><li>The fund buys a convertible note, convertible preferred, or an equity line from the company</li><li>The conversion price floats, which essentially means the fund’s price follows the stock wherever it goes<br> — Usually that’s a <strong>5% to 20% discount</strong> to the recent market price, or the lesser of a fixed price and that discount</li><li>The company files a resale registration so the fund can legally sell the shares it gets</li><li>The fund converts, sells, converts again, and <strong>sells again, for as long as there’s a bid.</strong></li></ol><p>The fund’s whole business is buying stock at a discount and dumping it into whatever liquidity shows up, and a stock running 72% in the pre-market is the <strong>best </strong>liquidity a company that size will see all quarter.</p><p>So, that shines a bit more light on who the “<strong>forced seller”</strong> from part 1 might be.</p><h4>There’s Still Value in The Math</h4><p>Now, the other half of this is our <a href="https://www.alphanume.com/premarket-drop-risk">Pre-Market Drop Risk</a> dataset, where every trading morning a model takes in the microcaps that have been active before the open and ranks them by their chance of falling <strong>5% or more</strong> from the open to the close.</p><p>Rows land a few minutes after 9 AM ET and the history goes back to <strong>May 2024</strong>, so here’s what the list has done since then for names trading at <strong>$1 or more</strong>:</p><ul><li><strong>3,452</strong> flagged names over <strong>609</strong> trading days, about <strong>5</strong> a morning.</li><li><strong>65%</strong> of them fell from the open to the close.</li><li>The median one fell <strong>5.7%</strong>.</li><li>The top 3 names each day fell <strong>70%</strong> of the time, for an average short return of <strong>+4.7%</strong> per trade.</li></ul><p>You get all of that without reading a single filing, since the model <em>only</em> sees prices, which also means it has no idea who’s holding a convertible.</p><p>That’s where the <a href="https://www.alphanume.com/private-placements">Toxic Financing</a> dataset comes in, since it tracks the PIPEs (basically a fund buying stock straight from the company) and structured private placements disclosed in 8-Ks since 2024.</p><p>Each deal comes with:</p><ul><li>The pricing formula and the discount.</li><li>The investors behind it.</li><li>The resale registration dates.</li><li>A <strong>0-to-3 toxicity grade</strong>, where 3 means the price floats with the market.</li></ul><h4>Pull one out of a hat</h4><p>I wanted to see how dumb I could make this and still get paid, so I simulated the <em>laziest </em>possible version, where every morning you pick <strong>one</strong> name at random from the list, short it at the open, and cover at the close.</p><p>I ran that across all 609 days, 10,000 separate times, which is basically 10,000 different people each drawing their own name out of a hat every morning for about 2.5 years.</p><p>Even with zero filtering, <strong>88%</strong> of them finished in profit, averaging <strong>+1.7%</strong> per trade.</p><p>Then I made it one notch less dumb by <em>only</em> drawing from names on the list that also had a deal in the Toxic Financing feed over the prior year, which left 512 days with at least one of those names to draw from.</p><p>This time, <strong><em>all 10,000 runs</em></strong> finished in profit, averaging <strong>+4.1%</strong> per trade (chart below).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Pe5pM80UlXsxJhlGt_uDSA.png" /></figure><p>So out of 10,000 people pulling from those 2 lists at random, not a single one lost money. You can literally pick one of these names out of a hat, short it, and make money.</p><p>Interestingly enough, the edge keeps growing the tighter you make the filter, so here’s every name on the list sorted by what was sitting in its filings <em>before</em> the morning it got flagged:</p><ul><li><strong>Any name on the list:</strong> 65% fell, average short return <strong>+2.5%</strong> (3,452 trades).</li><li><strong>Any private placement in the past year:</strong> 67% fell, <strong>+4.8%</strong> (1,205 trades).</li><li><strong>A deal graded 2 or 3 in the past 90 days:</strong> 72% fell, <strong>+6.2%</strong> (302 trades).</li><li><strong>A resale registration that went effective in the past 90 days:</strong> 72% fell, <strong>+7.5%</strong> (209 trades). These come from our <a href="https://www.alphanume.com/dilution">Stock Dilution</a> feed, which flags registrations of shares existing holders already own.</li></ul><p>That last one is GYGY’s exact setup, and it’s the cleanest version of the mechanism, because the financier’s shares <em>just</em> became sellable and then the stock ran.</p><p>The names with a financier behind them also beat the rest of the list in <strong>every single year</strong> of the history (chart below).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*iP5fvwynjqoeFKXQOYiyXw.png" /></figure><h4>Why it’s still sitting there</h4><p><strong>So if it’s this easy, why doesn’t everyone do it already?</strong></p><p>Mostly because it checks almost every box on part 1’s list:</p><ul><li><strong>Too small.</strong> The median opening auction for one of these names trades about <strong>$73,000</strong>, which a fund running a few billion can’t even see, never mind trade</li><li><strong>Operationally annoying.</strong> You need a list by 9 AM, a locate before 9:30, a market-on-open order, and an afternoon cover, <em>every single day</em>.</li><li><strong>Short-side stigma.</strong> You’re betting against tiny companies that just announced a “strategic financing”</li></ul><p>The fourth friction, the slow payout, is the one that’s <strong>gone</strong>, since this trade opens at 9:30 and closes the <strong>same afternoon</strong>, so you know whether you were right before dinner and there’s no overnight borrow to pay.</p><h4>How to run it yourself</h4><ol><li>At about <strong>9:05 AM ET</strong>, pull the day’s list with min_price=1.</li><li>Pull every <a href="https://www.alphanume.com/private-placements">Toxic Financing</a> deal from the past year and keep the names that show up in both.</li><li>Check the borrow in the <a href="https://www.alphanume.com/short-locates">Short Locates</a> feed, which snapshots quoted locate costs before the open, and skip anything you can’t get.</li><li>Short what’s left with market-on-open orders, equal dollars per name.</li><li>Cover everything at <strong>2 PM ET</strong>, which is what our bot does.</li></ol><p>Steps 1 and 2 are a dozen lines of Python:</p><pre>import requests, pandas as pd<br><br>KEY = &quot;YOUR_ALPHANUME_KEY&quot;<br>B = &quot;https://api.alphanume.com/v1/&quot;<br>H = {&quot;X-API-Key&quot;: KEY}<br>today = pd.Timestamp.now(tz=&quot;America/New_York&quot;)<br><br># This morning&#39;s list, $1 and up<br>picks = pd.DataFrame(requests.get(B + &quot;premarket-drop-risk&quot;, headers=H,<br>    params={&quot;date&quot;: today.strftime(&quot;%Y-%m-%d&quot;), &quot;min_price&quot;: 1}).json()[&quot;data&quot;])<br><br># Every toxic financing deal from the past year<br>deals = pd.DataFrame(requests.get(B + &quot;capital/private-placements&quot;, headers=H,<br>    params={&quot;date_gte&quot;: (today - pd.Timedelta(days=365)).strftime(&quot;%Y-%m-%d&quot;)}).json()[&quot;data&quot;])<br><br># Names on the list with a financier behind them<br>shorts = picks[picks[&quot;ticker&quot;].isin(deals[&quot;ticker&quot;])]<br>print(shorts[[&quot;ticker&quot;, &quot;rank_for_date&quot;, &quot;prob_drop&quot;, &quot;px_at_trading&quot;, &quot;premarket_return_at_cutoff&quot;]])</pre><p>If you want the stricter version, add min_toxicity=2 to the second call and shrink the window to 90 days.</p><p>Keep each name small, since every so often one of these runs a few hundred percent before the close. The worst top-3 day in the history was PLAG in August, up <strong>443%</strong> from the open, and the top 3 still finished every year in profit.</p><h4>Final Thoughts</h4><p>Part 1 was the argument for why this kind of edge sticks around, and this is the part where you get to go <strong>collect it.</strong></p><p>What I like about this one is how little discretionary judgment it asks for, since the model finds the names that ran before the open, the filings tell you who’s waiting to sell into them, and the rest is basically a couple of orders and a timer.</p><p>If you want to try it, both datasets are in <a href="https://www.alphanume.com/pricing">Alphanume Pro</a>, which comes with a 3-day free trial, so you can pull a few mornings (or years) of the list and see it for yourself.</p><p>It also makes me wonder how far the same idea stretches, since at-the-market programs and warrant exercises come to mind first, and there’s probably a version of this for anyone with a reason to sell.</p><p>As always, thanks for reading, and we’ll see you in the next one.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=57f1748d34e7" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Everything You Need to Short Your First Stock [Code Included]]]></title>
            <link>https://quant-galore.medium.com/everything-you-need-to-short-your-first-stock-code-included-57efabb35b32?source=rss-f1c7c4923c52------2</link>
            <guid isPermaLink="false">https://medium.com/p/57efabb35b32</guid>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[technology]]></category>
            <dc:creator><![CDATA[Quant Galore]]></dc:creator>
            <pubDate>Tue, 27 Oct 2026 21:22:29 GMT</pubDate>
            <atom:updated>2026-10-27T21:22:29.381Z</atom:updated>
            <content:encoded><![CDATA[<h4>With the PDT rule gone, there’s no more reasons to be unprofitable.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DXtW-mnYb8BStHvIKnZIsA.png" /></figure><p>Until June 4th of this year, a US trader needed <strong>$25,000</strong> in their account to make more than three day trades in five trading days, which ended up keeping <strong>a lot </strong>of smaller accounts out of intraday shorting entirely.</p><p>FINRA <a href="https://tradezero.com/en-us/blog/the-usd25-000-day-trading-minimum-is-gone-here-s-what-it-means-for-you">scrapped the PDT rule</a> and replaced it with a new intraday margin framework, so the floor for short selling at a broker like TradeZero is now <strong>$2,000</strong> of equity.</p><p>It’s been a few months since the change, but yet there hasn’t been a public proliferation of small traders running the kinds of strategies that <strong>actually make money.</strong></p><p>Now, the question I get most about our core short selling strategy is basically <em>“how do I even start?”, </em>so I assume this is largely an <em>information issue</em>, where not enough people even know where to start looking.</p><p>For some quick context, our hallmark strategy has been a daily short of beaten-down small caps that now runs on a fully automated basis, at &gt;70% hit rates. I recommend checking out these two posts for more detail:</p><ul><li><a href="https://www.alphanume-research.com/p/abusing-microcaps-at-scale">Abusing Microcaps at Scale</a></li><li><a href="https://quant-galore.medium.com/running-sophisticated-trading-strategies-with-tradezero-code-included-f191a15111b2">Running Sophisticated Trading Strategies with TradeZero [Code Included]</a></li></ul><p>So today, I’m writing down every step in detail, from opening an account to placing your first short with a single Python script.</p><p>With that being said, let’s get right into it.</p><h4>What Shorting Even Is</h4><p>A short is just a trade that makes money when a stock goes <em>down</em>, and contains three components:</p><ol><li><strong>Borrow</strong> shares you don’t own, through your broker</li><li><strong>Sell</strong> them at today’s price</li><li><strong>Buy them back</strong> later, hopefully cheaper, and return them</li></ol><p>Your profit is the spread between where you sold and where you bought back, minus whatever the borrow cost you.</p><p>The payoff feels backwards at first, because a stock can only fall to zero, so the most a short can make is <strong>100%</strong>, while there’s no cap on how high a stock can climb or what a short can lose, which is basically why <strong>everything below is built around <em>small</em> size and getting out the <em>same day</em>.</strong></p><h4>Step 1: The account</h4><p>You need a <strong>margin account</strong>, which is essentially the kind of account that lets you borrow.</p><p>We use TradeZero for this, mainly because it lets you rent hard-to-borrow shares straight through its API, and here’s what <a href="https://tradezero.com/en-us/support/questions/tradezero-america-is-there-a-minimum-deposit-to-open-an-account">TradeZero America lists</a> today:</p><ul><li><strong>No minimum</strong> to open the account</li><li><strong>$500</strong> in account value before trading is turned on</li><li><strong>$2,000</strong> in equity to trade on margin or sell short</li><li><strong>$0</strong> commissions on stocks priced $1 or more, on NYSE, AMEX, or NASDAQ</li></ul><p>If you sign up through this <a href="https://registration.tradezero.com/?Referral=LKGE2VLMWO">referral link</a>, you’ll get <strong>$100</strong> once you fund the account and place one trade.</p><p>Once you’re approved, getting API keys only takes a few clicks, and their <a href="https://developer.tradezero.com/docs/documentation/api-keys">API key guide</a> has screenshots for each one:</p><ol><li>In the TradeZero portal, pick the <strong>ProBundle</strong> or <strong>FreeBundle</strong> platform plan, and turn on the <strong>API Trading</strong> add-on. The end-game is automated execution, so you realistically only need the Free bundle.</li><li>Sign the <strong>API Trading Agreement</strong> on the Agreements page.</li><li>Go to <strong>API Keys</strong> and generate a key pair.</li></ol><p>You’ll get a key ID and a secret, and the secret only shows <em>once</em>, so save it right away.</p><h4>Step 2: Borrowing the shares</h4><p>Before you can short anything, your broker has to find shares to lend you, and this is probably where most beginners get stuck because stocks fall into two buckets:</p><ul><li><strong>Easy to borrow:</strong> big, liquid names where the broker has plenty of shares, so there’s no extra step and no fee</li><li><strong>Hard to borrow:</strong> small, crowded names where shares are scarce, so you have to request a <strong>locate</strong> first. A locate is basically <em>renting </em>the right to borrow those shares.</li></ul><p>At TradeZero, you ask for a locate and get a quote, and you <a href="https://tradezero.com/en-us/blog/what-is-a-short-locate-how-stock-locates-work">only pay the fee once you accept it</a>, so checking a price costs you nothing.</p><p>That fee is a one-time charge for the day, which is why we cover before the close, since holding a hard-to-borrow short overnight means paying an annual borrow rate that, on these names, can run north of <strong>100%</strong>.</p><blockquote>We have a <a href="https://www.alphanume.com/short-locates">share locate dataset </a>so you can see historical daily prices, but most cost around a dollar per 100 shares.</blockquote><h4>Step 3: Finding something to short</h4><p>Every morning, a handful of small caps rip in pre-market on a phony press release, a reverse split, or just noise, and<strong> a lot</strong> of them give it back once the regular session opens.</p><p>Our <a href="https://www.alphanume.com/premarket-drop-risk">Pre-Market Drop Risk</a> model ranks those names on the odds each one falls <strong>5% or more</strong> from the open to the close, and the list lands around <strong>09:03 ET</strong>, ranked from most to least likely to drop.</p><p>Pulling the stats for the top 3 names every day since May 2024, shorting at the open and covering at the close:</p><ul><li><strong>947</strong> trades</li><li><strong>+4.7%</strong> average return per trade</li><li><strong>70%</strong> of them made money</li></ul><blockquote><strong>If you’d rather not stare at a pre-market scanner at 8 AM, the dataset does virtually</strong> <strong>ALL of the work for you.</strong></blockquote><h4>Step 4: Your first short, in Python</h4><p>Once you have the account, the margin, and the exact names to short, all that’s left is placing the order.</p><p>At a high-level, the process goes like this:</p><ol><li>Pull this morning’s top 3 names priced at $1 or more</li><li>Request locates for each name at your desired size, and drop the name if the fee is more than 5% of the position size</li><li>Short <strong>$500</strong> worth of each with a market-on-open order<br>** This puts you in the opening auction, which is essentially where everyone trades at one price at 09:30, so you skip the wide spread on a thin small cap</li><li>At 14:00 (2PM EST), buy it back with a limit order</li></ol><p>The full code for this is in the <a href="https://github.com/alphanume-markets/Alphanume-Strategy-Lab/tree/main/Strategies/Equities/Premarket%20Trading">Alphanume Strategy Lab</a>, but we’ll walk you through a few chunks of it:</p><p><strong>Going through each name and getting the locates:</strong></p><pre>def pick_a_name():<br>    picks = requests.get(f&quot;{ALPHANUME}/premarket-drop-risk&quot;, params={&quot;date&quot;: today, &quot;min_price&quot;: 1, &quot;max_rank&quot;: 3},<br>                         headers=ALPHANUME_HEADERS).json()[&quot;data&quot;]<br>    snapshot = requests.get(f&quot;{ALPHANUME}/short-locates&quot;, params={&quot;date&quot;: today, &quot;slot&quot;: &quot;am&quot;},<br>                            headers=ALPHANUME_HEADERS).json()[&quot;data&quot;]<br>    locate_status = {row[&quot;ticker&quot;]: row[&quot;status&quot;] for row in snapshot}<br><br>    for pick in sorted(picks, key=lambda row: row[&quot;rank_for_date&quot;]):<br>        if locate_status.get(pick[&quot;ticker&quot;]) in (&quot;no_shares&quot;, &quot;threshold&quot;):<br>            print(f&quot;{pick[&#39;ticker&#39;]}: no shares to borrow this morning, skipping&quot;)<br>            continue<br>        return pick[&quot;ticker&quot;], pick[&quot;px_at_trading&quot;]<br>    sys.exit(&quot;nothing shortable today&quot;)</pre><p>Now, the locate is the step that actually costs money, and since locates come in 100-share lots, the script rounds up, gets a quote, and cancels it if it’s too expensive:</p><pre>fee = offer[&quot;locatePrice&quot;] * locate_shares<br>if fee &gt; MAX_LOCATE_FEE * shares * price:<br>    requests.delete(f&quot;{TZ}/accounts/locates/cancel/accounts/{account_id}/quoteReqID/{quote_id}&quot;, headers=TZ_HEADERS)<br>    sys.exit(f&quot;{ticker}: locate costs ${fee:.2f} on a ${shares * price:.2f} position, too expensive&quot;)<br><br>requests.post(f&quot;{TZ}/accounts/locates/accept&quot;, headers=TZ_HEADERS,<br>              json={&quot;accountId&quot;: account_id, &quot;quoteReqID&quot;: offer[&quot;quoteReqID&quot;]})</pre><p>On this morning’s POM, a $500 position is <strong>384</strong> shares, which rounds up to a <strong>400</strong>-share locate, and this morning’s locate cost us <strong>$9.50</strong>, or roughly <strong>1.9%</strong> of the trade, so it cleared the 5% cap comfortably.</p><p>Finally, we send the short order, routed to ARCA because on TradeZero only ARCA and NYSE accept opening-auction orders:</p><pre>order = {&quot;symbol&quot;: ticker, &quot;securityType&quot;: &quot;Stock&quot;, &quot;side&quot;: &quot;Sell&quot;, &quot;openClose&quot;: &quot;Open&quot;,<br>         &quot;orderType&quot;: &quot;Market&quot;, &quot;timeInForce&quot;: &quot;AtTheOpening&quot;, &quot;orderQuantity&quot;: shares,<br>         &quot;route&quot;: &quot;ARCA&quot;, &quot;clientOrderId&quot;: f&quot;{ticker}-short-{int(time.time())}&quot;}</pre><p>Looking at the full code linked above will make more sense, but that’s pretty much all you need to be off and running.</p><p>I recommend going by hand for the first week to get comfortable with the code (<em>or just give it to your AI agent to double-check</em>), but once you’re comfortable, you can deploy the full thing on a $6 DigitalOcean droplet and check back in a few weeks to see how much you’ve made.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*SRdUzhUhVsFo9CsXkMnqYQ.png" /></figure><h4>Final Thoughts</h4><p>For most, the hardest parts of running profitable strategies were the $25,000 PDT gate and gaining the knowledge to step out of the long-only space.</p><p>Powers out of our hands solved the first issue, and I hope this post at the very least <em>helped </em>on the second front.</p><p>If you want to try this, Alphanume Pro has a <a href="https://www.alphanume.com/pricing">3-day free trial</a>, and both datasets in this post, <strong>Pre-Market Drop Risk</strong> and <strong>Short Locates</strong>, come with it, which is enough time to watch the list for a few mornings and run your first short on <strong>real data</strong>.</p><p>As always, thanks for reading, and we’ll see you in the next one.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=57efabb35b32" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Running Sophisticated Trading Strategies with TradeZero [Code Included]]]></title>
            <link>https://quant-galore.medium.com/running-sophisticated-trading-strategies-with-tradezero-code-included-f191a15111b2?source=rss-f1c7c4923c52------2</link>
            <guid isPermaLink="false">https://medium.com/p/f191a15111b2</guid>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <dc:creator><![CDATA[Quant Galore]]></dc:creator>
            <pubDate>Fri, 09 Oct 2026 13:50:33 GMT</pubDate>
            <atom:updated>2026-10-09T13:50:33.402Z</atom:updated>
            <content:encoded><![CDATA[<h4>And why there’s never been a better time to be a short seller.</h4><p>On September 28, our automated requested locates, shorted MSGY into the opening auction at <strong>$8.25</strong> and bought it back a little after 2 PM at <strong>$3.08</strong>, which is about <strong>+63%</strong> on the trade.</p><p>While this is only one example and it’s easy to cherry-pick, this same process happens <strong>every single trading session</strong>, day after day.</p><p>Now, we’ve talked about this before in <a href="https://www.alphanume-research.com/p/abusing-microcaps-at-scale">Abusing Microcaps at Scale</a>, but we’ve never actually broken down the full process required to actually run this. Specifically, the grittier parts like brokerage integration, how to set up the automation to reliably run, and everything required to do more than just backtest into infinity.</p><p>So today, we’ll be showing you the exact process we deploy daily, using <a href="https://tradezero.com/en-us?ref=quantgalore-medium">TradeZero </a>as our broker for short-selling and <a href="https://www.alphanume.com/?ref=quantgalore-medium">Alphanume </a>as our data provider.</p><p>We’ll also leave the full code for this in our Strategy Lab repository on GitHub for you to verify and test this out yourself.</p><p>So, without further ado, let’s get right into it.</p><h4>The Strategy</h4><p>Before diving straight first into the technical aspects, it’d be wise to start with how the strategy works.</p><p>At it’s core, we’re doing mean reversion within a toxic basket of stocks.</p><p>From a universe of the most toxic assets (serial diluters, microcaps, etc.), our model takes the cross-sectional pre-market return to output the 5 likeliest to drop more than 5% intraday, and returns its probabilities:</p><pre>    {<br>      &quot;date&quot;: &quot;2026-09-28&quot;,<br>      &quot;ticker&quot;: &quot;MSGY&quot;,<br>      &quot;rank_for_date&quot;: 2,<br>      &quot;prob_drop&quot;: 0.695,<br>      &quot;px_at_trading&quot;: 8.188,<br>      &quot;premarket_return_at_cutoff&quot;: 1.46<br>    }</pre><p>From there, the strategy executes as follows:</p><ol><li><strong>Around 09:08 ET</strong>, get the day’s list of names</li><li><strong>Before the open</strong>, short each one with a <em>market-on-open</em> order, which basically just drops your order into the opening auction where everyone trades at <strong>one price</strong>, so you skip the ugly bid-ask spread microcaps that would hurt you otherwise</li><li><strong>At 14:00 ET</strong>, buy everything back</li></ol><p>Since you’re in and out the same day, you never pay overnight borrow rates, which on these names can run north of <strong>200%</strong> a year.</p><p>Now, you <em>do</em> have to pay for a locate, which is essentially a one-time fee to reserve hard-to-borrow (HTB) shares for the day. Almost <strong>every </strong>name on this list is HTB, so the program skips any name where that fee gets too expensive (more on that in a sec).</p><h4>Step 1: The data</h4><p>The model’s picks publish every morning as Alphanume’s <a href="https://www.alphanume.com/premarket-drop-risk">Pre-Market Drop Risk dataset</a>, which is the exact feed our live bot reads. The endpoint is part of Alphanume Pro, so you’ll need a Pro API key for the requests below.</p><p>Each row is one ticker on one morning, and the keys ones are:</p><ul><li>rank_for_date: that day&#39;s ranking, with 1 being the most likely to drop</li><li>prob_drop: the model&#39;s probability of a <strong>5%+</strong> drop from open to close</li><li>px_at_trading: the last pre-market price at or before 09:00 ET, which we use for sizing</li><li>intraday_return_pct: the actual open-to-close move, filled in after the session so you can grade every pick</li></ul><p>Pulling the morning’s basket is pretty simple:</p><pre>import requests<br><br>API_KEY = &quot;alp_your_key_here&quot;<br>BASE = &quot;https://api.alphanume.com/v1&quot;<br><br>basket_request = requests.get(f&quot;{BASE}/premarket-drop-risk?date=2026-09-28&amp;min_price=1&amp;api_key={API_KEY}&quot;).json()<br><br>for row in basket_request[&quot;data&quot;]:<br>    print(row[&quot;ticker&quot;], row[&quot;rank_for_date&quot;], row[&quot;prob_drop&quot;], row[&quot;px_at_trading&quot;])</pre><pre>LABT 1 0.83 2.125<br>MSGY 2 0.695 8.188<br>PMAX 3 0.61 1.898<br>GYGY 4 0.6 1.274</pre><p>That morning, <em>all four</em> names finished the day down, anywhere from -<strong>28% to -63%</strong> from the open.</p><p>Again, one good morning proves nothing, so before you trust this, it’s smart to run a quick backtest yourself. Fortunately, you can just as easily pull the full dataset going back to 2024:</p><pre>import pandas as pd<br>import matplotlib.pyplot as plt<br><br>premarket_request = requests.get(f&quot;{BASE}/premarket-drop-risk?min_price=1&amp;api_key={API_KEY}&quot;).json()<br>history = pd.json_normalize(premarket_request[&quot;data&quot;]).dropna(subset=[&quot;intraday_return_pct&quot;])<br><br>daily_short_return = -history.groupby(&quot;date&quot;)[&quot;intraday_return_pct&quot;].mean().sort_index()<br>cumulative_return = daily_short_return.cumsum()<br><br>plt.plot(cumulative_return.index, cumulative_return.values)</pre><p>That’s pretty much it.</p><p>Going back a few years, we can model out a strategy that does everything above, where for all names &gt;$1, we short all in equal-weight each morning:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*HQNoaZ-x8c14DtYwUdZYaQ.png" /></figure><p>So, now that you have a grip on what the strategy actually does and how it works, let’s get started on executing in the real-world.</p><h4>Step 2: Get a TradeZero API key</h4><p>We use TradeZero because it lets you buy locates on hard-to-borrow names straight through its API, and getting a live key only takes a few clicks (their <a href="https://developer.tradezero.com/docs/documentation/api-keys">API key guide</a> has screenshots):</p><ol><li>Log into the TradeZero portal and go to <strong>Trade → Platform Selection</strong>.</li><li>Pick Pro Bundle or Free Bundle, and turn on the <strong>API Trading</strong> add-on.</li><li>Sign the agreements on the <strong>Agreements</strong> page, including the API Trading Agreement.</li><li>Go to <strong>API Keys → API Key Management → Generate API Keys</strong>.</li></ol><p>You’ll get a key ID and a secret, and the secret only shows <em>once</em>, so save it somewhere safe right away.</p><h4>Step 3: The algorithm</h4><p>Our script has three commands: check to test your keys, entry in the morning, and exit in the afternoon.</p><p>For sizing, since short-selling is heavily left-tailed (lots of small wins, occasional large losses), we stick to a constant 30% of NAV, where no individual name gets more than <strong>10%</strong>, as follows:</p><pre>DAILY_FRACTION_OF_EQUITY = 0.30<br>MAX_FRACTION_PER_NAME = 0.10<br><br>dollars_per_name = min(DAILY_FRACTION_OF_EQUITY * equity / len(basket), MAX_FRACTION_PER_NAME * equity)<br>shares = math.floor(dollars_per_name / price)</pre><p>So on a hypothetical $10,000 account with five names, each one gets $600, and the 10% cap only really kicks in on days when the basket has just one or two names.</p><p><strong>The locate check:</strong></p><p>For a hard-to-borrow name, the bot asks TradeZero for a locate quote, rounded up to the next 100 shares since locates come in 100-share lots, and <strong>if the fee would eat more than 5% of the position, it cancels the quote and skips the name:</strong></p><pre>locate_shares = math.ceil(shares / 100) * 100<br><br># ... request a quote for locate_shares and wait for TradeZero&#39;s offer ...<br><br>locate_cost = offer[&quot;locatePrice&quot;] * locate_shares<br>position_value = shares * price<br>if locate_cost &gt; MAX_LOCATE_COST_FRACTION * position_value:<br>    print(f&quot;{ticker}: locate costs ${locate_cost:.2f} on a ${position_value:.2f} position, too expensive&quot;)<br>    requests.delete(f&quot;{TRADEZERO_URL}/accounts/locates/cancel/accounts/{account_id}/quoteReqID/{quote_id}&quot;, headers=TRADEZERO_HEADERS)<br>    return False<br><br>requests.post(<br>    f&quot;{TRADEZERO_URL}/accounts/locates/accept&quot;,<br>    headers=TRADEZERO_HEADERS,<br>    json={&quot;accountId&quot;: account_id, &quot;quoteReqID&quot;: offer[&quot;quoteReqID&quot;]},<br>)</pre><p>Interestingly enough, this check skipped the <em>top-ranked</em> name on that same September 28 morning, because LABT’s locate was <strong>$0.125 a share</strong>, and once you round up to a 100-share lot, on our small position that worked out to <strong>11%</strong> of the trade.</p><p>While this isn’t totally necessary as sometimes the best positions are the ones with the most expensive locates, it goes a long way in managing overall execution costs.</p><p>Once the borrow is in hand, the order itself is a plain market-on-open sell:</p><pre>order = {<br>    &quot;symbol&quot;: ticker,<br>    &quot;securityType&quot;: &quot;Stock&quot;,<br>    &quot;side&quot;: &quot;Sell&quot;,<br>    &quot;openClose&quot;: &quot;Open&quot;,<br>    &quot;orderType&quot;: &quot;Market&quot;,<br>    &quot;timeInForce&quot;: &quot;AtTheOpening&quot;,<br>    &quot;orderQuantity&quot;: shares,<br>    &quot;route&quot;: OPENING_AUCTION_ROUTE,<br>    &quot;clientOrderId&quot;: f&quot;{ticker}-short-{int(time.time())}&quot;,<br>}<br>result = requests.post(f&quot;{TRADEZERO_URL}/accounts/{account_id}/order&quot;, headers=TRADEZERO_HEADERS, json=order).json()<br>print(f&quot;{ticker}: short {shares} at the open -&gt; {result.get(&#39;orderStatus&#39;)} {result.get(&#39;text&#39;) or &#39;&#39;}&quot;)</pre><p>The route is ARCA because on our account only ARCA and NYSE offered AtTheOpening orders.</p><p>At 14:00 (2PM EST), the bot buys back every short with a limit order <strong>1%</strong> above the last price TradeZero shows, then waits 30 seconds, and anything still open gets cancelled and re-sent another 1% higher, for up to ten rounds:</p><pre>for attempt in range(1, 11):<br>    # ... cancel any unfilled covers from the last round, then re-read what&#39;s still short ...<br><br>    # TradeZero serves no quotes, so the last price comes from its P&amp;L feed.<br>    pnl_rows = requests.get(f&quot;{TRADEZERO_URL}/accounts/{account_id}/pnl&quot;, headers=TRADEZERO_HEADERS).json()[&quot;pnl&quot;]<br>    last_prices = {row[&quot;symbol&quot;]: abs(row[&quot;exposure&quot;]) / shorts[row[&quot;symbol&quot;]] for row in pnl_rows if row[&quot;symbol&quot;] in shorts}<br><br>    for ticker, shares in shorts.items():<br>        limit_price = round(last_prices[ticker] * (1 + 0.01 * attempt), 2)<br>        order = {<br>            &quot;symbol&quot;: ticker,<br>            &quot;securityType&quot;: &quot;Stock&quot;,<br>            &quot;side&quot;: &quot;Buy&quot;,<br>            &quot;openClose&quot;: &quot;Close&quot;,<br>            &quot;orderType&quot;: &quot;Limit&quot;,<br>            &quot;limitPrice&quot;: limit_price,<br>            &quot;timeInForce&quot;: &quot;Day&quot;,<br>            &quot;orderQuantity&quot;: shares,<br>            &quot;route&quot;: COVER_ROUTE,<br>            &quot;clientOrderId&quot;: f&quot;{ticker}-cover-{int(time.time())}&quot;,<br>        }<br>        requests.post(f&quot;{TRADEZERO_URL}/accounts/{account_id}/order&quot;, headers=TRADEZERO_HEADERS, json=order)<br><br>    time.sleep(30)</pre><p>We went with a 14:00 exit as opposed to just the close since, as of writing, TradeZero’s API doesn’t accept market-on-close orders.</p><p>In our own executions, we found that covering at 14:00 gave up about <strong>3 points</strong> of annual return for a slightly better Sharpe ratio, so it’s a trade-off we’re willing to make.</p><p><strong>Step 4: A $6 server</strong></p><p>Although you can run this on your laptop, you have to keep in mind that it: sleeps, reboots for updates, and loses Wi-Fi. The opening auction has a strict cutoff and all of these calculations happen less than 25 minutes before it, so if you’re going to run this seriously, you need a <strong>real server.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*AdnX9NaFFYVWB3lA-ca7Dg.png" /></figure><p>We run ours on a DigitalOcean droplet, which is just a rented, always-on Linux machine that lives in a data center, and the <a href="https://www.digitalocean.com/pricing/droplets">1 GB droplet</a> runs <strong>$6 a month.</strong></p><p>To get started <em>(if you’ve never done this before, you should honestly just hand this part over to Claude/Codex)</em>:</p><ol><li>Create a droplet with <strong>Ubuntu 24.04</strong>, the 1 GB plan, and an SSH key.</li><li>Log in and set the clock to New York time:</li></ol><pre>ssh root@YOUR_DROPLET_IP<br>timedatectl set-timezone America/New_York<br>systemctl restart cron<br>apt update &amp;&amp; apt install -y python3-venv</pre><p>3. Copy over the script (scp from your own machine works fine) and make a .env file with your TradeZero key ID, TradeZero secret, and Alphanume key:</p><pre>mkdir bot &amp;&amp; cd bot<br># from your own computer, in another terminal:<br>#   scp production.py root@YOUR_DROPLET_IP:/root/bot/<br>python3 -m venv venv<br>venv/bin/pip install requests pytz<br>nano production.py   # paste your keys into the three lines at the top<br>venv/bin/python production.py check</pre><p>check is read-only, since it just prints your TradeZero account and today&#39;s basket, so you know both keys work before anything trades.</p><p>4. Schedule it with cron, which is basically Linux’s built-in scheduler, by running crontab -e and adding these two lines:</p><pre>5 9 * * 1-5  cd /root/bot &amp;&amp; venv/bin/python production.py entry &gt;&gt; bot.log 2&gt;&amp;1<br>0 14 * * 1-5 cd /root/bot &amp;&amp; venv/bin/python production.py exit  &gt;&gt; bot.log 2&gt;&amp;1</pre><p>From then on, it starts at 09:05 every weekday, covers at 14:00, and writes <strong>everything</strong> to bot.log. This log is important as you can track execution times, PnL, and everything needed for a real timestamped track-record.</p><p>On market holidays the basket will come back empty, so the bot keeps checking until 09:20, prints that there are no names, and exits.</p><h4>Final Thoughts</h4><p>The full script is on GitHub, in the <a href="https://github.com/alphanume-markets/Alphanume-Strategy-Lab/tree/main/Strategies/Equities/Premarket%20Trading">Pre-Market Quantitative Trading on TradeZero</a> repo.</p><p>The way I’d start is to plug in your keys, run check, watch a few mornings with tiny size, and add the guardrails as you hit the problems they solve, which is pretty much how ours got built.</p><p>The one piece you <em>can’t</em> rebuild over a weekend is the daily list itself, and that’s what <a href="https://www.alphanume.com/pricing">Alphanume Pro</a> is for. It comes with the full Pre-Market Drop Risk history, the REST API the bot calls, and more than 25 other proprietary datasets just like this one.</p><p>If you want to follow us along for more research like this, you can see the rest of our posts over at <a href="https://www.alphanume-research.com/?ref=quantgalore-medium">Alphanume Research</a>.</p><p>As always, thanks for reading, and we’ll see you in the next one.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f191a15111b2" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Monetizing The Golden Age of Short Selling]]></title>
            <link>https://quant-galore.medium.com/monetizing-the-golden-age-of-short-selling-aab473122296?source=rss-f1c7c4923c52------2</link>
            <guid isPermaLink="false">https://medium.com/p/aab473122296</guid>
            <category><![CDATA[trading]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[finance]]></category>
            <category><![CDATA[technology]]></category>
            <dc:creator><![CDATA[Quant Galore]]></dc:creator>
            <pubDate>Sun, 30 Aug 2026 17:37:55 GMT</pubDate>
            <atom:updated>2026-08-30T17:37:55.066Z</atom:updated>
            <content:encoded><![CDATA[<h4>It’s too small for the funds and too much work for everyone else, including you.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8bMc0vlVOzdBhCR0kXGyoA.png" /></figure><p>Somewhere between 70 and 100 reverse stock splits execute in the US every month, and almost all of them start as sub-$1 microcaps trying to game their way out of a Nasdaq delisting.</p><p>I started collecting them into a calendar earlier this year, mostly out of curiosity, but the numbers around them turned out to be so clean and predictable it made it <strong><em>impossible </em></strong>not to take a more serious look.</p><blockquote><em>That calendar now lives in our </em><a href="https://www.alphanume.com/?dataset=reverse-splits#dashboard"><em>enriched reverse-split dataset</em></a></blockquote><p>Eventually, that experiment led to another experiment, which led to another one after that, and is ultimately why I can say with <strong>extreme</strong> confidence that there’s probably <em>never </em>been a better time for short selling.</p><p>Now, in just the title alone, we’ve already made pretty big claims about how good this space is, so to <em>actually</em> back up those words, let’s start from the beginning.</p><h4>It doesn’t get easier than a reverse split</h4><p>When a stock closes under $1 for 30 straight sessions, Nasdaq sends out a deficiency notice. In order to stay listed on the exchange, all the company has to do is bring its <em>price</em> back up to that $1 minimum.</p><p>Note how <em>price</em> is emphasized; not market value, revenue, or anything beyond just the surface-level optic of <em>price</em>.</p><p>Knowing this, the de-facto solution for these companies is a <strong>reverse split, </strong>where they consolidate 10, 30, or even 50 shares into one, and the delisting problem disappears overnight.</p><p>The company itself doesn’t change at all and still has the same cash burn, the same need to continuously dilute, and the million other problems that got it there in the first place.</p><p>To give a relatable example, Beyond Meat ($BYND) has been doing this all year:</p><ul><li>The share count went from <a href="https://www.investing.com/analysis/beyond-meat-stock-crashes-56-as-debtforequity-swap-triggers-massive-dilution-200668432">76.5 million to 515.8 million</a></li><li>Once the stock was trading in the thirty-cent range, the company <a href="https://investors.beyondmeat.com/news-releases/news-release-details/beyond-meat-announces-effectiveness-1-30-reverse-stock-split">executed a 1-for-30 reverse split on August 14</a> to beat the August 31 compliance deadline</li></ul><p>Now, one of the challenges in shorting broken companies is that some of the best candidates are often already trading below $1, which most brokers don’t allow you to do.</p><p>However, if that candidate just executed a reverse split and became eligible for shorting again, one can ask a pretty simple question:</p><blockquote><strong>“If the business model is still broken and the company is still expected to perform poorly, couldn’t you just continue shorting it now that the restriction is gone?”</strong></blockquote><p>Intrigued by the question, I pulled the data for every reverse split from January 2024 through July 2026, with a crude strategy of shorting at the <em>next</em> session’s open and holding for 30 trading days.</p><p>To filter out un-tradeable noise, I also applied a $1 minimum price and a $100k minimum average daily dollar volume, so sub-dollar zombies with no borrow don’t give misleading results.</p><p>For this first, crude experiment, the numbers weren’t too bad:</p><ul><li><strong>1,373 tradeable events</strong>, out of about 2,700 raw splits (the rest had no listed price data or were under the sanity floor described above)</li><li>Mean 30-day short return <strong>+7.7%</strong>, median <strong>+16.6%</strong>, hit rate <strong>69%</strong></li><li>The mean and median have a large spread due to the left-tail nature of short positions, where the worst single event, BNAI, cost the short <strong>over 2,000%</strong> of the position</li></ul><blockquote>Interestingly, academia found the same drift decades ago, where <a href="https://www.researchgate.net/publication/227635654_Return_Performance_Surrounding_Reverse_Stock_Splits_Can_Investors_Profit">a 2008 Financial Management study</a> of 1,612 reverse splits showed <strong>significant negative abnormal returns</strong> for three years after the split.</blockquote><p>Now, one of the advantages of doing this for some time is that you gain the ability to tie an older experiment to the results of a new experiment, allowing for a more effective version that other participants couldn’t build.</p><p>We’ve covered <a href="https://www.alphanume-research.com/p/a-junior-quants-guide-to-getting">similar effects existing in stock dilution events</a>, so that made me curious to see what would happen if we segmented these reverse split events by those who <strong>also</strong> have a history of repeat dilution.</p><p>Fortunately, that extra <em>umph</em> is what made it a viable strategy:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*cazrcwL6WVVZ0lHB.png" /></figure><p>We found that shorting reverse split events in companies with a history of dilution returned <strong>+15.9%</strong> (9.9% net after a fixed 50% annualized borrow cost assumption) per position over 30 days, at a<strong> 77%</strong> hit rate.</p><h4>Machine learning still has some juice</h4><p>With renewed confidence that short-side edge still exists in relatively untapped areas, I went through some of our old files to see if anything useful still held up.</p><p>Back in the early days, when machine-learning models were my first weapon of choice, I remember building out a classification model to track a market phenomenon you’ve probably seen before:</p><ol><li>Stock XYZ with a $20m market cap is up <strong>150%+</strong> in early pre-market and gets plastered over 100 retail-focused screeners (e.g., “Pre-market movers”)<br>* In the best case, it’s tied to a vague “AI” or “crypto” press release<br>* In most cases, you wouldn’t be able to find a real catalyst even if you tried</li><li>By the end-of-day close, the stock has either gone negative or is <strong>substantially</strong> down from its pre-market headline</li><li>This repeats the next day, but with a new stock</li></ol><p>Most of this is attributable to shaky price discovery during illiquid periods, but a meaningful chunk is tied to <a href="https://www.justice.gov/usao-sdny/pr/us-attorney-announces-recovery-195-million-victims-china-based-pump-and-dump-schemes">bad actors</a> running pump-and-dump schemes.</p><p>We built a model for exactly that, where given <strong>only </strong>information available 30 minutes prior to the open (e.g., return distribution, size), we’d have a probability of whether the given premarket ticker would drop by 5% or more by close.</p><blockquote>We now publish those daily rankings through <a href="https://www.alphanume.com/?dataset=premarket-drop-risk#dashboard">Alphanume’s Pre-Market Drop Risk dataset</a>, with each name’s model probability and subsequent outcomes.</blockquote><p>To see if it still worked, we re-ran the strategy over the same multi-year test period as above, where we’d short at the 9:30 open (MOO auction order) and buy back the position at close (MOC order).</p><p>Surprisingly, <em>it still works:</em></p><ul><li><strong>865 trades</strong> across 485 sessions since May 2024</li><li>Mean return <strong>+4.3% per trade</strong>, with a <strong>70%</strong> hit rate</li><li>Concentrating helps, as the day’s top-1 highest probability name alone averaged <strong>+6.1%</strong> per trade</li><li>Extending the position duration also helps, where holding the same shorts for 5 sessions averaged <strong>+11.1%</strong></li></ul><p>The equity curve (below) immediately raised every <strong><em>“you probably overfit somewhere”</em></strong> flag in the book, but after trying to break it some more and not getting anywhere, I’ll just let you be the judge <em>(replication instructions in the final section)</em>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*JVUEtUIKhqqQlEDn.png" /></figure><p>Now, being transparent, the reason we didn’t keep running this model when we had it is that this is almost entirely in the realm of<strong> low-capacity</strong> trades:</p><ul><li>Many of these companies are low-volume from the start, so any position size north of even $10k can sometimes be 5%+ of historical ADV, which <strong>will </strong>give you partial fills when using auction orders</li><li>Full automation is difficult as these are <strong>all</strong> HTB, so even though locate fees are manageable at places like TradeZero and Centerpoint (e.g., $0.04 per 100 shares), you still have to actually press the button</li><li>When running this live, we used CSV basket orders to speed things up, but even that was tough as any partially filled leg threw off the target equal weight allocation</li></ul><p>So, while this can still work magic for a few thousand bucks, we’d be lying if we said it’s a million-dollar compounding machine.</p><h4>Pounding the table on dilution, again</h4><p>This post is already getting a bit lengthy, but we’d be doing a massive disservice to you if we didn’t mention the last leg that we’ve already been running live.</p><p>We’ve <a href="https://www.alphanume-research.com/p/most-quant-newsletters-would-never">written about it recently</a>, but shorting small caps that file dilutive S-1 registrations is still one of the lowest hanging fruits in this space.</p><p>For quick context, an S-1 registers new shares in companies that usually need the money <strong>badly</strong>. Despite the announcement being priced-in rather quickly, shares continue to go down abnormally as the new lack of shareholder incentive combines with the already dim outlook on the company’s future.</p><p>A few days ago, I publicly shared the performance (link above) to show that the edge still survives out of sample:</p><ul><li><strong>301 tradeable filings</strong>, mean 30-day short return <strong>+26.3%</strong>, median <strong>+31.5%</strong>, hit rate <strong>82%</strong></li></ul><p>Again, being transparent, we recently tried the same strategy with the cousin of this (shelf registrations) and found it wasn’t that effective, running at <strong>+1.8%</strong> on average, with a 57% hit rate.</p><blockquote>You can <a href="https://www.alphanume.com/?dataset=dilution#dashboard">inspect a delayed sample of the S-1 filings here</a>, including the company, shares registered, and market cap, without creating an account.</blockquote><h4>You’ll blow up if you don’t combine them</h4><p>In short selling, you <strong>will </strong>eventually have a position that goes up n standard deviations against you. It might not happen in the first 100 trades, but it is almost a guarantee that it’ll happen at some point.</p><p>The best solution I’ve found for this is <em>“simply”</em> running the multiple strategies as a diversified book, so that one day’s strategy loss can be offset not just by the smaller allocated size, but ideally also by the gains of another strategy.</p><p>“Simply” in quotes, as each strategy might have non-overlapping exposure periods. For instance, the pre-market list updates every morning, but reverse splits execute in weekly clumps, while S-1s arrive most evenings.</p><p>To make it easier for you, we can walk through a sample framework:</p><ol><li>A <strong>$30,000</strong> account puts $1,000 behind each sleeve each morning, split equally across whatever positions that sleeve has open that day</li><li>A sleeve with nothing on keeps its $1,000 in cash</li><li>A <em>position’s</em> one-day loss is capped at -100% of its slice</li><li>Position sizes stay fixed in dollars, with <strong>no compounding</strong> (compounding full size in microcap shorts is unrealistic)</li></ol><p>Over 561 sessions from June 2024 through August 2026, the combined book of strategies grew from $30,000 to <strong>$67,307 (+124%)</strong>, while dripping the same $3,000 a day into SPY finished at $31,227 (+4%).</p><p>Broken down, that comes out to roughly $16.5k a year of P&amp;L against $3,000 of gross short exposure, with 72% of days positive (chart below).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*nIFzHwA8Sb0Wq_xK.png" /></figure><h4>Final Thoughts</h4><p>None of the inputs here are secret, as reverse splits are announced in press releases, S-1s and shelfs sit on EDGAR, and pre-market movers are on every dashboard.</p><p>The reason they aren’t talked about as much is that putting it all together took deep domain experience and <strong>hard </strong>data work.</p><p>However, all of this is now accessible through an API call, which is pretty much my whole case for framing this as the golden age.</p><p>All three datasets covered here are available through <a href="https://www.alphanume.com/pricing">Alphanume Pro</a>, with their available history and ongoing updates through the dashboard, REST API, and hosted MCP server, at $99/month.</p><p>If you want to run or model any of this yourself, you can go two ways:</p><p><strong>Manual pipeline</strong></p><ol><li>Pull the event calendar (<a href="https://www.alphanume.com/?dataset=reverse-splits#dashboard">reverse splits</a>, <a href="https://www.alphanume.com/?dataset=dilution#dashboard">S-1s</a>, or the <a href="https://www.alphanume.com/?dataset=premarket-drop-risk#dashboard">morning drop-risk</a>)</li><li>Enter at the next session’s open, and apply the same tradeability floor ($1 and $100k daily dollar volume is what I used)</li><li>Hold 30 trading days for the filing-driven trades, or close at the bell for the pre-market tranche</li><li>Before sizing anything, get a real borrow quote to simulate the interest costs</li></ol><p><strong>Give it to Claude</strong></p><p>We run a hosted <a href="https://www.alphanume.com/docs#mcp-server">MCP server</a>, and the setup takes about a minute:</p><ol><li>Open Settings in Claude, then Connectors, and click Add custom connector</li><li>Paste https://mcp.alphanume.com/mcp as the server URL and confirm</li><li>Click Connect and sign in with your Alphanume account</li></ol><p>From there, all 25 datasets sit one plain-language question away, so here’s a few prompts worth stealing:</p><ul><li><strong>Have it build the production plumbing:</strong> <em>“watch the reverse-split calendar and alert me the day before any split with an S-1 or shelf on file executes”</em></li><li><strong>Have it go deeper than I did here:</strong> <em>“re-run the reverse-split short with a 60-day hold and a hard-to-borrow fee assumption, and show me where the edge dies”</em></li><li><strong>Or have it hunt for an edge that’s fully yours:</strong> <em>“cross reference the premarket drop-risk list against the SEC filing intensity and Wikipedia-attention feeds, and show me whatever filter survives”</em></li></ul><p>So, hopefully we’ve given you enough evidence to back up our confidence on this. We’ve long believed that there’s a much bigger world out there than the vanilla “buy large-caps” you see on Bloomberg, and for once, the data actually agrees.</p><p>As always, thanks for reading, and we’ll see you in the next one.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=aab473122296" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[If I Had to Learn Quantitative Trading From Scratch]]></title>
            <link>https://quant-galore.medium.com/if-i-had-to-learn-quantitative-trading-from-scratch-6d54b1b0441c?source=rss-f1c7c4923c52------2</link>
            <guid isPermaLink="false">https://medium.com/p/6d54b1b0441c</guid>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[quantitative-finance]]></category>
            <category><![CDATA[machine-learning]]></category>
            <dc:creator><![CDATA[Quant Galore]]></dc:creator>
            <pubDate>Thu, 27 Aug 2026 21:48:20 GMT</pubDate>
            <atom:updated>2026-08-27T21:48:20.346Z</atom:updated>
            <content:encoded><![CDATA[<h4>Seven days took one learner from zero proper backtests to running a mini options desk that actually works.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Or4sztE_9ReOCiFrbavtBQ.png" /></figure><p>A month after <a href="https://learn.alphanume.com/">Alphanume Learn</a> went live, one of the early learners sent me a progress update that made the whole launch click.</p><p>Before starting, they had never written what they considered a proper backtest. Seven days later, they were building new options-strategy research with proprietary data, using an agent to write the plumbing, and checking the assumptions before trusting the next 15-Sharpe result.</p><p>It wasn’t long before we had a follow-up call and I learned that he is currently doing <em>very </em>well.</p><p>That was one learner’s experience, and one week is obviously a tiny sample, but what I mainly care about was the change in what they could <em>do</em>: they went from just reading quant material to <strong>running </strong>a research process they could inspect, run again, and eventually deploy into the real-world.</p><p>I’ve heard similar stories from other people using Learn, where most quant content helped people <em>know </em>more things, but not necessarily <strong><em>do </em></strong>more things.</p><p>So, over the past few weeks, we’ve doubled-down and made some upgrades.</p><h4>You Can Own the Course Now</h4><p>When I <a href="https://quant-galore.medium.com/the-self-taught-quant-curriculum-filtered-f313b06f80b6">first wrote about the curriculum on Medium</a>, Learn had a few lessons and came bundled with an Alphanume Pro subscription.</p><p>The curriculum has since grown to <strong>66 lessons across 12 modules</strong>, and the full course is now available on its own for <strong>$499 once</strong>. Your course access doesn’t expire, and every future revision and addition to the course is included.</p><p>If you finish in a month, revisit the volatility module next earnings season, and come back to the agent workflow six months later, the same purchase covers<strong> all of it.</strong></p><blockquote>For reference, premium algorithmic-trading education can cost several thousand dollars. <a href="https://www.getsmarter.com/products/oxford-algorithmic-trading-programme">Oxford’s six-week programme</a> currently lists at $2,859, while <a href="https://www.quantinsti.com/admissions">QuantInsti’s EPAT</a> begins at $7,799 for US buyers.</blockquote><p>Most self-taught quants already have more material than they can finish: notebooks, saved threads, half a Python course, a strategy video they meant to reproduce, and a folder called backtests where every file sits on its own and answers completely different questions.</p><p>Learn gives those pieces an <strong>order</strong>, then makes you <strong>use </strong>them:</p><p>From our own experience and conversations, we know that self-taught researchers can lose <em>months </em>figuring out that order before they quit too early and move onto something else:</p><ul><li>You can learn pandas from one place, option mechanics from another, and backtesting from a third, then discover that nobody explained which timestamp you <strong>actually </strong>could have traded at or that your historical universe was contaminated by survivors only.</li><li>If you’re serious about quantitative trading, you <strong>need </strong>to know those things <strong>before </strong>risking a single dollar.</li></ul><p>The course gives the same exciting strategies you care about, but builds with those common mistakes in mind from the start.</p><p>By the time you reach the earnings screen or the dilution study, you already have a research database, a point-in-time mindset, and a checklist designed to ruin an obviously wrong result long before it reaches your account.</p><h4>What the $499 Includes</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*O1bwc3gpz48GjL_kkTh0wA.png" /></figure><p>The full <a href="https://learn.alphanume.com/courses/systematic-trader">Systematic Trading with Market Data syllabus</a> runs from <em>why </em>an edge can exist to the machinery required to operate it.</p><p>You get:</p><ul><li><strong>66 lessons</strong> across 12 modules, taking roughly 18 hours at the planned pace.</li><li><strong>Interactive Python exercises</strong> that run in the browser against real market data.</li><li><strong>Quizzes and graded output</strong>, including questions designed to catch bad <em>reasoning </em>rather than reward memorizing vocabulary.</li><li><strong>Saved progress and a final capstone</strong> where you build and defend your own event study.</li><li><strong>The data required by the course exercises</strong>, so you can complete the curriculum without buying another data plan.</li><li><strong>Future course revisions and additions</strong>, included with the original purchase.</li></ul><p>Having some basic Python knowledge helps, but it’s not a requirement. Since the course runs from the browser, you completely bypass the hours of Python environment setups, conflicting dependencies, broken kernels, and so on.</p><p>If you really wanted to, you could complete the entire thing from your phone.</p><p>By the end, you’ll have a <strong>lock </strong>on the market segments most people will <em>never </em>understand, let alone exist:</p><ul><li><strong>Volatility and catalysts:</strong> IV/HV premium, IV rank, earnings moves, and 0-DTE structures</li><li><strong>Corporate events:</strong> dilution, shelf registrations, de-SPACs, defaults, and lock-up expirations</li><li><strong>Signals and portfolios:</strong> dividends, momentum, attention data, regime gates, sizing, and correlation</li><li><strong>Operations:</strong> scheduled delivery, agent-assisted research, code guardrails, and the final capstone</li></ul><p>You can <a href="https://learn.alphanume.com/courses/systematic-trader/price-as-consensus">start the free module here</a>, run the work, and decide from the actual experience whether the format fits how you learn.</p><p>If you already know you want the full sequence, you can <a href="https://learn.alphanume.com/signup">buy permanent access for $499</a>. Active Alphanume Pro members already have access and can simply sign in.</p><p>Both links stay open, so you can work through the free module before deciding.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*9f78usGUkc8CMDhHBvvXyQ.png" /></figure><h4>Final Thoughts</h4><p>The early Learn results have been gratifying because the strongest feedback has focused on <em>real-world </em><strong><em>output</em></strong>.</p><p>People are talking about the strategies they can now deploy, the data they can query, and the agent workflows they can audit.</p><p>That’s exactly what I wanted the course to produce and I’m glad to see adoption have a real impact on people.</p><p>I’m also curious to see what more people end up building once the research process feels routine enough to be a launchpad for their own ideas.</p><p>As always, thanks for reading, and we’ll see you in the next one.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6d54b1b0441c" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[We Built a Claude MCP Server for Quant Trading Research]]></title>
            <link>https://quant-galore.medium.com/we-built-a-claude-mcp-server-for-quant-trading-research-c69f53e52b4d?source=rss-f1c7c4923c52------2</link>
            <guid isPermaLink="false">https://medium.com/p/c69f53e52b4d</guid>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[technology]]></category>
            <dc:creator><![CDATA[Quant Galore]]></dc:creator>
            <pubDate>Wed, 26 Aug 2026 20:26:32 GMT</pubDate>
            <atom:updated>2026-08-27T04:34:27.872Z</atom:updated>
            <content:encoded><![CDATA[<h4>Claude writes better research when you stop feeding it 20-year-old papers.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*MZxj2jOaqi-5LY4loKG_CQ.png" /></figure><p><a href="https://www.alphanume.com/">Alphanume</a>’s new MCP server gives Claude access to <strong>25 quantitative trading datasets</strong> through one connector URL.</p><p>I built it because I kept hitting the same snag: Claude could write a decent backtest, then I had to stop, find the right dataset, check its schema, write the request, and explain when each observation became available.</p><p>Now, the model can handle that retrieval loop directly inside the conversation.</p><blockquote>Quick disclosure before we get into it: <strong>I built Alphanume</strong>, so this is absolutely a product post. I also publish <a href="https://www.alphanume-research.com/">the methodology, samples, weak results, and caveats behind the data</a> since even a frontier-model attached to questionable history just helps you produce questionable research faster.</blockquote><h4>The 60-Second Setup</h4><p>The recommended Claude connection uses OAuth, which means there is no API key to copy into a config file. Here is the full setup from the current <a href="https://www.alphanume.com/docs">Alphanume MCP documentation</a>:</p><ol><li>Open <strong>Settings</strong> in Claude, then open <strong>Connectors</strong>.</li><li>Click <strong>Add custom connector</strong>.</li><li>Paste https://mcp.alphanume.com/mcp as the remote MCP server URL.</li><li>Click <strong>Connect</strong> and sign in with your Alphanume account in the browser window.</li><li>Return to Claude. The <strong>25 Alphanume tools</strong> are now available in normal conversations.</li></ol><p>The connector follows your signed-in Claude account across web, desktop, mobile, and Claude Code, so you only add it once (diagram below).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pRmjbUduVSSHGi3KfZIURQ.png" /></figure><h4>What Claude Actually Gets</h4><p>An MCP server is basically just a tool menu. Each tool tells Claude what a dataset does, which parameters it accepts, and what fields come back.</p><p>You can ask a market question in plain English, and Claude decides whether it needs IV/HV Premium, historical optionable tickers, the S&amp;P 500 risk regime, stock dilution records, or some combination of them. Alphanume returns the same rows available through the REST API, including the observation dates and point-in-time history.</p><p>To further break things down:</p><ul><li><strong>Claude handles retrieval and assembly:</strong> it selects tools, constructs calls, joins results, and writes code.</li><li><strong>Alphanume supplies the research layer:</strong> fixed historical observations, derived market features, event records, and consistent response conventions.</li><li><strong>You own the research decision:</strong> assumptions, execution timing, costs, validation, and whether a result deserves capital.</li></ul><p>Claude gets better evidence, and you still make the portfolio decisions.</p><h4>Start With the Vol Screen</h4><p>Here is the first prompt I would use. You can paste it into a fresh Claude conversation after connecting Alphanume:</p><pre>Use the Alphanume MCP. On the latest settled date available to my account:<br><br>1. Retrieve the point-in-time optionable equity universe.<br>2. Find the 10 stocks in the richest decile of IV/HV ratio.<br>3. Use only finalized volatility observations.<br>4. Add the S&amp;P 500 risk regime for that observation date.<br>5. Mark any stocks that also appear in Next-Day Movers.<br><br>Return a compact table with ticker, observation date, IV, HV, IV/HV spread,<br>IV/HV ratio, cross-sectional rank, risk regime, and mover status. State the<br>tool and filters used for each field. Do not recommend a trade.</pre><p>Claude should reach for historical optionable tickers, IV/HV Premium, the S&amp;P 500 risk regime, and Next-Day Movers.</p><p>What makes this useful is the saved time in the <em>combination</em> of the already useful datasets. You get names where options look rich, the market regime surrounding them, and a separate model’s view of whether each name may move unusually far next session.</p><h4>Now Check What You Missed</h4><p>High implied volatility usually has a reason. Sometimes the reason is obvious, and sometimes it’s sitting in a filing you didn’t even know to search for.</p><p>Run this second prompt against the tickers Claude just returned:</p><pre>For the tickers in the prior table, use Alphanume to check the 30 calendar days<br>ending on each observation date for:<br><br>- dilutive filings and shelf registrations<br>- abnormal SEC filing intensity<br>- SEC trading suspensions<br>- disclosed cyber incidents<br>- FDA response events or advisory committee votes, where applicable<br><br>Tag each ticker as clean screen, known event risk, or needs manual review.<br>Show the event date and source tool behind every tag. Do not infer that an<br>event caused the volatility premium unless the data establishes that link.</pre><p>The first screen shows what the options market is charging for uncertainty, next, I use the event overlay to see what might be driving it.</p><p>I separate them because a <strong>clean volatility premium</strong> and an <strong>event premium</strong> call for different work. A rich ratio with no nearby event might deserve a mean-reversion test, while a shelf registration or FDA date sends me back to the mechanism before I touch a payoff diagram.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YdpjYGm1EONKe0c_WshYDg.png" /></figure><h4>Make Claude Show Its Work</h4><p>The third prompt turns the screen into a research specification. I would keep this part strict because models are extremely happy to fill a missing field with a plausible assumption and continue typing.</p><pre>Write a point-in-time backtest specification for this hypothesis:<br><br>Stocks in the richest IV/HV decile behave differently after removing names<br>with identified event risk.<br><br>Requirements:<br>- use the historical optionable universe as it existed on each date<br>- use only data available before the stated entry time<br>- use finalized IV/HV observations and preserve publication timestamps<br>- paginate until every requested row is retrieved<br>- separate event-free and event-tagged cohorts<br>- report coverage changes and missing observations<br>- include realistic costs, slippage, spread, borrow, and assignment assumptions<br>- state which price or option-chain fields must come from another vendor<br>- do not fabricate option prices or calculate a Sharpe from unavailable data<br><br>Produce the research design first. Then write modular Python for the data pull,<br>joins, validation checks, and analysis.</pre><p>This is where I save the most time, because Claude can inspect field definitions, build the loader, preserve the observation-time rules, and generate the boring validation checks in the same conversation.</p><p>I use Alphanume for the research layer, then pull quotes, surfaces, or adjusted prices from another provider like <a href="https://massive.com/?ref=quantgalore">Massive </a>when a trade-level options backtest needs them. I also make Claude list missing inputs before it writes the backtest.</p><h4>There Is Evidence Behind All of This</h4><p>We maintain a public <a href="https://www.alphanume.com/proof">proof page with the full scoreboard</a>, including sample periods, tests, charts, clean results, and nuanced ones.</p><p>The studies relevant to this workflow found:</p><ul><li><strong>IV/HV Premium:</strong> seller edge sorted from <strong>-9.4 to +5.1 vol points</strong> across IV/HV-ratio quintiles, a 14.5-point spread before costs.</li><li><strong>S&amp;P 500 Risk Regime:</strong> forward 10-day realized volatility averaged <strong>19.0% in risk-off</strong> against 12.3% in risk-on, while annualized returns were nearly identical. The signal measures volatility state and should be used for risk scaling.</li><li><strong>Next-Day Movers:</strong> selected names realized a <strong>4.8% median absolute move</strong> against 2.4% on a normal day.</li><li><strong>Stock Dilution:</strong> the published sample had a <strong>-14.9% median one-month return</strong>, with 71% of dilutive filings lower.</li></ul><p>Those are historical gross findings under the published methodology. I’d rerun them with spreads, slippage, borrow, and path risk, then keep testing as regimes change.</p><h4>Final Thoughts</h4><p>One of the first problems we ran into with Alphanume was that even if we had an expansive dataset catalog, it would take <strong>a lot </strong>of work for an trader to understand each one, integrate and test each, and <em>only then</em>, plug it into a larger strategy.</p><p>The new MCP makes this process at least 10x faster, while giving you substantially more breadth in how much you can test and ultimately deploy.</p><p>We might be biased, but it really is as simple as pointing your desired LLMs at our datasets, and just simply asking questions. Go back and forth with your agent on this a few dozen times and it makes it <strong>very </strong>unlikely that you won’t be able to put together a profitable strategy of your own.</p><p>The <a href="https://www.alphanume.com/signup">free Alphanume account</a> gives you a rolling 30-day window of delayed data at 60 requests per minute, with the latest observation reserved for Pro. That’s enough to connect Claude, run the workflow above, inspect the output, and decide whether the data belongs in your process.</p><p>If it does, <a href="https://www.alphanume.com/pricing">Pro opens the full history</a> and raises the limit to 600 requests per minute.</p><p>As always, thanks for reading, and we’ll see you in the next one.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c69f53e52b4d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to Run Quant Research at Industrial Scale]]></title>
            <link>https://quant-galore.medium.com/how-to-run-quant-research-at-industrial-scale-6a736a7471ff?source=rss-f1c7c4923c52------2</link>
            <guid isPermaLink="false">https://medium.com/p/6a736a7471ff</guid>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Quant Galore]]></dc:creator>
            <pubDate>Mon, 24 Aug 2026 21:31:03 GMT</pubDate>
            <atom:updated>2026-08-24T21:31:03.060Z</atom:updated>
            <content:encoded><![CDATA[<p>Here’s what it looks like to run 100,000 quants at once, and why nobody has yet.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_mITJFYKbHORl1JyRrdjpw.png" /></figure><p>I’ve spent years deep in quantitative trading research, and I’ve also been a heavy user of AI models since the first public releases, back when the impressive trick was writing a limerick.</p><p>Recently though, things have started to pick up speed.</p><p>The current generation writes real research code, runs it, reads its own output, and argues with me about the interpretation, and somewhere in there an idea I would have laughed at two years ago started looking buildable.</p><p>Now, I want to be delicate with this post, as the genre it belongs to is mostly garbage:</p><ul><li>The <strong><em>“AI replaces all quants by 2030”</em></strong> forecasts, usually written by people who have never cleaned a corporate action in their lives.</li></ul><p>So, we’re going to approach this the right way: from the mechanics up.</p><p>The question on the table is simple:</p><blockquote><strong><em>“What would it actually take to train a machine that does quantitative research at industrial scale?”</em></strong></blockquote><p>By this I mean a system that gets handed a dataset and an objective, runs its own experiments, kills its own bad ideas, and hands back something <strong>robust</strong>, running a few <strong><em>thousand </em></strong>copies in parallel.</p><p>Essentially a quant research desk, but ultra-scaled like compute.</p><p>Now, we won’t turn this into an academic ML sleeper, but to reason about any of this the right way, we first need to understand a few basics.</p><blockquote>This piece first ran on <a href="https://www.alphanume-research.com/">Alphanume Research (alphanume-research.com)</a>, where all of our work lives.</blockquote><h4>How a model gets good at things</h4><p>A base language model is trained to predict text, and that alone gets you a <em>generally capable</em> <em>generalist</em>. It writes decent pandas, knows what a Sharpe ratio is, and can recite a few momentum papers.</p><p>Now, just predicting something based on what’s already known has a pretty low ceiling. What’s actually made novel research and fresh ideas possible is <strong>reinforcement learning (RL)</strong>.</p><p>RL often sounds more mysterious than it is, so let’s think about how a junior quant actually learns.</p><p>Nobody hands them a rulebook covering every market state; they start with a hypothesis, put on positions, the P&amp;L comes back, and the strategies that kept making money survive while the ones that kept losing get removed.</p><p>RL is that loop, run on a model, <strong>millions </strong>of times, with a reward/penalty standing in for the P&amp;L:</p><ol><li>Give the model a task where a computer (“grader”) can score the outcome: a math problem with a known answer, code with unit tests, etc.</li><li>Let it generate a full attempt, reasoning, tool calls and all. That whole attempt is called a <em>trajectory</em>.</li><li>Grade the outcome mechanically. Correct earns a reward (+1), wrong earns nothing.</li><li>Update the model so trajectories that earned a reward become more probable, and trajectories that didn’t become less probable.</li></ol><p>Step 4 is where <strong>a lot</strong> of people in the space degenerate to bizarre overfitting, so let’s slow down a bit.</p><p>You might picture it writing down a rule like INVERSE_VOL = GOOD somewhere. That update is actually a nudge to billions of weights that makes the entire <em>chain of behavior</em> that preceded a reward slightly more likely to happen again.</p><p>The public proof this works is <a href="https://www.nature.com/articles/s41586-025-09422-z">DeepSeek-R1</a>, which was trained with rewards linked to final-answer correctness. Nobody told it to double-check its work, and by the end of training it was pausing mid-solution to re-evaluate its own reasoning anyway, because <em>trajectories containing that behavior kept getting rewarded</em>.</p><p>That’s pretty much it: a grader, a lot of attempts, and a rule that says <em>be more like your better self</em>.</p><p>Alright, that was the bulkiest academic part of this post. So now that you have some starting notion of how RL works, we can get our hands dirty.</p><h4>The quant research game</h4><p>Say you wanted to do this for quant research. Each training episode would look something like a fresh, self-contained research assignment:</p><pre>Universe:   1,500 US equities<br><br>Period:     2004-2020<br><br>Fields:     date, ticker, adjusted_close,<br>            volume, market_cap<br><br>Objective:  Construct a market-neutral<br>            long/short momentum strategy.<br><br>You may write and execute Python.</pre><p>The agent sees 2004 through 2020. The years 2021–2025 exist only on the grader’s side, and the agent is <strong>never </strong>shown them, or even told exactly where the boundary sits.</p><p>Then, you let it cook.</p><p>To demonstrate, here’s a plausible sequence of attempts, with numbers loosely borrowed from how this actually goes:</p><ul><li>Naive 12-month momentum, deciles, equal weight, daily rebalance: Sharpe <strong>0.83</strong>, monstrous turnover, 38% drawdown.</li><li>It notices cross-sectional vol varies wildly and tries inverse-vol weighting: <strong>1.34</strong>.</li><li>Skip the most recent month (the classic 12–1 construction): <strong>1.55</strong>.</li><li>Monthly rebalance instead of daily: <strong>1.73</strong>.</li><li>All three together: <strong>2.13</strong>.</li></ul><p>Grade the out-of-sample years, reward accordingly, and repeat.</p><p>Across one experiment this is basically just a parameter search, and <em>honestly </em>RL would be overkill for that; a grid search finds rebalance = monthly too.</p><p>The interesting thing happens when the <strong><em>next</em> </strong>experiment is Japanese equities and mean reversion, then the one after that is commodity carry, then futures trend, then earnings revisions, each with different hidden periods, different costs, different regimes.</p><p>Run <strong>100,000 episodes</strong> of this.</p><p>Now, no single “trick” generalizes (e.g., “always monthly rebalance”). The research model will find that inverse-vol weighting helps in some experiments and is irrelevant in others.</p><p>What <strong>will </strong>generalize though are the <em>research behaviors </em>that led to good outcomes:</p><ul><li>“Check whether risk differences are driving your portfolio before believing your signal”</li><li>“Test whether the effect lives entirely in microcaps, then impose liquidity constraints”</li><li>“Distrust any spectacular in-sample Sharpe on principle.”</li><li>“Compare neighboring parameters; a strategy that dies at lookback = 11 was never alive at 12”</li><li>“Run subperiods, and check the whole result isn’t three good years carrying seven bad ones”</li><li>“When two constructions perform the same, keep the simpler one”</li></ul><p>Those are the habits of a good systematic researcher, and under this training loop they’d be reinforced the same way Deepseek R1 learned to double-check algebra: they just keep getting paid. (chart below)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*T8NrLmUDEafA3pO_.png" /></figure><p>Now, markets give you <strong>one </strong>history, and you can’t generate 50,000 more S&amp;P 500s to practice on, which is exactly why RL on raw prices has such a <em>miserable </em>track record.</p><p>The research process above sidesteps that limitation though, as the thing being practiced is the <em>process</em>, and you can manufacture <strong>endless </strong>distinct research problems from enough historical data.</p><h4>You WILL train the world’s best p-hacker, at first.</h4><p>Suppose your reward function is a naive one:</p><blockquote><strong><em>“Sharpe above 2 pays +1, anything else pays 0”</em></strong></blockquote><p>In order to earn a reward, your agent <strong>will</strong> “discover” that some obscure universe filter plus a 173-day lookback, excluding Tuesdays, rebalanced every 37 days, prints a Sharpe of 2.04 on the historical window.</p><p>This failure is known in RL as <em>reward hacking</em>.</p><p>Fortunately for us though, Finance met this <strong>exact</strong> adversary <em>years </em>before the AI labs did.</p><p>When you test N random, zero-edge strategies on the same history, the <em>best</em> one’s Sharpe grows like the square root of the log of N. In other words, search enough noise and noise <strong>will </strong>clear any bar you set (chart below).</p><p>Bailey and López de Prado formalized the fix as the <a href="https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2460551">deflated Sharpe ratio</a>: given how many trials you ran, this is the Sharpe that means anything at all.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*X-ubUalz8w2U5A76.png" /></figure><p>The standard complaint about Sharpe deflation is that human researchers lie about N. For instance, a junior quant runs 400 variations, has their pitch deck say 3, and no one can really prove otherwise until it starts losing money.</p><p>An RL environment can have none of those problems, but only if you structure it right from the beginning. To do this, <strong>the environment must see every experiment the agent ran.</strong> Every backtest, every parameter touched, the full trajectory <em>has </em>to be logged.</p><blockquote><strong><em>This way, you can compute the deflated Sharpe </em>exactly<em>, per episode, and pay the reward on THAT.</em></strong></blockquote><h4>Making the grader evil enough</h4><p>Here’s a high-level view of what I’d say is the ideal framework for making this possible:</p><ol><li><strong>Hidden holdouts with undisclosed boundaries<br></strong>The agent sees a train window and a validation window. The grader scores a third period the agent never touches and is never told the edges of, so there’s no boundary to quietly optimize toward.</li><li><strong>A continuous, multi-term reward<br></strong>* No “reward if 2+ Sharpe“ targets.<br>* Score out-of-sample Sharpe, drawdown, turnover, transaction costs, factor neutrality, and cross-universe robustness <strong>together</strong>, smoothly, as single hard-targets like Sharpe are what get hacked.</li><li><strong>Randomized episodes<br></strong>Asset class, region, regime, cost model, liquidity assumptions, all drawn fresh each episode, so the only thing stable enough to learn is the <em>research process.</em></li><li><strong>Deflate, deflate, deflate<br></strong>The grader counts every experiment in the trajectory and deflates the reward accordingly.<br>Ten clean experiments that led to a Sharpe of 1.4 outscores 400 experiments that wound up with a 2.1</li><li><strong>Robustness probes<br></strong>After the agent submits, the grader scrambles its parameters, resamples the universe, and stress-tests the costs.</li></ol><p>The high-level view loop can be visualized as follows:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*yYkFqIODoalJ9xKE.png" /></figure><p>What comes out the other side,<em> if it works</em>, is a model whose <em>instincts</em> on a brand-new dataset go like this:</p><blockquote>“This looks cross-sectional, so first I’ll characterize coverage and missingness. There’s heavy heteroskedasticity, so I’ll compare equal-weight and risk-normalized books before trusting any signal. Quintile portfolios first; no parameter optimization yet. Interesting, the effect is concentrated in small caps. Impose ADV constraints and retest. Sharpe falls from 2.1 to 1.2, so before abandoning it, check whether it survives in large caps and internationally.”</blockquote><p>The model behaves that way because across the 100,000+ graded research problems, <strong><em>behaving</em></strong> <strong><em>that way is what got it rewarded.</em></strong></p><p><em>THAT’S</em> the version of “AI quant” one should take seriously: a fleet of these, each one a few dollars of compute, pointed at every dataset you own, running the full protocol every single time.</p><h4>Why this doesn’t exist yet</h4><p>What’s interesting is that, right now, <strong><em>this </em></strong>is where the actual arms race is, since the RL algorithms are public and the labs are in an outright <em>land rush</em> for training environments. <a href="https://techcrunch.com/2025/09/21/silicon-valley-bets-big-on-environments-to-train-ai-agents/">Anthropic reportedly discussed spending over $1 billion on them</a> in a single year, and a dozen startups now sell simulated Salesforce instances and browser sandboxes by the seat.</p><p>There’s also academic LLM “alpha mining” agents too, all you have to do is make one GitHub search and you’ll see 50.</p><p>However, almost all of them are practically just <em>prompted </em>systems. Clever, yes, but it isn’t actually letting the model self-learn the behaviors needed to come up with <strong>novel </strong>ideas and strategies.</p><p>We just proposed a sample framework to get there, but a few things make it difficult:</p><ul><li><strong>The grader is uniquely evil here</strong></li><li>A math environment’s verifier is truth itself (e.g., x+y is <em>objectively </em>z). Our verifier, historical performance, is a noisy proxy for the thing we care about, which is <strong>future</strong> performance.</li><li><strong>The environment is made of data</strong></li><li>A hundred thousand distinct, bias-free episodes means point-in-time universes, survivorship-aware histories, real cost surfaces, across assets and regimes. You can’t scrape that, and using broken data just scales a broken process.</li></ul><p>The first problem has a solution this post just sketched, and the Sharpe deflation math is twelve years old at this point. The second problem is an infrastructure problem, and it’s the one we’ve decided to go after.</p><p>If you’re an <a href="https://www.alphanume.com/">Alphanume </a>client, you got an email from us recently about an infrastructure upgrade so we can start scaling the quality and breadth of the dataset catalog.</p><p>Our mission with Alphanume, since day one, has been to build the best quantitative finance data provider, full stop. We aren’t fully there yet, but the progress behind the scenes is real.</p><p>The point-in-time, survivorship-aware catalog we provide to human researchers is, structurally, the same thing a machine researcher’s environment is made of. We just want to be the ones holding the data once someone figures this out at scale.</p><h4>Final Thoughts</h4><p>This has objectively been the most interesting rabbit hole I’ve gone down in a while.</p><p>The original <a href="https://situational-awareness.ai/">Situational Awareness</a> paper theorized that in the future, million-deep swarms of research agents would be able to produce novel research to solve problems in biology and other vital fields.</p><p>Admittedly, I, like most people, read predictions like that as “huh, yeah maybe.”, but when you actually try running this yourself with current frontier models, you start to think that such a system might not be that far-fetched.</p><p>Now, I don’t know whether the first genuinely RL-trained quant research swarm comes out of a frontier lab or some niche options desk. Again, my background is just on the quantitative research side of things, but <a href="https://openrouter.ai/models">you can see for yourself</a> that models with frontier-level intelligence are getting <strong>substantially </strong>cheaper along with the compute necessary to run them.</p><p>It’s inevitable that when enough people at least <em>try</em> a framework like this, at least <em>one</em> will genuinely work, <em>for awhile anyway.</em> Heck, there’s even a chance that we’re <strong>way</strong> behind the curve on this one and it’s already a solved problem somewhere.</p><p>This post was a bit different than my typical pure-quant research/experimental style, but I was just so enthused by this space that I felt compelled to write it up. Of course, no one knows exactly what the future will look like, but if (<em>when</em>) these possibilities are realized, it will be <em>very </em>interesting.</p><p>As always, thanks for reading, and we’ll see you in the next one.</p><blockquote><strong>This essay was originally published at </strong><a href="https://www.alphanume-research.com/"><strong>Alphanume Research</strong></a><strong>, the research arm of the </strong><a href="https://www.alphanume.com/"><strong>Alphanume dataset platform</strong></a><strong>. Everything we publish there is available to read right now, including this piece’s follow-up work as the environment gets built. Subscribing by email is the reliable way to catch it.</strong></blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6a736a7471ff" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Self-Taught Quant Curriculum, Filtered]]></title>
            <link>https://quant-galore.medium.com/the-self-taught-quant-curriculum-filtered-f313b06f80b6?source=rss-f1c7c4923c52------2</link>
            <guid isPermaLink="false">https://medium.com/p/f313b06f80b6</guid>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <dc:creator><![CDATA[Quant Galore]]></dc:creator>
            <pubDate>Fri, 17 Jul 2026 11:13:56 GMT</pubDate>
            <atom:updated>2026-07-17T11:13:56.547Z</atom:updated>
            <content:encoded><![CDATA[<p><em>12 Modules That Take You From “What Is an Edge?” to a Running Trading Book</em></p><p>For most of this industry’s history, there was exactly one way to become a quant: a desk hired you, and a senior trader spent two years beating the bad habits out of you.</p><p>You didn’t pick the syllabus. You sat where you were told, watched what you were told to watch, and got asked <em>why does this trade exist?</em> about four hundred times before anyone let you price one.</p><p>The strange part, looking back, is how little of that apprenticeship was math.</p><p>The math was assumed, but what the desk actually transmitted was <strong>order</strong>: what to trust, what to distrust, and which skill has to exist before the next one can be stacked on top of it.</p><p>The self-taught path has no desk, and you can see the result on any self-taught quant’s hard drive. They all look the same: a backtests folder with nine half-finished notebooks, an indicator strategy that worked for six months and then quietly stopped, three abandoned Coursera specializations in stochastic calculus.</p><p>All of the material, in whatever order the internet shipped it.</p><p>The self-taught crowd splits into two camps. One grinds measure theory for a year and never places a trade; the other is live by Friday with an RSI crossover and a dream.</p><p>Both wash out for the same reason: the <strong>sequence</strong>.</p><p>So, we wrote the sequence down, and then we built it.</p><p><strong>Alphanume Learn</strong> is our new interactive course platform at <a href="https://learn.alphanume.com/">learn.alphanume.com</a>, and its first curriculum, <em>Systematic Trading with Market Data</em>, is this exact sequence: <strong>twelve modules</strong>, <strong>65 lessons</strong>, from why edges exist at all to running an automated book.</p><p>That means volatility and earnings, the SPX 0-DTE strike band, dilution from S-1 to effectiveness, de-SPACs and corporate defaults, dividends and momentum, alt data, and a final module on automating the whole thing with Claude.</p><p>Every lesson is interactive: real Python running in your browser against live Alphanume data, exercises that grade themselves, a knowledge check at the end of each module. Module 1 is <strong>free</strong> with no account, and the homepage has a runnable demo of the earnings study if you want to poke the format first.</p><p>What follows is the whole syllabus, in the order a desk would actually teach it, and why each module sits where it does (map below). Steal the order even if you never sign up; it’s the part that took longest to figure out.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*lboHZLU04_FDFiq0Qj__MA.png" /></figure><p>Let’s get into it.</p><h4>1. Who’s Forced to Trade?</h4><p>The first thing a desk hands a new hire is a question: why would any edge exist at all, in a market full of people smarter than you?</p><p>The answer is that a surprising share of what moves markets is <strong>scheduled, disclosed, and queryable</strong>:</p><ul><li>Index trackers have to buy at the rebalance, on the rebalance date.</li><li>Insiders are locked up until an expiration that’s printed in the filing.</li><li>SPAC holders can redeem, on a schedule.</li><li>A CFO at the bottom of the financing ladder has to issue, at whatever the price is.</li></ul><p>We split edges into structural and statistical, give you a three-part test for a researchable event (<strong>recurring, dated, disclosed</strong>), and install the four-step loop everything else runs on: hypothesis, data, measurement, attack.</p><p>All theory, no code, <em>by design</em>. It’s also the <strong>free</strong> module.</p><h4>2. Plumbing Before Alpha</h4><p>Now the tools, and only now, because a toolkit makes no sense until you know what it’s for.</p><p>A reproducible Python environment. A SQL database as the research shelf. Git as the research journal, so six months from now you know <em>why</em> you changed that filter.</p><p>Then the anatomy of a market-data API: auth, the {count, data} envelope, and the raise_for_status() line every beginner skips and later regrets. JSON to DataFrame in five lines.</p><p>That ingestion skeleton gets reused by every module after this one.</p><h4>3. Your Backtest Is Lying to You</h4><p>Before your first strategy, you learn how results deceive, because a beginner with a backtester is a danger to their own account.</p><p>Event windows and day 0 come first. Then abnormal versus raw returns: a stock down 10% means <strong>nothing</strong> in a month where the market fell 12%.</p><p>Then the three ways backtests lie:</p><ul><li><strong>Survivorship</strong>: your universe only contains the names that lived.</li><li><strong>Delisting</strong>: the shorts that went to zero quietly vanish from the data.</li><li><strong>Look-ahead</strong>: you traded on a number that didn’t exist yet.</li></ul><p>You build a point-in-time universe to kill all three, and the module ends with the honest-results checklist (tails, regime concentration, sample size, costs, borrow) that later modules invoke <em>by name</em>.</p><h4>4. Expensive Needs Three Numbers</h4><p>The first real trade, and it opens on a loss: the 48-vol straddle you sell because vol mean-reverts, that prints <strong>61</strong> two days later.</p><p>The lesson is that “expensive” means nothing until it’s anchored to three numbers:</p><ul><li>The <strong>IV/HV premium</strong>: are you being paid relative to what the stock is actually doing?</li><li><strong>IV rank</strong> against the name’s own 52-week band: is it stretched <em>for this name</em>?</li><li><strong>Vol-of-vol</strong> as the sizing dial: gentle drift or knife fight on the way back?</li></ul><p>The capstone puts numbers on it. Selling every straddle indiscriminately captures roughly <strong>0</strong> vol points. Rich names only: <strong>+4.6</strong>. Rich <em>and</em> stretched, IV rank at 70 or above: <strong>+12.5</strong>.</p><p>The edge lives in the conditioning.</p><h4>5. The Straddle Is a Forecast</h4><p>Every pre-earnings ATM straddle is an encoded forecast: the market’s estimate of the move, sitting on the screen, priced and tradeable.</p><p>And forecasts have track records. Some names overprice their earnings move <em>every single quarter</em>, and those track records are queryable, quarter by quarter, name by name.</p><p>It’s Module 4’s machinery pointed at Module 1’s favorite kind of event. Earnings are the purest scheduled catalyst on the calendar: recurring, dated, disclosed.</p><p>You finish by building the pre-earnings screen for the coming reporting week, which is the first time in the sequence you produce something that tells you what to do <em>next Tuesday</em>.</p><h4>6. Two Integers a Day</h4><p>At 10:30 AM, a model publishes a strike band for SPX: a lower strike and an upper strike.</p><p>The whole module is those two integers and how much playbook fits inside them. Condors sold around the band, butterflies centered inside it, verticals placed off its edges.</p><p>The health checks matter more than the structures, though. The rolling containment rate tells you whether the band is still earning its keep, and regime gates decide when the whole thing sits out.</p><p>The band’s <em>width</em>, tracked day over day, turns out to be a volatility time series in its own right.</p><h4>7. Desperation Leaves a Paper Trail</h4><p>The deepest module in the curriculum, because nobody else teaches this end to end.</p><p>It starts with the last-ditch financing ladder: by the time a company sells dilutive equity, it has been turned down for everything cheaper, which makes the raise a one-way message. Then the mechanics of how new shares actually reach the tape, S-1 through EFFECT.</p><p>Then the short-selling mechanics, taught <em>honestly</em>:</p><ul><li>Locates, and whether your borrow even exists.</li><li>Borrow fees as a daily carry cost.</li><li>Recalls, where your lender can end the trade for you.</li><li>The dividend liability nobody warns you about.</li></ul><p>You run the post-filing drift study yourself, then meet the uglier cousins: ATM programs, shelf registrations, toxic financing.</p><h4>8. Fragile by Construction</h4><p>De-SPACs are a cohort the structure itself makes fragile: sponsors get paid for closing <em>a</em> deal before the clock expires, good deal or not.</p><p>So the trade is patient. Fade the post-completion basket against an index leg; the gap is invisible on any single day and hard to miss after a quarter.</p><p>Lock-up expirations get their own treatment, because they’re the rare supply shock with the date literally printed in the prospectus, months in advance.</p><p>And it closes on corporate defaults as an equity event class, the terminal rung of the ladder Module 7 introduced.</p><h4>9. Now Buy Something</h4><p>Okay, so after two short-biased modules, the book needs a long side.</p><p>Dividends first, starting with who <em>really</em> pays the dividend. Naive dividend capture is a <strong>coin flip</strong> until you screen for recovery odds, and the screen is the whole trade.</p><p>Then cross-sectional momentum, one of the most documented factors in the literature, with real mechanisms behind it: underreaction, herding, and the reconstitution flows Module 1 promised you.</p><p>You close by replicating a monthly top-10 momentum basket, weighted by rank slot rather than equally.</p><p>You now know what a fragile long looks like, because you just spent two modules learning to short them.</p><h4>10. Watch What They’re Reading</h4><p>Prices are one sensor. This module adds the rest:</p><ul><li>Wikipedia page views, converted to z-scores, as an attention gauge: when a sleepy ticker’s page traffic suddenly spikes, <em>someone</em> is curious, and it pays to ask why.</li><li>EDGAR filing bursts, which cluster before announcements.</li><li>The daily movers slate, framed honestly: it flags which names are moving, and the direction is your job.</li></ul><p>Every signal gets sliced by sector, because an attention spike means something <em>very</em> different in biotech than in utilities.</p><p>This sits late in the sequence on purpose. Alternative data is where beginners drown first, and by now you have Module 3’s checklist to keep every shiny new signal honest.</p><h4>11. Temperament Is a Position</h4><p>Everything so far was one study at a time. Now the studies become sleeves, and the sleeves become a book.</p><p>Sizing and concentration come first, then the uncomfortable part: “uncorrelated” sleeves stay uncorrelated right up until the day they don’t, and that day is the one you size for.</p><p>Then the P&amp;L path itself. Event-driven books carry negative skew, long quiet stretches punctuated by sharp drawdowns, and the core discipline is deciding <em>in advance</em> when you size down, so the decision isn’t made mid-drawdown by your adrenal glands.</p><p>One regime flag gates the whole book.</p><p>The desk version of this module was a senior trader watching your face during a drawdown. The self-taught version has to be written down.</p><h4>12. Make It Boring</h4><p>Production is boring <em>on purpose</em>.</p><p>One flat file. Pull, rank, format, send. Scheduling and delivery, so the screen you built in Module 5 lands in your inbox before the open without you touching anything.</p><p>Then the modern part: using Claude for idea generation and code generation, with guardrails. You treat it as a junior analyst rather than a slot machine, and you <strong>never</strong> let it grade its own homework.</p><p>The capstone is the whole curriculum compressed: build your own event study, end to end, and <em>defend</em> it against the Module 3 checklist.</p><h4>Final Thoughts</h4><p>Look back at the sequence and the desk logic is visible in every seam.</p><p>Theory before tools, so you know what the tools are for. Measurement before trades, so you know which results to distrust. Vol before events, the short side before the long, single studies before a book, and automation dead last, once there’s something worth automating.</p><p>The material was always out there. The <strong>order</strong> was the part you used to need a hiring process for.</p><p>That’s the part we packaged.</p><p>Module 1 is free at <a href="https://learn.alphanume.com/">learn.alphanume.com</a>, the first lesson takes about ten minutes, and the other eleven modules are included with <a href="https://www.alphanume.com/pricing">Alphanume Pro</a>, alongside full access to the data platform the exercises run on.</p><p>The exercises pull from the same endpoints our Pro members already trade off. The material is the research process behind the platform, written down in order.</p><p>And if you’d rather run the syllabus above on your own, with your own books and your own data, that works too. Either way, start at module one.</p><p>As always, thanks for reading, and we’ll see you in the next one. 🫡</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f313b06f80b6" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Automating Your First Trading Signal in a Few Lines of Python [Code Included]]]></title>
            <link>https://quant-galore.medium.com/automating-your-first-trading-signal-in-a-few-lines-of-python-code-included-0015e7b66246?source=rss-f1c7c4923c52------2</link>
            <guid isPermaLink="false">https://medium.com/p/0015e7b66246</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[quantitative-finance]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[technology]]></category>
            <dc:creator><![CDATA[Quant Galore]]></dc:creator>
            <pubDate>Fri, 10 Jul 2026 21:01:00 GMT</pubDate>
            <atom:updated>2026-07-10T21:01:00.947Z</atom:updated>
            <content:encoded><![CDATA[<p>Ask most people why they still check their signals by hand, and you’ll get the same answer: automating it sounds like a whole engineering project.</p><p>Queues, workers, a database, a cloud console with forty tabs. So the signal stays a browser bookmark you open <em>when you remember to</em>.</p><p>And a signal you have to remember to check is a signal you’ll forget.</p><p>Fortunately, there’s a better way. A short Python file and a scheduler that runs it once a day.</p><p>No framework, no queue, no classes.</p><p>By the end of this you’ll have a <strong>next-day-movers</strong> slate landing in your inbox every morning before the close, pulled from one <a href="https://www.alphanume.com/">Alphanume</a> endpoint.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Zy38DsoSry-X5WGkWnAQcw.png" /></figure><p>Let’s build it.</p><h4>What next-day-movers actually is</h4><p><a href="https://www.alphanume.com/next-day-movers">next-day-movers</a> is a daily, model-ranked set of equities most likely to make a large move the next session.</p><p>The model scores a liquid, optionable universe on implied vol, realized vol, and vol-structure features, then hands back the names sitting at the top. It regenerates every day at <strong>3:30 PM ET</strong>, and every row is point-in-time, so what you pull is what the model actually flagged that afternoon.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*0Wp3DYZefwzdJsSAyptMiA.png" /></figure><p>It’s a short slate. About <strong>five</strong> names per date, not a screen of fifty.</p><p>You hit it like any other Alphanume endpoint:</p><pre>requests.get(&quot;https://api.alphanume.com/v1/next-day-movers?api_key=alp_...&quot;)</pre><p>Same envelope as everything else on the platform, a count and a data list of rows:</p><pre>{&quot;count&quot;: 5, &quot;data&quot;: [ ... ]}</pre><p>Each row carries four fields: date, ticker, return, and absolute_move.</p><p>The free tier gives you a rolling <strong>30-day</strong> window of delayed data, which is everything you need to build and test this. Today’s live row is reserved for Pro.</p><p>One wrinkle to know before the code makes sense. On the newest date, return and absolute_move come back null until that next session closes.</p><p>The freshest slate is the names with their moves still pending, which is exactly the list you want emailed to yourself before close.</p><h4>A few names it actually called</h4><p>Before wiring anything up, it’s fair to ask whether the list is <strong>worth </strong>automating. A few of the names it flagged recently, all reproducible on a free key:</p><pre>date         ticker   next-session move<br>2026-06-30   SOC      +42.66%<br>2026-06-26   SLS      +24.71%<br>2026-06-26   FCEL     +23.95%<br>2026-06-25   FCEL     +21.98%<br>2026-06-16   RXT      +21.37%</pre><p>Cherry-picking the winners is easy and dishonest, so here’s a full slate. On <strong>2026–06–30</strong> the model flagged five names, and every one of them moved:</p><pre>ticker   next-session move<br>SOC      +42.66%<br>FCEL     -11.44%<br>SLS      -10.21%<br>AXTI      -9.85%<br>OUST      -4.04%</pre><p>The biggest was <strong>+42.66%</strong>, the smallest <strong>-4.04%.</strong></p><p>Across the full history, about <strong>49%</strong> of flagged names moved more than <strong>5%</strong> the next session, about <strong>21%</strong> moved more than <strong>10%</strong>, and the median absolute move was around <strong>4.8%</strong>.</p><p>So treat it as a volatility screen. Plenty of names move a little, a meaningful share move a lot, but the model doesn’t call direction for you.</p><h4>The script</h4><p>The logic is short and flat. Pull the endpoint, keep the latest date, sort that day’s slate, format it into text.</p><pre>import requests<br>import pandas as pd</pre><pre>resp = requests.get(<br>    &quot;https://api.alphanume.com/v1/next-day-movers&quot;,<br>    params={&quot;api_key&quot;: &quot;alp_...&quot;},<br>)<br>resp.raise_for_status()<br>df = pd.json_normalize(resp.json()[&quot;data&quot;])</pre><p>The raise_for_status() line is the one beginners skip and later regret. If the key is wrong or the endpoint is down at 6 AM, you find out right there instead of getting a silent, empty email.</p><p>Now keep the newest slate and sort it by size of expected move:</p><pre>latest = df[&quot;date&quot;].max()<br>slate = df[df[&quot;date&quot;] == latest].sort_values(&quot;absolute_move&quot;, ascending=False)</pre><p>Then format the names into a plain-text table. The move column reads pending on the newest date, since return is still null until that session closes:</p><pre>rows = [f&quot;Movers for {latest}&quot;, &quot;&quot;]<br>for _, r in slate.iterrows():<br>    move = &quot;pending&quot; if pd.isna(r[&quot;return&quot;]) else f&quot;{r[&#39;return&#39;]:+.2f}%&quot;<br>    rows.append(f&quot;{r[&#39;ticker&#39;]:&lt;6} {move}&quot;)</pre><pre>body = &quot;\n&quot;.join(rows)<br>print(body)</pre><p>Run it against a free key today and you get the live slate for the upcoming session, moves still pending:</p><pre>Movers for 2026-07-08</pre><pre>AXTI   pending<br>BE     pending<br>FCEL   pending<br>SLS    pending<br>SOC    pending</pre><p>That print is your test harness. Point latest at an older date instead and the same code fills in the realized moves, so you can eyeball the feed for a week before you trust it with your morning.</p><p>The only change between the version that prints and the version that emails is the last step: send body instead of printing it.</p><p>Zoomed out, the whole thing is five steps and one file (diagram below): a scheduler fires, the script pulls the endpoint, formats the slate, sends it over SMTP, and it lands in your inbox.</p><h4>Sending it to yourself</h4><p>Email out of Python is the standard library plus a login. Gmail is the path of least resistance.</p><pre>import smtplib<br>from email.message import EmailMessage</pre><pre>msg = EmailMessage()<br>msg[&quot;Subject&quot;] = f&quot;Movers for {latest}&quot;<br>msg[&quot;From&quot;] = &quot;you@gmail.com&quot;<br>msg[&quot;To&quot;] = &quot;you@gmail.com&quot;<br>msg.set_content(body)</pre><pre>with smtplib.SMTP_SSL(&quot;smtp.gmail.com&quot;, 465) as server:<br>    server.login(&quot;you@gmail.com&quot;, &quot;your_app_password&quot;)<br>    server.send_message(msg)</pre><p>The one thing that trips everyone up: your_app_password is not your Gmail login password. Google blocks that.</p><p>You generate a <strong>16-character</strong> App Password at <a href="https://myaccount.google.com/apppasswords">myaccount.google.com/apppasswords</a>, which requires 2-Step Verification turned on first. Paste that into the script and leave your real password out of it.</p><p>Prefer Outlook or Zoho? Both work the same way, with an app password, over a slightly different connection.</p><p>Outlook is smtp-mail.outlook.com on port <strong>587</strong>, Zoho is smtp.zoho.com on port <strong>587</strong>, and both use STARTTLS instead of SSL. The only code change is swapping the SSL connection for a plain one that upgrades:</p><pre>with smtplib.SMTP(&quot;smtp-mail.outlook.com&quot;, 587) as server:<br>    server.starttls()<br>    server.login(&quot;you@outlook.com&quot;, &quot;your_app_password&quot;)<br>    server.send_message(msg)</pre><p>That’s the entire production script. Pull, rank, format, send.</p><h4>Putting it on a server</h4><p>The script works on your machine, which means it works when your machine is on and you remember to run it. The point was to stop remembering.</p><p>For that you want it on a box that’s always awake. We use <a href="https://www.pythonanywhere.com/">PythonAnywhere</a>, on the paid Developer tier at $10/month, and the setup is three steps:</p><ol><li>Upload the one production file and paste in your API key and app password.</li><li>Create a Scheduled Task that runs the file once a day.</li><li>Pick the time carefully. PythonAnywhere schedules in <strong>UTC</strong>, so as of the time of writing, 15 minutes before the close will be 19:45.</li></ol><p>That’s it. The task fires every evening, and the email is waiting when you sit down.</p><h4>Final Thoughts</h4><p>None of this is specific to <a href="https://www.alphanume.com/docs#next-day-movers">next-day-movers</a>.</p><p>Swap the endpoint and the same pull-rank-format-send skeleton mails you an <a href="https://www.alphanume.com/docs#iv-rank">IV-rank screen</a>, an <a href="https://www.alphanume.com/docs#earnings-move-history">earnings vol calendar</a>, or <a href="https://www.alphanume.com/docs#quant-galore-momentum-index">a momentum basket</a> instead. The Alphanume envelope is always {&quot;count&quot;: N, &quot;data&quot;: [...]}, so the code barely changes when the question does.</p><p>The real upgrade is smaller than the model or the email. It’s moving a signal out of a browser tab you have to remember to open and into a place that reaches you on its own.</p><p>Grab a free key at <a href="https://www.alphanume.com/">alphanume.com</a>, get the print version working against last week’s slate, and once you trust it, give it a server and let it run.</p><p>The full code for this experiment can be found via the <a href="https://github.com/alphanume-markets/Alphanume-Strategy-Lab/tree/main/Tutorials/Automated%20Signal%20Emails">Alphanume Strategy Lab on GitHub</a>.</p><p>As always, thanks for reading, and we’ll see you in the next one. 🫡</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0015e7b66246" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>