Insights
Monthly Momentum-Rebalance Data for Drift Studies
Alphanume Team · July 26, 2026
Use each fixed 10-stock monthly basket as the starting cohort, then measure post-rebalance drift by rank with independently sourced prices and explicit turnover.
Alphanume's Quant Galore Momentum Index dataset provides the live and historical constituents of a maintained cross-sectional momentum basket. Every rebalance date contains 10 tickers and ranks them from 1, the strongest momentum name, through 10. Historical baskets remain fixed after publication.
That contract supports drift research because it preserves what the model selected at each rebalance instead of reconstructing winners from today's universe. The endpoint does not provide weights, prices, returns, benchmark levels, or trading costs, so the researcher must define those choices before evaluating rank decay.
Start from the published basket
Field | Meaning | Required research choice |
|---|---|---|
date | Monthly rebalance date | Entry session and execution price |
ticker | Constituent selected for that basket | Identity and corporate-action handling |
rank | Cross-sectional momentum order from 1 to 10 | Equal or rank-based weighting |
next date | Derived from following published basket | Exit or rebalance convention |
Constituents publish at 4:05 PM New York time. A same-day close fill is therefore unavailable to a strategy waiting for the published basket. Use the next eligible open, a later timestamped execution, or a separately archived pre-publication signal only if the research truly had it.
Retrieve and validate each rebalance
The endpoint is GET /v1/quant-galore-momentum-index. Query a fixed date range and group rows by date. Reject any rebalance that does not contain exactly 10 unique ranks and 10 unique tickers.
import os
import requests
import pandas as pd
response = requests.get(
"https://api.alphanume.com/v1/quant-galore-momentum-index",
headers={"X-API-Key": os.environ["ALPHANUME_API_KEY"]},
params={"date_gte": "2022-01-01", "date_lte": "2025-12-31"},
timeout=30,
)
response.raise_for_status()
baskets = pd.DataFrame(response.json()["data"])
audit = baskets.groupby("date").agg(
rows=("ticker", "size"),
tickers=("ticker", "nunique"),
ranks=("rank", "nunique"),
)
assert audit.eq(10).all().all()Results are ordered by date descending and numeric rank ascending. Save the raw response and validate the date sequence before prices are joined. Free access supplies a trailing 20-trading-session window ending one session behind the latest observation, which usually covers one monthly basket.
Measure drift by rank
For every basket, attach split-adjusted prices from the first tradable session after publication and measure fixed forward horizons such as 1, 5, 10, and 20 sessions. Keep signed return and rank together, and calculate rank-level summaries across rebalance dates rather than treating 10 names from one month as independent experiments.
Output | Definition | Question answered |
|---|---|---|
Rank curve | Median forward return by entry rank | Does strength vary monotonically within the basket |
Decay curve | Return by sessions since rebalance | How long post-selection drift persists |
Basket breadth | Equal-weight return across all 10 | Whether one rank carries the result |
Turnover | Names entering or leaving at next rebalance | How much implementation changes monthly |
Use date-clustered or rebalance-level uncertainty because all constituents share the same market month. A strong rank 1 average concentrated in two rebounds is different from broad, persistent drift. Publish the number of months, not only the number of stock rows.
Forward windows overlap when a 20-session horizon reaches the next monthly rebalance. Decide whether the original rank remains held through day 20, exits at the next basket publication, or transitions under a portfolio rebalance rule. Apply the same convention to every rank and show how many observations were shortened by the next rebalance.
Model turnover and concentration
Consecutive baskets create the actual implementation path. A name retained at a new rank may need only a weight change, while a departing name requires an exit and a new entrant requires a purchase. Define equal weights or a fixed rank-weight schedule before simulating costs.
The 10-stock basket is concentrated by construction. Report single-name, sector, and top-rank contribution, and avoid projecting current classifications backward unless versioned historical labels are available. A diversified benchmark and a cash convention are also needed to interpret months with missing prices or delayed execution.
Control the honest failure modes
- Close leakage. The 4:05 PM publication arrives after the regular close.
- Survivorship. Current tickers and clean-price survivors cannot replace the published baskets.
- Turnover. Gross constituent returns omit the cost of monthly changes.
- Concentration. Ten names can produce large idiosyncratic swings.
- Rank mining. Choosing the best rank after viewing outcomes needs later confirmation.
Historical compounding describes one implementation under its assumptions. It is not an expected return and can change materially with entry timing, weighting, costs, taxes, and delisting treatment.
Reproduce one drift panel
Use the Momentum Index guide to pull at least 24 completed rebalances. Export basket audits, next-session entry prices, forward returns by rank, turnover between dates, and missing outcomes. Inspect every incomplete or extreme row before aggregating.
Publish equal-weight basket drift first, then the predefined rank comparison and cost sensitivity. Keep months as the primary sample count and show the result with the strongest month removed. That concrete sequence tests decay without projecting today's winners into old baskets.