Insights
Combining Market Regime and Stock-Movement Signals
Alphanume Team · August 6, 2026
Combine market regime and stock-movement signals by letting the mover model select candidates and using the regime label to segment or size portfolio risk. Neither input supplies a directional forecast.
Alphanume Next-Day Movers publishes a short daily list of equities a volatility model ranks for elevated movement in the following trading session. Its output says which names may move more than usual, while the S&P 500 Risk Regime assigns the market a daily risk-on or risk-off state. Joining them can test whether the mover signal behaves differently when broad conditions are stressed. The Risk Regime reference defines the daily label and publication clock.
The clean architecture keeps two jobs separate. Candidate selection happens at the security level through Next-Day Movers. Risk-state filtering happens at the portfolio level through the regime flag. Turning risk-off into an automatic bearish direction or treating a selected mover as a long candidate changes the meaning of both datasets.
Respect the two publication clocks
Dataset | Published clock | Fields used in the join | Meaning |
|---|---|---|---|
S&P 500 Risk Regime | Daily at 10:10 AM New York time | date, risk_regime | 0 is risk-on and 1 is risk-off |
Next-Day Movers | Daily at 3:30 PM New York time | date, ticker | Candidate for elevated next-session movement |
Mover outcome | After the following session completes | return, absolute_move | Realized scorecard, unavailable at selection time |
A same-date join is valid for a decision made after 3:30 PM because that day's regime label was already published at 10:10 AM. A strategy that trades at the open cannot use either same-day input. At that clock, use the prior available regime and a previously published candidate list under a rule that matches the intended holding period.
The newest mover rows can have null return and absolute_move until the next session closes. Preserve those rows. Filtering for non-null outcomes before freezing the candidate cohort creates an outcome-availability filter.
Build the joined research panel
Pull both datasets for the same historical window, assert one regime row per date, and left join the regime onto every mover selection. The mover endpoint returns no pagination, and both routes accept exact date or date ranges. Keep the raw response from each route before creating the joined table.
import os
import requests
import pandas as pd
headers = {"X-API-Key": os.environ["ALPHANUME_API_KEY"]}
params = {"date_gte": "2024-01-01", "date_lte": "2025-12-31"}
def get_rows(path):
response = requests.get(
f"https://api.alphanume.com/v1/{path}",
headers=headers,
params=params,
timeout=30,
)
response.raise_for_status()
return response.json()["data"]
movers = pd.DataFrame(get_rows("next-day-movers"))
regime = pd.DataFrame(get_rows("sp500-risk-regime"))
assert not regime["date"].duplicated().any()
panel = movers.merge(regime, how="left", on="date", validate="many_to_one")Report mover dates without a regime match rather than filling them from a later day. Holiday calendars, coverage starts, or a wrong assumption about publication can cause gaps. Forward-filling a state through an unobserved date should be a declared strategy rule, not a data-cleaning reflex.
Test selection and sizing separately
Test | Dependent value | Question answered |
|---|---|---|
Selection quality | absolute_move | Did selected names move differently across states |
Directional behavior | return | Was signed performance different, without assuming it should be |
Hit rate | absolute_move above a fixed threshold | Did the large-move frequency change |
Portfolio sizing | return from a separately defined implementation | Did lower gross exposure change drawdown or volatility |
Start with descriptive cells by risk_regime: observation count, distinct dates, median absolute move, signed mean return, hit rate, and missing outcomes. Cluster uncertainty by date because several selected tickers share the same market state and session shock.
A sizing test needs a rule written before returns are viewed. One example keeps full notional in risk-on and half notional in risk-off. Run that rule on an actual portfolio construction with equal weights, entry time, exit time, and costs. The regime field itself does not provide weights.
The combination is a new hypothesis
- Magnitude only. Next-Day Movers makes no directional claim, so positive and negative outcomes belong in the same movement test.
- Binary state. Risk-off does not reveal how severe the stress is or forecast the market direction.
- Shared dates. Treating ticker rows as independent overstates the sample size.
- Null outcomes. The newest selections cannot be graded until the following session completes.
- Implementation gap. Spreads, option prices, slippage, capacity, and trading halts are outside the two response schemas.
The Alphanume proof page publishes separate evidence for Next-Day Movers and S&P 500 Risk Regime. It does not establish that their combination improves a portfolio. Treat the joined analysis as a fresh test with its own denominator and costs. The market-regime filter explainer provides useful background on that boundary.
Reproduce one regime split
Pull one year, export both raw responses and the joined panel, then publish the coverage table before any performance statistic. Compare median absolute_move and hit rate across risk-on and risk-off dates, with date-clustered uncertainty and null outcomes shown separately. Only then test one fixed sizing overlay.
Review the candidate contract on the Next-Day Movers page and the complete workflow in the Next-Day Movers guide. Free access covers a trailing 20-session delayed window, so a multi-year split requires historical access.