fintech-algorithms
Using a coding agent? Give it the skill: npx skills add IslamBaraka90/Fintech-Algorithms-Library What it does →

Raff Regression Channel

Install and import#

bash
npm install fintech-algorithms
ts
import { 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#

NameTypeNotes
inputTopicInputbars 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.period is not an integer >= 2 — throws Error
  • When parameters.multiplier is 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#

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#

Raff Regression Channel — article hero
Raff Regression Channel — concept map
Raff Regression Channel — decision comparison
Raff Regression Channel — worked example

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.

Read the article →

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

The rest of the Bands, Envelopes, and Squeezes family#