ArgusJEPA / README.md
dams2005's picture
Add M and XS checkpoints (weights and architecture config) and model card
4b288af verified
|
Raw History Blame Contribute Delete
3.41 kB
---
tags:
- finance
- time-series
- jepa
- self-supervised-learning
- representation-learning
library_name: pytorch
---
# ArgusJEPA
A Joint-Embedding Predictive Architecture (JEPA) that learns one dense representation
per **stock-day** from point-in-time daily features. It is the first stage of a
two-stage forecaster; the second stage is
[CassaFormer](https://huggingface.co/dams2005/CassaFormer), a causal Transformer that
reads sequences of these day vectors. Code: [github.com/daMS2005/jepa-transformer-model](https://github.com/daMS2005/jepa-transformer-model).
## How it works
- **Input:** one asset-day as a 191-dimensional vector of point-in-time features, NaN
where a value is unavailable on that day.
- **Context encoder:** a residual MLP (`Linear → GELU → LayerNorm` blocks) over the day
vector with a random half of the available feature units hidden. The 64 components of
the text-description embedding are one masking unit, hidden or shown together.
- **Target encoder:** an exponential moving average of the context encoder that sees the
full day; its momentum ramps linearly from 0.996 to 1.0 over training, as in I-JEPA.
- **Objective:** a predictor maps the masked-view representation to the target encoder's
full-view representation (L1 loss in latent space).
- **Use:** after training the context encoder is frozen; `encode()` maps a day to its vector.
## Checkpoints
| Folder | Representation | Encoder | Parameters (full JEPA) |
|---|---|---|---|
| `m/` | 768 | 3 residual blocks, 768 wide | 5.0M |
| `xs/` | 256 | 3 residual blocks, 256 wide | 0.6M |
Each folder has `jepa.safetensors` (context encoder, target encoder and predictor) and
`jepa_config.json` (architecture and training settings, input width and feature groups).
Both were trained for 30 epochs.
## Inputs
191 daily channels in ten groups, in this order:
| Group | Channels |
|---|---|
| price | 11 |
| risk | 3 |
| liquidity | 3 |
| fundamentals | 31 |
| market | 8 |
| sectors | 12 |
| macro | 35 |
| options | 7 |
| events_8k | 15 |
| sec_descriptions | 66 |
Channels are normalized as in the repository's data layer (training-window z-scores or
same-day cross-sectional ranks, with explicit 0/1 mask channels). The individual feature
definitions are not published; the repository's `configs/data/example.toml` shows the
specification format.
## Training data
US-listed common stocks in a point-in-time top-1000 universe (delisted names included for
the days they were members), daily from 2010. Companies are split into core, extended and
holdout groups; only core and extended companies through 2023 were used for training.
## Loading
```python
import json, torch
from safetensors.torch import load_file
from jepa_transformer.models.jepa import JEPA # from the GitHub repository
cfg = json.load(open("m/jepa_config.json"))["config"]
jepa = JEPA(cfg["input_dim"], cfg["output_dim"], hidden_dim=cfg["hidden_dim"], depth=cfg["depth"],
dropout=0.0, residual=cfg["residual"], mask_units=tuple(cfg["mask_units"]))
jepa.load_state_dict(load_file("m/jepa.safetensors"))
day_vectors = jepa.eval().encode(features) # features: [N, 191], NaN where unavailable
```
## Limitations
Research artifact. Representations are trained on one market and period and on a private
feature pipeline; inputs must follow the same feature order and normalization. Nothing
here is investment advice.