Raff Regression Channel
Install and import#
npm install fintech-algorithmsimport { raffRegressionChannel } from "fintech-algorithms/technical-indicators/bands-envelopes-and-squeezes/raff-regression-channel";Signature#
raffRegressionChannel(input)Raff Regression Channel: the same rolling least-squares centre line as the regression channel, but the channel half-width is the largest absolute residual in the window rather than its root mean square.
Parameters#
| Name | Type | Notes |
|---|---|---|
input | TopicInput | bars is the required OHLCV array -- each bar carries timestamp, open, high, low, close, volume and an optional basis, strictly ordered by timestamp. From parameters this topic reads period (default 20, integer >= 2), the regression window, and multiplier (default 2, a finite number >= 0) applied to the widest residual. |
Returns#
TopicResult
series holds center, upper and lower; latest carries the last of each. All three share a warm-up of period - 1 leading nulls, so ready_at is 19 at the default period. center is the fitted value at the end of the window, upper is center + multiplier * width and lower is center - multiplier * width, where width is the largest absolute residual of that window. At the default multiplier of 2 the channel is twice the textbook Raff width; pass multiplier: 1 for that variant.
Warm-up#
The first `period - 1` bars (19 at the default period) positions are null. The centre is the fitted value at the end of the window and appears once period closes exist. The band at index t contains that bar's close whenever multiplier >= 1, and at multiplier: 0 both bands collapse onto the centre and generally exclude it. The band is not a claim about the rest of the window: earlier closes are measured against the sloped fit, not against center, so they can sit outside the published band.
Errors#
- When
parameters.periodis not an integer >= 2 — throws Error - When
parameters.multiplieris not a finite number, or is negative — throws Error - When a bar is missing open, high, low, close, or volume, or one of them is 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#
raffRegressionChannel(input)Returns#
object with 9 fields: topic_id, title, state, ready, ready_at, series, latest, parameters, …
{
"topic_id": "D07-F07-A06",
"title": "Raff Regression Channel",
"state": "calculated",
"ready": true,
"ready_at": 19,
"series": {
"center": [null, null, null, null, null, null],
"upper": [null, null, null, null, null, null],
"lower": [null, null, null, null, null, null]
},
"latest": {
"center": 103.97453763199998,
"upper": 111.94198395599993,
"lower": 96.00709130800003
},
"parameters": {},
"diagnostics": {
"causal": true,
"input_count": 96
}
}Diagrams#
Calculation flow#
Raff Regression Channel calculation flow
flowchart LR
A["ordered OHLC or close observations, a declared centerline,"] --> B["Validate order, basis, and finite values"]
B --> C["Apply the selected Raff Regression Channel 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"]
Raff Regression Channel 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#
- TA-Lib function groups — TA-Lib project contributors
- TA-Lib C/C++ API — TA-Lib project contributors
- TA-Lib maintained source — TA-Lib project contributors
- Evidence decision
- Level 1 evidence map