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 hitsPredicted 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)