Connors CRASH! Strategy: Profit When Markets Decline
In today’s edition of stock secrets we are gonna dig into a classic short selling strategy that you can use to add some negative delta to your trading portfolio. On its own this strategy isn’t very impressive so we’re gonna beef it up and transform it from an average, marginally profitable strategy into a highly profitable strategy.
DELTA RISK
The strategy we are gonna look into today is called Connor’s CRASH and its a classic strategy. It goes way, way back. Before we get into the strategy rules you need to understand the idea of Delta risk.
Lets say you have a portfolio full of long positions, in other words in order for your portfolio to increase in value you need the market to go up in price. This is called delta risk. Most professional traders try to keep a delta neutral portfolio, which is to say the portfolio is made up of a mix of long and short positions.
A delta neutral portfolio makes money regardless of whatever direction the overall market is trending.
STRATEGY RULES
If you trade this strategy mechanically, that is to say you trade it strictly based on the rules alone, then its really not a very good strategy in terms of profitability. We’re gonna put a modern spin on it so that instead of being a pure short strategy it will be a positive Theta, negative Vega strategy. We will transform this old strategy, which has a very low profitability into a strategy with substantial profits.
- The stock’s closing price must be greater than $5/share.
- The stock’s average daily volume over the past 21 trading days must be at least 1,000,000 shares a day.
- The stock’s 100-day Historical Volatility must be at least 100%.
- The stock must have a closing ConnorsRSI (CRSI) reading of 90 or greater at the close.
- Go short (sell a Call Option contract(s) or bear put spread) on the open the following day
- Exit (buy option back) when the stock closes with a CRSI reading closing under 30 or you reach 50% profit
Please keep in mind that this strategy is highly targeted and specialized. It only works for stocks that are highly volatile so its not something you can use all the time, rather its best to go looking for opportunities when you really need some short delta in your portfolio to balance out your long delta.
One last note, you really need to trade this strategy with options. Without options the strategy just doesn’t produce enough profit per trade given the risk. In the demo I am using naked short calls but if you’re not comfortable using naked options, for fear of assignment, feel free to replace the naked calls with defined risk trades like bear call spreads or whatever defined risk setup you prefer.
WALKTHROUGH / DEMO
I highly recommend you watch the recorded video demo, posted above, because it can be difficult to relay the steps effectively in written format.
The first thing we need to do is to find some stocks we can apply the strategy to. In a perfect world you would setup a screen that would locate all the stocks that meet our criteria but I couldn’t find any free online screeners that offered the historical volatility and ConnorsRSI indicators. Its important to me that everything I teach you in Stock Secrets can be replicated with needing any expensive tools or datasets.
So we are gonna do this hard way.
Locate a stock to use the strategy on
First we’re going head over to Barchart’s volatility screener and sort the results by Implied Volatility.
Then I’m gonna scroll down to MARA which is a stock I use with this strategy a lot. When I wrote this script MARA’s IVR rank was around 40% and now its down to 1% so that tells us that MARA’s current volatility is very low relative to the past 365 days. If I were looking for a trade today, I would probably pass on this trade because it doesn’t have enough negative vega but for the purpose of this demo we’ll continue to the next step
Plotting Historical Volatility onto the Chart
Next we are gonna open MARA’s chart on tradingview. The first thing we want to do is write a historical volatility indicator so we can visualize this value on the chart. Open the Pine Editor tab in the bottom region of the TradingView chart and type the following code.
// Baileysoft Solutions © 2016-2021
// Author: Neal Bailey
// https://www.tradingview.com/u/nealosis/
// https://www.youtube.com/channel/UCWLOB6VrnIHc1QBMpCXUi4A/
// https://www.journeymaninvestor.com/
//
// This source code is subject to the terms of the Mozilla Public License 2.0
// https://mozilla.org/MPL/2.0/
//
// ---------------------------------------------------------------------------
// Historical Volatility is a measure of how much price deviates from its
// average in a specific time period that can be set. The more price
// fluctuates, the higher the indicator value.
// ---------------------------------------------------------------------------
//@version=4
study(title="Historical Volatility (Baileysoft)")
// The lookback period (days)
LookbackDays = input(100, "Lookback Period (Days)", minval=5)
// The lookback range (days)
Range = input(365, "Lookback Range (Days)", minval=50)
// Calculate the historic volatility
// @param lookback_days the number of days to compare against the range
// @returns integer the historic volatility value
getHistoricVolitility(lookback_days, hvol_range) =>
ann_days = hvol_range
log_price = log(close / close[1])
nPer = iff(timeframe.isintraday or timeframe.isdaily, 1, 7)
std_dev = stdev(log_price, lookback_days)
hist_vol = std_dev * sqrt(ann_days / nPer) * 100
hist_vol
// Get historic volatility
hist_vol = getHistoricVolitility(LookbackDays, Range)
// Plot the study
plot(hist_vol, title="Historical Volatility", color=color.green)
plotchar(bar_index, "Bar index", "", location.top)
When completed, press the ‘add to chart‘ button to apply the new indicator to your chart
Plotting the ConnorsRSI onto the chart
Next we need to create a ConnorsRSI indicator that we can plot to go with the histoical volatility indicator we just wrote. Clear the pine editor code and paste the following code
// Baileysoft Solutions © 2016-2021
// Author: Neal Bailey
// https://www.tradingview.com/u/nealosis/
// https://www.youtube.com/channel/UCWLOB6VrnIHc1QBMpCXUi4A/
// https://www.journeymaninvestor.com/
//
// This source code is subject to the terms of the Mozilla Public License 2.0
// https://mozilla.org/MPL/2.0/
//
// ---------------------------------------------------------------------------
// Connors RSI (CRSI) is a technical indicator created by Larry Connors that
// is a composite of three separate components. The three components that
// comprise the ConnorsRSI indicator are The RSI, UpDown Length, and Rate-of-Change.
// These components are used to create a momentum oscillator. Connors RSI outputs
// a value between 0 and 100, which is then used to identify short-term overbought
// and oversold conditions.
// ---------------------------------------------------------------------------
//@version=4
study("Connors RSI (Baileysoft)", shorttitle="CRSI", format=format.price, precision=2, resolution="")
// The standard RSI indicator period
lenrsi = input(4, "RSI Length (days)", minval=2)
// The number of consecutive days that a security price has either closed up
// (higher than previous day) or closed down (lower than previous days).
lenupdown = input(2, "Up Down Length (days)", minval=2)
// The look-back period for calculating a percentage of the number of values
// within the look back period that are below the current day price change percentage.
lenroc = input(100, "Rate of Change (days)", minval=20)
// The price to evaluate on each bar
src = close
// Calculate the UpDown period required for the algorithm
// @param s_rsi the rsi value to use in the upDown calculation
// @returns integer the updown calculation
calcConnorsUpDown(s_rsi) =>
isEqual = s_rsi == s_rsi[1]
isGrowing = s_rsi > s_rsi[1]
ud = 0.0
ud := isEqual ? 0 : isGrowing ? (nz(ud[1]) <= 0 ? 1 : nz(ud[1])+1) : (nz(ud[1]) >= 0 ? -1 : nz(ud[1])-1)
ud
// Calculate the ConnorsRSI value
// @param lenrsi user-defined standard RSI indicator period length
// @param lenupdown user-defined lookback period
// @param lenroc user-defined daily rate of change (ROC)
// @returns integer the connors oscillator reading
getConnorsRsi(lenrsi, lenupdown, lenroc) =>
rsi = rsi(src, lenrsi)
updownrsi = rsi(calcConnorsUpDown(src), lenupdown)
percentrank = percentrank(roc(src, 1), lenroc)
crsi = avg(rsi, updownrsi, percentrank)
crsi
// Get the ConnorsRSI value
crsi = getConnorsRsi(lenrsi, lenupdown, lenroc)
// Plot the indicator study
plot(crsi, "CRSI", color=color.orange)
band1 = hline(70, "Upper Band", color = #787B86)
band0 = hline(30, "Lower Band", color = #787B86)
fill(band1, band0, color.rgb(33, 150, 243, 90), title = "Background")
Once we apply Connors RSI to the chart we have a way to quickly visualize the CRSI along with the volatility on any given bar on the chart.
Evaluating the Options Profitability / Probability
Before we continue any further we want to make sure that there’s actually enough premium in these options to make any potential trade worth our while so we will switch over to the trading platform (TastyWorks) and pull up the data for MARA.
In the options chain we are only interested in trades 30-45 days long so we’ll expand the October 15th options chain
Here we can see that the market makers expect MARA to move up or down about 11 points over the next 45 days and we definitely want to be out of the way of that move.
On the call side there’s really only option that is out of the expected move, the 55 strike.
If we select the 55 strike we can see that this option has an 88% probability of profit. If we buy the option back at 50% profit then it has a 94% probability of profit.
Each contract we sell will add -24 points worth of negative delta to our portfolio. Our max profit is $179 for each contract and our max loss is infinite. If we had high conviction and had a larger account size we could potentially sell 10 contracts and collect about $1800.
As far as premium goes, this looks fairly decent.
Margin of Safety
Next let’s mark our margin of safety on the chart. Our strike price was 55 so we will draw a line indicating the strike. Next we want to mark the expiration date on the chart so we can visualize our margin of safety.
Without looking at any other metrics we can see that fir us to lose on this trade, MARA needs to rise 17 points over the next 45 days in order to get in-the-money. Remember the market makers project this option will only move 11 points over the next 45 days.
Also important is that 55 is just about MARA’s all-time high. If you were to place a trade you would be betting that MARA was not going to break all time highs over the next 45 days.
Tying All The Data Together: The Backtest
The last thing we want to do is tie all this data together by writing a backtest to see how this specific stock responds to the Connors Crash rule-set.
So we will whip up a quick backtest in pinescript to analyze the signals.
// Baileysoft Solutions © 2016-2021
// Author: Neal Bailey
// https://www.tradingview.com/u/nealosis/
// https://www.youtube.com/channel/UCWLOB6VrnIHc1QBMpCXUi4A/
// https://www.journeymaninvestor.com/
//
// This source code is subject to the terms of the Mozilla Public License 2.0
// https://mozilla.org/MPL/2.0/
//
// ---------------------------------------------------------------------------
// Connors Crash strategy was first introduced in the book "Buy the Fear, Sell the Greed"
// The strategy attempts to profit from short term greed in the marketplace.
// Whenever greed reaches extreme levels security prices become absurdly overbought.
// This creates an opportunity to profit from short term short trades.
// ---------------------------------------------------------------------------
//@version=4
strategy("Connors CRASH! (Short)", overlay=true)
// --------------------
// Strategy Rules
// --------------------
// 1. The stock's closing price must be greater than $5/share.
// 2. The stock's average day volume over the past 21 trading days must be at least 1,000,000 shares a day.
// 3. The stock's 100-day Historical Volatility must be at least 100%.
// 4. The stock has a closing ConnorsRSI (CRSI) reading of 90 or greater.
// 5. Sell a Call Option contract(s) on the open the following day
// 6. Exit (buy option back) when the stock closes with a CRSI reading closing under 30 or you reach 50% profit
// The strategy range
testPeriodStart = timestamp(2011,1,1,0,0) // Start Date
testPeriodStop = timestamp(2021,12,31,0,0) // End Date
// Connors variables
lenrsi = input(4, "CRSI Length (days)", minval=2)
lenupdown = input(2, "CRSI UpDown Length (days)", minval=2)
lenroc = input(20, "CRSI Rate of Change (days)", minval=20)
// Volatility variables
LookbackDays = input(100, "HVol Lookback Period (Days)", minval=5)
Range = input(365, "HVol Lookback Range (Days)", minval=50)
// The price to evaluate on each bar
src = close
// Calculate the UpDown period required for the algorithm
// @param s_rsi the rsi value to use in the upDown calculation
// @returns integer the upDown value
calcConnorsUpDown(s_rsi) =>
isEqual = s_rsi == s_rsi[1]
isGrowing = s_rsi > s_rsi[1]
ud = 0.0
ud := isEqual ? 0 : isGrowing ? (nz(ud[1]) <= 0 ? 1 : nz(ud[1])+1) : (nz(ud[1]) >= 0 ? -1 : nz(ud[1])-1)
ud
// Calculate the ConnorsRSI value
// @param lenrsi user-defined standard RSI indicator period length
// @param lenupdown user-defined lookback period
// @param lenroc user-defined daily rate of change (ROC)
// @returns integer the crsi value
getConnorsRsi(lenrsi, lenupdown, lenroc) =>
rsi = rsi(src, lenrsi)
updownrsi = rsi(calcConnorsUpDown(src), lenupdown)
percentrank = percentrank(roc(src, 1), lenroc)
crsi = avg(rsi, updownrsi, percentrank)
crsi
// Calculate the historic volatility
// @param lookback_days the number of days to compare against the range
// @returns integer the historic volatility value
getHistoricVolitility(lookback_days, hvol_range) =>
ann_days = hvol_range
log_price = log(close / close[1])
nPer = iff(timeframe.isintraday or timeframe.isdaily, 1, 7)
std_dev = stdev(log_price, lookback_days)
hist_vol = std_dev * sqrt(ann_days / nPer) * 100
hist_vol
// Determine if current bar is within range
// @returns boolean true or false
testPeriod() =>
time >= testPeriodStart and time <= testPeriodStop ? true : false
// Long-term moving average
longSMA = sma(close, 200) // SMA Entry Signal
// Get the ConnorsRSI value
crsi = getConnorsRsi(lenrsi, lenupdown, lenroc)
// Get historic volatility
hist_vol = getHistoricVolitility(LookbackDays, Range)
// Step one of entry - bar must be above long-term moving average
longCondition = (close > longSMA)
// if the current bar meets all entry criteria, place a trade
if (longCondition and testPeriod())
strategy.entry("SHORT", strategy.short, 1, when = crsi >= 90 and hist_vol >= 100)
strategy.close("SHORT", when = crsi <= 30)
Once the strategy is applied to the chart we can see that, if you trade based on the signals, this strategy has a 75% win-rate for this stock. Looks like there were 3 signals triggered in 2021 and they are all dead right.
We don’t have any active signals right now so if you are trading the strategy then you don’t have a trade at the moment. You could wait for the signal to trigger by checking in on the stock each day or you might see those 94% the market maker is giving the option and decide to place the trade anyway.
Regardless of what you decide to do, those 2 indicators we wrote can stay on your chart because they are very useful for all your trading.
CONCLUSION
So that’s the Connors CRASH strategy on steriods. I’ve been having some great success with it over the summer but just remember that you do need to use some discretion. In some cases, like what we saw in the demo, we may not be receiving a signal but the trade could still be a good trade, and vice-versa.
SUPPORT THE AUTHOR
If you are finding value in my research or the YouTube content please kindly consider making a small donation to keep this project going.
37y3Twv4QK4wJSDh2UQ4simNTNxUKq486s |
RESOURCES
Portfolios
Please consider using my M1 Finance affiliate link if you decide to invest in one of the portfolios we have analyzed.
- “Dogs of the Dow” (2020) Portfolio
- “Dividend Dogs” (2020) Portfolio
- Harry Browne “Permanent Portfolio”
- Ray Dalio “All-Seasons Portfolio”
- PortfolioCharts “Golden Butterfly” Portfolio
- Robert Gibson “Holy Talmud” Portfolio
- Scott Burns “Couch Potato” Portfolio
- Rick Ferri “Core Four” Portfolio
- Boglehead “Three Fund” Portfolio
- JL Collins “Simple Path to Wealth” Portfolio
- Paul Merriman “Ultimate Buy & Hold” Portfolio
- Dow Jones Index (Equal Weight)
Recommended Books
- A Random Walk Down Wall Street (Burton Malkiel)
- The Simple Path to Wealth (JL Collins)
- I Will Teach You To be Rich (Ramit Sethi)
Please consider buying any of these books as audiobooks from Audible.com!