كيف يتم حساب كاما؟
الإجابة المباشرة
عادةً ما يتم حساب كاما كمتوسط متحرك متغير، يتكيف تلقائيًا. في الصياغة الأكثر شيوعًا، يستخدم كل قيمة جديدة من كاما (1) قيمة كاما السابقة، و(2) عامل تمليس يتغير مع الوقت، و(3) سعرًا حاليًا. يعتمد عامل التمليس هذا على مدى تحرك السعر “بكفاءة” خلال نافذة مراجعة حديثة—وغالبًا ما يُقاس كنسبة التغير الصافي في السعر إلى مجموع التغيرات المطلقة الكلية.
وبما أن هناك أسماءً وأشكالًا مختلفة في التطبيق، فإن أكثر طريقة أمانًا للتحقق مما تستخدمه هي مراجعة التعريف الدقيق في إعدادات المؤشر الذي لديك (على سبيل المثال، طول فترة المراجعة وثوابت التمليس). يوضح الحساب أدناه بنية واحدة مستخدمة على نطاق واسع ومستقرة؛ إذا كانت كاما في منصتك تستخدم أسماء معلمات مختلفة أو معادلة كفاءة مختلفة قليلًا، فستظل الخطوات الميكانيكية متشابهة لكن قد تختلف الثوابت.
الآلية والتعريف
طريقة عملية لوصف الآلية هي اعتبارها عملية تمليس متكررة (recursive).
- اختر سلسلة سعر الإدخال يتم حساب كاما من سلسلة زمنية للأسعار. يمكن تعريف “السعر” بطرق مختلفة (على سبيل المثال، سعر الإغلاق، أو السعر النموذجي، أو سلسلة مشتقة أخرى). يجب أن يطابق اختيارك طريقة التنفيذ التي تريد إعادة إنتاجها.
لتكن P[t] هي السعر المختار عند الزمن t.
- حدد نافذة مراجعة وحدود التمليس تستخدم كاما النموذجية:
- طول فترة المراجعة: N (كم عدد الفترات المستخدمة لتقييم الكفاءة)
- إعداد التمليس السريع: عادةً يُمثَّل بفترة “fast” صغيرة أو ثابت
- إعداد التمليس البطيء: عادةً يُمثَّل بفترة “slow” أكبر أو ثابت
في العديد من التطبيقات، يتم تحويل حدود التمليس إلى ثابتين:
- SC_fast و SC_slow الناتجان عن فترتي fast و slow
يعتمد التحويل الدقيق على التنفيذ. نهج شائع يستخدم ثوابت تمليس بأسلوب أسي من الشكل:
- SC_fast = 2 / (fastPeriod + 1)
- SC_slow = 2 / (slowPeriod + 1)
- احسب نسبة الكفاءة عبر آخر N فترات ضمن نافذة المراجعة، تتم مقارنة كميتين:
- التغير الصافي: |P[t] − P[t−N]|
- مجموع التحركات المطلقة: sum_{i=0..N−1} |P[t−i] − P[t−i−1]|
ثم يتم حساب نسبة الكفاءة ER على النحو التالي:
- ER = netChange / sumAbsMoves
تم تصميم ER لتكون أعلى عندما يتحرك السعر بقوة من بدايته إلى نهايته مقارنةً بكمية “التذبذب ذهابًا وإيابًا” داخل النافذة. عندما تكون ER قريبة من 0، يكون السعر متذبذبًا؛ وعندما تكون ER أقرب إلى 1، يكون السعر قد تحرك بشكل أكثر مباشرة.
تفصيل تتعامل معه التطبيقات صراحةً: إذا كان sumAbsMoves يساوي صفرًا (على سبيل المثال، إذا كان السعر دون تغيير عبر النافذة بالكامل)، فقد يتم تعيين ER إلى 0 أو التعامل معه لتجنب القسمة على صفر. يجب أن تُطبق نفس القاعدة المستخدمة في مصدر البيانات لديك.
- حوّل ER إلى ثابت تمليس ديناميكي يتم بعد ذلك حساب ثابت تمليس متغير SC[t] باستخدام ER وحدود التمليس. بنية شائعة هي:
- SC[t] = (ER × (SC_fast − SC_slow) + SC_slow)^2
الأس (غالبًا 2) جزء من الصياغة المستخدمة بشكل شائع؛ إذا كان تنفيذك يستخدم أسًا مختلفًا، يجب استخدام نفس الأس.
- حدّث كاما بشكل تكراري أخيرًا، يتم تحديث كاما على النحو التالي:
- Kama[t] = Kama[t−1] + SC[t] × (P[t] − Kama[t−1])
تُظهر هذه الصيغة أن كاما “تنجذب” نحو السعر الحالي بمقدار يعتمد على SC[t]. تعني SC الأكبر تعديلًا أسرع؛ وتعني SC الأصغر تعديلًا أبطأ.
- التهيئة (Initialization) تحتاج كاما إلى قيمة ابتدائية أولية لـ Kama[0] (أو Kama[N−1]، حسب طريقة الفهرسة). تقوم العديد من التطبيقات بتهيئة كاما باستخدام السعر عند أول نقطة متاحة أو باستخدام متوسط متحرك بسيط. إذا كنت تريد التحقق بشكل مستقل من الحساب، فتأكد من قاعدة التهيئة الدقيقة من تعريف المؤشر الذي تختبره.
دليل أو مثال (مع افتراضات صريحة)
فيما يلي شرح عددي صغير باستخدام افتراضات مذكورة. هذا ليس بيانات سوق حية؛ بل يوضح بنية الحساب التي يمكنك تكرارها باستخدام سلسلتك الخاصة.
افتراضات المثال:
- سعر الإدخال P هو سعر الإغلاق.
- طول فترة المراجعة N = 3.
- fastPeriod = 2, slowPeriod = 30، لذا:
- SC_fast = 2/(2+1) = 0.666666…
- SC_slow = 2/(30+1) = 0.064516…
- الأس هو 2 في SC[t].
- قيمة كاما السابقة هي Kama[t−1] = 100.
افترض أنه عند الزمن t لديك:
- P[t−2] = 99
- P[t−1] = 101
- P[t] = 100
الخطوة A: netChange
- netChange = |P[t] − P[t−N]| = |100 − 99| = 1
الخطوة B: sumAbsMoves بالنسبة لـ N = 3، نحتاج إلى |P[t]−P[t−1]| + |P[t−1]−P[t−2]| + |P[t−2]−P[t−3]|. لكن سلسلتنا المصغّرة تعرض سعرين سابقين فقط. للحفاظ على اتساق العرض التوضيحي، وسّع النافذة لتشمل P[t−3].
لتكن P[t−3] = 98. الآن احسب:
- |P[t] − P[t−1]| = |100 − 101| = 1
- |P[t−1] − P[t−2]| = |101 − 99| = 2
- |P[t−2] − P[t−3]| = |99 − 98| = 1
- sumAbsMoves = 1 + 2 + 1 = 4
الخطوة C: ER
- ER = netChange / sumAbsMoves = 1 / 4 = 0.25
الخطوة D: ثابت تمليس ديناميكي
- SC[t] = (ER × (SC_fast − SC_slow) + SC_slow)^2 أولًا احسب (SC_fast − SC_slow):
- 0.666666… − 0.064516… = 0.602150… ثم الحد الخطي:
- ER × (SC_fast − SC_slow) + SC_slow = 0.25 × 0.602150… + 0.064516… = 0.150537… + 0.064516… = 0.215053… ثم مربّعه:
- SC[t] ≈ (0.215053…)^2 ≈ 0.0463
الخطوة E: تحديث كاما
- Kama[t] = Kama[t−1] + SC[t] × (P[t] − Kama[t−1]) = 100 + 0.0463 × (100 − 100) = 100
في هذا المثال المُنشأ، السعر الحالي يساوي كاما السابقة، لذا يكون التحديث صفريًا. إذا كان P[t] مختلفًا عن Kama[t−1]، فسترى تعديلًا غير صفري مُقاسًا بواسطة SC[t].
لماذا يوضح هذا الفكرة: إذا زادت ER (أصبح تحرك السعر أكثر مباشرة خلال N فترات)، فإن SC[t] تميل إلى الاقتراب من SC_fast، مما يجعل كاما تستجيب بشكل أسرع. وإذا انخفضت ER (حركة أكثر تذبذبًا)، فإن SC[t] تميل إلى الاقتراب من SC_slow، مما يجعل كاما أكثر سلاسة.
القيود والمخاطر
-
عدم تطابق المعلمات تعتمد كاما على N وإعدادات fast/slow، وعلى الأس وقواعد التعامل مع الحالات الحدّية (مثل القسمة على صفر). إذا نسخت المعادلة لكن لم تنسخ التحويل الدقيق للمعلمات من المؤشر الخاص بك، فستحصل على قيم مختلفة.
-
تعريف سعر الإدخال تعرّف المنصات المختلفة “السعر” بشكل مختلف. إذا استخدمت منصة سعر الإغلاق بينما استخدمت منصة أخرى سعرًا مشتقًا (على سبيل المثال، متوسط high/low/close)، فإن سلسلة المخرجات بالكامل ستتغير.