SEC-filings impact model · experimental

CatalystBERT-v1

A model that reads an SEC filing for a specific issuer and estimates the significance, direction, and magnitude of the subsequent stock-price reaction relative to SPY.

The current v1 baseline uses only SEC filings. Filing text is paired with asset identity, filing category, and pre-event market context. “Combined” refers to those input types, not a mixture of news and SEC examples. The earlier news-only experiment is retained at the bottom of this page.

SEC-filings test results

SEC-only combined-input baseline · 8-K, 6-K, 10-Q, and 10-K filings · 2016–2026. Combined means text plus structured context.

Impact significance ranks whether a reaction is large relative to expected volatility. Direction ranks positive versus negative returns among significant reactions. These are separate tasks.

● Impact significance○ Direction · significant reactions
0.00.10.20.30.40.50.60.70.80.91.0Chance · 0.5005 min30 min2 hours1 day
5 min: impact 0.630 · direction 0.517

Impact AUC is 0.130 above the chance reference. Direction is 0.017 relative to chance. AUC measures ranking, not the percentage of correct predictions or a trading return.

Reported chronological test set · 137,174 examples; available labels vary by horizon
HorizonImpact ROC-AUCDirection ROC-AUC
5 min0.6300.517
30 min0.6430.499
2 hours0.6590.515
1 day0.6600.527

Impact ranking is strongest at 2h and 1d; direction remains close to chance. The aggregate scores do not show calibration, confidence intervals, or subgroup performance.

Data & methodology

One example represents a filing–issuer pair. The SEC acceptance timestamp determines which return windows can be labeled; future prices create training targets and are never inference inputs.

Dataset construction · filing to supervised example
  1. SEC filing + issuerSelect filing content, identify the issuer and form, and retain the exact SEC acceptance timestamp.
  2. Pre-acceptance contextAdjusted stock and SPY prices supply backward returns and trailing abnormal volatility.
  3. Reaction windowsMeasure stock-minus-SPY log returns over 5m, 30m, 2h, and 1d where timestamps and prices permit.
  4. Scale and maskScale returns by prior expected volatility. Mask contaminated or unavailable horizon labels.
  5. Chronological splitsTrain → validation → test. Build the asset map and feature normalization from training rows only.
  6. Batch and trainPreserve issuer/title tokens; pad variable filing lengths. Optimize three masked prediction tasks.

Filing sources and timing

The SEC builder reads model-ready filing inputs, uses accepted_at as the event timestamp, and keeps only rows with a usable exact timestamp. Preferred securities, warrants, rights, and units are excluded by the security-name filter. The accession number identifies the filing. The four form types remain explicit event categories.

Current label-window rules
Acceptance timingAvailable targetsReturn window
Exact time during regular hours5m / 30m / 2h / 1d, subject to price availabilityIntraday windows start at acceptance; 1d ends at the same Eastern clock time on the next trading day.
Exact premarket time1d onlyThat trading session’s open to close.
After hours or weekend1d onlyNext shared stock/SPY trading session’s open to close. SEC rows without exact acceptance times are excluded from this baseline.

Intraday endpoints use the latest completed minute-bar close, rejecting endpoint prices more than five minutes stale. Daily volatility is the sample standard deviation of up to 20 prior daily stock-minus-SPY log returns, requiring at least 10 valid observations.

Connecting filing labels to market returns

r_abnormal,h = ln(P_stock,end / P_stock,start) − ln(P_SPY,end / P_SPY,start)σ_expected,h = σ_prior daily abnormal × √(minutes_h / 390)z_h = r_abnormal,h / σ_expected,h

Horizon minutes are [5, 30, 120, 390]. A scaled return of +1 means a positive abnormal move of one expected volatility, not a 1% price return. Missing or nonpositive expected volatility makes a target unavailable. SPY adjustment removes its observed log return; this is not a beta-adjusted asset-pricing alpha estimate.

Return-to-label illustration

Hypothetical inputs, not a real event or model prediction. Adjust interval returns and prior daily volatility to see how the target for one horizon is constructed. The 1d illustration uses a 390-minute volatility scale.

-1σ0σ1σ
Abnormal log return
0.795%
Expected horizon volatility
0.555%
Scaled target z
1.434
Significance target
1 · significant
Direction target
1 · positive
Magnitude loss target
0.889

The shaded region is |z| < 1. Classification targets describe realized reactions; they do not demonstrate that the event caused the move or that it could have been traded profitably.

Label quality and leakage controls

  • Mask a horizon if another event for the same asset falls inside its reaction window.
  • Mask 1d targets crossing a material price-adjustment factor change.
  • By default, exclude 09:30–10:00 ET acceptances from impact training and mask horizons whose prior move reaches three expected volatilities.
  • Carry a separate target mask per horizon. Missing targets are zero-filled for batching but excluded from losses and evaluation.
  • Use chronological splits and an asset map derived only from final training rows. Unseen validation, test, and inference assets map to 0.

These controls reduce contamination; they do not prove causal attribution to a filing. Metrics shown here are reported aggregates from the sq-models SEC v6 baseline; this site does not rerun the evaluation.

Input and output tensors

The tables document the current combined-mode implementation associated with this v1 research. B is batch size; L is padded token length; F = 5 market features; the four horizon columns always follow [5m, 30m, 2h, 1d]. The reported experiment used batch size 1 and maximum L = 1,024. An archived checkpoint’s own configuration remains authoritative.

Six tensors consumed by model.forward
TensorDtypeShapeMeaning
input_idsint64[B, L]Tokenized issuer name, time precision, title, and filing content; L ≤ 1,024 in the reported experiment.
attention_maskbool[B, L]True for non-padding tokens; also used for masked mean pooling.
asset_idint64[B]Training-set asset index. Index 0 is reserved for assets unseen during training.
event_type_idint64[B]Event-category embedding index; sec_8k = 3; sec_10q = 4; sec_10k = 5; sec_6k = 6.
market_featuresfloat32[B, 5]Five pre-event features, normalized with training-set means and standard deviations. Missing values become zero.
market_feature_maskbool[B, 5]Availability mask distinguishes missing values from true normalized zeros.

Text serialization

[TARGET] Issuer Company
[TIME] datetime
[TITLE] Filing title
[CONTENT] Selected filing content…

The prefix and filing body are tokenized as a pair. Truncation applies only to the content sequence, preserving issuer and title. SEC prefixes omit the ticker because the current ticker does not prove historical ticker validity. Four section tokens are added to the tokenizer and the encoder embedding vocabulary is resized accordingly. No token_type_ids tensor is passed.

Market-feature order

  1. pre_event_abnormal_return_5m
  2. pre_event_abnormal_return_30m
  3. pre_event_abnormal_return_2h
  4. pre_event_abnormal_return_1d
  5. pre_event_volatility_20d

The 1d pre-event feature uses the prior market close; the SEC baseline uses exact acceptance timestamps, and its market context is restricted to observations before the event. The feature vector and its availability mask are concatenated to [B, 10] before the market encoder.

Combined model · tensor flow
Filing tokens[B, L]ModernBERT-large[B, L, 1024]Masked mean pooling[B, 1024]
Asset index[B]Asset embedding[B, 64]
Event category[B]Event embedding[B, 16]
Market values + mask[B, 10]LayerNorm → Linear → GELU[B, 32]
Concatenate [B, 1136]LayerNorm → Linear(1136, 256) → GELU → Dropout(0.1)Shared representation [B, 256]
impact_significanceLinear(256, 4) → [B, 4]
directionLinear(256, 4) → [B, 4]
magnitudeLinear(256, 4) → [B, 4]
Three output tensors · floating point, exported as float32 at inference
TensorShapeInterpretation
impact_significance[B, 4]Binary logits for |z| ≥ 1. Apply sigmoid to obtain significance scores.
direction[B, 4]Binary positive-return logits; loss and reported direction metrics use significant, available reactions only.
magnitude[B, 4]Unconstrained regression output trained against log(1 + |z|). Inference decodes expm1(max(output, 0)) into volatility units.

Forward computation can use mixed precision; the inference adapter explicitly casts outputs to float32 before sigmoid and magnitude decoding. Sigmoid scores are not established calibrated probabilities. Magnitude is an absolute reaction in volatility units, not a direct price forecast.

Training targets and losses

Batch targetDtype / shapeUse
targetsfloat32 [B, 4]Signed realized scaled abnormal returns z.
target_maskbool [B, 4]Available, retained horizons.
impact_significancebool [B, 4]|z| ≥ 1; class-weighted binary cross-entropy with logits.
direction / direction_maskbool [B, 4] eachz > 0 / available AND significant. Binary cross-entropy only on this subset.
magnitudefloat32 [B, 4]Batch stores |z|; loss transforms it to log1p(|z|) and applies Smooth L1 on available targets.
L = L_significance + L_direction + 0.25 × L_magnitude

ModernBERT-large

A bidirectional, encoder-only Transformer used here to encode filing text, rather than generate text. ModernBERT-large has 395 million parameters and 28 layers, with a native context window up to 8,192 tokens. It uses rotary positional embeddings, alternating local/global attention, and unpadding; this implementation requests FlashAttention 2. Official model card.

The encoder configuration specifies a hidden width of 1,024. CatalystBERT mean-pools non-padding token embeddings and adds its own structured inputs and prediction heads. The experiment’s 1,024-token cap is substantially shorter than the encoder’s supported context window. These are distinct limits.

SEC experiment and limitations

catalystbert-sec-v6-combined-1x1024: 275,697 training, 121,561 validation, and 137,174 test examples. SEC-only 8-K, 6-K, 10-Q, and 10-K filings from 2016–2026. One epoch; batch size 1; eight gradient-accumulation steps; learning rate 2e-5; impact threshold 1.0; seed 17. One 1,024-token passage per example.

Reported SEC baseline loss · lower is better
TrainingValidationTest
1.1661.1631.146

The reported results show impact-ranking signal, especially at 2h and 1d. Direction remains near chance; these results do not establish trading profitability, probability calibration, or causal attribution. SEC text-only and structured-only ablations are planned, not completed results.

The implementation also supports multiple passages with token tensors [B, P, L], a passage mask [B, P], and learned attention over passage representations. The reported baseline uses P = 1; it does not evaluate that extension.

News-only experiment

Earlier news-article baseline · catalystbert-expanded-v1-combined. These results are retained separately from the SEC-only model.

Impact significance ranks whether a reaction is large relative to expected volatility. Direction ranks positive versus negative returns among significant reactions. These are separate tasks.

● Impact significance○ Direction · significant reactions
0.00.10.20.30.40.50.60.70.80.91.0Chance · 0.5005 min30 min2 hours1 day
5 min: impact 0.663 · direction 0.522

Impact AUC is 0.163 above the chance reference. Direction is 0.022 relative to chance. AUC measures ranking, not the percentage of correct predictions or a trading return.

Reported chronological test set · 30,947 examples; available labels vary by horizon
HorizonImpact ROC-AUCDirection ROC-AUC
5 min0.6630.522
30 min0.6470.527
2 hours0.6160.483
1 day0.5800.496

Impact ranking is strongest at shorter horizons; direction remains near chance. The aggregate scores do not show calibration, confidence intervals, or subgroup performance.

News-only experiment · setup and limitations

catalystbert-expanded-v1-combined: 95,001 training, 30,445 validation, and 30,947 test examples. Three epochs; batch size 1; eight gradient-accumulation steps; learning rate 2e-5; seed 17. The checkpoint with lowest validation loss was evaluated on the chronological test split.

The earlier experiment uses news-article/target-company pairs. Its builder defaults to Benzinga, Finnhub, and Yahoo, with historical Google News opt-in. The current SEC methodology above is not a claim that this news evaluation used filing inputs.

Reported test loss · lower is better
Input modeLoss
Combined1.268
Structured only1.276
Text only1.300

These aggregate ablations suggest a small combined-input improvement in the documented experiment; no confidence interval or significance test is available. The model’s direction scores do not support a directional trading claim. Magnitude quality, calibration, and downstream strategy value are not established by the available results.

SEC and news results are separate experiments with different source data, date ranges, split sizes, and epoch counts. Their AUC differences are descriptive; they are not a controlled comparison of filing text against news text.