Signals
Pulling quant signals
GET /v1/signals/{ticker} returns a JSON array of signal records, newest first. Each record's score is the Piotroski F-Score expressed as a 0-1 fraction (count of 9 passing tests divided by 9, not a 0-100 number). The components object breaks the diagnosis into five signal families: piotroski (9 booleans), altman_z (Z-Score + distress zone), beneish_m (manipulation M-Score + flag), sloan_accrual (accrual ratio + earnings quality), and regime (real HMM market regime: current plus confidence). Signals are computed weekly by the Whystock.app analytics engine and served as bitemporal records. To see coverage and a worked sample, browse the Quant Signals dataset.
# Latest quant signals for AAPL
curl https://api.vectorfinancials.com/v1/signals/AAPL \
-H "X-API-Key: vf_sk_your_key_here" \
-G \
-d "limit=1"
# Response: a JSON array of SignalRecord (newest first)
[
{
"ticker": "AAPL",
"date": "2026-06-16",
"score": 0.778,
"components": {
"piotroski": {
"positive_ni": true, "positive_ocf": true, "roa_increasing": true,
"ocf_gt_ni": true, "leverage_decreasing": false,
"current_ratio_increasing": true, "no_dilution": true,
"gross_margin_increasing": true, "asset_turnover_increasing": false
},
"altman_z": {
"score": 6.12, "zone": "safe",
"components": { "x1": 0.28, "x2": 0.19, "x3": 0.22, "x4": 4.85, "x5": 0.88 }
},
"beneish_m": { "score": -2.61, "flag": false },
"sloan_accrual": { "ratio": -0.021, "quality": "high" },
"regime": { "current": "bull", "confidence": 0.82 }
},
"effective_ts": "2026-06-16T00:00:00Z",
"knowledge_ts": "2026-06-17T06:30:00Z"
}
]Here score = 0.778 means 7 of the 9 Piotroski tests passed (7 of 9). Altman Z of 6.12 sits in the safe zone, the Beneish M-Score is below the manipulation threshold (flag: false), Sloan accrual quality is high, and the market regime is bull at 0.82 confidence. All five families read clean.
Signals field reference
Every field returned by GET /v1/signals/{ticker}, its type, whether it can be null, and how to read it. All records are bitemporal and append-only, so multiple knowledge_ts versions may exist per (ticker, date); take the latest for the current view, or filter by it for point-in-time backtests with no look-ahead.
| Field | Type | Nullable | Meaning & how to use |
|---|---|---|---|
ticker | string | no | Equity ticker symbol (e.g. AAPL). Echoes your request. |
date | string (YYYY-MM-DD) | no | Signal/trading date the row describes. Sort or filter with date_from / date_to. |
score | number (0 to 1) | no | Piotroski F-Score as a fraction = passing tests divided by 9. 0.778 = 7 of 9 passed. NOT a 0-100 ranking. Screen with e.g. score >= 0.66. |
components.piotroski.positive_ni | boolean | yes | Net income > 0. |
components.piotroski.positive_ocf | boolean | yes | Operating cash flow > 0. |
components.piotroski.roa_increasing | boolean | yes | Return on assets up year-over-year. |
components.piotroski.ocf_gt_ni | boolean | yes | Operating cash flow > net income (accrual quality). |
components.piotroski.leverage_decreasing | boolean | yes | Long-term leverage down YoY. |
components.piotroski.current_ratio_increasing | boolean | yes | Current ratio up YoY. |
components.piotroski.no_dilution | boolean | yes | No new shares issued. |
components.piotroski.gross_margin_increasing | boolean | yes | Gross margin up YoY. |
components.piotroski.asset_turnover_increasing | boolean | yes | Asset turnover up YoY. F-Score = count of the 9 trues. |
components.altman_z.score | number | yes | Altman Z-Score composite. Higher = safer. |
components.altman_z.zone | string | yes | safe | grey | distress: bankruptcy-distress band derived from the Z-Score. |
components.altman_z.components.x1 | number | yes | Working capital / total assets. |
components.altman_z.components.x2 | number | yes | Retained earnings / total assets. |
components.altman_z.components.x3 | number | yes | EBIT / total assets. |
components.altman_z.components.x4 | number | yes | Market value of equity / total liabilities. |
components.altman_z.components.x5 | number | yes | Sales / total assets. |
components.beneish_m.score | number | yes | Beneish M-Score. Above −1.78 suggests earnings-manipulation risk. |
components.beneish_m.flag | boolean | yes | True when the M-Score crosses the manipulation threshold. Use as a red flag. |
components.sloan_accrual | object | null | yes | Whole object is null when accrual inputs are unavailable. |
components.sloan_accrual.ratio | number | yes | Accrual ratio (balance-sheet method). Lower = higher earnings quality. |
components.sloan_accrual.quality | string | yes | high | medium | low earnings-quality bucket. |
components.regime.current | string | null | yes | bull | bear | sideways | null: HMM market regime; null when undetermined. |
components.regime.confidence | number (0 to 1) | yes | Model confidence in the current regime. Gate on e.g. confidence >= 0.6. |
effective_ts | string (ISO 8601) | no | When the signal became effective (the data date). |
knowledge_ts | string (ISO 8601) | no | When VectorFin computed/ingested this version. Bitemporal key: latest per (ticker, date) is current. |