How Should Missing Factor Values Be Handled?
Missing factor values should be handled according to why the observation is absent. A security that has not filed a report, a ratio whose denominator is invalid, a source outage, and a characteristic that does not apply to the security are different states. One universal fill value cannot preserve all of their meanings.
The policy should be recorded at the input level and applied point in time. Common choices are to exclude the security for that calculation, assign a neutral normalized exposure, impute from a documented peer group, retain a valid earlier observation for a limited period, or calculate a partial composite with an explicit weight rule. Coverage is part of the factor result, not merely a data-cleaning statistic.
Missingness and coverage
For input \(k\), define the availability indicator
\[a^{(k)}_{i,t} = \begin{cases} 1, & \text{if a valid point-in-time value is available},\\ 0, & \text{otherwise}. \end{cases}\]
Input coverage at date \(t\) is
\[\operatorname{coverage}^{(k)}_t = \frac{\sum_{i\in U_t}a^{(k)}_{i,t}}{|U_t|}.\]
For a \(K\)-input complete-case composite, security \(i\) is valid only when
\[A_{i,t}=\prod_{k=1}^{K}a^{(k)}_{i,t}=1.\]
This rule preserves a constant definition across securities but can remove much of the universe when the inputs have different coverage.
Four defensible policies
Exclude the observation
Exclusion is appropriate when the factor cannot be interpreted without the input. The security remains in the broader investment universe but receives no score from that factor on the date.
Assign neutral normalized exposure
After the observed values have been normalized, set the unavailable component to zero:
\[\widetilde{z}^{(k)}_{i,t} = \begin{cases} z^{(k)}_{i,t}, & a^{(k)}_{i,t}=1,\\ 0, & a^{(k)}_{i,t}=0. \end{cases}\]
This says the missing component supplies no positive or negative evidence. It does not assert that the raw value itself was zero.
Impute from a peer group
A raw value can be replaced by a point-in-time sector, industry, country, or other peer statistic:
\[\widetilde{x}^{(k)}_{i,t} = \operatorname{median} \left\{x^{(k)}_{j,t}:j\in G(i,t),\ a^{(k)}_{j,t}=1\right\}.\]
The group must contain enough valid peers, and the imputed status should remain available downstream. Median imputation reduces extremes and can create many ties.
Renormalize the available composite weights
For normalized inputs \(z^{(k)}\) and declared weights \(\alpha_k\), an available-weight score is
\[s^{\mathrm{available}}_{i,t} = \frac{\sum_{k=1}^{K}a^{(k)}_{i,t}\alpha_k z^{(k)}_{i,t}} {\sum_{k=1}^{K}a^{(k)}_{i,t}|\alpha_k|}.\]
This preserves score scale when inputs are absent, but each security may then be evaluated by a different effective model. Minimum available weight and required inputs are necessary controls.
Worked composite example
Suppose three normalized inputs have weights \(0.50\), \(0.30\), and \(0.20\). Missing values are shown explicitly.
Three-input composite with incomplete coverage
| Security | Input 1 | Input 2 | Input 3 | Neutral-component score | Available-weight score |
|---|---|---|---|---|---|
| A | +0.8 | +0.4 | missing | +0.520 | +0.650 |
| B | +0.4 | missing | +0.6 | +0.320 | +0.457 |
| C | −0.1 | +0.2 | −0.2 | −0.030 | −0.030 |
| D | missing | −0.5 | −0.1 | −0.170 | −0.340 |
For A, neutral component treatment gives
\[s_A^{\mathrm{neutral}} =0.50(0.8)+0.30(0.4)+0.20(0)=0.520.\]
The available inputs account for absolute weight \(0.50+0.30=0.80\), so
\[s_A^{\mathrm{available}} =\frac{0.520}{0.80}=0.650.\]
D illustrates the risk of renormalization. Its two observed components supply only half of the intended model weight, and dividing by \(0.50\) doubles the magnitude from \(-0.170\) to \(-0.340\). A minimum-coverage rule could instead make D ineligible.
Python calculation
import pandas as pd
inputs = pd.DataFrame(
{
"input_1": [0.8, 0.4, -0.1, None],
"input_2": [0.4, None, 0.2, -0.5],
"input_3": [None, 0.6, -0.2, -0.1],
},
index=["A", "B", "C", "D"],
)
weights = pd.Series({"input_1": 0.50, "input_2": 0.30, "input_3": 0.20})
available = inputs.notna()
neutral_score = inputs.fillna(0).mul(weights).sum(axis=1)
available_weight = available.mul(weights.abs()).sum(axis=1)
renormalized_score = neutral_score / available_weight
result = pd.DataFrame(
{
"neutral_score": neutral_score,
"available_weight": available_weight,
"renormalized_score": renormalized_score,
}
)
When carrying an earlier value is appropriate
Forward filling can be valid when an observation remains economically in force until a scheduled replacement. A quarterly balance-sheet value may be used after its publication date until a later filing arrives, subject to a maximum age and corporate-event rules. The value at \(t\) is then the latest observation published by \(t\), rather than an imputation for a failed current record.
Forward filling is generally unsuitable for transient measurements such as intraday flow, a daily borrow quote, or a failed live feed. In those cases a stale value can appear current precisely when market conditions are changing.
Positive, zero, and missing are separate states
A positive factor component supports the recorded direction, and a negative component opposes it. Zero ordinarily represents the cross-sectional centre or a measured neutral value. Missing means the system lacks a valid observation under the timing and quality rules.
If neutral treatment maps missing to zero for calculation, the availability indicator still needs to be retained. Otherwise portfolio review cannot tell a balanced signal from an incomplete one.
Common implementation mistakes
Filling raw missing values with zero
For a valuation ratio, count, price, or return, raw zero often has a specific economic meaning. Neutrality usually belongs on the normalized scale.
Using a future peer statistic
Historical imputation must use group membership and peer values available at the observation time. Current classifications and revised data introduce look-ahead bias.
Ignoring informative missingness
Young companies, distressed issuers, certain sectors, and thinly traded assets may be missing systematically. An imputed factor can inherit a size, sector, or liquidity bias even when the filled values look neutral.
Allowing one input to define the composite
Available-weight renormalization can turn a multi-input factor into a single input for poorly covered securities. Set required inputs, minimum component count, and minimum represented weight.
Measuring performance on changing samples without reporting coverage
An improving IC can result from the factor becoming available only for easier securities. Store coverage, missingness by group, and the evaluation universe beside every result.
Confusing a source outage with a true absence
Operational failures should trigger freshness and quality controls. Treating them as ordinary economic missingness can silently alter live positions.
Signal and portfolio consequences
Each policy changes ranks, information coefficient, turnover, and exposure. Complete-case evaluation measures performance among covered securities. Neutral treatment preserves broader coverage while shrinking scores for names with missing components. Available-weight treatment preserves magnitude but changes the effective input mix.
Portfolio construction can include a coverage penalty, cap positions with imputed inputs, or require a minimum confidence score. Comparing performance on the intersection of valid observations helps determine whether an apparent improvement comes from the model or from the sample.
Frequently asked questions
Is median imputation always neutral?
It is central within the chosen peer group on that date. After later transforms or global ranking it may not equal zero, and systematic missingness can still create exposure.
Should missing values receive the worst rank?
Only when absence itself has a stated adverse interpretation supported by the research design. Otherwise the rule invents a negative signal.
Can a missingness indicator be a separate feature?
Yes. If absence carries repeatable information, test the indicator separately and point in time. This keeps the observed characteristic and the missingness hypothesis identifiable.
What should be stored with each score?
At minimum: source timestamps, available-input mask, imputation flags, input ages, represented weight, universe eligibility, and the factor version.
Next reading
- What Is Cross-Sectional Ranking?
- Should Alpha Factors Be Z-Scored or Ranked?
- How to compose registered signals into a factor
Sources
- pandas missing-data documentation
- Roderick J. A. Little and Donald B. Rubin, Statistical Analysis with Missing Data, Wiley, 3rd edition, 2019 (ISBN 978-0-470-52679-8).
This walkthrough is for research and educational purposes. It illustrates how strategynet.ai organizes signal evidence into factors and scenarios. It provides no recommendation, investment advice, or instruction to trade any security.
Back to Insights