ml4t-specs
Shared schema and artifact contracts for the ML4T library ecosystem.
The stable support matrix is CPython 3.12 through 3.14 on Linux, macOS, and Windows. CPython 3.15 prereleases are tested on all three operating systems but are not advertised as stable until Python 3.15 is final.
What This Package Does
ml4t-specs provides the small set of shared types that multiple ML4T libraries use to
describe:
- market data column mappings and feed semantics
- artifact metadata and storage conventions
- versioned strategy lifecycle and market-event semantics
- canonical targets, child orders, execution assumptions, and position-rule state
- lightweight YAML/JSON spec payloads
It exists so the higher-level libraries can exchange consistent contracts without re-defining the same dataclasses in multiple repos.
Today it is used by:
ml4t-backtestfor feed, lifecycle, strategy-intent, execution, and position-rule semanticsml4t-livefor the same runtime-neutral execution contractsml4t-engineerfor artifact metadataml4t-diagnosticfor artifact and backtest-result integrationml4t-modelsas an optional integration bridge whenml4t-specsis installed
Installation
pip install ml4t-specs
Main Types
FeedSpec
FeedSpec defines how downstream libraries should interpret a tradable price table:
- timestamp column
- entity column
- price / OHLCV columns
- quote columns
- calendar and timezone
- data frequency and timestamp semantics
from ml4t.specs import FeedSpec
feed = FeedSpec(
timestamp_col="date",
entity_col="ticker",
close_col="settle",
price_col="settle",
calendar="NYSE",
timezone="America/New_York",
data_frequency="daily",
)
MarketDataSpec
MarketDataSpec bundles schema, semantics, and artifact metadata into one serializable object.
from ml4t.specs import ArtifactStorage, MarketDataSchema, MarketDataSemantics, MarketDataSpec
spec = MarketDataSpec(
artifact_id="us_equities_daily",
schema=MarketDataSchema(timestamp_col="date", entity_col="ticker", close_col="close"),
semantics=MarketDataSemantics(calendar="NYSE", data_frequency="daily"),
storage=ArtifactStorage(path="data/us_equities_daily.parquet"),
)
Artifact Contracts
The base artifact layer gives ML4T libraries a shared way to talk about persisted outputs:
ArtifactKindArtifactStorageArtifactProvenanceArtifactSpec
Lifecycle And Market Events
LifecycleContract defines callback ordering, available information, intent permissions,
callback counts, exception behavior, and causal rank for each portable strategy phase.
LIFECYCLE_V1 is the supported contract. MarketEvent supplies versioned event identity,
validated payloads, provider sequence or gap evidence, and immutable JSON metadata. Phase
declaration order is the serialization order; causal_rank defines causal ordering.
Strategy And Execution Contracts
CanonicalTargetIntent records a strategy decision before order construction.
CanonicalChildOrderIntent records the resulting unsigned order, its target lineage, fill
decision session, fill session, eligibility phase, time in force, and required execution
capabilities. eligibility_phase is always a phase in decision_session. The two session fields
permit a close decision to schedule a child for a later session's opening auction.
Targets may schedule an arbitrary future effective session so allocation systems can register
dated decisions in advance; venue calendars decide whether that date is tradable.
ExecutionPolicy records the assumptions under which an engine or venue executes those orders.
PositionRulePolicy and PositionRuleState make client-side and broker-native exit behavior
portable and resumable. Persist one PositionRuleState per rule_id that carries runtime state,
including composite parents and stateful leaves. Its remaining quantity is post-action; partial
exit quantity and adjusted stop price are stored with the latest action.
SCALED_EXIT sizes an exit order below the open position quantity; it does not require the venue
to partially fill that smaller order, so it is independent of allow_partial_fills.
Stop-loss, take-profit, and trailing-stop rules use the required fractional pct parameter in
(0, 1]. Time exits use the required positive integer max_bars; scaled exits use ordered
ScaledExitTarget values.
These contracts serialize to JSON-compatible mappings. Their comparison helpers report exact
field-level differences, including generated identities and timestamps. Callers comparing two
engines must align those fields first. Auction fill eligibility and auction time-in-force values
require the matching declared capability. A decision that observes a completed close cannot fill
at that same close. Instrument prices may be negative, while quantities, trailing amounts, and
trailing percentages remain positive. Favorable and adverse excursions are signed fractional
returns. Use validate_child_against_policy() before submission to reject child orders that need
execution behavior disabled by the selected policy. Use
validate_rule_policy_against_execution_policy() before activating position rules.
For intraday strategies, NEXT_PHASE from INTRABAR or MARKET_EVENT means the next event in
that same phase. Cross-session opening fills use OPENING_AUCTION explicitly, with OPG time in
force and the opening-auction capability.
CURRENT_PHASE, including IOC and FOK, is available only for evolving MARKET_EVENT
callbacks. Bar-based INTRABAR decisions have already observed the completed high and low and
must use NEXT_PHASE. Engines must call validate_event_against_phase() before dispatch so a
completed event cannot be presented as an evolving callback.
CanonicalChildOrderIntent requires both decision_session and effective_session. An order
decided before the opening auction uses eligibility_phase=PRE_OPEN with
fill_eligibility=OPENING_AUCTION; using eligibility_phase=OPENING_AUCTION means the decision
already observed that session's open and is rejected for same-open execution.
Read And Write Spec Payloads
from ml4t.specs import read_spec_payload, write_spec_payload
write_spec_payload(spec, "market_data.yaml")
loaded = read_spec_payload("market_data.yaml")
Why This Exists
The public ML4T libraries share a few contract types at their boundaries. Keeping them here:
- reduces duplication
- keeps cross-library serialization consistent
- gives backtest, modeling, engineering, and diagnostics code one shared contract vocabulary
This package is intentionally small. It is a support layer, not a full end-user workflow library.
Development
git clone https://github.com/ml4t/specs.git
cd ml4t-specs
uv sync --dev
uv run ruff check src/ tests/
uv run ty check
uv run pytest tests/ -q
uv build
License
MIT
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ml4t_specs-0.1.1.tar.gz.
File metadata
- Download URL: ml4t_specs-0.1.1.tar.gz
- Upload date:
- Size: 50.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0d807edf20f839826f04f0d3b6d14ca37ab056d2bf0b599f3c4d00f2fbd0fade
|
|
| MD5 |
394edd2393ced9462b6b8dd1c9e078ea
|
|
| BLAKE2b-256 |
cd69f3e67230cb9f9b18f4b07f905a3dbc46f19afa172cdfed1428480b96b21c
|
Provenance
The following attestation bundles were made for ml4t_specs-0.1.1.tar.gz:
Publisher:
release.yml on ml4t/specs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ml4t_specs-0.1.1.tar.gz -
Subject digest:
0d807edf20f839826f04f0d3b6d14ca37ab056d2bf0b599f3c4d00f2fbd0fade - Sigstore transparency entry: 2398341634
- Sigstore integration time:
-
Permalink:
ml4t/specs@ea1e210f9253e36655a662eec07e64cc8250db85 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/ml4t
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ea1e210f9253e36655a662eec07e64cc8250db85 -
Trigger Event:
push
-
Statement type:
File details
Details for the file ml4t_specs-0.1.1-py3-none-any.whl.
File metadata
- Download URL: ml4t_specs-0.1.1-py3-none-any.whl
- Upload date:
- Size: 33.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
97d017ed8968d77dfa52409c0817a99c15986bd3fe875c4c58fcbd9499336220
|
|
| MD5 |
b08cdb210c9737daf749e82b786fb48a
|
|
| BLAKE2b-256 |
e99a1f256a8b78a15a0140410c224c91464e5383680ff8108fc94b82fde5678f
|
Provenance
The following attestation bundles were made for ml4t_specs-0.1.1-py3-none-any.whl:
Publisher:
release.yml on ml4t/specs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ml4t_specs-0.1.1-py3-none-any.whl -
Subject digest:
97d017ed8968d77dfa52409c0817a99c15986bd3fe875c4c58fcbd9499336220 - Sigstore transparency entry: 2398341998
- Sigstore integration time:
-
Permalink:
ml4t/specs@ea1e210f9253e36655a662eec07e64cc8250db85 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/ml4t
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ea1e210f9253e36655a662eec07e64cc8250db85 -
Trigger Event:
push
-
Statement type: