카테고리 없음

NASDAQ100 stock screener for bullish trend - python, yfinance

전문 컨설턴트 2024. 11. 4. 14:24

Purpose:

to screen stockers that have bullish trend

 

Definition:

- bullish trend: The stock's short-term simple moving average (SMA) is greater than its medium-term SMA and its medium-term SMA is greater than its long-term SMA.

- simple moving average: an average of close price for a given window.

- short-term SMA: SMA for 5 trading days (1 week)

- medium-term SMA: SMA for 20 trading days (1 month)

- long-term SMA: SMA for 60 trading days (3 month)

 

Theory:

Stocks that have a bullish trend have 80% possibility of going up

 

Getting Simple Moving Averages for Each Ticker:

    data = yf.download(ticker, period="6mo")

    short_window = 5   # Short-term SMA (e.g., 20 days)
    medium_window = 20  # Medium-term SMA (e.g., 60 days)
    long_window = 60   # Long-term SMA (e.g., 200 days)

    SMA_short = data['Close'].tail(short_window).mean().values[0]
    SMA_medium = data['Close'].tail(medium_window).mean().values[0]
    SMA_long = data['Close'].tail(long_window).mean().values[0]

 

Checking Whether Bullish or Not:

    condition_one = (SMA_short > SMA_medium)
    condition_two = (SMA_medium > SMA_long)

    is_bullish = condition_one and condition_two

 

Full Code:

import yfinance as yf
import pandas as pd
import json

nasdaq100_tickers = pd.read_html('https://en.wikipedia.org/wiki/Nasdaq-100#Components')[4]['Symbol']
#nasdaq100_tickers = nasdaq100_tickers[0:10]

quotes = {}
quotes["bullish"] = []

for idx, ticker in enumerate(nasdaq100_tickers):
  try:
    remaining = len(nasdaq100_tickers) - idx - 1
    print(f"checking quote {idx + 1}. remainding = {remaining}")

    data = yf.download(ticker, period="6mo")

    short_window = 5   # Short-term SMA (e.g., 20 days)
    medium_window = 20  # Medium-term SMA (e.g., 60 days)
    long_window = 60   # Long-term SMA (e.g., 200 days)

    SMA_short = data['Close'].tail(short_window).mean().values[0]
    SMA_medium = data['Close'].tail(medium_window).mean().values[0]
    SMA_long = data['Close'].tail(long_window).mean().values[0]

    condition_one = (SMA_short > SMA_medium)
    condition_two = (SMA_medium > SMA_long)

    is_bullish = condition_one and condition_two

    if is_bullish:
      quotes["bullish"].append(ticker)

  except Exception as e:
    print(f"Exception: {e}")
    raise

print(f"total {len(quotes['bullish'])} quotes found")

bullish_tickers = quotes['bullish']
for i in range(0, len(bullish_tickers), 5):
    # Join the next five tickers into a string
    line = ", ".join(bullish_tickers[i:i + 5])
    print(line)

 

Result: