strategy_000004

Back to leaderboard · 2015-01-01 to 2025-06-01 · v3_top100_monthly

Overall top-100 hits
24.95
average across horizons
Predicted top-100 avg actual rank
236.54
lower is better

Horizon Breakdown

top 100 only
Horizon Average Top-100 Hits Predicted Top-100 Avg Actual Rank
3m 25.22 236.87
6m 25.19 235.64
12m 24.46 237.09

Run Details

strategy_test_results #6
id
6
strategy_id
strategy_000004
strategy_hash
29b66c080a0027d3a30586a95be7cfc972b3757d331ec95b69bb0fb5eb3d0464
evaluator_version
v3_top100_monthly
start_date
2015-01-01
end_date
2025-06-01
created_at
2026-07-24 21:02:16
updated_at
2026-07-24 21:02:16

Sample Top-100 Lists

2020-03-31 / 6m / 23 hits

Predicted top 100

A, AAL, AAP, AAPL, ABBV, ABC, ABMD, ABT, ACN, ADBE, ADI, ADM, ADP, ADSK, AEE, AEP, AES, AFL, AIG, AIZ, AJG, AKAM, ALB, ALGN, ALK, ALL, ALLE, ALXN, AMAT, AMCR, AMD, AME, AMGN, AMP, AMT, AMZN, ANET, ANSS, AON, AOS, APD, APH, APTV, ARE, ATO, ATVI, AVB, AVGO, AVY, AWK, AXP, AZO, BA, BAC, BIIB, BIO, BMY, CAG, CARR, CCI, CLX, CNC, CPB, CTLT, DLR, DPZ, DVA, DXCM, EA, EQIX, FTNT, GILD, GIS, HRL, HUM, INTC, JKHY, K, KR, LDOS, LLY, MSCI, MSFT, NEE, NEM, NFLX, NOW, NVDA, ODFL, OTIS, REGN, RMD, ROL, SBAC, SJM, TMUS, TSLA, TYL, VRTX, WST

Actual top 100

AAP, AAPL, ABMD, ADBE, ADSK, ALB, ALGN, AMD, AMP, AMZN, APD, APH, APTV, ATVI, AVGO, BBY, BWA, CARR, CDNS, CE, CHRW, CMG, CMI, CPRT, CRM, CTAS, CTLT, CTSH, DD, DE, DHI, DHR, DRI, DXCM, EBAY, EMN, ETSY, EXPE, FCX, FDX, GLW, GPS, HAL, HD, IDXX, IPGP, JCI, KMX, LEG, LEN, LH, LOW, MAS, MCHP, MGM, MOS, NCLH, NKE, NOW, NSC, NVDA, NWS, NWSA, ORLY, PAYC, PH, PHM, PNR, POOL, PVH, PWR, PYPL, QCOM, QRVO, RCL, ROK, ROL, SHW, SIVB, SNPS, SWK, SWKS, SYF, TDG, TEL, TER, TGT, TMO, TSCO, TSLA, TT, UPS, URI, VAR, VIAC, VTR, WHR, WMB, WST, WY

Matched tickers

AAP, AAPL, ABMD, ADBE, ADSK, ALB, ALGN, AMD, AMP, AMZN, APD, APH, APTV, ATVI, AVGO, CARR, CTLT, DXCM, NOW, NVDA, ROL, TSLA, WST

Strategy Script

29b66c080a
"""Generated V3 stock-ranking strategy."""
from __future__ import annotations

import numpy as np


STRATEGY_ID = "strategy_000004"
DESCRIPTION = """
Ranks candidates with date-local normalization and a higher emphasis on
near-term momentum, growth, valuation, volatility, and constructive pullbacks.
"""
FACTORS_USED = [
    "return_1m_pct",
    "return_3m_pct",
    "return_6m_pct",
    "return_12m_pct",
    "momentum_12_1_pct",
    "eps_growth_pct",
    "revenue_growth_pct",
    "operating_margin_pct",
    "free_cash_flow_margin_pct",
    "forward_pe",
    "pe",
    "vol_63d",
    "from_52w_high_pct",
    "from_200d_ma_pct",
    "market_cap",
]
PARAMETERS = {
    "r1": 0.384497074445,
    "r3": 0.381685296643,
    "r6": -0.245338429014,
    "r12": -0.059927288111,
    "m121": -0.075349992155,
    "growth": 0.770849543724,
    "margin": 0.032539894260,
    "value": 0.537869452153,
    "vol": 0.787837043192,
    "size": 0.343140979477,
    "pull": 0.475639458254,
    "sma": 0.259117920485,
    "min_sma": -0.158681044236,
}
COMPLEXITY = 6
PARENT_STRATEGY_ID = "strategy_000001"
GENERATION = 2
RANDOM_SEED = 20260725
CREATED_AT = "2026-07-25T00:00:00+00:00"


def _date_zscore(df, column):
    clean = df[column].replace([np.inf, -np.inf], np.nan)
    if "trade_date" not in df.columns:
        std = clean.std()
        if not np.isfinite(std) or std == 0:
            return clean * 0.0
        return ((clean - clean.mean()) / std).fillna(0)

    grouped = clean.groupby(df["trade_date"])
    mean = grouped.transform("mean")
    std = grouped.transform("std").replace(0, np.nan)
    return ((clean - mean) / std).fillna(0)


def eligibility_filter(df):
    return df["from_200d_ma_pct"].fillna(0) >= PARAMETERS["min_sma"]


def calculate_score(df):
    growth = 0.55 * _date_zscore(df, "eps_growth_pct") + 0.45 * _date_zscore(df, "revenue_growth_pct")
    margin = 0.55 * _date_zscore(df, "operating_margin_pct") + 0.45 * _date_zscore(df, "free_cash_flow_margin_pct")
    value = -0.65 * _date_zscore(df, "forward_pe") - 0.35 * _date_zscore(df, "pe")
    pullback = (-df["from_52w_high_pct"].fillna(0)).clip(lower=0, upper=0.45)
    constructive_pullback = pullback.where(df["return_6m_pct"].fillna(0) > 0, 0)
    size = _date_zscore(df.assign(_log_market_cap=np.log1p(df["market_cap"].clip(lower=0).fillna(0))), "_log_market_cap")

    score = (
        PARAMETERS["r1"] * _date_zscore(df, "return_1m_pct")
        + PARAMETERS["r3"] * _date_zscore(df, "return_3m_pct")
        + PARAMETERS["r6"] * _date_zscore(df, "return_6m_pct")
        + PARAMETERS["r12"] * _date_zscore(df, "return_12m_pct")
        + PARAMETERS["m121"] * _date_zscore(df, "momentum_12_1_pct")
        + PARAMETERS["growth"] * growth
        + PARAMETERS["margin"] * margin
        + PARAMETERS["value"] * value
        + PARAMETERS["vol"] * _date_zscore(df, "vol_63d")
        + PARAMETERS["size"] * size
        + PARAMETERS["pull"] * constructive_pullback
        + PARAMETERS["sma"] * _date_zscore(df, "from_200d_ma_pct")
    )
    score = score.where(eligibility_filter(df), -1e9)
    return score.replace([np.inf, -np.inf], np.nan).fillna(score.median()).fillna(0.0)