Directional Persistence
Install and import#
npm install fintech-algorithmsimport { directionalPersistence } from "fintech-algorithms/geometric-chart-patterns/market-structure-breakouts-and-regimes/directional-persistence";Signature#
directionalPersistence(input)Maps each bar to +1, -1 or 0 by the sign of its close-to-close change, sums those signs over period bars, and reports the absolute total divided by period. It measures one-sidedness without caring which side.
Parameters#
| Name | Type | Notes |
|---|---|---|
input | TopicInput | bars is the required OHLCV history, strictly ordered by timestamp and on a single adjustment basis. parameters.period (default 20, integer of at least 2) sets the summation window. |
Returns#
TopicResult
series and latest carry a single value key, between 0 and 1. The warm-up is period bars, because the sign at index 0 is undefined and the rolling sum rejects windows containing it, so with the default ready_at is 20.
Warm-up#
The first period bars (20 by default) positions are null. The sign series is null at index 0, so the first complete window of period signs ends at index period.
Errors#
- When
periodis supplied as a non-integer or as a value below 2 — throws Error - When a bar's
closeis not a finite number — throws Error
Complexity: time O(n × period),
space O(n).
Worked example#
executed Captured by running this function on the input its own test provides. Real output of real code — but not asserted against a published figure.
Input#
{
"bars": [
{
"timestamp": "2024-01-02",
"basis": "synthetic-unadjusted",
"open": 100,
"high": 101.45,
"low": 98.695,
"close": 100,
"volume": 750000,
"benchmark": 200
},
{
"timestamp": "2024-01-03",
"basis": "synthetic-unadjusted",
"open": 101.49111452,
"high": 103.38381693,
"low": 100.05480022,
"close": 101.78791214,
"volume": 795117,
"benchmark": 200.56326135
},
{
"timestamp": "2024-01-04",
"basis": "synthetic-unadjusted",
"open": 102.45519048,
"high": 104.6701838,
"low": 100.91147007,
"close": 102.9549389,
"volume": 840234,
"benchmark": 201.11020913
}
],
"parameters": {}
}Call#
directionalPersistence(input)Returns#
object with 9 fields: topic_id, title, state, ready, ready_at, series, latest, parameters, …
{
"topic_id": "D08-F07-A14",
"title": "Directional Persistence",
"state": "calculated",
"ready": true,
"ready_at": 20,
"series": {
"value": [null, null, null, null, null, null]
},
"latest": {
"value": 0.1
},
"parameters": {},
"diagnostics": {
"causal": true,
"input_count": 96
}
}Diagrams#
Calculation flow#
Directional Persistence calculation flow
flowchart LR
A["ordered OHLC observations, explicit lookbacks and threshol"] --> B["Validate order, basis, and finite values"]
B --> C["Apply the selected Directional Persistence convention"]
C --> D["Emit value, readiness, and diagnostics"]
D --> E["Interpret descriptively; test outcomes separately"]
B -->|invalid or insufficient| X["Withhold output with a reason"]
Directional Persistence readiness and evidence states
stateDiagram-v2
[*] --> Waiting
Waiting --> Ready: enough valid causal observations
Waiting --> Rejected: malformed or unsupported input
Ready --> Calculated: selected formula applied
Calculated --> Interpreted: diagnostic and limitation retained
Interpreted --> Ready: next observation arrives
Rejected --> Waiting: corrected input and deterministic reset
How it works#
This page states the contract — how to call it correctly. The article explains the concept: why it works, and where it breaks.
References#
- CFA Institute technical-analysis overview — see linked primary or authoritative record
- TA-Lib maintained source — see linked primary or authoritative record
- Long-Term Storage Capacity of Reservoirs — see linked primary or authoritative record
- Evidence decision
- Level 1 evidence map