Alphanume

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.