Skip to main contentSkip to content
Squeeze Setups A live squeeze scanner built around the Slingshot Squeeze, with 22 years of backtest results behind it. See it, $99/month →
TOS Indicators
  • Tools

    Categories

    • Indicators
    • Backtesters
    • Scans
    • Dashboards
    • thinkScript
    • Member Resources
    Browse Full Library

    Featured Tutorials

    Fair Value Gap Indicator
    Fair Value Gap Indicator
    Indicators

    Download our free Fair Value Gap indicator for ThinkorSwim. It shades every...

    Learn more →
    False Breakout Scanner for ThinkorSwim (Free Scan Pair)
    False Breakout Scanner for ThinkorSwim (Free Scan Pair)
    Scans

    A two-scan pair that flags failed breakouts and failed breakdowns with volume...

    Learn more →
    Heiken Ashi Trend Indicator
    Heiken Ashi Trend Indicator
    Indicators

    Download our Custom Heiken Ashi indicator for ThinkOrSwim. Full ThinkScript code, formula...

    Learn more →

    Popular Posts

    Unusual Volume Pro Scans
    Unusual Volume Pro Scans
    Scans

    4 additional scans to find unusual volume overlapping with key...

    Learn more →
    High Short Interest Near 52 Week Highs (thinkScript)
    High Short Interest Near 52 Week Highs (thinkScript)
    Scans

    Build a simple scan in which to find stocks that...

    Learn more →
    Upcoming Earnings with High Short Interest
    Upcoming Earnings with High Short Interest
    Scans

    Build a scan to find stocks that are likely to...

    Learn more →
  • Courses
    Squeeze Course
    Squeeze Course
    19 Modules

    Scan, backtest, and trade the TTM Squeeze setup with precision.

    View Course →
    Earnings Course
    Earnings Course
    3 Modules

    Master earnings plays with free indicators and proven strategies for ThinkOrSwim.

    View Course →
    V-Shaped Reversals
    V-Shaped Reversals
    7 Modules

    Identify and trade powerful V-shaped reversal patterns with confidence and precision.

    View Course →
    Fibonacci Trading
    Fibonacci Trading
    4 Modules

    Learn to trade Fibonacci retracements and extensions in ThinkOrSwim effectively.

    View Course →
  • Products
    Futures Volatility Box Premium
    Futures Volatility Box

    Volatility models for 10 major futures markets, including the micros.

    Explore Futures VB →
    Stock Volatility Box Premium
    Stock Volatility Box

    Volatility levels for 600+ stocks and ETFs, with a live scanner.

    Explore Stock VB →
    Opening Range Breakouts Premium
    Opening Range Breakouts

    Scans 600+ stocks every 2 seconds for opening range breaks, with a backtester.

    Explore ORB Setups →
My Account
All Indicators
Beginner-Friendly 25 mins

Super Bowl Indicator

How effective is the Super Bowl in predicting market returns? Test this stock market theory, going back to the very first Super Bowl.

Download Indicator
How to install in ThinkOrSwim →
Table of Contents
  • Step-by-Step Coding Guide for the Super Bowl Indicator
  • Final Thoughts and Analysis

Introduction

The Super Bowl Indicator, also known as the Stock Market Predictor, is a popular myth that suggests that the outcome of the Super Bowl can predict the direction of the stock market for the coming year.

This theory states that:

  • If a team from the American Football Conference (AFC) wins, it is a bearish signal for the stock market
  • If a team from the National Football Conference (NFC) wins, it is a bullish signal for the stock market

In this tutorial, we will put this theory to test, by building our very own Super Bowl Indicator.

Along the way, we will examine the underlying assumptions and principles, and evaluate its accuracy and reliability as a predictor of stock market performance.

Step-by-Step Coding Guide for the Super Bowl Indicator

Step 1: Setting Up Inputs

We begin by creating inputs in ThinkOrSwim. These inputs provide flexibility, allowing you to toggle chart bubbles and labels on or off, depending on what you wish to visualize. Here’s how you set these inputs:

input chartBubblesOn = yes;
input labelsOn = yes;

These inputs are Boolean types, defaulted to “yes,” enabling both chart bubbles and labels on the chart. Later on, we’ll use these variables to control which features are displayed.

Step 2: Defining Conference Values

Next, we define constant values to represent the AFC and NFC conferences. These will make it easier to distinguish which conference each Super Bowl winner belongs to, enabling more straightforward comparisons.

def nfc = 1;
def afc = -1;

These simple definitions will help us set up the rest of the code for determining Super Bowl winners based on conference affiliations.

Step 3: Classifying Super Bowl Winners by Year

In this step, we’ll assign each Super Bowl winner to the appropriate conference based on the year. This block uses conditional statements to tie each year to either the AFC or NFC, which will allow us to visualize changes over time. You can use data from an external source, like Wikipedia, to ensure accuracy when inputting the winning conferences.

def SuperBowlWinner = if getYear() == 2024 and getYear()[-1] == 2025 then afc 
else if getYear() == 2023 and getYear()[-1] == 2024 then afc 
...
else if getYear() == 1967 and getYear()[-1] == 1968 then nfc 
else 0;

This code block runs through each year and assigns the appropriate value (AFC or NFC) based on the Super Bowl’s outcome. You’ll need to ensure that all years from 1967 onward are accounted for, allowing for comprehensive analysis.

Step 4: Calculating Yearly Market Stats

Now, let’s add code to calculate the market’s annual percentage change. This is crucial for understanding how each Super Bowl outcome correlates with market performance:

def yearChange = (close(period = AggregationPeriod.Year) - open(period = AggregationPeriod.Year))/(open(period = AggregationPeriod.Year));

def totalAFCWinners = TotalSum(SuperBowlWinner == afc);
def totalNFCWinners = TotalSum(SuperBowlWinner == nfc);

def AFCPctChange = if SuperBowlWinner == afc then yearChange else 0;
def NFCPctChange = if SuperBowlWinner == nfc then yearChange else 0;

def averageAFCPctChange = TotalSum(AFCPctChange)/totalAFCWinners;
def averageNFCPctChange = TotalSum(NFCPctChange)/totalNFCWinners;

By calculating the yearChange, we can analyze each year’s performance and store the results for AFC and NFC teams separately. This step provides valuable data on annual market trends and the average percentage change for each conference’s winning years.

Step 5: Adding Chart Bubbles

Chart bubbles enhance the visual appeal and functionality of the Super Bowl Indicator. With bubbles, you can quickly identify Super Bowl winners and corresponding market changes each year. Here’s the code to add these bubbles:

AddChartBubble(chartBubblesOn and SuperBowlWinner, close, "Winner: " + if SuperBowlWinner == afc then "AFC \nYear Change: " + AsPercent(yearChange) else "NFC \nYear Change: " + AsPercent(yearChange), if SuperBowlWinner == afc then color.pink else color.cyan);

This line creates a bubble that displays the conference of the Super Bowl winner, along with the market’s percentage change for that year. You can modify the colors to your preference, making it even easier to distinguish AFC and NFC years.

Step 6: Adding Labels for Total Wins and Averages

With labels, we can summarize the total number of wins for each conference and the average percentage changes. This step provides a high-level view of the market impact by Super Bowl outcomes.

AddLabel(labelsOn, "AFC Wins: " + totalAFCWinners + " | Avg Pct: " + AsPercent(averageAFCPctChange), color.pink);
AddLabel(labelsOn, "NFC Wins: " + totalNFCWinners + " | Avg Pct: " + AsPercent(averageNFCPctChange), color.cyan);

Labels condense all the data into a more digestible format, making it easy to see overall trends at a glance. This feature provides immediate context for both AFC and NFC performance over the years.

Step 7: Building a Custom Excel Sheet (Optional)

If you want to expand the analysis, consider creating a custom Excel sheet. Enter historical Super Bowl winners, categorizing them by conference. Then, bring this data into ThinkOrSwim for analysis. By using Excel, you can easily update the data annually and even experiment with other variables.

For this process, set up columns in Excel for the year, conference, and market change. Use ThinkOrSwim’s import function to streamline the transition from Excel to the platform.

Step 8: Calculating Averages Manually

In this part, we create our own averaging function for more flexibility. Rather than using built-in ThinkOrSwim functions, this manual approach gives greater control over how data is processed, especially for separating AFC and NFC years:

def averageAFCPctChange = TotalSum(AFCPctChange)/totalAFCWinners;
def averageNFCPctChange = TotalSum(NFCPctChange)/totalNFCWinners;

This method ensures that the averages reflect only the years in which each conference won the Super Bowl, allowing for more precise analysis.

Step 9: Testing and Fine-Tuning

Before finalizing the indicator, test it on different time frames and chart types. You might find certain settings reveal more about the market’s reaction to Super Bowl outcomes. Experiment with other markets, such as the Dow Jones or NASDAQ, to see how they align with the Super Bowl theory.

Adjust the input variables and test on various periods. These tests will show whether the indicator holds any significant insights or is purely coincidental fun.

Final Thoughts and Analysis

By completing this tutorial, you’ve not only built a fully functioning Super Bowl Indicator, but you’ve also gained insights into the ThinkOrSwim platform’s data handling capabilities. With the flexibility of inputs, chart bubbles, and labels, this indicator is a unique tool for exploring historical trends based on a famous football event.

Remember, the Super Bowl Indicator is meant for entertainment rather than scientific analysis. The purpose here is to help you explore new coding techniques and see how even non-traditional data points can be visualized in ThinkOrSwim. You can find the full script and Excel data template on our website for further experimentation.

Super Bowl Indicator.ts
#TOS Indicators

#Home of the Volatility Box

#Indicator Name: Super Bowl Indicator

#Full tutorial here: tosindicators.com/indicators/superbowl

### Inputs ###

input chartBubblesOn = yes;

input labelsOn = yes;

### Classifying Super Bowl Winners ###

def nfc = 1;

def afc = -1;

def SuperBowlWinner = if getYear() == 2022 and getYear()[-1] == 2023 then nfc else

if getYear() == 2021 and getYear()[-1] == 2022 then nfc else

if getYear() == 2020 and getYear()[-1] == 2021 then afc else

if getYear() == 2019 and getYear()[-1] == 2020 then afc else

if getYear() == 2018 and getYear()[-1] == 2019 then nfc else

if getYear() == 2017 and getYear()[-1] == 2018 then afc else

if getYear() == 2016 and getYear()[-1] == 2017 then afc else

if getYear() == 2015 and getYear()[-1] == 2016 then afc else

if getYear() == 2014 and getYear()[-1] == 2015 then nfc else

if getYear() == 2013 and getYear()[-1] == 2014 then afc else

if getYear() == 2012 and getYear()[-1] == 2013 then nfc else

if getYear() == 2011 and getYear()[-1] == 2012 then nfc else

if getYear() == 2010 and getYear()[-1] == 2011 then nfc else

if getYear() == 2009 and getYear()[-1] == 2010 then afc else

if getYear() == 2008 and getYear()[-1] == 2009 then nfc else

if getYear() == 2007 and getYear()[-1] == 2008 then afc else

if getYear() == 2006 and getYear()[-1] == 2007 then afc else

if getYear() == 2005 and getYear()[-1] == 2006 then afc else

if getYear() == 2004 and getYear()[-1] == 2005 then afc else

if getYear() == 2003 and getYear()[-1] == 2004 then nfc else

if getYear() == 2002 and getYear()[-1] == 2003 then afc else

if getYear() == 2001 and getYear()[-1] == 2002 then afc else

if getYear() == 2000 and getYear()[-1] == 2001 then nfc else

if getYear() == 1999 and getYear()[-1] == 2000 then afc else

if getYear() == 1998 and getYear()[-1] == 1999 then afc else

if getYear() == 1997 and getYear()[-1] == 1998 then nfc else

if getYear() == 1996 and getYear()[-1] == 1997 then nfc else

if getYear() == 1995 and getYear()[-1] == 1996 then nfc else

if getYear() == 1994 and getYear()[-1] == 1995 then nfc else

if getYear() == 1993 and getYear()[-1] == 1994 then nfc else

if getYear() == 1992 and getYear()[-1] == 1993 then nfc else

if getYear() == 1991 and getYear()[-1] == 1992 then nfc else

if getYear() == 1990 and getYear()[-1] == 1991 then nfc else

if getYear() == 1989 and getYear()[-1] == 1990 then nfc else

if getYear() == 1988 and getYear()[-1] == 1989 then nfc else

if getYear() == 1987 and getYear()[-1] == 1988 then nfc else

if getYear() == 1986 and getYear()[-1] == 1987 then nfc else

if getYear() == 1985 and getYear()[-1] == 1986 then nfc else

if getYear() == 1984 and getYear()[-1] == 1985 then afc else

if getYear() == 1983 and getYear()[-1] == 1984 then nfc else

if getYear() == 1982 and getYear()[-1] == 1983 then nfc else

if getYear() == 1981 and getYear()[-1] == 1982 then afc else

if getYear() == 1980 and getYear()[-1] == 1981 then afc else

if getYear() == 1979 and getYear()[-1] == 1980 then afc else

if getYear() == 1978 and getYear()[-1] == 1979 then nfc else

if getYear() == 1977 and getYear()[-1] == 1978 then afc else

if getYear() == 1976 and getYear()[-1] == 1977 then afc else

if getYear() == 1975 and getYear()[-1] == 1976 then afc else

if getYear() == 1974 and getYear()[-1] == 1975 then afc else

if getYear() == 1973 and getYear()[-1] == 1974 then afc else

if getYear() == 1972 and getYear()[-1] == 1973 then nfc else

if getYear() == 1971 and getYear()[-1] == 1972 then afc else

if getYear() == 1970 and getYear()[-1] == 1971 then afc else

if getYear() == 1969 and getYear()[-1] == 1970 then afc else

if getYear() == 1968 and getYear()[-1] == 1969 then nfc else

if getYear() == 1967 and getYear()[-1] == 1968 then nfc else

0;

### Stats ### 

def yearChange = (close(period = AggregationPeriod.Year) – open(period = AggregationPeriod.Year))/(open(period = AggregationPeriod.Year));

def totalAFCWinners = TotalSum(SuperBowlWinner == afc);

def totalNFCWinners = TotalSum(SuperBowlWinner == nfc);

def AFCPctChange = if SuperBowlWinner == afc then yearChange else 0;

def NFCPctChange = if SuperBowlWinner == nfc then yearChange else 0;

def averageAFCPctChange = TotalSum(AFCPctChange)/totalAFCWinners;

def averageNFCPctChange = TotalSum(NFCPctChange)/totalNFCWinners;

### Chart Bubbles and Labels ### 

AddChartBubble(chartBubblesOn and SuperBowlWinner, close, “Winner: ” + if SuperBowlWinner == afc then “AFC \nYear Change: ” + AsPercent(yearChange) else “NFC \nYear Change: ” + AsPercent(yearChange), if SuperBowlWinner == afc then color.pink else color.cyan);

AddLabel(labelsOn, “AFC Wins: ” + totalAFCWinners + ” | Avg Pct: ” + AsPercent(averageAFCPctChange), color.pink);

AddLabel(labelsOn, “NFC Wins: ” + totalNFCWinners + ” | Avg Pct: ” + AsPercent(averageNFCPctChange), color.cyan);

Want the .ts file and the one-click import? Both come with a free account.

Create Free Account Login
To build a Super Bowl indicator in ThinkOrSwim, start by creating a new study and define constants (def nfc = 1; def afc = -1;). Then create a large conditional statement using if getYear() == [YEAR] and getYear()[-1] == [YEAR+1] then [CONFERENCE] for each Super Bowl year from 1967-present. Use Excel formulas to generate this code automatically rather than typing 56+ conditions manually.
The Super Bowl Indicator theory, discovered in 1978, states that if an NFC team wins the Super Bowl, the stock market will rise that year, while an AFC team win predicts market decline. Historically accurate about 75% of the time initially, but only 50% accurate in recent decades. This is a non-scientific theory used here for educational purposes to teach ThinkScript programming and data analysis.
Create an Excel column with a formula like ="if getYear() == "&A2&" and getYear()[-1] == "&A2+1&" then "&IF(C2="NFC","nfc","afc")&" else ". Copy this formula down for all years, then copy the entire column and paste into your ThinkScript editor. This automates creating large conditional statements and prevents manual typing errors.
Use aggregation periods to force yearly calculations: def yearChange = (close(period = AggregationPeriod.Year) - open(period = AggregationPeriod.Year))/(open(period = AggregationPeriod.Year)); This calculates percentage change from year open to year close regardless of your chart timeframe, ensuring consistent yearly performance measurements.
Use \n for line breaks in chart bubble text: AddChartBubble(condition, close, "Winner: AFC \nYear Change: " + AsPercent(yearChange), color.pink); The \n creates a new line, allowing multi-line information displays. Combine with conditional logic to show different content based on data values.
Create input variables at the top: input chartBubblesOn = yes; input labelsOn = yes; Then use these in your conditions: AddChartBubble(chartBubblesOn and SuperBowlWinner, close, text, color); This creates checkboxes in the indicator settings allowing users to show/hide different elements for better performance and customization.
Build custom averages using TotalSum and division: def averageAFCPctChange = TotalSum(AFCPctChange)/totalAFCWinners; First create conditional variables that store values only when conditions are met (AFCPctChange = if SuperBowlWinner == afc then yearChange else 0), then sum those values and divide by the count. This avoids division-by-zero errors and handles conditional data.
Yes, the indicator works on any market with sufficient historical data. SPX provides data back to 1967 (first Super Bowl), while QQQ starts around 1999 and individual stocks vary. Simply apply the indicator to different symbols to see how the Super Bowl theory performs across various markets. The data automatically adjusts to whatever timeframe the symbol supports.

Here are some resources that you may find useful:

  • How to import an indicator into ThinkOrSwim (video tutorial)
Featured Tools:
Stock Volatility Box

Stock Volatility Box

Spot reversal zones across 600 stocks & ETFs.

  • Hourly & daily models
  • Powerful Live Scanner
  • Built for day traders
Futures Volatility Box

Futures Volatility Box

Pinpoint reversal zones in 10 major futures markets.

  • 5 models (incl. Scalper)
  • ThinkOrSwim & TradingView
  • SPX traders
ORB Setups

ORB Setups

Find the best Opening Range Breakout setups.

  • Powerful real-time scanner
  • Instant backtests
  • 2+ years data

Get Free Access

Create a free account for downloads and new tutorial alerts.

Create Free Account

Related tutorials and research

How to Build a Fair Value Gap Indicator in ThinkorSwim

How to Build a Fair Value Gap Indicator in ThinkorSwim

Indicators · Beginner-Friendly
How to Build a Heiken Ashi Trend Dots Indicator in ThinkOrSwim

How to Build a Heiken Ashi Trend Dots Indicator in ThinkOrSwim

Indicators · Beginner-Friendly
Commodities Tracker

Commodities Tracker

Indicators · Beginner
Trend Squeeze

Trend Squeeze

Indicators · Beginner
Volume Intensity

Volume Intensity

Indicators · Beginner-Friendly
Parabolic SAR

Parabolic SAR

Indicators · Intermediate

Ready to Trade With an Edge?

Join 40,000+ traders using institutional-grade tools for ThinkOrSwim.

Get the Bundle
TOS Indicators

Premium thinkorswim indicators, scans, and trading tools to help you trade smarter.

ThinkOrSwim Tools

  • Indicators
  • Scans
  • Backtesters
  • Dashboards
  • thinkScript
  • Browse All

Courses

  • Squeeze Course
  • Earnings Course
  • V-Shaped Reversals
  • Fibonacci Trading

Products

  • Futures Volatility Box
  • Stock Volatility Box
  • ORB Setups
  • Shop All

Guides

  • TTM Squeeze
  • Automated Trading
  • Volatility Trading
  • Opening Range Breakouts
  • Trade Reports
  • Contact Us

© 2026 TOS Indicators. All rights reserved.

Privacy Policy Terms of Service Disclaimer Accessibility

The information contained on this website is solely for educational purposes, and does not constitute investment advice. The risk of trading in securities markets can be substantial. You must review and agree to our Terms of Service prior to using this site.

U.S. Government Required Disclaimer - Commodity Futures Trading Commission. Futures and options trading has large potential rewards, but also large potential risk. You must be aware of the risks and be willing to accept them in order to invest in the futures and options markets. Don't trade with money you can't afford to lose. This website is neither a solicitation nor an offer to Buy/Sell futures or options. No representation is being made that any account will or is likely to achieve profits or losses similar to those discussed on this website. The past performance of any trading system or methodology is not necessarily indicative of future results.

Individual results may vary, and testimonials are not claimed to represent typical results. All testimonials are by real people, and may not reflect the typical purchaser's experience, and are not intended to represent or guarantee that anyone will achieve the same or similar results.

TOS Indicator's Traders and employees will NEVER manage or offer to manage a customer or individual's options, stocks, currencies, futures, or any financial markets or securities account. If someone claiming to represent or be associated with TOS Indicator solicits you for money or offers to manage your trading account, do not provide any personal information and contact us immediately.

CFTC RULE 4.41 - HYPOTHETICAL OR SIMULATED PERFORMANCE RESULTS HAVE CERTAIN LIMITATIONS. UNLIKE AN ACTUAL PERFORMANCE RECORD, SIMULATED RESULTS DO NOT REPRESENT ACTUAL TRADING. ALSO, SINCE THE TRADES HAVE NOT BEEN EXECUTED, THE RESULTS MAY HAVE UNDER-OR-OVER COMPENSATED FOR THE IMPACT, IF ANY, OF CERTAIN MARKET FACTORS, SUCH AS LACK OF LIQUIDITY, SIMULATED TRADING PROGRAMS IN GENERAL ARE ALSO SUBJECT TO THE FACT THAT THEY ARE DESIGNED WITH THE BENEFIT OF HINDSIGHT. NO REPRESENTATION IS BEING MADE THAT ANY ACCOUNT WILL OR IS LIKELY TO ACHIEVE PROFIT OR LOSSES SIMILAR TO THOSE SHOWN.