DEV Community

penny penguin
penny penguin

Posted on

How I Rank 19 Mega-Cap Tech Stocks With a Momentum + Quality Factor Model (Real Data, Reproducible)

LaunchTower is an independent market-data desk. This is a real, dated, reproducible research note — not a stock tip. Every number below comes from public price data (yfinance, split/dividend-adjusted closes) and a simple, fully documented factor model. You can re-run it yourself.

The Setup

Report date: 2026-09-11 (data as of market close)
Universe: 19 large/mega-cap US tech & growth names (SQ excluded — delisted/renamed, no data)
Observations: 499 trading days (2024-09-16 → 2026-09-11), adjusted close prices via yfinance.
Method: Cross-sectional z-scores. Momentum = equal-weight of 1m/3m/6m/12m return z-scores. Quality = negative z of 12m realized volatility and 12m max drawdown. Composite = 0.6 × momentum + 0.4 × quality.

No paid data. No look-ahead bias. No black box.

Top 5 (Highest Composite Score)

# Ticker Price 3m Ret 12m Ret 12m Vol 12m MaxDD Momentum Quality Composite
1 CRM $247.72 +48.8% +3.0% 47.2% −43.3% 1.090 0.167 0.721
2 AMD $516.13 +5.7% +223.5% 71.7% −27.8% 1.795 −1.068 0.650
3 MSFT $495.63 +27.2% −0.1% 32.4% −34.5% 0.212 0.390 0.283
4 AAPL $332.27 +12.5% +47.1% 25.1% −13.8% 0.386 0.037 0.246
5 MSTR $130.97 +9.0% −59.9% 79.7% −77.1% 0.205 0.084 0.157

Bottom 5 (Lowest Composite Score)

# Ticker Price 3m Ret 12m Ret 12m Vol 12m MaxDD Composite
15 TSLA $365.44 −8.5% +5.1% 47.5% −39.1% −0.183
16 UBER $71.67 +3.1% −23.9% 35.9% −34.1% −0.218
17 SHOP $128.79 +16.6% −9.4% 58.4% −46.7% −0.294
18 ORCL $150.28 −18.1% −53.7% 57.2% −64.6% −0.396
19 AVGO $361.99 −6.0% −1.3% 46.2% −28.7% −0.496

Read of the Tape

  • CRM leads on momentum (strong 3m run) with acceptable quality — cleanest composite in the universe.
  • AMD is a pure momentum story: +223% over 12m but very high vol (72%) and negative quality; the model still ranks it #2 because momentum dominates the 60/40 weighting.
  • AAPL is the quality anchor: lowest vol (25%) and shallowest drawdown (−14%) in the universe.
  • AVGO/ORCL are the clear laggards: negative 3m and 12m returns with elevated vol.

Full Factor Table (All 19 Names)

Rank Ticker Price 1m 3m 6m 12m 12m Vol 12m MaxDD Momentum Quality Composite
1 CRM 247.72 +28.1% +48.8% +24.9% +3.0% 47.2% −43.3% +1.09 +0.17 0.721
2 AMD 516.13 +6.9% +5.7% +161.0% +223.5% 71.7% −27.8% +1.80 −1.07 0.650
3 MSFT 495.63 +0.8% +27.2% +23.8% −0.1% 32.4% −34.5% +0.21 +0.39 0.283
4 AAPL 332.27 +9.9% +12.5% +30.2% +47.1% 25.1% −13.8% +0.39 +0.04 0.246
5 MSTR 130.97 +38.1% +9.0% −4.6% −59.9% 79.7% −77.1% +0.21 +0.08 0.157
6 ABNB 170.19 −5.5% +30.1% +33.3% +37.9% 34.8% −17.2% +0.35 −0.18 0.140
7 META 648.03 +12.0% +14.1% +1.7% −13.5% 39.4% −32.5% +0.02 +0.11 0.054
8 TSM 433.24 +1.0% +2.9% +29.3% +68.2% 40.2% −21.6% +0.14 −0.23 −0.005
9 PLTR 167.23 −2.2% +27.6% +8.9% +0.3% 60.8% −48.2% +0.06 −0.13 −0.015
10 COIN 175.26 +17.6% +9.2% −9.3% −44.4% 70.7% −63.6% −0.15 −0.01 −0.095
11 AMZN 256.78 −3.9% +6.3% +22.6% +11.5% 34.3% −21.7% −0.17 −0.03 −0.114
12 GOOGL 338.50 −1.4% −5.3% +11.7% +41.9% 31.5% −21.1% −0.25 +0.04 −0.137
13 NVDA 218.29 −2.5% +6.7% +19.5% +23.4% 38.0% −20.2% −0.11 −0.20 −0.143
14 NFLX 77.40 +4.3% −4.8% −17.9% −38.0% 35.9% −45.5% −0.65 +0.59 −0.154
15 TSLA 365.44 +11.6% −8.5% −7.5% +5.1% 47.5% −39.1% −0.33 +0.04 −0.183
16 UBER 71.67 −4.9% +3.1% −1.8% −23.9% 35.9% −34.1% −0.54 +0.27 −0.218
17 SHOP 128.79 −14.4% +16.6% +2.1% −9.4% 58.4% −46.7% −0.42 −0.10 −0.294
18 ORCL 150.28 −2.0% −18.1% −4.9% −53.7% 57.2% −64.6% −0.96 +0.45 −0.396
19 AVGO 361.99 −13.0% −6.0% +8.1% −1.3% 46.2% −28.7% −0.68 −0.22 −0.496

Reproduce It Yourself

The model is a ~100-line Python script:

import yfinance as yf
import pandas as pd
import numpy as np

TICKERS = ["CRM","AMD","MSFT","AAPL","MSTR","ABNB","META","TSM","PLTR",
           "COIN","AMZN","GOOGL","NVDA","NFLX","TSLA","UBER","SHOP","ORCL","AVGO"]

df = yf.download(TICKERS, start="2024-09-11", auto_adjust=True)["Close"]
rets = {w: df.pct_change(w).iloc[-1] for w in [21, 63, 126, 252]}
vol = df.pct_change().rolling(252).std().iloc[-1] * np.sqrt(252)
maxdd = (df / df.cummax() - 1).rolling(252).min().iloc[-1]

# Z-score cross-sectionally, blend 60/40
momentum = sum(pd.Series(rets[w]).rank(pct=True) for w in rets) / 4
quality = (1 - pd.Series(vol).rank(pct=True) + (1 - pd.Series(maxdd).rank(pct=True))) / 2
composite = 0.6 * momentum + 0.4 * quality
Enter fullscreen mode Exit fullscreen mode

No black box. No paid data. Pull 2 years of adjusted closes, compute returns, z-score them cross-sectionally, blend momentum (60%) with a quality tilt (40%), and rank.

Get the Full Report + Dataset

The complete report includes all 19 tickers with every factor score, the full methodology writeup, the reproducible code, and the raw CSV dataset.

Get the full report + dataset → ($29)


This is a research report, not financial advice. Factor scores are computed from historical data and do not guarantee future performance. Momentum strategies can experience sharp reversals. Past performance is not indicative of future results. LaunchTower is an independent market-data desk. We do not manage client funds, sell financial advice, or solicit crypto payments. Data is from Yahoo Finance via yfinance. Verify independently before making any investment decision.

Top comments (0)