Scan for upcoming earnings with high short interest: stocks within 15% of their 365-bar high, reporting in 10 bars, then filtered by short interest.
In this tutorial I build a scan for upcoming earnings with high short interest: stocks that report in the next 10 bars, trade within 15% of their 365-bar high, and carry double-digit short interest. A member asked for it, and it takes 3 lines of thinkScript, the Earnings filter that comes with ThinkorSwim, and one pass through Excel to add the short interest.
After the scan, I go through the top results the way I would before earnings: a Fibonacci target on the chart, open interest near that strike, the stock’s earnings history in our Smarter Earnings indicator, and 3 ways to structure an options trade in PENN. It’s for swing and options traders who want a short research list before a report.
=A1&",", and paste it into our Short Interest Scanner, a Stock Volatility Box tool. I focus on the double-digit readings.The upcoming earnings with high short interest scan finds stocks with 3 things in common: an earnings report in about the next 2 weeks, a price near the high of the last 365 bars, and a large short interest reading. A member requested this combination.
The idea in the video: if a heavily shorted stock near its highs keeps moving up into or after earnings, short sellers’ stops can get run, which can carry price toward the next target. I use short interest as one way to anticipate that, alongside the chart, the options chain and the stock’s earnings history.
| Filter | Setting in the video | Where it lives |
|---|---|---|
| Volume | At least 500,000 shares | Stock filter |
| Bid | At least $20 | Stock filter |
| Near the 365-bar high | Within 15%, or 10% to narrow the list | Custom study filter (thinkScript) |
| Upcoming earnings | Has earnings, anytime, within the next 10 bars | Study, then Corporate Actions, then Earnings |
| Short interest | Double digits | Our Short Interest Scanner (Stock Volatility Box), after the scan runs |
The liquidity filters keep thin and low-priced stocks out of the results. In the Scan tab I start with 2 stock filters: volume of at least 500,000 shares and a minimum bid of $20. Lower the bid filter if you want to find cheaper stocks.
I find these two a good starting point for stocks that are liquid and that you’d want to be caught trading. A stock has to pass every filter in the scan to show up, so these 2 set the floor for the whole list.
The near-high filter is a custom study filter that keeps stocks within a set percentage of their highest high of the last 365 bars. I’ve coded something similar in a previous video, and our high short interest near 52-week highs tutorial covers a related scan. To add it:
This post has no download, so the code here and in the Code tab is written out from the video.
def percentageThreshold = 0.15;
def allTimeHigh = Highest(high, 365);
plot signal = (allTimeHigh - close) / close <= percentageThreshold;
percentageThreshold sets how close to the high a stock has to be. In the video I set it to 15%, and in the code that is 0.15, because the plot line compares a ratio.
Typing 15 instead would pass any stock whose high is up to 16 times its close, which is almost every stock.
allTimeHigh uses Highest(high, 365), the highest high of the last 365 bars. On daily bars that goes beyond one full trading year. It covers more bars than the past year needs, and that makes certain the scan catches the highest high of the past 365 days.
The plot line takes the distance from that high down to the current close and divides it by the close, which gives a percentage. When that percentage is at or below the threshold, the condition plots true and the stock shows up in the results. When the stock is too far below the high, it drops out.
Because the code divides by the close, the cutoff sits a little closer than 15% below the high. With a $100 high, the close has to be $86.96 or higher, which is 100 divided by 1.15.
The variable is called allTimeHigh, and it measures the 365-bar high. A stock with a longer history can have a true all-time high further back. For a scan built around 52-week highs instead, see our tutorial on which stocks made a new 52-week high this week.
The ThinkorSwim Earnings filter adds the upcoming earnings condition without more code. Click Add filter, choose Study, open Corporate Actions, and select Earnings. I set it to has an earnings announcement anytime, before or after the market, within the next 10 bars.
On daily bars, 10 bars covers about the next 2 weeks. I considered 15 bars and stayed with 10 as a good list to start with. Our upcoming earnings scan tutorial explains the settings in this filter and shows how to target one exact earnings date with the HasEarnings() function.
Short interest comes in after the scan, through a comma-separated list of tickers. In the video the scan returned 200 stocks, and I moved them into our Short Interest Scanner, which comes with the Stock Volatility Box membership. Any tool that takes a list of tickers and returns short interest fits the same step:
=A1&",". The ampersand joins the ticker in A1 with a comma.I only pasted the first 100 tickers in the video. The second 100 from the list of 200 are still there to work through on your own time.
The threshold in the near-high filter is the quickest way to shrink the scan. Changing it from 15% to 10% cut the results from 200 to 160 in the video. I repeated the same Excel formula on the new list, pasted it into the short interest scanner, and filtered by short interest again.
Each stock the scan finds still needs a chart, a target and a look at the options chain. These are the names I checked in the video, with the prices and dates as they were when I recorded it.
iRobot met all the criteria, with earnings after market hours the upcoming Tuesday. There was no Squeeze forming, so the case rested on price action and high short interest. The 1.272 Fibonacci extension pointed to a target of 95.17. The options chain wasn’t very liquid: the 95 strike had about 74 contracts of open interest, a little higher than the rest, and nothing that stood out.
Our Smarter Earnings indicator added the earnings history. On a daily chart of about 2 years with 8 earnings cycles, iRobot had 1 gap fill, which came on a beat, and 7 gap and go moves, where price kept going in the direction it gapped.
That gave me a plan for each outcome. A gap up on a beat makes the 95 zone interesting. A gap down on a beat points to a gap fill. A gap down on a miss had no history behind it in the data and takes the 95 zone off the table.
BGS had a Squeeze forming. With a Fibonacci drawn from the swing high to the swing low, price sat right around the 50% level, and the 1.272 extension looked a little far away.
I picked Carvana from the 10% list. In the video it traded at 221.34, with earnings on October 29 after market hours, inside the 2-week window. The 1.272 extension from the most recent swing high, measured from before the gap, came out at 255.72.
My read: if the gap stays unfilled and price keeps moving up, stops keep getting run. A move through 242.15 put 255.72 next. On the October 30 series, open interest at the 255 strike didn’t stand out, and a $5-wide 255/260 vertical cost about 95 cents. The chain wasn’t as liquid as I’d hoped, so Carvana stayed on the watchlist.
Penn National Gaming (PENN) had a more interesting options chain than iRobot or Carvana. The 1.272 extension pointed to 80.53, earnings were on October 29, and a Squeeze on the chart looked like it was losing momentum and maybe turning positive. On the October 30 series, the 80 strike had much higher open interest than most of the chain.
| Trade (October 30 series) | Cost in the video | What the Analyze tab showed |
|---|---|---|
| First look: 75/80 vertical | 1.38 | Not modeled in the video |
| Way 1: 75/80/85 butterfly, $5 wide | 0.47, with 0.50 to 0.60 more realistic as a fill | Profit range from about 75.46 to 84.49. Max profit $112.35 on October 29, or $98.95 with implied volatility up 10 points |
| Way 2: 75/80/83 broken-wing butterfly | About 0.82 | No upside risk: if price overshoots the 80 zone, the trade still showed about $118 of profit |
| Way 3: 80/81 vertical | 0.24 | Risk 24 cents to make 76. About $60 of profit before expiration with implied volatility up 10 points, and the full profit only at the October 30 expiration |
Implied volatility on the chain was right around 102%. I modeled a rise of 10 percentage points, an arbitrary number, for traders who expect volatility to climb into earnings. That lowered the butterfly’s profit at 80 to $98.95, still a nice return on a $47 investment if price pins near 80.
The broken-wing version costs more, and it suits a trader who is especially bullish on PENN. In the video I called the 80/81 vertical the easiest, cleanest way to play a move into earnings outside of a long call, and the easiest of the 3 to manage.
Smarter Earnings gave no strong lean for PENN. Across 8 earnings periods, it showed a greater-than-expected move 0% of the time, 3 gap fills (1 gap up that didn’t come on a miss and 2 gap downs that didn’t come on a beat), and 0 gap and go moves.
The PENN trade rested on the target, the open interest and the bullish momentum in casino and betting stocks such as PENN and DraftKings at the time.
The upcoming earnings with high short interest scan builds a research list. It finds stocks where a move up could pressure short sellers, and it can’t tell you that the move will happen. Each name still needs a chart target, a look at the options chain, and a plan for each earnings outcome.
With a debit spread or a butterfly, the debit is the most you can lose, so size the trade so that losing all of it costs a small, fixed share of your account. With stock, decide where your stop goes before the report. For more on Fibonacci levels, see our Fibonacci Trading Course.
For another short interest example, see our 30-minute, daily and weekly Squeezes with high short interest. More earnings tools are on our earnings page, and more free scans are on the scans page.
# Upcoming Earnings with High Short Interest Scan for ThinkOrSwim
# TOS Indicators
# Full tutorial: tosindicators.com/scans/scan-for-upcoming-earnings-with-high-short-interest
# Written out from the video (this post has no download file).
#
# Custom study filter: stocks within 15% of their highest high of the last 365 bars.
# The video says 15%. The plot compares a ratio, so enter it as 0.15.
# Change it to 0.10 to keep only stocks within 10% of that high.
def percentageThreshold = 0.15;
def allTimeHigh = Highest(high, 365);
plot signal = (allTimeHigh - close) / close <= percentageThreshold;
# The other filters from the video go in the Scan tab, not in this code:
# Stock filter: Volume, minimum 500,000
# Stock filter: Bid, minimum 20
# Study filter: Corporate Actions > Earnings
# has an earnings announcement, anytime, within the next 10 bars
#
# Excel formula for a comma-separated ticker list (tickers in column A):
# =A1&","Want the .ts file and the one-click import? Both come with a free account.
Here are some resources that you may find useful:
Join 40,000+ traders using institutional-grade tools for ThinkOrSwim.
Get the Bundle