بوابة الدقة: البحث من الخشن إلى الدقيق في الاختبار الرجعي يخدعك أسرع ما لم يُرتّب الوكيل الرخيص الإعدادات مثلما يفعل التقييم المكلف
جزء من سلسلة "اختبارات رجعية بلا أوهام".
كل بحث جاد عن المعاملات يصطدم بالجدار نفسه: الفضاء هائل، وكل تقييم صادق مكلف. استراتيجية متعددة الأطر الزمنية تضم اثنتي عشرة عتبة وثلاث فترات للمؤشرات، تُقيَّم عبر تقسيم walk-forward متعدد الطيّات، يمكن أن تكلف ثوانٍ لكل إعداد. عشرة آلاف إعداد تعني ساعات. لذا تبحث عن اختصار، والاختصار هو دائماً الفكرة نفسها: قيّم بتكلفة زهيدة، ورقِّ فقط الناجين إلى الاختبار المكلف. افحص عشرة آلاف إعداد على طيّة واحدة، واحتفظ بأفضل بضع مئات، ثم شغّل هذه على كل الطيّات. افحص على شموع الساعة، وانزل بالتفصيل إلى دقة الثانية الواحدة فقط للمتأهلين النهائيين.
هذا هو البحث من الخشن إلى الدقيق (coarse-to-fine) — drill-down، متعدد الدقة، التنصيف المتتالي، Hyperband، ASHA — وهو واحد من الأفكار الجيدة حقاً في التحسين (optimization). يمكنه أن يحوّل يوماً كاملاً من الحوسبة إلى ساعة واحدة. نحن نستخدمه. لكنه يخفي فخاً هادئاً لدرجة أن معظم من يطبقونه لا يتحققون منه أبداً، والفخ هو هذا: الطريقة بأكملها تفترض أن وكيلك الرخيص يرتّب الإعدادات بالطريقة نفسها التي يرتّبها بها التقييم المكلف. إن لم يكن الأمر كذلك، فأنت لا تبحث بشكل أسرع. أنت تتخلص من فائزيك المستقبليين عند البوابة الأولى وترقّي الضجيج (noise) — أنت فقط تخدع نفسك بشكل أسرع.
هذا المقال يتناول القياس الوحيد الذي يخبرك إن كان الـ drill-down الخاص بك حقيقياً أم وهماً. طبّقناه على بحثنا الخاص متعدد الأطر الزمنية، وكانت الإجابة مزعجة: عند أرخص دقة، رتّب وكيلنا الإعدادات بشكل شبه عشوائي (Spearman ρ ≈ 0.03). لو كنا قد شذّبنا (pruned) بقوة عند تلك الدقة — كما تدعوك كل إعدادات ASHA الافتراضية الجاهزة إلى فعله — لكنا قد تخلصنا من الفائزين النهائيين في الجولة الأولى. الحل هو بوابة إلزامية تعمل قبل البحث: قِس ارتباط الرتب، وارفض التشذيب دون الدقة التي يكون فيها هذا الارتباط موثوقاً.
ما هو البحث متعدد الدقة فعلياً

لهذه العائلة من الطرق شكل واحد. تُعرِّف دقة (fidelity) — تُسمى أيضاً مورداً (resource) أو ميزانية (budget) — وهي مقياس متدرج من الرخيص إلى المكلف، يعطي عند أقصاه الهدف الحقيقي. ثم تُشغّل الإعدادات عند دقة منخفضة، وترتّبها، وتحتفظ بأفضل نسبة منها، وتعيد تشغيل هؤلاء الناجين فقط عند دقة أعلى — وتكرر ذلك حتى يتم تقييم عدد صغير من المتأهلين النهائيين عند الدقة الكاملة.
التنصيف المتتالي (Successive halving) (Jamieson & Talwalkar, 2016) هو الجوهر: ابدأ بـ N إعداداً عند الحد الأدنى من المورد، احتفظ بأفضل 1/η، اضرب المورد في η، وكرر. Hyperband (Li et al., 2018) يغلّف التنصيف المتتالي في حلقة خارجية تحوّط عبر موارد بداية مختلفة، بحيث لا تضطر إلى تخمين درجة قوة التشذيب. ASHA (Li et al., 2020) هو النسخة غير المتزامنة الملائمة للتوازي (parallel). معدل الاستبعاد η هو المقبض الوحيد الذي تشترك فيه جميعها؛ والافتراضي المعياري هو η = 3 — احتفظ بأفضل ثلث عند كل درجة (rung)، وضاعف الميزانية ثلاث مرات.
يمكن أن تكون الدقة نفسها أي شيء تقريباً يتدرج من الرخيص إلى المكلف ويتقارب نحو الحقيقة:
- عدد طيّات walk-forward. قيّم على طيّة واحدة، ثم طيّتين، ثم ثلاث، وصولاً إلى K. هذه هي الدقة التي ندرسها أدناه، لأنها الأنسب طبيعياً لاختبار رجعي بتقسيم متجدد خارج العينة (out-of-sample).
- دقة الشموع (candle resolution). افحص على أشرطة الساعة الواحدة، ورقِّ إلى الدقيقة الواحدة، وانزل إلى دقة الثانية الواحدة أو الصفقات الخام فقط للمتأهلين النهائيين. هذه هي فكرة الانزال التكيفي بالتفصيل مطبّقة على البحث بدلاً من محاكاة التنفيذ (fill simulation).
- طول السجل التاريخي، الحقب (epochs)، العينة الفرعية لمجموعة البيانات — دقات التعلم الآلي الكلاسيكية.
في الاختبار الرجعي، الطيّات والدقة هما الاثنان المهمان، و— وهذه هي فكرة المقال بأكمله — ليسا آمنَين بالتساوي. أحدهما يحمل تحيّزاً يختار بصمت المعاملات الخاطئة مهما توخيت الحذر في وضع البوابة عليه.
الافتراض الوحيد الذي يقوم عليه كل شيء

دوّن ما يحتاجه التنصيف المتتالي فعلياً ليكون صحيحاً. هو لا يحتاج إلى أن تعطي الدقة الرخيصة قيمة الهدف الصحيحة — لا أحد يهتم بأن طيّة واحدة تُبلغ عن نسبة شارب (Sharpe) مختلفة عن ست طيّات. إنه يحتاج إلى شيء أضعف لكنه أكثر تحديداً بكثير: يجب أن ترتّب الدقة الرخيصة الإعدادات بالطريقة نفسها التي ترتّبها بها الدقة المكلفة. إذا تفوّق الإعداد A على الإعداد B عند الدقة الكاملة، فينبغي أن يميل A إلى التفوق على B عند الدقة المنخفضة أيضاً. هذا كل شيء. وهذا أيضاً هو كل شيء.
رسمياً، الكمية التي تحكم ما إذا كان الـ drill-down يعمل هي ارتباط الرتب بين الهدف منخفض الدقة والهدف عالي الدقة، عبر فضاء الإعدادات. إذا كان هذا الارتباط عالياً، فإن الناجين من الجولة الرخيصة هم أنفسهم الإعدادات التي كانت ستفوز في الجولة المكلفة، وتكون قد وفّرت حوسبة مجاناً. وإذا كان منخفضاً، فإن الجولة الرخيصة مجرد مرشّح عشوائي: تستبعد إعدادات جيدة وترقّي أخرى سيئة، وتكون قد أنفقت ميزانيتك في تسريع طريقك نحو إجابة أسوأ. لا يوجد إعداد وسط لـ η ينقذك — الوكيل السيئ إذا شُذِّب برفق ما زال يُسرّب الفائزين؛ وإذا شُذِّب بقوة ينزف منهم.
يكون الفشل خفياً بالطريقة المعتادة. يكتمل البحث، ويُبلَّغ عن بطل، ويبدو البطل جيداً داخل العينة (in-sample). لا يُطلَق أي خطأ. لا تكتشف أن الوكيل كان يكذب إلا عندما ينهار البطل خارج العينة (out-of-sample) — وبحلول ذلك الوقت تكون قد عزوت الفشل إلى الاستراتيجية، لا إلى البحث الذي اختارها. لذا فإن الانضباط هو نفسه الذي تصل إليه هذه السلسلة مراراً: قِس الشيء الذي تفترضه الطريقة، قبل أن تثق بالطريقة. بالنسبة إلى الـ drill-down، الشيء الذي يجب قياسه هو ارتباط الرتب، والقياس رخيص.
قياسه: بوابة الدقة

البوابة تجربة صغيرة تُجريها مرة واحدة، قبل البحث الفعلي، على نفس الفضاء الذي أنت على وشك البحث فيه. الإجراء:
- اسحب بضع مئات من الإعدادات عشوائياً من فضاء المعاملات (نستخدم نحو 200 — عدد كافٍ لتقدير مستقر لسبيرمان، ورخيص بما يكفي لتحمّل تكلفته).
- قيّم كل واحد منها عند كل درجة (rung) من درجات الدقة: عند طيّة واحدة، طيّتين، ... وصولاً إلى K طيّة كاملة. بالنسبة إلى دقة قائمة على عدد الطيّات، هذا شبه مجاني، لأن الطيّات التي تحسبها للدرجات الرخيصة تُعاد استخدامها في الدرجة المكلفة — كمتوسط تراكمي.
- لكل درجة
r، احسب ارتباط الرتب لسبيرمان بين ترتيب r طيّة وترتيب K طيّة الكامل، عبر تلك الإعدادات الـ200 تقريباً. - أول درجة يتجاوز فيها ρ عتبةً معينة (نستخدم ρ ≥ 0.5) هي أدنى دقة يُسمح لك بالتشذيب عندها. وتحتها، يكون الترتيب مشوّشاً أكثر من أن يُوثَق به؛ ويجب ألا تستبعد إعدادات هناك.
الأمر برمّته لا يتجاوز بضع عشرات من الأسطر. وهذا هو جوهره:
def fidelity_check(cache, n_probe, seed=7):
"""Spearman ρ: cumulative mean over the first r folds (in FOLD_ORDER)
vs the full K-fold objective, on n_probe random configs."""
rng = np.random.default_rng(seed)
k = len(FOLDS)
per_fold = np.empty((k, n_probe))
order_win = np.array([list(FOLDS[fi]) for fi in FOLD_ORDER], np.int64)
for j in range(n_probe):
p = _unit_to_params(rng.random(len(PNAMES))) # random config
scores, *_ = eval_group(cache, p, _sp_of(p)[None, :], order_win, False)
per_fold[:, j] = scores[0] # score on each fold
cums = np.cumsum(per_fold, axis=0) / np.arange(1, k + 1)[:, None] # r-fold mean
rhos = []
for r in range(1, k):
rho = spearmanr(cums[r - 1], cums[-1]).statistic # r folds vs all K
rhos.append(0.0 if math.isnan(rho) else rho)
return rhos
لاحظ تفصيلاً مقصوداً: تُؤخَذ الطيّات بترتيب FOLD_ORDER، وهو ترتيب متشابك (interleaved) يتناوب بين شرائح مبكرة ومتأخرة من التقويم (الطيّة 0، ثم طيّة وسطى، ثم الطيّة 1، ثم طيّة لاحقة، ...). هذا مهم للغاية وهو موضوع قسم لاحق: فهو يعني أن "طيّة واحدة" هي شريحة واحدة تمتد عبر منتصف السجل التاريخي، وأن "طيّتين" هما شريحة مبكرة زائد شريحة متأخرة — وليستا أبداً نافذة حديثة متصلة. تصبح الدقة الرخيصة أرخص باستخدام طيّات أقل، لا طيّات أحدث.
النتائج: طيّة واحدة تُرتِّب بشكل شبه عشوائي

إليك ما أبلغت به البوابة، عند تشغيلها على اثنين من إعداداتنا متعددة الأطر الزمنية. الرقم هو ρ لسبيرمان بين ترتيب r طيّة والترتيب الكامل لـ K طيّة عبر نحو 200 إعداد عشوائي — أي مدى دقة تنبؤ ترتيب الدقة الرخيصة بترتيب الدقة الكاملة.
الطيّات r |
تشغيلة متعددة الأطر الزمنية | نظام سوق أصعب |
|---|---|---|
| 1 | +0.43 | +0.03 |
| 2 | +0.67 | +0.43 |
| 3 | +0.78 | +0.78 |
| 4 | +0.82 | — |
| 5 | +0.91 | +0.91 |
اقرأ عمود النظام الأصعب أولاً، لأنه المقلق. عند طيّة واحدة، ρ = 0.03. هذا ليس ارتباطاً ضعيفاً؛ إنه انعدام ارتباط — ترتيب مئتي إعداد عند طيّة واحدة لا يمكن تمييزه إحصائياً عن خلطها عشوائياً. تشغيلة تنصيف متتالٍ مُعدَّة (كما هو الحال في الغالبية، افتراضياً) لبدء التشذيب عند min_resource = 1 ستقوم، في هذا النظام، بأول وأقوى قطع لها بناءً على رمية عملة. الإعدادات التي كانت ستفوز في النهاية عند الدقة الكاملة لديها فرصة 50/50 للنجاة من الجولة الأولى بالذات. وبحلول الوقت الذي تصل فيه إلى الدقة التي يصبح فيها الترتيب ذا معنى (ρ = 0.78 عند ثلاث طيّات)، يكون معظمها قد اختفى بالفعل.
عمود multi-TF أخف حدة لكنه يوصل الفكرة نفسها بطريقة مختلفة. حتى هناك، تعطي طيّة واحدة ρ = 0.43 — وهو أقل من بوابتنا عند 0.5. يبدو ارتباطاً معقولاً، وهذا بالضبط هو الخطر: 0.43 مرتفع بما يكفي لتخديرك ومنخفض بما يكفي لتسريب أفضل إعداداتك. لا يصبح الترتيب موثوقاً إلا عند طيّتين (ρ = 0.67).
يمكن تعميم أمرين من هذا. أولاً، ρ عند طيّة واحدة يعتمد على النظام السوقي وغير موثوق — قسنا قيماً تراوحت بين 0.03 و0.43 عبر الإعدادات، وفي كلتا الحالتين لم تتجاوز طيّة واحدة العتبة. ثانياً، ρ يرتفع بشكل رتيب وسريع: عند ثلاث طيّات يبلغ الإعدادان كلاهما 0.78، وعند خمس طيّات يتقاربان عند 0.91. الإشارة موجودة؛ عليك فقط أن تنفق دقة كافية لرؤيتها. مهمة البوابة هي إيجاد الدرجة الدقيقة التي يبدأ عندها "الكفاية" — ومنع التشذيب دونها.
لماذا تكون الطيّة الواحدة صاخبة (مشوّشة) إلى هذا الحد
الضجيج ليس خللاً في بنية طيّاتنا؛ إنه متأصل، وفهم السبب يمنعك من "إصلاحه" بالطريقة الخاطئة. طيّة walk-forward واحدة هي نافذة قصيرة — أسابيع من نظام سوقي واحد. تُهيمن على درجة الاستراتيجية في تلك النافذة مدى ملاءمة معاملاتها مصادفةً لذلك النظام، وهو أمر مرتبط بشكل واهٍ فقط بمدى قدرتها على التعميم. يمكن لإعدادين مختلفين حقاً في الجودة أن يتبادلا مواقعهما على طيّة واحدة لمجرد أن أحدهما التقط اتجاهاً (trend) صادف أن تلك الطيّة تحتويه. الهدف عند طيّة واحدة هو مقدِّر عالي التباين للهدف الذي يهمّك فعلياً، وارتباط الرتب هو بالضبط ما يدمّره التباين العالي أولاً — يمكنك الحفاظ على متوسط المقدِّر بينما يكون ترتيبه ضجيجاً صرفاً.
إضافة طيّات تخفّض ذلك التباين عبر المتوسط. كل طيّة هي عيّنة مستقلة جزئياً من ظروف السوق؛ ومتوسط r طيّة هو مقدِّر أقل تبايناً، ويتقارب ترتيبه نحو ترتيب الدقة الكاملة. هذا بالضبط هو تصاعد ρ = 0.03 ← 0.43 ← 0.78 ← 0.91: ليس الهدف هو الذي يتغيّر، بل تقدير رتبته هو الذي يستقر مع تلاشي الحظ الخاص بالنظام السوقي عبر المتوسط. الدرس هو أن الدقة، بالنسبة إلى الاختبار الرجعي، تتعلق أساساً بعدد الأنظمة المستقلة التي أخذت منها عينات — وواحد منها لا يكفي تقريباً أبداً للترتيب عليه.
هذا يفسّر أيضاً لماذا يبدأ النظام الأصعب عند 0.03 بينما تبدأ تشغيلة multi-TF عند 0.43. في النظام الأصعب، تكون الطيّة الواحدة أكثر خصوصية لذلك النظام — أي أن درجات الإعدادات عند طيّة واحدة مدفوعة أكثر بالحظ وأقل بميزة تنافسية دائمة، لذا يرتّبها ذلك بشكل أقرب إلى العشوائية. تقرأ البوابة ذلك الفرق تلقائياً وتستجيب بطلب مزيد من الطيّات قبل أن تسمح بالتشذيب. لست بحاجة إلى معرفة مسبقة بالنظام السوقي الذي أنت فيه؛ أنت تقيس.
البوابة في الكود: الرفع التلقائي للحد الأدنى من الدقة
مخرج البوابة هو عدد صحيح واحد: min_resource، أدنى دقة يُسمح لـ ASHA بالتشذيب عندها. القاعدة آلية — امشِ عبر الدرجات، وخذ أول درجة يتجاوز فيها ρ العتبة:
RHO_GATE = 0.5
min_res = len(FOLDS) # default: pruning OFF (full fidelity)
rhos = fidelity_check(cache, n_probe=200) # [ρ@1, ρ@2, …, ρ@(K-1)]
passing = [r for r, rho in enumerate(rhos, 1) if rho >= RHO_GATE]
if passing:
min_res = passing[0] # first rung that clears the gate
pruner = SuccessiveHalvingPruner(min_resource=min_res, reduction_factor=3)
تتبّع ذلك عبر التشغيلتين. في إعداد multi-TF، يفشل ρ@1 = 0.43 في اجتياز البوابة لكن ρ@2 = 0.67 يجتازها، لذا يُرفَع min_resource تلقائياً إلى 2: تُشغِّل ASHA كل إعداد على طيّتين على الأقل قبل أن يُسمَح لها باستبعاد أي شيء، ثم تُشذِّب بشكل طبيعي من تلك النقطة. في النظام الأصعب، يفشل كل من ρ@1 = 0.03 وρ@2 = 0.43؛ وρ@3 = 0.78 هو أول من يجتاز، لذا يصبح min_resource قيمته 3. والحل الاحتياطي الحاسم: إذا لم تصل أي درجة إلى 0.5، تكون passing فارغة ويبقى min_resource عند K — يُعطَّل التشذيب كلياً، ويتدهور البحث بأمان إلى بحث كامل الدقة عادي بدلاً من بحث سريع وخاطئ. الـ drill-down الذي لا يستطيع إثبات صحة وكيله يرفض التشذيب ببساطة.
هذه هي الفلسفة بأكملها في سطر واحد من تدفق التحكم. الإعداد الافتراضي لكل مكتبة تنصيف متتالٍ هو "شذِّب بدءاً من min_resource = 1، وثِق بالدرجة الرخيصة." تستبدل البوابة ذلك بـ "شذِّب بدءاً من أول درجة تقول البيانات إنها موثوقة، وإن لم تكن هناك واحدة، فلا تشذِّب." يكلّف ذلك مسحاً استقصائياً واحداً لنحو 200 إعداد مقدَّماً، ويحوّل الـ drill-down من فعل إيمان إلى قرار مقيس. يبقى معدل الاستبعاد η = 3 كما هو؛ فالبوابة لا تمسّ شدة التشذيب، بل فقط مدى التبكير المسموح به للبدء.
ملاحظة صدق واحدة ظاهرة في الكود أعلاه: رفع min_resource يقتطع من التسريع. التشذيب عند 3 طيّات بدلاً من طيّة واحدة يعني أن كل إعداد — بما في ذلك تلك التي ستستبعدها — يدفع ثمن ثلاث طيّات. هذا هو ثمن الصحة، وهي المقايضة الصحيحة: تسريع أصغر بمقدار 2× في بحث يجد فائزين حقيقيين يتفوق على تسريع بمقدار 6× في بحث يستبعدهم. تجعل البوابة تلك المقايضة صريحة بدلاً من إخفائها.
المحور الرخيص الخاطئ: السجل التاريخي الأقصر فخ
توجد دقة رخيصة مغرية وواضحة ومتحيّزة، ويستحق الأمر تسميتها صراحةً لأن الجميع يلجأ إليها أولاً: السجل التاريخي الأقصر. افحص الإعدادات على الشهر الأخير، ورقِّ الناجين إلى العامين الكاملين. إنها رخيصة بشكل تافه وتبدو وكأنها الفكرة نفسها الخاصة بعدد الطيّات الأقل. لكنها ليست كذلك.
تختلف الطيّات الأقل عن السجل التاريخي الأقصر بطريقة حاسمة واحدة. دقة قائمة على عدد الطيّات، إذا نُفِّذت بشكل صحيح، ما زالت تمتد عبر التقويم بأكمله — إنها فقط تأخذ منه عينات بشكل أكثر خشونة. أما دقة السجل التاريخي الأقصر فتأخذ عينات كثيفة من فترة فرعية من التقويم. والفترة الفرعية من تاريخ السوق هي نظام سوقي محدد. عندما ترتّب الإعدادات على الشهر الأخير، فأنت لا تحصل على تقدير مشوَّش لكنه غير متحيّز لترتيبها على كامل الفترة؛ بل تحصل على تقدير متحيّز يفضّل بشكل منهجي الإعدادات المضبوطة على نظام الشهر الأخير. ارفع حجم العيّنة كما تشاء — توسّط على مزيد من الإعدادات، مزيد من المحاولات — والتحيّز لا يتقلّص، لأنه ليس تبايناً. ستُرقّي الإعدادات التي تلائم نافذة الفحص بأفضل شكل، وتلك هي بالضبط الإعدادات الأكثر عرضة لأن تكون مفرطة التخصيص لنظام سوقي عابر.
هذا هو سبب مشي دقتنا عبر الطيّات بترتيب متشابك (interleaved) بدلاً من الترتيب الزمني. مع توزّع K طيّة عبر التاريخ بأكمله، تكون "طيّة واحدة" شريحة واحدة قرب المنتصف، و"طيّتان" شريحة مبكرة وأخرى متأخرة، و"ثلاث طيّات" تنتشر عبر المبكر/الوسط/المتأخر — كل مستوى دقة، حتى الأرخص، يأخذ عينات عبر التقويم بأكمله. الوكيل الرخيص هو نظرة خشنة على الفترة بأكملها، وليس أبداً نظرة حادة على شريحة واحدة منها. هذا التشابك هو ما يجعل الدقة القائمة على عدد الطيّات مجرد مشوَّشة (قابلة للعلاج بالبوابة) بدلاً من متحيّزة (وهو ما لا يمكن لأي بوابة إصلاحه — فارتباط ρ مرتفع مقابل هدف متحيّز لا يفعل سوى التصديق على أنك ستختار بشكل موثوق الإعداد الملائم للنظام السوقي). إذا كانت طريقتك الوحيدة لجعل الدقة أرخص هي جعلها أحدث زمنياً، فأنت لا تملك دقة صالحة. اجعلها أكثر خشونة بدلاً من ذلك.
الدقة الزمنية (resolution) كمحور رخيص صادق
المحور الرخيص الآخر يتجنب التحيّز كلياً، وهو الشريك الطبيعي لـالانزال التكيفي بالتفصيل الذي وصفناه لمحاكاة التنفيذ (fill simulation): دقة الشموع. افحص الفضاء بأكمله على أشرطة الساعة الواحدة، ورقِّ الناجين إلى الدقيقة الواحدة، وانزل بالتفصيل إلى دقة الثانية الواحدة أو الصفقات الخام فقط لحفنة من المتأهلين النهائيين. الشموع الأكثر خشونة عبر نفس السجل التاريخي الكامل أرخص في التقييم — أشرطة أقل، ومرور أسرع على المؤشرات، ومحاكاة أسرع — وعلى عكس النافذة الأقصر، فإن النظرة الخشنة على التقويم بأكمله غير متحيّزة: فهي ترى كل نظام سوقي، لكن بتفاصيل أقل داخل الشمعة الواحدة (intrabar).
الدقة الزمنية والطيّات محوران متكاملان للدقة، وتنطبق بوابة الدقة على كليهما. قبل أن تثق بفحص على الساعة الواحدة، أجرِ نفس المسح الاستقصائي: خذ نحو 200 إعداد، سجّلها عند دقة الساعة ودقة الدقيقة، وقِس ارتباط الرتب. إذا كان ρ(1h, 1m) مرتفعاً، فالفحص على الساعات آمن وتكون قد اشتريت تسريعاً كبيراً بصدق. وإذا كان منخفضاً — وهو ما يحدث حين تعيش ميزة الاستراتيجية في بنية داخل الشمعة (intrabar) تطمسها شموع الساعة — فإن الفحص بالساعة مرشِّح عشوائي لتلك الاستراتيجية، وتخبرك البوابة بالبدء بدقة أدق. القاعدة لا تتغيّر أبداً: لا يُسمَح لك بالتشذيب عند دقة معينة إلا بعد أن تقيس أن ترتيبها يتفق مع الحقيقة.
يفشل المحوران أيضاً بطريقتين متعاكستين، وهذا مفيد. الدقة الخشنة تفقد معلومات داخل الشمعة؛ والطيّات الأقل تفقد معلومات عبر الأنظمة السوقية. قد ترتّب استراتيجية زخم (momentum) على آفاق يومية بشكل مثالي على شموع الساعة لكنها تحتاج إلى طيّات كثيرة لتوسيط حظ النظام السوقي؛ وقد ترتّب استراتيجية سكالبينغ (scalping) جيداً على طيّات قليلة لكنها تنهار فوق دقة الثانية الواحدة. البوابة، عند تشغيلها لكل محور على حدة، تخبرك بأي دقة يمكنك تحمّل الرخص فيها بالنسبة إلى هذه الاستراتيجية بالذات — بدلاً من افتراض إجابة تصادف أنها مريحة.
من أين يأتي التوفير فعلياً
تحفّظ يبقي الـ drill-down صادقاً: الدقة لا توفّر الحوسبة إلا حيث تعيش التكلفة فعلياً. في محركنا متعدد الأطر الزمنية، الجزء المكلف هو الحساب المسبق للمؤشرات — إشارات HMA والفصل (separation) متعددة الأطر الزمنية — وهو ما يُدفَع مرة واحدة لكل إعداد، قبل تشغيل أي طيّة. المحاكاة لكل طيّة على الإشارات المخزَّنة مؤقتاً (cached) رخيصة نسبياً. لذا فإن التشذيب حسب عدد الطيّات يوفّر فقط تكلفة المحاكاة، لا تكلفة المؤشرات المهيمنة؛ الدقة القائمة على عدد الطيّات حقيقية لكن سقفها أدنى مما توحي به نسبة الطيّات الخام.
محور الدقة الزمنية، على النقيض، يهاجم التكلفة المهيمنة مباشرة: الشموع الأكثر خشونة تعني أشرطة أقل لحساب المؤشرات عليها، بحيث يتقلّص الحساب المسبق المكلف والمحاكاة الرخيصة معاً. هذا ليس تفصيلاً — إنه يحدد أي drill-down يستحق البناء. قبل أن تستثمر في بحث متعدد الدقة، اسأل إلى أين تذهب ثوانيك. إذا كانت 90% منها حساباً مسبقاً للمؤشرات مشتركاً عبر الطيّات، فإن الدقة القائمة على عدد الطيّات تمنحك القليل ودقة الدقة الزمنية تمنحك الكثير. حلِّل (profile) أولاً؛ المحور الرخيص الصحيح هو الذي يزيل التكلفة التي تملكها فعلياً، ويجب أن يجتاز البوابة رغم ذلك.
أين يتصل هذا بغيره
تقع بوابة الدقة في نقطة محددة من سلسلة نظافة الاختبار الرجعي (backtest hygiene) في هذه السلسلة المقالية:
- هي تسبق ضبط الإفراط في التخصيص (overfitting). الـ drill-down الذي يشذِّب بناءً على وكيل سيئ هو طريقة جديدة للإفراط في التخصيص — فأنت تدع درجة مبكرة مشوَّشة تختار متأهليك النهائيين. ما زال على البطل أن ينجو من نسبة شارب المخفَّضة (Deflated Sharpe) وPBO، ويجب أن يشمل عدد المحاولات التي تُغذّي تلك البوابات كل محاولة مُشذَّبة، لا الناجين فقط — فالتشذيب لا يُعفي محاولة ما من سجل الاختبار المتعدد (multiple-testing).
- تشترك في عدوّها مع تحليل الهضبة: إعداد يفوز في طيّة واحدة أو نافذة فحص واحدة ولا يفوز في أي مكان آخر هو نفس أداة (artifact) الملاءمة للنظام السوقي التي توجد كلتا الأداتين لرفضها. البوابة ترفض أن تختار بناءً على طيّة كهذه؛ وتحليل الهضبة يرفض أن يثق ببطل يقف على واحدة فقط.
- تفترض وجود تقسيم walk-forward صادق في الأساس — طيّات تمتد عبر التقويم الكامل، مع الاحتفاظ بعينة خارج العينة (out-of-sample) جانباً — وهي المكمِّل في وقت البحث لـ drill-down الذي بنيناه من أجل محاكاة التنفيذ: المبدأ نفسه من الخشن إلى الدقيق، لكنه مطبَّق على أي الإعدادات يجب تقييمها بدلاً من مدى دقة تنفيذها.
- وتعتمد اعتماداً كلياً على أن تكون الدقة خالية من التسريب (leak-free) عند كل درجة. إذا كانت الدرجة الرخيصة تحمل تحيّز الاستطلاع المسبق لا تحمله الدرجة المكلفة، فإن ρ يقيس الاتفاق مع هدف ملوَّث والبوابة تصادق على تسريب. قِس ارتباط الرتب، نعم — لكن على هدف صادق.
الفكرة الموحِّدة، مرة أخرى، هي تلك التي لن تتوقف هذه السلسلة عن تكرارها: الاختبار الرجعي تجربة إحصائية، وكل اختصار فيه هو فرضية أنت ملزَم باختبارها. فرضية الـ drill-down هي "الترتيب الرخيص ≈ الترتيب المكلف." وهي قابلة للاختبار في نحو 200 إعداد. اختبرها.
الخلاصات
- البحث من الخشن إلى الدقيق يقوم على افتراض واحد: أن الوكيل الرخيص يرتّب الإعدادات كما يرتّبها الوكيل المكلف. ليست نفس القيمة — بل نفس الترتيب. إذا كان ارتباط الرتب منخفضاً، فإن التشذيب القوي يستبعد فائزيك المستقبليين ويرقّي الضجيج. أنت تبحث بشكل أسرع نحو إجابة أسوأ.
- قِسه قبل أن تثق به. اسحب نحو 200 إعداد عشوائي، سجّلها عند كل درجة دقة، واحسب ρ لسبيرمان بين كل درجة رخيصة والترتيب كامل الدقة. الأمر لا يتجاوز بضع عشرات من الأسطر ومسحاً استقصائياً رخيصاً واحداً.
- طيّة واحدة ترتّب بشكل شبه عشوائي. قسنا ρ@1 يتراوح من 0.03 (رمية عملة) إلى 0.43 (ما زال دون الثقة) حسب النظام السوقي؛ ويرتفع إلى 0.67 و0.78 و0.82 و0.91 مع تراكم الطيّات. الإعداد الافتراضي
min_resource = 1لكل ASHA جاهز هو، بالنسبة إلى الاختبار الرجعي، خاطئ عادةً. - ارفع تلقائياً الحد الأدنى للدقة إلى أول درجة يكون فيها ρ ≥ 0.5، وإن لم تجتز أي درجة، فلا تشذِّب على الإطلاق. تحوّلت البوابة إلى
min_resource = 2لإعداد واحد و3لإعداد أصعب؛ ويتدهور الحل الاحتياطي بأمان إلى بحث كامل الدقة. الصحة تكلّف بعض التسريع — ادفع ثمنها. - اختر المحور الرخيص بناءً على ما إذا كان متحيّزاً، لا بناءً على مدى رخصه. السجل التاريخي الأقصر متحيّز — فهو يختار معاملات ملائمة للنظام السوقي ولا يُصلِح ذلك أي حجم عيّنة. استخدم طيّات أقل تمتد عبر التقويم الكامل (متشابكة، لا متصلة) أو دقة أكثر خشونة عبر الفترة الكاملة. وأنفق المحور الرخيص حيث تعيش تكلفتك فعلياً.
الـ drill-down واحد من أفضل وسائل التسريع في الاختبار الرجعي، وواحد من أسهلها تحوّلاً إلى طريقة أسرع لخداع نفسك. الفرق بين الاثنين رقم واحد يمكنك قياسه قبل أن يبدأ البحث. إذا لم يستطع وكيلك إثبات أنه يرتّب مثل الحقيقة، فهو ليس وكيلاً — إنه مولّد أرقام عشوائية بملف تكلفة معقول الشكل.
Authors
Trading-systems engineer
Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.