PINN Architecture & Flow Diagrams

Physics-Informed Neural Network System - Agencio Predict

All 6 Phases Complete: Price PINN, Volatility PINN, Sizing PINN, Correlation PINN, Market Regime PINN, and Cointegration PINN are fully implemented with 150+ unit tests passing. All phases are integrated with the algorithmic trading DSL and executor.
Important: PINN uses TensorFlow.js neural networks trained via backpropagation on historical price data. This is different from LLMs (Large Language Models like Claude) used elsewhere in the system for algorithm translation. PINN models are trained to embed physics constraints directly into the learning process.

Table of Contents

1. System Overview

The PINN (Physics-Informed Neural Network) predictor is a trainable neural network that embeds trading physics constraints directly into the learning process. Unlike traditional ML approaches that apply guardrails post-prediction, PINN learns constrained dynamics from the start.

PINN System Overview - All 6 Phases
flowchart TB subgraph DataSources["Data Sources"] PRICE["Price History\n(Yahoo/Finnhub/CoinGecko)"] VOL["Volume Data"] VIX["Market Indicators\n(VIX, Credit Spreads)"] CORR["Correlation Data\nPairwise Returns"] PAIR["Pair Price Data\nCointegrated Assets"] end subgraph PINNSystem["PINN System (6 Phases - All Complete)"] P1["Phase 1: Price PINN\nPrice + velocity + liquidation\n128 unit tests"] P2["Phase 2: Volatility PINN\nGARCH + regime switching\n34 unit tests"] P3["Phase 3: Sizing PINN\nAlmgren-Chriss impact\n34 unit tests"] P4["Phase 4: Correlation PINN\nDCC + Cholesky + Markowitz\n94 unit tests"] P5["Phase 5: Regime PINN\nHMM + crisis detection\n9 files"] P6["Phase 6: Cointegration PINN\nOU dynamics + pair trading\n35+ unit tests"] end subgraph Outputs["Outputs"] PRED["AlgorithmPrediction\ndirection, confidence, signals"] SIZE["SizingDecision\nrecommendedSizeUsd, slippage"] WEIGHTS["PortfolioWeights\nMarkowitz optimal weights"] REGIME["RegimePINNOutput\ncrisisWarning, recovery"] COINT["CointegrationOutput\nhedgeRatio, zScore, signals"] end subgraph Integration["Integration Points"] SIG["Signal Generator\nweight: 0.22"] DSL["DSL Primitives\n60+ primitives"] EXEC["Executor\nregime sizing, crisis pause"] BACKTEST["Backtest Engine\nphysics validation"] end PRICE & VOL & VIX & CORR --> P1 & P2 & P3 & P4 & P5 P1 --> PRED P2 --> P3 P3 --> SIZE P4 --> WEIGHTS P5 --> REGIME PRED --> SIG SIZE --> EXEC WEIGHTS --> EXEC REGIME --> EXEC P1 & P2 & P3 & P4 & P5 --> DSL DSL --> BACKTEST

Key Advantages

FeatureDescriptionPhase
Physically plausible predictionsVelocity consistent with price changePhase 1
Liquidation risk awarenessBuilt into the model outputPhase 1
Kelly sizing constraintsSoft penalties in loss functionPhase 1
GARCH volatility dynamicsσ² mean-reversion, persistencePhase 2
Almgren-Chriss market impactSlippage prediction, optimal sizingPhase 3
PSD correlation matricesCholesky parameterization guarantees validityPhase 4
DCC dynamicsTime-varying correlationsPhase 4
Markowitz optimizationMean-variance portfolio weightsPhase 4
Regime-aware sizingAutomatic position reduction in crisisPhase 5
HMM state transitionsRow-sum=1, persistence constraintsPhase 5
OU mean-reversion dynamicsdS = θ(μ - S)dt + σdW for spreadPhase 6
Hedge ratio optimizationStability constraints, rolling regressionPhase 6
Pair trading signalsEntry/exit based on spread z-scorePhase 6

2. Academic Foundations

The PINN implementation in Agencio Predict is grounded in peer-reviewed research from both machine learning and quantitative finance domains.

PINN Research Lineage
flowchart TB subgraph Foundations["Foundational Papers"] R1["Raissi et al. (2019)\nPhysics-informed neural networks:\nA deep learning framework for\nsolving forward and inverse problems\nJournal of Computational Physics"] R2["Noguer i Alonso & Camarena (2023)\nPhysics-Informed Neural Networks\n(PINNs) in Finance\nSSRN 4598180"] end subgraph CoreConcept["Core PINN Concept"] C1["Loss = L_data + L_physics\n\nPhysics equations embedded\nas soft constraints in loss"] end subgraph Finance["Finance Applications"] F1["Black-Scholes PDE\ndV/dt + 0.5σ²S²d²V/dS² + rS dV/dS - rV = 0"] F2["Heston Stochastic Volatility\ndS = μS dt + √v S dW_S\ndv = κ(θ-v)dt + σ_v√v dW_v"] F3["DCC Model (Engle 2002)\nQ_t = (1-a-b)Q̄ + a×ε_{t-1}ε'_{t-1} + b×Q_{t-1}"] F4["Almgren-Chriss (2001)\nImpact ∝ σ × √(Q/V)"] end subgraph Agencio["Agencio Predict Implementation"] A1["Phase 1: Price PINN\nKelly + liquidation constraints"] A2["Phase 2: Volatility PINN\nGARCH constraints"] A3["Phase 3: Sizing PINN\nAlmgren-Chriss physics"] A4["Phase 4: Correlation PINN\nDCC + Cholesky + Markowitz"] A5["Phase 5: Regime PINN\nHMM constraints"] end R1 --> C1 R2 --> F1 & F2 C1 --> A1 & A2 & A3 & A4 & A5 F1 & F2 -.-> A1 & A2 F3 -.-> A4 F4 -.-> A3

Key Academic References

PaperContributionRelevance to Implementation
Raissi, Perdikaris & Karniadakis (2019)
Journal of Computational Physics
Original PINN framework: encode physical laws as soft constraints in the neural network loss function Core architecture: L = L_data + L_physics
Noguer i Alonso & Camarena (2023)
SSRN 4598180
Application of PINNs to financial PDEs: Black-Scholes and Heston stochastic volatility models Validates physics-based approach for option pricing and volatility modeling
Engle (2002)
Journal of Business & Economic Statistics
Dynamic Conditional Correlation (DCC) model for time-varying correlations Phase 4: DCC residual as physics loss
Almgren & Chriss (2001)
Journal of Risk
Optimal execution with market impact: Impact ∝ σ × √(Q/V) Phase 3: Market impact physics constraint
Markowitz (1952)
Journal of Finance
Mean-variance portfolio optimization Phase 4: Portfolio weights with Sharpe maximization

3. Six PINN Phases

PINN Evolution: 6 Phases (All Complete)
flowchart LR subgraph Phase1["Phase 1"] P1["Price PINN"] P1S["Status: Complete"] P1A["16 input features\n3 outputs\nKelly + liquidation constraints"] end subgraph Phase2["Phase 2"] P2["Volatility PINN"] P2S["Status: Complete"] P2A["GARCH constraints\n3 regimes: low/normal/high\nMarkov transitions"] end subgraph Phase3["Phase 3"] P3["Sizing PINN"] P3S["Status: Complete"] P3A["Almgren-Chriss impact\nRegime-aware sizing\n34 unit tests"] end subgraph Phase4["Phase 4"] P4["Correlation PINN"] P4S["Status: Complete"] P4A["DCC constraints\nCholesky decomposition\n94 unit tests"] end subgraph Phase5["Phase 5"] P5["Regime PINN"] P5S["Status: Complete"] P5A["HMM constraints\n5 market regimes\nCrisis response"] end subgraph Phase6["Phase 6"] P6["Cointegration PINN"] P6S["Status: Complete"] P6A["OU dynamics\nPair trading\n53 tests"] end P1 --> P2 --> P3 --> P4 --> P5 --> P6
PhasePINN TypePhysics ConstraintsTestsMigration
Phase 1 Price PINN Kelly sizing, liquidation boundaries, mean-reversion (Hurst) Complete 244
Phase 2 Volatility PINN GARCH: σ² ≥ 0, α + β < 1, Markov transitions 34 tests 248
Phase 3 Sizing PINN Almgren-Chriss: impact ∝ σ × √(Q/V) 34 tests 253
Phase 4 Correlation PINN DCC, Cholesky (PSD), Markowitz mean-variance 94 tests 254
Phase 5 Regime PINN HMM: row-sum=1, diagonal-dominant, persistence 9 files 251
Phase 6 Cointegration PINN OU: dS = θ(μ - S)dt, hedge ratio stability, signal calibration 53 tests

4. Neural Network Architecture

Price PINN Model Architecture (Phase 1)
flowchart TB subgraph Input["Input Layer"] IN["Sequence Input\n[20 bars x 16 features]"] end subgraph Processing["Processing Layers"] LSTM["LSTM Layer\n64 units\nreturnSequences: false"] D1["Dense 1\n64 units, ReLU"] DROP1["Dropout 0.1"] D2["Dense 2 + Residual\n64 units, ReLU"] DROP2["Dropout 0.1"] D3["Dense 3 + Residual\n64 units, ReLU"] DROP3["Dropout 0.1"] D4["Dense 4 + Residual\n64 units, ReLU"] end subgraph OutputHeads["Output Heads"] O1["Price Output\nSigmoid (0-1)\nprice_t+1 normalized"] O2["Velocity Output\nTanh (-1 to 1)\ndS/dt"] O3["Liquidation Output\nSigmoid (0-1)\nrisk probability"] end subgraph Final["Final Output"] CONCAT["Concatenate\n[3 values]"] end IN --> LSTM --> D1 --> DROP1 --> D2 --> DROP2 --> D3 --> DROP3 --> D4 D4 --> O1 & O2 & O3 O1 & O2 & O3 --> CONCAT

Model Parameters by Phase

PhaseInput ShapeHidden UnitsOutput
Phase 1: Price[20, 16]64 (LSTM + 4 Dense)3 (price, velocity, liq_risk)
Phase 2: Volatility[20, 12]64 (LSTM + 4 Dense)6 (vol, regimes x3, alpha, beta)
Phase 3: Sizing[10, 12]64 (4 Dense)6 (size, slippage, perm/temp impact, residual, confidence)
Phase 4: Correlation[batch, 166]128 (4 Dense)N(N+1)/2 Cholesky params + N weights + 1 risk
Phase 5: Regime[batch, 12]128 (4 Dense)8 (5 regimes, transition, crisis, recovery)

5. Model Creation Process

TensorFlow.js Model Building
flowchart TB subgraph Entry["Entry Point"] REQ["runPINNPrediction()\npredictor.ts:65"] end subgraph LoadOrTrain["Load or Train Decision"] CHECK["Check cache/S3\nloadPINNModel()"] CHECK --> EXISTS{"Model exists\nand fresh?"} EXISTS --> |"Yes < 24h old"| USE["Use cached model"] EXISTS --> |"No or stale"| TRAIN["Train new model"] end subgraph Training["Training Path"] TRAIN --> DETECT["detectAssetClass()\nstock/crypto/forex"] DETECT --> BUILD{"bars > 500?"} BUILD --> |"Yes"| FULL["buildPINNModel()\nFull LSTM architecture"] BUILD --> |"No"| SIMPLE["buildSimplePINNModel()\nFlattened MLP"] FULL & SIMPLE --> COMPILE["compilePINNModel()\nAdam optimizer\nPhysics loss function"] end subgraph TrainLoop["Training Loop"] COMPILE --> FIT["model.fit()\nepochs: 100\nbatchSize: 32"] FIT --> EARLY{"Early stopping?\npatience: 10"} EARLY --> |"No improvement"| STOP["Stop training"] EARLY --> |"Improving"| FIT end subgraph Persist["Persistence"] STOP --> SAVE["savePINNModel()\nS3 + metadata"] SAVE --> CACHE["Cache in memory\nTTL: 24 hours"] end REQ --> CHECK USE --> INFER["Run inference"] CACHE --> INFER

6. Training Pipeline

Complete Training Pipeline
sequenceDiagram participant P as Predictor participant T as Trainer participant F as Features participant M as Model participant S as S3/Cache P->>T: trainPINNModel(symbol, bars) T->>F: computeNormalizationParams(bars) F-->>T: NormalizationParams T->>F: extractFeatureSequences(bars, normParams) F-->>T: {sequences, targets, timestamps} Note over T: Split 80/20 train/val T->>M: buildPINNModel() or buildSimplePINNModel() T->>M: compilePINNModel(model, config) loop Training Loop (max 100 epochs) T->>M: model.fit(trainX, trainY) M-->>T: {loss, val_loss} alt val_loss improved T->>T: bestValLoss = val_loss T->>T: epochsWithoutImprovement = 0 else no improvement T->>T: epochsWithoutImprovement++ alt epochsWithoutImprovement >= 10 T->>M: model.stopTraining = true end end end T->>T: computeLossBreakdown() T->>T: computeValidationMetrics() T->>S: savePINNModel(model, metadata, normParams) T-->>P: PINNTrainResult

7. Physics Loss Functions

Physics-Informed Loss Functions by Phase
flowchart TB subgraph Phase1Loss["Phase 1: Price PINN Loss"] L1["L = λ_mse × MSE(price)\n+ λ_physics × MSE(velocity)\n+ λ_constraint × MSE(liq_risk)\n+ λ_kelly × ReLU(|v| - max)"] end subgraph Phase2Loss["Phase 2: Volatility PINN Loss"] L2["L = λ_mse × MSE(vol)\n+ λ_garch × |σ² - (ω + α×ε² + β×σ²_{t-1})|\n+ λ_markov × CrossEntropy(regime)\n+ λ_persistence × ReLU(α + β - 0.999)"] end subgraph Phase3Loss["Phase 3: Sizing PINN Loss"] L3["L = λ_mse × MSE(size)\n+ λ_almgren × |impact - σ×√(Q/V)|\n+ λ_slippage × MSE(slippage)\n+ λ_boundary × ReLU(size - maxPos)"] end subgraph Phase4Loss["Phase 4: Correlation PINN Loss"] L4["L = λ_corr × MSE(Cholesky params)\n+ λ_psd × ReLU(-minEigenvalue)\n+ λ_dcc × |Q_t - (1-a-b)Q̄ - a×εε' - b×Q_{t-1}|\n+ λ_markowitz × (1/Sharpe)\n+ λ_weights × |Σw - 1|"] end subgraph Phase5Loss["Phase 5: Regime PINN Loss"] L5["L = λ_regime × CrossEntropy(regime)\n+ λ_hmm × |row_sum - 1|²\n+ λ_persistence × ReLU(off_diag - diag)\n+ λ_crisis × BCE(crisis_warning)\n+ λ_smooth × |regime_t - regime_{t-1}|²"] end

Loss Weights by Phase

PhasePrimary LossPhysics LossesDefault Weights
Phase 1 MSE (price) velocity, liquidation, Kelly mse: 1.0, physics: 0.1, constraint: 0.05, kelly: 0.02
Phase 2 MSE (volatility) GARCH residual, Markov, persistence mse: 1.0, garch: 0.3, markov: 0.2, persistence: 0.1
Phase 3 MSE (size) Almgren-Chriss, slippage, boundary mse: 1.0, almgren: 0.5, slippage: 0.2, boundary: 0.1
Phase 4 MSE (Cholesky) PSD, DCC, Markowitz, weight sum correlation: 1.0, psd: 0.5, dcc: 0.3, markowitz: 0.2, weightSum: 0.5
Phase 5 CrossEntropy HMM row-sum, persistence, crisis regime: 1.0, hmm: 0.3, persistence: 0.2, crisis: 0.5

8. Feature Engineering

Feature Extraction Pipeline
flowchart TB subgraph Input["Price History"] BARS["PriceHistory[]\nopen, high, low, close, volume"] end subgraph Normalization["Normalization Params"] NORM["computeNormalizationParams()\npriceMin, priceMax\nvolumeMean, volumeStd\nreturnsMean, returnsStd"] end subgraph Features["16 Features Extracted"] F1["priceNormalized\n(price - min) / range"] F2["returns5d\n5-day return scaled"] F3["returns20d\n20-day return scaled"] F4["volatility10d\n10-day realized vol"] F5["volatility30d\n30-day realized vol"] F6["rsi14\nRSI / 100"] F7["hurstExponent\nR/S analysis"] F8["regimeBull\none-hot"] F9["regimeBear\none-hot"] F10["regimeSideways\none-hot"] F11["regimeCrisis\none-hot"] F12["regimeRecovery\none-hot"] F13["leverage\ncurrent / 125"] F14["marginUsage\n0-1"] F15["liquidationDistance\n0-1"] F16["volumeNormalized\nvs 20d avg"] end subgraph Output["Feature Vector"] VEC["PINNFeatureVector\n[16 numbers]\nfor each of 20 bars"] end BARS --> NORM BARS --> F1 & F2 & F3 & F4 & F5 & F6 & F7 & F8 & F9 & F10 & F11 & F12 & F13 & F14 & F15 & F16 F1 & F2 & F3 & F4 & F5 & F6 & F7 & F8 & F9 & F10 & F11 & F12 & F13 & F14 & F15 & F16 --> VEC

9. Prediction Flow

End-to-End Prediction Flow
sequenceDiagram participant SG as Signal Generator participant PP as PINN Predictor participant PS as Price Service participant TF as TensorFlow participant S3 as S3 Storage SG->>PP: runPINNPrediction symbol history 1d PP->>PP: Check bars at least 100 alt Insufficient data PP-->>SG: null end PP->>S3: loadPINNModel symbol alt Model exists and fresh S3-->>PP: model and normParams else Missing or stale PP->>PP: trainPINNModel PP->>S3: savePINNModel end PP->>PP: Build feature sequence last 20 bars loop For each bar PP->>PP: extractFeaturesForBar PP->>PP: featuresToVector end PP->>TF: predict model sequence TF-->>PP: priceT1 dSdt liquidationRisk PP->>PP: denormalizePrice PP->>PP: computeConfidence PP->>PP: detectMarketRegime PP->>PP: calculateHurstExponent PP->>PP: buildSignals PP-->>SG: AlgorithmPrediction with direction confidence signals

10. Correlation PINN (Phase 4)

Phase 4 Complete: 94 unit tests passing. Implements DCC (Dynamic Conditional Correlation) physics, Cholesky parameterization for guaranteed PSD matrices, and Markowitz mean-variance optimization.
Correlation PINN Architecture
flowchart TB subgraph Input["Input Features (166 for 20 assets)"] I1["Per-Asset Features (8 each)\nreturns5d, returns20d\nvolatility, regime (3)\nrsi14, sectorId"] I2["Global Features (6)\nvix, marketRegime\nriskTolerance, correlationRegime\nnumAssets, rebalanceUrgency"] end subgraph Model["Dense Layers (4x128 + Residual)"] DENSE["Dense + ReLU + Dropout 0.1"] end subgraph Outputs["Multi-Head Output"] O1["Cholesky Params\nN(N+1)/2 values\nGuarantees PSD R = LL'"] O2["Portfolio Weights\nSoftmax normalized\nΣw_i = 1"] O3["Portfolio Risk\nSigmoid (0-1)\nAnnualized volatility"] end subgraph Loss["Physics Loss Components"] L1["Correlation MSE\nMSE(Cholesky_true, Cholesky_pred)"] L2["PSD Loss\nGershgorin eigenvalue bounds\nReLU(-minEig)"] L3["DCC Residual\n|Q_t - (1-a-b)Q̄ - a×εε' - b×Q_{t-1}|"] L4["Weight Sum\n|Σw - 1|²"] L5["Markowitz Loss\n-Sharpe or -return/risk"] end I1 & I2 --> DENSE --> O1 & O2 & O3 O1 & O2 & O3 --> L1 & L2 & L3 & L4 & L5

Cholesky Parameterization

Correlation matrices must be Positive Semi-Definite (PSD). The Cholesky parameterization guarantees this by construction:

// Correlation matrix R = LL' where L is lower triangular
// L parameters: diagonal (softplus for positivity) + off-diagonal (unconstrained)

Cholesky L:          Correlation R = LL':
| l11  0    0  |     | 1       r12     r13     |
| l21  l22  0  |  →  | r12     1       r23     |
| l31  l32  l33|     | r13     r23     1       |

// Diagonal of R = sum of squares of L rows = 1 (normalized)
// Off-diagonal = dot product of L rows / norms

DCC (Dynamic Conditional Correlation) Physics

// Engle (2002) DCC model embedded as physics loss:
Q_t = (1 - a - b) × Q̄ + a × ε_{t-1} × ε'_{t-1} + b × Q_{t-1}

Where:
- Q̄ = unconditional correlation matrix (long-term average)
- ε_t = standardized residuals (returns / volatility)
- a = shock reaction parameter (how fast correlations react)
- b = persistence parameter (how long shocks last)
- Constraint: a + b < 1 for stationarity

Phase 4 Files

FileLinesPurpose
correlation/types.ts180Type definitions, feature constants
correlation/cholesky-utils.ts250Cholesky decomposition, PSD validation
correlation/correlation-features.ts400Feature extraction, normalization
correlation/correlation-model.ts300TensorFlow.js model architecture
correlation/correlation-loss.ts350Physics loss function
correlation/correlation-predictor.ts450Inference wrapper
correlation/index.ts50Module exports

Phase 4 Test Coverage (94 tests)

Test FileTestsCoverage
cholesky-utils.test.ts31Cholesky decomposition, PSD validation, TF.js ops
correlation-features.test.ts28Feature extraction, normalization, sector mapping
correlation-model.test.ts23Model architecture, forward pass, memory
correlation-loss.test.ts12Physics loss, component isolation

11. Market Regime PINN (Phase 5)

Market Regime PINN Architecture
flowchart TB subgraph Input["12 Input Features"] I1["returns5d, returns20d, returns60d"] I2["volatility20d, volatilityRatio"] I3["volumeRatio, breadth"] I4["vix, creditSpread, yieldCurve"] I5["priceVsSma50, priceVsSma200"] end subgraph Model["Dense Layers (4x128 + Residual)"] DENSE["Dense + ReLU + Dropout"] end subgraph Outputs["Multi-Head Output"] O1["regime_probs (5)\nSoftmax"] O2["transition_prob\nSigmoid (0-1)"] O3["crisis_warning\nSigmoid (0-1)"] O4["recovery_signal\nSigmoid (0-1)"] end subgraph Loss["HMM Physics Loss"] L1["CrossEntropy(regime)"] L2["|row_sum - 1|^2"] L3["ReLU(off_diag - diag)"] L4["BCE(crisis)"] L5["|regime[t] - regime[t-1]|^2"] end I1 & I2 & I3 & I4 & I5 --> DENSE --> O1 & O2 & O3 & O4 O1 & O2 & O3 & O4 --> L1 & L2 & L3 & L4 & L5

Five Market Regimes

RegimeDescriptionRisk MultiplierEffect
BULLSustained uptrend, low volatility1.1xSlightly increase position size
BEARSustained downtrend, elevated vol0.6xSignificant reduction
SIDEWAYSRange-bound, neutral momentum0.9xSlight reduction
CRISISSharp decline, VIX spike0.4xMajor reduction
RECOVERYRebound from crisis0.7xCautious increase

Crisis Response Actions

ActionTriggerEffect
Pause EntriescrisisWarning >= threshold (50%)Block new position entries
Reduce ExposurecrisisWarning >= thresholdApply regime sizing multiplier
Flatten AllcrisisWarning >= flattenThreshold (80%)Close ALL positions

12. Cointegration PINN (Phase 6)

Cointegration PINN models the relationship between pairs of assets that move together in the long run (cointegrated pairs). It uses Ornstein-Uhlenbeck (OU) dynamics as physics constraints to learn mean-reverting spread behavior for pair trading strategies.

Cointegration PINN Architecture
flowchart TB subgraph Input["28 Input Features (20 timesteps)"] I1["Asset 1: price, return, vol, rsi, momentum, volume, zscore, trend"] I2["Asset 2: price, return, vol, rsi, momentum, volume, zscore, trend"] I3["Pair: spread, zscore, hedgeRatio, correlation, halflife, etc."] end subgraph Model["LSTM + Dense (Residual)"] LSTM["LSTM(64)"] DENSE["4x Dense(128) + ReLU + Dropout"] end subgraph Outputs["5-Head Output"] O1["spread_zscore\nTanh × 4"] O2["hedge_ratio\nSigmoid × 3"] O3["entry_signal\nSigmoid (0-1)"] O4["exit_signal\nSigmoid (0-1)"] O5["spread_velocity\nTanh × 0.5"] end subgraph Loss["OU Physics Loss"] L1["spreadMSE (0.3)"] L2["hedgeRatioMSE (0.2)"] L3["ouDynamics (0.25)"] L4["stationarity (0.1)"] L5["hedgeStability (0.1)"] L6["signalCalibration (0.05)"] end I1 & I2 & I3 --> LSTM --> DENSE --> O1 & O2 & O3 & O4 & O5 O1 & O2 & O3 & O4 & O5 --> L1 & L2 & L3 & L4 & L5 & L6

Ornstein-Uhlenbeck Physics Constraints

The OU process models mean-reverting dynamics: dS = θ(μ - S)dt + σdW

ConstraintDescriptionFormula
Mean Reversion Speed (θ)How fast spread reverts to meanθ ∈ [0.01, 0.5] per bar
Half-LifeBars to revert halfwayln(2) / θ
OU DynamicsVelocity points toward meansign(v) = -sign(z) when |z| > 0.5
StationarityZ-score stays bounded|z| < maxZScore (default 4)
Hedge StabilityHedge ratio changes slowly|Δβ| < maxHedgeChange

Pair Trading Signals

SignalConditionAction
Entry (Long Spread)z-score < -2, entry_signal > 0.6Buy Y, Sell β × X
Entry (Short Spread)z-score > +2, entry_signal > 0.6Sell Y, Buy β × X
Exit|z-score| < 0.5, exit_signal > 0.6Close both legs
Flat|z-score| < 1.5, signals weakNo position

12 DSL Primitives (Phase 6)

PrimitiveDescriptionReturns
pinn_hedge_ratio(sym1, sym2)Optimal hedge ratio β in Y = β×Xnumber (0.3-3.0)
pinn_spread_zscore(sym1, sym2)Spread z-score from meannumber (-4 to +4)
pinn_mean_reversion_speed(sym1, sym2)OU θ parameternumber (0.01-0.5)
pinn_halflife(sym1, sym2)Half-life in barsnumber (2-100)
pinn_pair_entry_signal(sym1, sym2)Entry signal strengthnumber (0-1)
pinn_pair_exit_signal(sym1, sym2)Exit signal strengthnumber (0-1)
pinn_pair_direction(sym1, sym2)Suggested direction'long_spread' | 'short_spread' | 'flat'
pinn_cointegration_confidence(sym1, sym2)Confidence pair is cointegratednumber (0-1)
pinn_pair_confidence(sym1, sym2)Overall prediction confidencenumber (0-1)
pinn_is_cointegrated(sym1, sym2, thresh?)True if cointegration confidence > thresholdboolean
pinn_spread_in_entry_zone(sym1, sym2, thresh?)True if |z| > threshold (default 2)boolean
pinn_spread_in_exit_zone(sym1, sym2, thresh?)True if |z| < threshold (default 0.5)boolean

Example: Pair Trading Strategy DSL

// GLD-SLV pair trading strategy using Cointegration PINN
{
  "universe": ["GLD", "SLV"],
  "entry": "and(
    pinn_is_cointegrated('GLD', 'SLV', 0.7),
    pinn_spread_in_entry_zone('GLD', 'SLV', 2),
    gte(pinn_pair_entry_signal('GLD', 'SLV'), 0.6)
  )",
  "exit": "or(
    pinn_spread_in_exit_zone('GLD', 'SLV', 0.5),
    gte(pinn_pair_exit_signal('GLD', 'SLV'), 0.7)
  )",
  "direction": "pinn_pair_direction('GLD', 'SLV')",
  "hedgeRatio": "pinn_hedge_ratio('GLD', 'SLV')"
}

Cointegration Model Files

FileLinesPurpose
cointegration/types.ts280Type definitions, constants, graduation gates
cointegration/cointegration-features.ts450Feature extraction, OU parameter estimation
cointegration/cointegration-model.ts300LSTM+Dense architecture, physics loss
cointegration/cointegration-training.ts250Training pipeline, early stopping
cointegration/cointegration-predictor.ts400Inference, caching, graduation validation
cointegration/index.ts70Module exports

Test Coverage

Test FileTestsCoverage
cointegration-features.test.ts35+Feature extraction, OU estimation, normalization
cointegration-model.test.ts25+Model architecture, forward pass, physics loss

13. Algorithmic Trading Integration

Full Integration Verified: PINN predictions are accessible to algorithmic trading via 50+ DSL primitives, signal generator ensemble (weight 0.22), executor crisis response, and regime-based sizing.
PINN Integration with Algorithmic Trading
flowchart TB subgraph PINNPredictions["PINN Predictions (6 Phases)"] PRICE["Price PINN\ndirection, confidence, velocity"] VOL["Volatility PINN\nforecast, regime, GARCH params"] SIZE["Sizing PINN\noptimal size, slippage, impact"] CORR["Correlation PINN\npairwise correlations, weights"] REGIME["Regime PINN\nmarket regime, crisis warning"] COINT["Cointegration PINN\nhedge ratio, spread z-score"] end subgraph Prefetch["Prefetch Layer (tick-context.ts)"] PF["prefetchPINNData(symbols)\nCalled once per tick\nCaches all predictions"] end subgraph DSL["DSL Evaluator (60+ Primitives)"] DSL1["Price: pinn_direction(), pinn_confidence()"] DSL2["Vol: pinn_vol_forecast(), pinn_vol_regime()"] DSL3["Size: pinn_optimal_size(), pinn_market_impact()"] DSL4["Corr: pinn_correlation(), pinn_optimal_weight()"] DSL5["Regime: pinn_crisis_warning(), pinn_regime_risk_multiplier()"] DSL6["Coint: pinn_hedge_ratio(), pinn_spread_zscore()"] end subgraph Executor["Paper/Live Executor"] EVAL["Evaluate Strategy DSL\nwith PINN primitives"] CRISIS["Crisis Check\ncheckCrisisResponse()"] SIZING["Position Sizing\nregime multiplier applied"] TRADE["Execute Trade\nwith PINN-informed decisions"] end subgraph SignalGen["Signal Generator"] ENS["Ensemble Predictor\nPINN weight: 0.22 (primary)"] ADAPT["Adaptive Weights\nby market regime"] end subgraph Backtest["Backtest Engine"] BT["Bar-by-bar evaluation\nPINN primitives available"] VALID["Physics validation\nresidual thresholds"] end PRICE & VOL & SIZE & CORR & REGIME & COINT --> PF PF --> DSL1 & DSL2 & DSL3 & DSL4 & DSL5 & DSL6 DSL1 & DSL2 & DSL3 & DSL4 & DSL5 & DSL6 --> EVAL REGIME --> CRISIS SIZE & REGIME --> SIZING EVAL --> TRADE CRISIS --> TRADE SIZING --> TRADE PRICE --> ENS REGIME --> ADAPT DSL1 & DSL2 & DSL3 & DSL4 & DSL5 --> BT BT --> VALID

Integration Points

ComponentFilePINN Usage
Tick Context algorithms/paper/tick-context.ts Imports prefetchPINNData, calls at tick start to populate cache
Executor algorithms/paper/executor.ts Uses macroContext.pinnData for all PINN primitives, crisis checks, regime sizing
DSL Evaluator algorithms/dsl/evaluator.ts 60+ PINN primitives wired to context functions
DSL Types algorithms/dsl/types.ts PINN primitive definitions (pinn category)
Signal Generator trading/services/signal-generator.ts PINN weight: 0.22 (primary ML predictor in ensemble)
Backtest Engine algorithms/backtest/engine.ts PINN primitives available during backtest evaluation

Example: Using PINN in DSL Strategy

// Example DSL strategy using PINN primitives
{
  "entry": {
    "rules": [
      // Use Phase 1 Price PINN for direction
      { "fn": "pinn_is_bullish", "args": ["$symbol", 0.6] },
      // Use Phase 2 Volatility PINN for regime filter
      { "fn": "not", "args": [
        { "fn": "eq", "args": [
          { "fn": "pinn_vol_regime", "args": ["$symbol"] },
          "high_vol"
        ]}
      ]},
      // Use Phase 5 Regime PINN for crisis avoidance
      { "fn": "lt", "args": [
        { "fn": "pinn_crisis_warning" },
        0.3
      ]}
    ]
  },
  "sizing": {
    // Use Phase 3 Sizing PINN for optimal position
    "fn": "pinn_optimal_size",
    "args": ["$symbol", 30]  // 30 bps expected edge
  },
  "risk_controls": {
    "regimeSizingEnabled": true,  // Apply Phase 5 regime multiplier
    "maxPositionUsd": {
      "fn": "mul",
      "args": [
        10000,
        { "fn": "pinn_regime_risk_multiplier" }
      ]
    }
  }
}

Executor Crisis Response Flow

// From executor.ts - Crisis check using Phase 5 Regime PINN
const regimePrediction = macroContext.pinnData?.regimePrediction ?? null;
crisisCheck = await checkCrisisResponse(state.algorithmId, regimePrediction);

if (crisisCheck.shouldPauseEntries) {
  crisisPauseEntries = true;
  // Block new position entries
}

if (crisisCheck.shouldFlattenAll) {
  // Emergency: close all positions
  await flattenAllPositions(state, macroContext, 'crisis_flatten');
}

// Regime sizing multiplier applied to all new positions
if (riskControls?.regimeSizingEnabled !== false && macroContext.pinnData?.regimePrediction) {
  const regimeMultiplier = dslPinnRegimeRiskMultiplierSync(macroContext.pinnData);
  // Crisis: 0.4x, Bear: 0.6x, Recovery: 0.7x, Sideways: 0.9x, Bull: 1.1x
  positionSizeUsd *= regimeMultiplier;
}

13. DSL Primitives (50+)

Price PINN Primitives (Phase 1)

PrimitiveReturnsDescription
pinn_direction(symbol)string'long', 'short', 'neutral'
pinn_confidence(symbol)numberPrediction confidence (0-1)
pinn_predicted_return(symbol)numberPredicted % return
pinn_velocity(symbol)numberPrice velocity (dS/dt)
pinn_liquidation_risk(symbol)numberRisk probability (0-1)
pinn_physics_residual(symbol)numberConstraint residual (lower = better)
pinn_is_bullish(symbol, threshold?)booleanTrue if bullish with conf > threshold
pinn_is_bearish(symbol, threshold?)booleanTrue if bearish with conf > threshold
pinn_accuracy(symbol)numberHistorical directional accuracy

Volatility PINN Primitives (Phase 2)

PrimitiveReturnsDescription
pinn_vol_forecast(symbol)numberNext-bar annualized vol %
pinn_vol_regime(symbol)string'low_vol', 'normal_vol', 'high_vol'
pinn_vol_regime_confidence(symbol)numberRegime confidence (0-1)
pinn_vol_persistence(symbol)numberGARCH persistence (α + β)
pinn_vol_alpha(symbol)numberGARCH α (shock reaction)
pinn_vol_beta(symbol)numberGARCH β (persistence)
pinn_vol_regime_duration(symbol)numberExpected bars until regime change
pinn_vol_regime_shift(symbol)number1 if regime changed this bar, 0 otherwise
pinn_vol_is_low(symbol, threshold?)booleanTrue if low volatility regime
pinn_vol_is_high(symbol, threshold?)booleanTrue if high volatility regime
pinn_vol_regime_prob(symbol, regime)numberProbability of specific regime

Sizing PINN Primitives (Phase 3)

PrimitiveReturnsDescription
pinn_expected_slippage(symbol, sizeUsd)numberExpected slippage in bps
pinn_optimal_size(symbol, edgeBps)numberOptimal position size in USD
pinn_market_impact(symbol, sizeUsd)numberExpected market impact in bps
pinn_sizing_confidence(symbol)numberSizing model confidence (0-1)
pinn_almgren_residual(symbol)numberAlmgren-Chriss physics residual
pinn_regime_size_multiplier(symbol)numberRegime-based size adjustment

Correlation PINN Primitives (Phase 4)

PrimitiveReturnsDescription
pinn_correlation(symbol1, symbol2)numberPredicted pairwise correlation (-1 to 1)
pinn_correlation_regime(symbol)string'low', 'normal', 'high'
pinn_correlation_confidence(symbol1, symbol2)numberCorrelation prediction confidence
pinn_optimal_weight(symbol)numberMarkowitz optimal weight (0-1)
pinn_portfolio_risk()numberPortfolio volatility (annualized)
pinn_portfolio_sharpe()numberPortfolio Sharpe ratio
pinn_dcc_residual()numberDCC physics residual
pinn_markowitz_efficiency()numberDistance from efficient frontier

Market Regime PINN Primitives (Phase 5)

PrimitiveReturnsDescription
pinn_market_regime()stringCurrent regime: bull/bear/sideways/crisis/recovery
pinn_regime_probability(regime)numberProbability of specific regime
pinn_regime_confidence()numberClassification confidence
pinn_regime_transition_prob()numberProbability of regime change
pinn_regime_next_likely()stringMost likely next regime
pinn_regime_duration()numberExpected bars in current regime
pinn_crisis_warning()numberCrisis probability (0-1)
pinn_recovery_signal()numberRecovery strength (0-1)
pinn_regime_risk_multiplier()numberPosition size multiplier (0.4-1.1)
pinn_regime_is(regime)booleanTrue if current regime matches

14. Database Schema

PINN Database Tables
erDiagram pinn_models { uuid id PK varchar symbol varchar asset_class text s3_path int version timestamptz trained_at int training_bars real physics_residual real validation_sharpe real validation_accuracy jsonb config boolean is_active } pinn_training_jobs { uuid id PK varchar symbol varchar status jsonb config int epochs_completed real current_loss uuid model_id FK text error_message timestamptz started_at } pinn_predictions { uuid id PK uuid model_id FK varchar symbol varchar timeframe real predicted_price real current_price varchar direction real confidence real velocity real liquidation_risk real physics_residual varchar market_regime } pinn_model_performance { uuid id PK uuid model_id FK timestamptz period_start timestamptz period_end int total_predictions real accuracy real avg_physics_residual real sharpe_ratio } pinn_correlation_models { uuid id PK text s3_path int num_assets text[] symbols timestamptz trained_at real dcc_residual real psd_violations } pinn_regime_history { uuid id PK timestamptz recorded_at varchar regime real[] probabilities real crisis_warning real recovery_signal } pinn_models ||--o{ pinn_training_jobs : "produces" pinn_models ||--o{ pinn_predictions : "generates" pinn_models ||--o{ pinn_model_performance : "tracked_by"

15. API Endpoints

Admin Endpoints

MethodPathDescription
GET/api/predict/v1/admin/pinn/modelsList all models
GET/api/predict/v1/admin/pinn/models/:idGet model details
POST/api/predict/v1/admin/pinn/trainTrigger training
DELETE/api/predict/v1/admin/pinn/cacheClear cache
GET/api/predict/v1/admin/pinn/statsGet statistics
GET/api/predict/v1/admin/pinn/monitoringGet monitoring data
GET/api/predict/v1/admin/pinn/jobsList training jobs

Regime Endpoints

MethodPathDescription
GET/api/predict/v1/pinn/regimeGet current regime
GET/api/predict/v1/pinn/regime/historyGet regime history
GET/api/predict/v1/admin/pinn/regime/statusModel status
POST/api/predict/v1/admin/pinn/regime/trainTrain regime model

16. File Reference

Core Module

FileLinesPurpose
pinn/index.ts605Module exports for all 5 phases
pinn/types.ts337Type definitions
pinn/model.ts270TF.js model architecture + physics loss
pinn/features.ts400Feature engineering
pinn/trainer.ts330Training pipeline
pinn/predictor.ts470Inference wrapper
pinn/persistence.ts450S3 + cache
pinn/validation.ts400Graduation gates
pinn/dsl-wrappers.ts1500+50+ DSL primitives

Phase-Specific Modules

PhaseDirectoryKey FilesTests
Phase 2pinn/volatility/volatility-model.ts, volatility-features.ts, regime-dynamics.ts34 tests
Phase 3pinn/sizing/sizing-model.ts, sizing-features.ts, sizing-loss.ts34 tests
Phase 4pinn/correlation/correlation-model.ts, cholesky-utils.ts, correlation-loss.ts94 tests
Phase 5pinn/regime/regime-model.ts, regime-labeling.ts, regime-predictor.ts9 files

Migrations

MigrationPurpose
244_pinn_models.sqlCore PINN tables: models, jobs, predictions, performance
247_pinn_ab_testing_leaderboard.sqlA/B testing infrastructure
248_pinn_volatility.sqlVolatility PINN tables
251_pinn_regime.sqlRegime PINN + history
252_regime_sizing_and_crisis.sqlCrisis response config + actions
253_pinn_sizing.sqlSizing PINN tables
254_pinn_correlation.sqlCorrelation PINN tables

Validation Thresholds (Graduation Gates)

MetricThresholdPurpose
Physics Residual≤ 0.05Velocity prediction accuracy
Constraint Violations≤ 5%Kelly/liquidation compliance
Directional Accuracy≥ 52%Better than coin flip
Brier Score≤ 0.25Risk calibration
Sharpe Ratio> 0.5Risk-adjusted returns
Max Drawdown< 20%Risk control

PINN Architecture Documentation - Agencio Predict
Generated: 2026-05-19 | All 6 Phases Complete | 150+ Unit Tests
Updated with Phase 4 Correlation PINN and Algorithmic Trading Integration