مؤشر Linear Regression Slope: الصيغة والإعدادات وطريقة القراءة

يوفّق مؤشر ميل الانحدار الخطي (Linear Regression Slope) خطًا مستقيمًا بطريقة المربعات الصغرى عبر آخر N إغلاق، ويرسم ميل هذا الخط معبَّرًا عنه بالسعر لكل شمعة. القيمة الموجبة تعني أن الخط الموفَّق يصعد عبر النافذة، والسالبة تعني أنه يهبط.

Senzoukria · المؤشرات · Updated September 2026


Linear Regression Slope الزخم, في لوحة مستقلة أسفل الرسم.

ما الذي يقيسه Linear Regression Slope

يُحسب الانحدار بصيغة متمركزة، حيث يُقاس محور الزمن من منتصف النافذة لا من شمعتها الأولى. هذا الخيار عددي لا شكلي: على إغلاقات عقود آجلة من خمس خانات، تطرح الصيغة التقليدية مجموعين كبيرين ومتساويين تقريبًا، فتُهدر نحو نصف الأرقام المعنوية. النافذة الافتراضية 20 شمعة، وهي النافذة الإحصائية نفسها التي تستخدمها Bollinger Bands وz-score في هذا الكتالوج. ولأن مجموع مربعات انحرافات الزمن موجب تمامًا لأي نافذة من شمعتين أو أكثر، فإن النافذة المسطحة تمامًا تعطي ميلًا يساوي 0 بالضبط، وهي قيمة حقيقية لا قسمة على صفر مُقنَّعة. وقبل امتلاء النافذة لا تُرسم أي قيمة.

الصيغة كما هي منفَّذة في الكود

هذا ليس التعريف الشائع في مصادر أخرى، بل ما يحسبه الكود المنشور فعليًا، موثَّقًا بجانب التنفيذ:

Entier ≥ `min` depuis les params (garde-fou UI). */ function intParam( params: Record<string, unknown>, key: string, fallback: number, min = 1, ): number { return Math.max(min, Math.floor(numParam(params, key, fallback))); } function toPoints( bars: readonly FootprintBar[], values: ReadonlyArray<number | null>, ): SeriesPoint[] { return bars.map((b, i) => ({ time: b.bucketTsNs, value: values[i] ?? null })); } /** Rendements alignés sur les barres : ret[i] = close[i] − close[i−1] ; ret[0] = null (pas de barre précédente). Cf. en-tête pour le choix différence vs log-return. */ function closeReturns(bars: readonly FootprintBar[]): Array<number | null> { return bars.map((b, i) => (i === 0 ? null : b.close - bars[i - 1].close)); } /** Les N derniers rendements se terminant à la barre `i`. `null` tant que la fenêtre n'est pas pleine — il faut i ≥ N puisque ret[0] n'existe pas. */ function returnWindow( rets: ReadonlyArray<number | null>, i: number, n: number, ): number[] | null { if (i < n) return null; const win: number[] = []; for (let j = i - n + 1; j <= i; j++) { const r = rets[j]; if (r === null) return null; win.push(r); } return win; } /** Les N derniers closes se terminant à la barre `i` (i ≥ N−1). */ function closeWindow( bars: readonly FootprintBar[], i: number, n: number, ): number[] { const win: number[] = new Array<number>(n); for (let j = 0; j < n; j++) win[j] = bars[i - n + 1 + j].close; return win; } /** Moyenne et Σ(x − moyenne)² — TWO-PASS (cf. en-tête). Tableau vide → ss = 0 et moyenne 0 : les appelants ne passent jamais de fenêtre vide, la garde `ss > 0` en aval couvre le cas. */ function meanSS(xs: readonly number[]): { mean: number; ss: number } { if (xs.length === 0) return { mean: 0, ss: 0 }; let sum = 0; for (const x of xs) sum += x; const mean = sum / xs.length; let ss = 0; for (const x of xs) { const d = x - mean; ss += d * d; } return { mean, ss }; } /** Corrélation de Pearson TWO-PASS entre deux séries de même longueur : r = Σ(x−x̄)(y−ȳ) / ( √Σ(x−x̄)² · √Σ(y−ȳ)² ) Deux racines SÉPARÉES au dénominateur (jamais √(Sxx·Syy)) : le produit de deux sommes de carrés déborderait sur des volumes cumulés. Sxx ou Syy nul (une des deux séries plate) → null : la corrélation est indéfinie, pas « 0 ». Borné dur [−1, 1] — l'arrondi f64 peut dépasser de 1 ulp sur une corrélation parfaite. */ function pearson(xs: readonly number[], ys: readonly number[]): number | null { const a = meanSS(xs); const b = meanSS(ys); if (!(a.ss > 0) || !(b.ss > 0)) return null; let sxy = 0; for (let i = 0; i < xs.length; i++) { sxy += (xs[i] - a.mean) * (ys[i] - b.mean); } return clamp(sxy / (Math.sqrt(a.ss) * Math.sqrt(b.ss)), -1, 1); } function clamp(v: number, lo: number, hi: number): number { return Math.min(hi, Math.max(lo, v)); } type Fit = { /** Pente b de y = a + b·t, en unités de PRIX PAR BARRE. */ slope: number; /** Valeur du fit au point COURANT : a + b·(n−1). */ value: number; /** Coefficient de détermination ∈ [0,1] ; null si la fenêtre est plate. */ r2: number | null; }; /** Moindres carrés y = a + b·t sur t = 0 (la plus ANCIENNE) … n−1 (la courante), formulation CENTRÉE : t̄ = (n−1)/2 ; Sxx = Σ(t−t̄)² = n(n²−1)/12 ; Sxy = Σ(t−t̄)(y−ȳ) b = Sxy/Sxx ; a = ȳ − b·t̄ ; fit(n−1) = ȳ + b·(n−1)/2 R² = Sxy² / (Sxx·Syy) (Syy = Σ(y−ȳ)²) Centrée et non « normale » (Σt·y) : sur des closes de futures à 5 chiffres, Σt·y et Σt·Σy sont deux grands nombres presque égaux — leur différence perd la moitié des chiffres significatifs. Sxx > 0 dès n ≥ 2, donc la pente n'a JAMAIS de division par zéro (une fenêtre plate rend une pente 0 EXACTE, pas un 0/0). Syy = 0 → R² null (variance nulle, cf. en-tête). n < 2 → null (pas de droite à ajuster). / function regressFit(ys: readonly number[]): Fit | null { const n = ys.length; if (n < 2) return null; const tBar = (n - 1) / 2; const { mean: yBar, ss: syy } = meanSS(ys); let sxx = 0; let sxy = 0; for (let t = 0; t < n; t++) { const dt = t - tBar; sxx += dt * dt; sxy += dt * (ys[t] - yBar); } const slope = sxy / sxx; // sxx = n(n²−1)/12 > 0 dès n ≥ 2 return { slope, value: yBar + slope * (n - 1 - tBar), r2: syy > 0 ? clamp((sxy * sxy) / (sxx * syy), 0, 1) : null, }; } /** Moment centré d'ordre p, convention POPULATION (÷N). */ function centralMoment( xs: readonly number[], mean: number, p: number, ): number { let acc = 0; for (const x of xs) acc += (x - mean) ** p; return acc / xs.length; } /** Dimension fractale de HIGUCHI (1988) sur une fenêtre de n valeurs : pour k = 1…kmax et m = 1…k (sous-séries décimées de pas k, départ m) : L_m(k) = [ Σ_{i=1..⌊(n−m)/k⌋} |x(m+ik) − x(m+(i−1)k)| · (n−1) / (⌊(n−m)/k⌋ · k) ] / k L(k) = moyenne des L_m(k) sur m L(k) ∝ k^(−D) ⇒ D = − pente de ln L(k) vs ln k (moindres carrés). Higuchi PLUTÔT que Katz ou box-counting : c'est l'estimateur de référence sur une série temporelle échantillonnée régulièrement (les barres le sont), il ne dépend d'aucune échelle d'amplitude (Katz mélange une distance de prix et un nombre de pas — donc dépend de l'instrument) et il se calcule en O(n·kmax) sans structure auxiliaire. D ∈ [1, 2] en théorie (1 = courbe lisse, 2 = bruit qui remplit le plan) ; l'estimateur n'est PAS borné artificiellement — on rend ce que la pente dit. kmax est clampé à ⌊n/2⌋ (au-delà, les sous-séries n'ont plus qu'un segment et L(k) n'a plus de sens) et à 2 minimum (une pente exige 2 points). Un L(k) nul (fenêtre plate, ou zigzag exactement en phase avec le pas k) rend le log-log indéfini → null : on ne trace pas une pente amputée. / function higuchiFd(x: readonly number[], kmaxParam: number): number | null { const n = x.length; const kmax = Math.min(Math.max(2, Math.floor(kmaxParam)), Math.floor(n / 2)); if (n < 4 || kmax < 2) return null; const lnK: number[] = []; const lnL: number[] = []; for (let k = 1; k <= kmax; k++) { let acc = 0; let used = 0; for (let m = 1; m <= k; m++) { const count = Math.floor((n - m) / k); if (count < 1) continue; let sum = 0; for (let i = 1; i <= count; i++) { sum += Math.abs(x[m + i * k - 1] - x[m + (i - 1) * k - 1]); } acc += (sum * (n - 1)) / (count * k * k); used += 1; } if (used === 0) return null; const lk = acc / used; if (!(lk > 0)) return null; // ln indéfini → pas de valeur inventée lnK.push(Math.log(k)); lnL.push(Math.log(lk)); } if (lnK.length < 2) return null; const a = meanSS(lnK); if (!(a.ss > 0)) return null; const yBar = meanSS(lnL).mean; let sxy = 0; for (let i = 0; i < lnK.length; i++) sxy += (lnK[i] - a.mean) * (lnL[i] - yBar); return -(sxy / a.ss); } // ── Défs — régression linéaire (le trio partage fenêtre et formule) ───────── /** Pente de la régression linéaire des N derniers closes (moindres carrés, formulation centrée — cf. `regressFit`), en PRIX PAR BARRE : > 0 = la droite monte. Défaut N=20 (la fenêtre statistique standard du catalogue, celle des Bollinger et du z-score). Warm-up (< N barres) → null ; fenêtre plate → 0 EXACT (Sxx > 0, ce n'est pas un 0/0).

كيف تقرأه

  • تخبرك الإشارة بالاتجاه الذي يشير إليه الخط الموفَّق عبر النافذة؛ ولا تخبرك هل السعر حاليًا قريب من هذا الخط.
  • قارن المقدار بحجم التِك للأداة: ميل ربع تِك لكل شمعة قول مختلف عن ميل تِكين لكل شمعة.
  • عبور الميل للصفر يعني أن خط أفضل توفيق عبر النافذة استوى ثم انعكس، وهذا يحدث بعد أن ينعطف السعر نفسه، لأن الشموع الأقدم لا تزال تثقل على التوفيق.
  • اقرنه بمؤشر R-Squared على الفترة نفسها: يعطي الميل الاتجاه والانحدار، ويقول R-Squared هل يصف خط مستقيم تلك النافذة أصلًا.
  • تحمل الشموع الأقدم والأحدث في النافذة أكبر وزن في ميل المربعات الصغرى، فالقيمة الشاذة الواحدة عند أحد الطرفين تحرك الخط أكثر من واحدة في الوسط.

المعاملات والقيم الافتراضية

الفترة الافتراضية 20 وتقبل من 2 إلى 500. النافذة القصيرة تنتج ميلًا يغيّر إشارته كثيرًا ويتفاعل خلال بضع شموع؛ والطويلة تنتج قراءة أكثر ثباتًا تصمد إشارتها أمام الارتدادات العادية، على حساب التفاعل المتأخر مع انعطاف حقيقي.

Linear Regression Slope — المعاملات المتاحة في التطبيق مع قيمها الافتراضية.
المعاملالنوعالقيمة الافتراضيةالمدى
Periodnumber202 – 500

ما لا يُظهره

يعطي الميل انحدار التوفيق لا جودته أبدًا: نافذة من الضجيج الخالص لها ميل أيضًا، وقد يكون كبيرًا. الوحدة هي السعر لكل شمعة، فالقراءات غير قابلة للمقارنة بين الأدوات ولا بين الأطر الزمنية ولا عبر تجديد عقد آجل يقفز فيه مستوى السعر نفسه. يستخدم الإغلاقات فقط، فالنطاقات والفجوات والبنية داخل الشمعة غير مرئية. ويغيب عنه أيضًا حجم التداول وجانب المُبادِر: فميل حاد على عقدين لكل شمعة وميل حاد على مشاركة كثيفة يعطيان الرقم نفسه.

تصفح جميع المؤشرات

هذه الصفحة بلغات أخرى

Frequently asked questions

ماذا تعني قيمة ميل الانحدار الخطي فعلًا؟
هي تغيّر السعر لكل شمعة على امتداد الخط المستقيم الأفضل توفيقًا لآخر N إغلاق. الميل 0.5 يعني أن الخط الموفَّق يرتفع نصف وحدة سعرية من شمعة إلى التالية؛ وعلى نافذة من 20 شمعة، تفصل بين نقطتيها الأولى والأخيرة تسع عشرة شمعة، يعني ذلك ارتفاعًا بنحو 9.5 وحدة على امتداد الخط. الوحدة هي وحدة سعر الأداة، فلا معنى للرقم إلا إلى جانب حجم التِك لتلك الأداة.
هل ميل الانحدار الخطي هو نفسه ميل المتوسط المتحرك؟
لا. ميل المتوسط المتحرك يقارن قيمتين متتاليتين لسلسلة منعَّمة، ويعتمد ذلك على طريقة ترجيح التنعيم للبيانات القديمة. أما ميل الانحدار فيوفّق خطًا مستقيمًا واحدًا عبر الإغلاقات الـ N كلها دفعة واحدة ويعطي انحداره، فتساهم كل شمعة في النافذة مباشرة في التوفيق.
لماذا تُظهر نافذة سعر مسطحة ميلًا يساوي صفرًا بالضبط؟
مقام ميل المربعات الصغرى يعتمد على محور الزمن وحده، وهو موجب تمامًا لأي نافذة من شمعتين أو أكثر. فالنافذة التي تتطابق فيها كل الإغلاقات تنتج بسطًا صفرًا مقسومًا على عدد موجب: صفر دقيق، لا نتيجة غير معرَّفة.

Keep reading