Entimema

Point-in-Time Correct Features for Credit Models

Entimema
Contents

A historical warehouse says MaxDPD_90d = 12 for a decision made at 2026-08-18 14:00. Production would have seen 28: the payment correction that reduced DPD had not reached the institution yet. Both values describe the same economic period; only one was available to the model.

KNOWN @ 14:00MaxDPD_90d = 28late correction arrivesRESTATED TODAYMaxDPD_90d = 12
Td = exact timestamp the historical decision would be made
Decision cut-off

Observation windows and availability windows are not the same

For feature X, WX(Td) defines the economic period it may inspect. A governed 90-day convention might be (Td−90d, Td]. The timestamp basis and inclusive boundaries must be explicit.

Teffective ∈ W(Td) and Tavailable ≤ Td
Two-axis feature eligibility
Eligible(E,Td) = I(EffectiveTime(E) ∈ W) × I(AvailableTime(E) ≤ Td)
Eligibility indicator
WHERE effective_time > :decision_time - INTERVAL '90 days'
  AND effective_time <= :decision_time
  AND available_time <= :decision_time

Effective time alone leaks later-known corrections. Load time alone can admit a future-effective change. Both axes are mandatory. For intraday decisions, a date is not a timestamp: an 18:00 event must not enter a 10:00 feature because they share a date.

An end-of-day snapshot can leak thirteen hours into a morning decision

00:0010:00
DECISION CUT-OFF
future same-day events →23:59
EOD SNAPSHOT
Joining a 23:59 daily customer snapshot to every decision on that date is unsafe for intraday decisioning.

A table named customer_state_daily says nothing about its usable cut-off. Every snapshot needs effective_as_of and available_as_of, not only snapshot_date.

Why common historical joins fail
JoinLeakage
effective_time ≤ decision_timeIncludes records learned later
loaded_at ≤ decision_timeMay include future-effective state
snapshot_date = decision_dateIncludes later same-day facts
historical decision → current masterInjects current identity, segment and ownership

Resolve historical membership before aggregating historical events

IDENTITY + RELATIONSHIPS KNOWN @ TELIGIBLE FACILITIES + EVENTSAGGREGATE FEATURE

The reverse—aggregate today's canonical entities and attach an old decision date—creates identity and relationship leakage. A later party merge can consolidate exposure production saw separately; a later co-borrower edge can introduce an unknown facility.

SELECT ...
FROM decisions d
JOIN customer_attribute_history a
  ON a.party_id = d.party_id
 AND a.valid_from <= d.decision_time
 AND (a.valid_to IS NULL OR a.valid_to > d.decision_time)
 AND a.system_from <= d.decision_time
 AND (a.system_to IS NULL OR a.system_to > d.decision_time);

SCD Type 2 preserves validity but not necessarily when a backdated correction became known. Critical mutable dimensions need valid and system time. Historical exposure includes only known, valid facility relationships and point-in-time state.

Event features count eligible events; state features reconstruct the path

Feature architecture by economic grain
FeatureRequired historyPIT control
PaymentCount_90dDiscrete payment eventsFinality, effective time, availability and reversal semantics
PaymentRatio_90dPayments, schedule and allocationEligible numerator and denominator under one state mode
MaxDPD_180dHistorical delinquency pathKnown DPD states or schedule/payment replay
AverageUtilisation_30dUtilisation state pathTime-weighted intervals or documented daily approximation
TotalInternalDrawnHistorical facility membership and stateResolve entity membership before aggregation

Current DPD cannot produce historical max DPD, and start/end utilisation cannot produce average utilisation. Store constant-state intervals where precision matters:

AverageX = (1 / (T₂−T₁)) ∫T₁T₂ X(t)dt
Time-weighted state feature

A daily approximation can be valid methodology, but document it rather than claiming continuous-time exactness.

Observation ends before performance begins

OBSERVATION WINDOWT−90d → TDECISION
CUT-OFF
PERFORMANCE WINDOWT → T+12m
No event after the decision cut-off may influence a pre-decision feature; performance labels use a separately versioned outcome methodology.
ObservationEnd ≤ DecisionTime < PerformanceStart
Feature/label boundary

Future default, restructuring, collections outcomes and post-decision payments cannot enter features. Labels may use eventual restated outcomes, but methodology must say so. If data end before Td + horizon, the row is censored—not automatically non-default.

Tlatest eligible decision = Tdataset end − PerformanceHorizon
Dataset maturity

The dataset manifest declares which historical world was built

type FeatureDatasetManifest = {
  datasetId: string;
  generatedAt: Date;
  populationStart: Date;
  populationEnd: Date;
  decisionTimeField: string;
  featureSetVersion: string;
  stateMode: "KNOWN" | "RESTATED";
  labelDefinitionVersion: string;
  performanceHorizon: string;
};

Given the manifest and governed sources, the dataset should rebuild. A hash of schema, row keys and metadata can detect mutation but cannot replace lineage. Do not combine restated DPD, known exposure and today's identity into a synthetic past.

One semantic builder should serve research, validation and replay

buildFeatureVector({
  entityId,
  decisionTime,
  featureSetVersion,
  stateMode: "KNOWN"
});
name: payment_count_90d
entity: facility
source_event: PAYMENT_APPLIED
window: 90d
time_basis: effective_time
availability_constraint: true
aggregation: count
version: v1

A declarative registry pins source, grain, window, aggregation and null handling without requiring a full feature DSL. Where research SQL and production code remain separate, equivalence tests are mandatory.

SELECT d.decision_id, COUNT(e.event_id) AS payment_count_90d
FROM decisions d
LEFT JOIN financial_events e
  ON e.facility_id = d.facility_id
 AND e.event_type = 'PAYMENT_APPLIED'
 AND e.effective_time > d.decision_time - INTERVAL '90 days'
 AND e.effective_time <= d.decision_time
 AND e.available_time <= d.decision_time
GROUP BY d.decision_id;

One feature can have known and corrected histories

Xknown(T)

Latest immutable revision available by T. Replicates production information.

Xrestated(T)

Current best economic reconstruction after corrections.

Ximproved infrastructure(T)

Controlled simulation of faster availability or better resolution.

Keep a feature_revision_id or system-time chain rather than overwriting a row. A production-like backfill reconstructs historical availability; a restated backfill uses corrected knowledge. The choice of known or restated training must be intentional.

The training-serving time contract is part of the model

FeatureVector(T) = one identity, state mode, availability horizon and feature-version set
Temporal coherence

Record effective time, available time and state mode. Refresh improvements can shift distributions even when model code is unchanged; treat them as data-generating-process and infrastructure-version changes requiring validation. Improved identity resolution and upstream semantic changes can do the same.

Leakage has six engineering forms

TEMPORALfuture or unavailable factsIDENTITYfuture party mappingRELATIONSHIPfuture facility linksSNAPSHOTend-of-period stateLABELfuture outcome in featureSEMANTICdefinition embeds outcome knowledge
The obvious future target is only one path. Most operational leakage enters through time, identity, relationships, snapshots or silent definition changes.

Prioritise deep PIT review for DPD, payment behaviour, utilisation, internal exposure, bureau and cross-entity features where temporal complexity is higher.

Temporal unit tests attack every boundary where leakage hides

Mandatory point-in-time tests
TestExpected result
Cut-offEvent at 14:00:01 is excluded from a 14:00 decision
Timestamp tieExplicit ordering governs an event exactly at T
Late eventMonday-effective, Wednesday-available event is excluded on Tuesday
Restated modeThe same event can enter Tuesday’s corrected feature
Window boundaryEvent exactly T−90d follows the declared rule
Identity correctionDecision before merge uses old mapping
Facility creationFacility opened after T never enters exposure
ReversalPayment feature follows each decision-time state
End-of-day18:00 event never enters a 10:00 daily feature
Future sentinelSynthetic post-cut-off event has zero influence

A golden timeline makes temporal correctness executable

T0P1 + F1T1paymentT2decision AT3late paymentT4reversalT5identity mergeT6new facilityT7decision B

Fix expected payment count, ratio, DPD, utilisation and exposure at each decision. Build a small golden dataset with fixed rows, features and labels. Any code change must reproduce it unless intentionally versioned.

Featuresreconstructedi = Featuresstored productioni
Offline replay equality

Model validation must test whether the dataset was possible

A statistically strong model trained on impossible information is operationally invalid. Audit each feature’s entity grain, sources, window, timestamp basis, availability constraint, identity semantics and label relationship.

Leakage incident response
StepEvidence
IdentifyAffected definitions, revisions and datasets
RebuildCorrect known-state PIT dataset
MeasurePerformance and calibration change
AssessHistorical and prospective decision impact
RemediateRetrain, revalidate or constrain use as required

Monitor point-in-time integrity as an ongoing control

PITMismatchRateLateDataFeatureImpactRateFeatureRevisionRateHistoricalReplayMismatchRateSameDayLeakageTestFailuresTemporalCoherenceFailureRate

No universal thresholds apply. Compare reconstructed features with stored production snapshots, monitor revision impact by feature and cohort, and run fixed replay cases after identity, state, pipeline or schema changes.

The Entimema architecture filters knowledge before computing features

DECISION TIMEHISTORICAL IDENTITY / RELATIONSHIPSELIGIBLE EVENTS + STATE · EFFECTIVE ≤ T AND AVAILABLE ≤ TOBSERVATION WINDOWFEATURE COMPUTATION VERSIONKNOWN FEATURE SNAPSHOTTRAINING / VALIDATION / DECISION REPLAY
Historical entity state establishes population; effective and availability constraints establish evidence; the known snapshot feeds training, validation and replay.
ENTIMEMA FRAMEWORKDefine → Cut → Join → Test → Validate
  1. Anchor decision time
  2. Resolve historical entity state
  3. Define observation window
  4. Filter effective time
  5. Filter availability time
  6. Compute pinned feature version
  7. Freeze snapshot
  8. Separate performance window
  9. Test leakage boundaries
  10. Validate replay

A Point-in-Time Feature Validation Agent can find impossible historical inputs

A controlled agent can inspect temporal definitions, validate window boundaries, detect availability violations, compare reconstructed with stored features, find current-master, identity and relationship leakage, test late events and same-day cut-offs, and identify affected models and datasets.

Continue with Building a Credit Risk Feature Store That Actually Respects Time, Point-in-Time Customer State Reconstruction, Event Time vs Processing Time vs Posting Time, Building a Reliable DPD Engine, Late-Arriving Events and Backdated Corrections and Why Customer ID Is Not Enough. Event-driven risk, streaming features and infrastructure-driven feature drift remain future research directions—not fabricated routes.