Quantopian's community platform is shutting down. Please read this post for more information and download your code.
Back to Community
How can I get the 200 largest company tickers from NASDAQ to update monthly?

Absolute newb here. I just joined Quantipian and had never written in python up until a week ago. So far, I'm slowly succeeding at algo writing but I find rigid ticker input lists annoying. I'd like to create a monthly updating list that fetches the largest 200 company tickers by market cap from the NASDAQ website (http://www.nasdaq.com/screening/companies-by-industry.aspx?industry=ALL&exchange=NASDAQ&sortname=marketcap&sorttype=1) and returns them in the data[stock] format. Any ideas? Thanks in advance.

8 responses

Hi Aitor,

Welcome!

The best way to dynamically set your universe is to use fundamentals data, specifically the get_fundamentls() method in combination with update_universe(), all within before_trading_start().

Market cap is one of the fields in there. There also looks to be a field called primary_exchange_id in the Company Reference namespace that might fit the bill for NASDAQ listed companies.

Check out the documentation here: https://www.quantopian.com/help#ide-fundamentals

There is also a field by field definition here: https://www.quantopian.com/help/fundamentals

Disclaimer

The material on this website is provided for informational purposes only and does not constitute an offer to sell, a solicitation to buy, or a recommendation or endorsement for any security or strategy, nor does it constitute an offer to provide investment advisory services by Quantopian. In addition, the material offers no opinion with respect to the suitability of any security or specific investment. No information contained herein should be regarded as a suggestion to engage in or refrain from any investment-related course of action as none of Quantopian nor any of its affiliates is undertaking to provide investment advice, act as an adviser to any plan or entity subject to the Employee Retirement Income Security Act of 1974, as amended, individual retirement account or individual retirement annuity, or give advice in a fiduciary capacity with respect to the materials presented herein. If you are an individual retirement or other investor, contact your financial advisor or other fiduciary unrelated to Quantopian about whether any given investment idea, strategy, product or service described herein may be appropriate for your circumstances. All investments involve risk, including loss of principal. Quantopian makes no guarantees as to the accuracy or completeness of the views expressed in the website. The views are subject to change, and may have become unreliable for various reasons, including changes in market conditions or economic circumstances.

Hi Josh,

Thanks for the advice. I got most of it to work but can't get the NASDAQ filter part to work. Could you help me with that? I'm attaching a backtest. On line 24, I filter out the non-NASDAQ symbols but my algo runs as if there were no symbols at all. If I delete this line, it prints many tickers, both from and outside the NASDAQ.

Hi Altor,

Looks like the Morningstar data uses NAS to indicate NASDAQ. (I checked this by specifically filtering on Cisco (CSCO )and printing out the primary exchange field.

When I swap that out for NASDAQ, I get a 200 security strong algo!

Very cool. Not a use case I had tested in the past.

Here's an example:

import pytz  
import math  
import talib  
import numpy as np  
import pandas as pd  
from datetime import datetime,timedelta

def initialize(context):  
    #Set Trading Guard  
    set_do_not_order_list(security_lists.leveraged_etf_list)  
    #Set Short Restrictions  
    set_long_only()

def before_trading_start(context):  
    #Setup Tickers for NASDAQ's Largest 200 Companies by Market Cap #Pending  
    fundamental_df = get_fundamentals(  
        query(  
            fundamentals.valuation.market_cap,  
            fundamentals.company_reference.primary_exchange_id  
        )  
        #.filter(fundamentals.company_reference.primary_exchange_id == 'NASDAQ')  
        .filter(fundamentals.valuation.market_cap != None)  
        .filter(fundamentals.company_reference.primary_symbol == 'CSCO')  
        .order_by(fundamentals.valuation.market_cap.desc()).limit(10))  
    context.stocks = [stock for stock in fundamental_df]  
    context.fundamental_df = fundamental_df[context.stocks]  
    update_universe(context.fundamental_df.columns.values)  
def handle_data(context, data):  
    for stock in context.stocks:  
        if stock in data:  
         print (stock)  

Works! Thanks A LOT!

Thanks, that is really helpful.

I did however wonder how you filter out stocks that are no longer traded. I have added the following to my monthly rebalance.

current_date = get_datetime()

for stock in prices:  
        if (stock.end_date - current_date).days < 31:  
            log.info("DROPPING %s"%stock)  
            prices = prices.drop(stock,axis=1)  

This works fine for historic testing but will blow up on the latest month as it drops all stocks and obviously cant be used for trading. Any ideas on how to make something that works for both historic timeframes and the present?

Gavin,

Since there aren't that many, I just removed them manually, adding them one by one as the backtest notifies me that there's an error. This works for backtests and I suppose it would for paper trading too. Although it does seem a bit oversimplified.. Anyway, check it out. Those 4 tickers messed up my year backtest, which is now (doing it right now) running smoothly and so far, so good.

def initialize(context):  
    #Set Broken Ticker List  
    BrokenTickers = symbols('LBTY_B', 'DISC_B', 'LMCB', 'LVNT_B')  
    #Set Trading Guard  
    set_do_not_order_list(BrokenTickers)  

Gavin,

The last code I posted doesn't work. I still don't know why :( Thought I should let you know.

@Josh Payne , Can I use most of the NYSE and NASDAQ stocks in my algo and use a screening function once per month / two weeks ?
I need to use the stock price data to sort the stocks and, from what I've seen, I can't use, of course, fundamental data or for technical selection criteria. There is no price data field in the available fields in the Fundamentals Reference that can be used in fundamental_df.
https://www.quantopian.com/posts/can-i-use-all-nyse-and-nasdaq-stocks-in-my-algo-and-use-a-screening-function-once-per-month-slash-two-weeks