strategy_000003

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

Overall top-100 hits
25.22
average across horizons
Predicted top-100 avg actual rank
235.54
lower is better

Horizon Breakdown

top 100 only
Horizon Average Top-100 Hits Predicted Top-100 Avg Actual Rank
3m 25.42 236.40
6m 25.49 234.59
12m 24.77 235.62

Run Details

strategy_test_results #5
id
5
strategy_id
strategy_000003
strategy_hash
2f686d1fb0685bfe1c92319f1cb44e48e6057f086bcd1c1a8fa00591d3ffdf2b
evaluator_version
v3_top100_monthly
start_date
2015-01-01
end_date
2025-06-01
created_at
2026-07-24 21:02:15
updated_at
2026-07-24 21:02:15

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

2f686d1fb0
"""Generated V3 stock-ranking strategy."""
from __future__ import annotations

import numpy as np


STRATEGY_ID = "strategy_000003"
DESCRIPTION = """
Ranks candidates with date-local feature normalization, emphasizing growth,
high-volatility gain potential, constructive pullbacks, and strength versus
the 200-day moving average.
"""
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.194083711879,
    "r3": 0.091930067089,
    "r6": -0.136583397207,
    "r12": -0.046827096882,
    "m121": -0.259319014305,
    "growth": 0.767585223317,
    "margin": -0.424447621340,
    "value": -0.442021296453,
    "vol": 0.846676069310,
    "size": 0.602809962096,
    "pull": 0.531065983911,
    "sma": 0.787489461919,
    "min_sma": -0.169227551290,
}
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)