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