العمليات الغوسية لنمذجة الأسعار غير البارامترية
جزء من سلسلة "خطوط الأساس الكلاسيكية لتعلم الآلة".
هناك شيئان يجعلان العملية الغوسية تستحق مقالة منفصلة في هذه المدونة، ولا يعتبر أي منهما "أنه يمنحك عدم اليقين".
الأول هو تصميم النواة. يعيش التحيز الاستقرائي الكامل للطبيب العام في وظيفة واحدة وهذه الوظيفة هي شيء تكتبه عمدًا: ما مدى صعوبة المسار، وما إذا كان يتكرر، وما إذا كان التكرار يتلاشى. لا يوجد أي شيء آخر في مجموعة الأدوات القياسية يسمح لك بوضع فرضية هيكلية حول ديناميكيات السوق التي تناسبها بشكل واضح. والثاني هو الاحتمال الهامشي — وهو هدف تدريبي مع عقوبة تعقيد مستمدة من النموذج نفسه، وليس من مجموعة محتجزة. توجد كل المقالات الأخرى في قوس التجهيز الزائد على هذه المدونة (تحليل الهضبة، PBO، deflated Sharpe) لأن تنظيم مجموعة التحقق من الصحة هش أثناء البحث. يدعي الطبيب العام أنه لا يحتاج إلى واحد. هذا الادعاء قابل للاختبار، واختباره أكثر إثارة للاهتمام من برنامج تعليمي آخر لتحجيم عدم اليقين.
فيما يتعلق بعدم اليقين نفسه: التباين الخلفي GP هو بنيوي - فهو يقع من نفس الاستدلال الذي ينتج المتوسط، بدلاً من أن يلتف حول نموذج مناسب بعد ذلك. هذا هو التناقض الحقيقي مع التنبؤ المطابق، والذي يغطي بالفعل في هذه المدونة سبب كون عدم اليقين هو المدخل الصحيح لتحديد حجم المركز وما يجب فعله بفاصل زمني بمجرد حصولك على فاصل زمني. هذه المقالة لا تعيد طرح هذه القضية؛ يذهب بعد النموذج.
ما يلي هو آلية النواة والاستدلال، وتطبيق GPyTorch، و- مذكور بوضوح في النهاية - القياسات التي لم تتضمنها هذه المقالة بعد.
ما هي العملية الغوسية؟
تظهر المواقع العامة بالفعل على هذه المدونة كبديل للتحسين البايزي في Optuna vs.حداثيات النسب، مع نفس التدوين ونفس التحذير ذي الأبعاد المنخفضة. هنا يكون GP هو النموذج نفسه، وهو ملائم لبيانات السوق بدلاً من سطح بحث المعلمات الفائقة، وبالتالي فإن المعالجة تكون أعمق.
العملية الغوسية عبارة عن مجموعة من المتغيرات العشوائية، أي عدد محدود منها له توزيع غاوسي مشترك. إنه توزيع على الوظائف، وليس توزيعًا على المعلمات.
رسميا، وظيفة يتم استخلاصه من GP إذا كان لأي مجموعة محدودة من المدخلات :
أين هي الدالة المتوسطة و هي وظيفة التغاير (النواة). نكتب هذا بشكل مضغوط على النحو التالي:
ترمز الدالة المتوسطة إلى الاعتقاد المسبق حول السلوك المتوسط . في التداول، نقوم عادة بتعيين ، مما يرمز إلى الافتراض بأنه ليس لدينا أي تحيز اتجاهي سابق على العوائد. كل الهيكل يذهب إلى النواة.
لماذا غير حدودي؟
نموذج الانحدار الخطي ذو 5 ميزات له 6 معلمات. تحتوي الشبكة العصبية المكونة من طبقتين مخفيتين من 64 وحدة على الآلاف. لا يحتوي GP على عدد محدد من المعلمات، حيث يزداد تعقيد النموذج مع البيانات. من خلال 10 ملاحظات، يحدد GP شكل غاوسي ذي 10 أبعاد. مع 10000 ملاحظة، فإنه يحدد 10000 بعدًا غاوسيًا.
هذا لا يعني أن الأطباء العامين ليس لديهم معلمات مفرطة. تحتوي وظيفة kernel على معلمات مفرطة (مقاييس الطول، والسعات، والدورات) التي تتحكم في خصائص الوظائف المستمدة من الوظائف السابقة. لكن الشكل الوظيفي نفسه لم يتم إصلاحه أبدًا. يمكن أن يمثل GP أي وظيفة مستمرة، مع توفر بيانات كافية والنواة الصحيحة. هذا هو ما تعنيه عبارة "غير بارامترية" - النموذج لا يقتصر على عائلة بارامترية مثل الدوال الخطية أو كثيرات الحدود.
بالنسبة للنمذجة المالية، هذا أمر ذو قيمة. الأسواق تتغير. العلاقة بين الميزات والعائدات غير خطية وغير ثابتة وتعتمد على النظام. تفرض النماذج البارامترية بنية قد لا تتطابق مع الواقع. الأطباء العامون يتركون البيانات تتحدث.
وظائف النواة: تشفير هيكل السوق
وظيفة النواة هي روح العملية الغوسية. فهو يحدد الوظائف المحتملة مسبقًا عن طريق تحديد التباين بين قيم الوظائف عند أي نقطتين إدخال. تقوم النوى المختلفة بتشفير افتراضات مختلفة حول السلاسة، والتواتر، والسلوك بعيد المدى.
دالة الأساس الشعاعي (RBF) / الأسي التربيعي
نواة RBF هي نقطة البداية الأكثر شيوعًا:
أين هو تباين الإشارة (مقياس الإخراج) و هو مقياس الطول. الوظائف المستمدة من GP مع نواة RBF قابلة للتمييز بشكل لا نهائي - سلسة للغاية.
تفسير التداول: مقياس الطول يتحكم في مدى تباعد نقطتي البيانات وما زال من الممكن ربطهما. ويعني المقياس القصير الطول أن النموذج يتفاعل مع الأنماط المحلية؛ مقياس الطول الطويل يعني أنه يلتقط اتجاهات واسعة. تباين الإشارة يتحكم في سعة الوظيفة - إلى أي مدى يمكن أن تصل العوائد المتوقعة.
مشكلة بالنسبة للتمويل: السلاسة اللامحدودة أمر غير واقعي. العوائد المالية لها قفزات، وتغييرات في النظام، وانقطاعات. يمكن لنواة RBF أن تزيد من سلاسة هذه الميزات، مما ينتج عنه تنبؤات متحفظة للغاية بالقرب من الفواصل الهيكلية.
نواة الأم
تقوم فئة Matern بتعميم RBF عن طريق إدخال معلمة النعومة :
أين هي دالة Bessel المعدلة من النوع الثاني. مثل ، تتقارب نواة الأم مع RBF. الاختيارات الشائعة:
- : أي ما يعادل عملية أورنشتاين-أولينبيك. الدوال مستمرة ولكنها غير قابلة للتفاضل — خشنة، مثل الحركة البراونية.
- : الوظائف قابلة للتمييز مرة واحدة. توازن جيد بين النعومة والمرونة.
- : الوظائف قابلة للتمييز مرتين. أكثر سلاسة من ولكن أقل جمودا من RBF.
تفسير التداول: الأم- يمكن القول إن kernel هو أفضل خيار افتراضي للسلاسل الزمنية المالية. فهو يسمح بنوع من الخشونة التي تظهرها مسارات الأسعار الحقيقية دون أن تكون خشنة مثلها . يتماشى هذا مع أدبيات "التقلبات القاسية" (Gatheral، Jaisson، & Rosenbaum، 2018)، والتي تظهر تجريبيًا أن مسارات التقلب لها أسس هيرست حولها. وهي أقسى بكثير من الحركة البراونية.
الدليل الرئيسي المنشور على تفوق حبات الأم على نماذج التقلب الكلاسيكية هو Rizvi et al. (2017)، الذين أبلغوا عن MSE أفضل بنسبة 20٪ تقريبًا من المشي العشوائي وأفضل بنسبة 50٪ من GARCH - ** في بيانات أزواج العملات اليومية لعام 2017، وليس العملات المشفرة، ولم يتم إعادة إنتاجها هنا. ** تعامل معها كحافز لتجربة النواة، وليس كمعيار. يتناسب GARCH(1,1) الخاص بهذه المدونة مع بيانات BTC اليومية الحقيقية، مع تشخيصات Ljung-Box وARCH-LM، وهو موجود في تنبؤات GARCH لتقلبات العملات المشفرة؛ ستكون المواجهة المباشرة مع طبيبة Matern GP على نفس العينة هي المقارنة الصادقة، ولم يتم إجراؤها.
النواة الدورية
الأسواق المالية لديها أنماط دورية: منحنيات الحجم خلال اليوم، وتأثيرات يوم من الأسبوع، وتدفقات إعادة التوازن الشهرية، ومواسم الأرباح ربع السنوية. تلتقط النواة الدورية ما يلي:
أين هي الفترة. تتكرر الوظائف المشتقة من هذه النواة مع الفترة ، معدلة بمقياس الطول الذي يتحكم في مدى سرعة اضمحلال الارتباط خلال فترة ما.
تفسير التداول: مجموعة (ساعات) لالتقاط الأنماط اللحظية، أو (أيام التداول) للموسمية الأسبوعية. على عكس ميزات فورييه، فإن النواة الدورية لا تفترض عددًا ثابتًا من التوافقيات، حيث يتعلم GP شكل الدورة من البيانات.
الجمع بين النوى: التركيب الإضافي والمضاعف
القوة الحقيقية لنواة GP تكمن في تكوينها. لو و هي حبات صالحة، وكذلك هي:
- المجموع: — الدالة هي مجموع المكونات المستقلة (التحلل الإضافي)
- المنتج: — التفاعلات بين المكونات (على سبيل المثال، السلوك الدوري محليًا)
نواة مركبة مفيدة للعوائد المالية:
هذا يتحلل الإشارة إلى:
- عنصر اتجاه غير سلس وغير دوري (Matern-3/2)
- مكون دوري تتضاءل سعته بمرور الوقت (Periodic ربف)
المنتج ينشئ نواة دورية محلية: يتكرر النمط، لكن التكرارات البعيدة لها تأثير أقل من التكرارات القريبة. وهذا ينطبق تماما على الموسمية المالية، التي تنحرف بمرور الوقت مع تطور البنية الدقيقة للسوق.
حبات الخليط الطيفي
للحصول على أقصى قدر من المرونة، تحدد نواة الخليط الطيفي (SM) (Wilson & Adams, 2013) الكثافة الطيفية للنواة كخليط من Gaussians:
أين هي أوزان الخليط، هي الفروق الطيفية، و هي وسائل طيفية (الترددات). بواسطة نظرية بوشنر، يمكن تمثيل أي نواة ثابتة بهذه الطريقة. يمكن لنواة SM اكتشاف المكونات الدورية، والاتجاهات طويلة المدى، والارتباطات قصيرة المدى في وقت واحد — كل ذلك من البيانات.
تفسير التداول: تكون نواة SM مفيدة عندما لا تعرف الأنماط الموجودة في البيانات. يمكنه تحديد الفترات المخفية في سلسلة العودة (على سبيل المثال، دورات دقيقة مدتها 4 ساعات في أسواق العملات المشفرة مدفوعة بإعادة التوازن الآلي). الجانب السلبي هو المزيد من المعلمات المفرطة وخطر التجهيز الزائد بمجموعات البيانات الصغيرة.
الاستدلال الخلفي: من ما قبل التنبؤ
نظرا لبيانات التدريب أين و ، GP الخلفي عند نقاط الاختبار لديه حل مغلق الشكل. هذه هي الميزة الحسابية الرئيسية للGPs مقارنة بمعظم النماذج الافتراضية.
المعادلات الخلفية
دع يكون مصفوفة التغاير التدريبي, يكون مصفوفة التغاير المتقاطع، و يكون اختبار مصفوفة التغاير. الخلفي هو :
أين:
الوسط الخلفي عبارة عن مزيج خطي من أهداف التدريب، مرجح بتشابه النواة بين نقاط الاختبار والتدريب. التباين الخلفي يبدأ من التباين السابق ويطرح المعلومات المكتسبة من بيانات التدريب. عندما تكون بيانات التدريب كثيفة، يكون التباين الخلفي صغيرًا. عندما تكون بيانات التدريب متفرقة، يعود التباين الخلفي إلى السابق.
الاحتمالية الهامشية، والمطالبة التي تستحق الاختبار
المعلمات الفائقة للنواة (مقاييس الطول، الفروق، مستوى الضوضاء) يتم تعلمها من خلال تعظيم احتمالية السجل الهامشية:
المصطلح الأول هو مصطلح مناسب للبيانات (يعاقب التنبؤات البعيدة عن الملاحظات). المصطلح الثاني هو عقوبة التعقيد (معاقبة النماذج شديدة المرونة، أي عندما يكون لمصفوفة النواة محدد كبير). المصطلح الثالث هو ثابت التطبيع.
هذه هي ماكينة حلاقة Occam الأوتوماتيكية، وهي الشيء الأكثر إثارة للاهتمام الذي يجلبه الطبيب العام إلى خط أنابيب التداول. النسخة القوية من المطالبة هي أنه لا توجد حاجة إلى مجموعة تحقق منفصلة للتنظيم — عقوبة التعقيد موجودة داخل الهدف، لذا لا يمكن للنموذج أن يشتري الملاءمة مع المرونة مجانًا.
هذا الادعاء يستحق الشك في هذه المدونة على وجه التحديد. تحليل الهضبة يُظهر أن نتيجة التحقق من نقطة واحدة هي معيار اختيار سيئ وأن القوة تكمن في شكل الحي؛ PBO يحدد عدد المرات التي يخسر فيها الفائز داخل العينة من خارج العينة؛ انكماش شارب الأسعار في عدد التجارب. لا يزال الاحتمال الهامشي هو هدف في العينة يتم تعظيمه - يعاقب عامل Occam سعة النموذج، وليس الاختيار على العديد من النوى المجهزة. إذا قمت بتركيب اثنتي عشرة نواة مرشحة واخترت واحدة ذات أفضل احتمالية هامشية، فإنك تعود إلى منطقة الاختبارات المتعددة وينطبق منطق الانكماش دون تغيير. النسخة القابلة للتزوير: هل ينتج عن اختيار الاحتمالية الهامشية فجوة أصغر داخل العينة/خارج العينة مقارنة باختيار مجموعة التحقق من الصحة على نفس البيانات ونفس عائلة النواة؟ وهذا قابل للقياس ولا يقاس أدناه.
سطح الاحتمال الهامشي له أيضًا أوبتيما محلي. تعد عمليات إعادة التشغيل العشوائية المتعددة أو التهيئة الدقيقة أمرًا مهمًا - تعد تهيئة مقياس الطول إلى المسافة الزوجية المتوسطة لمدخلات التدريب وتباين الضوضاء في تباين عينة الأهداف نقطة بداية معقولة.
التكلفة الحسابية وقابلية التوسع
عنق الزجاجة ينعكس ، الذي يكلف في الوقت و في الذاكرة. تمت مناقشة الجدار المكعب بالفعل في هذه المدونة من الاتجاه الآخر: طريقة البحث مقابل تكلفة التقييم تستبعد التحسين بايزي القائم على GP بشكل كامل عندما يكون الهدف رخيصًا، لأن تكلفة البديل أكثر من التقييمات التي يوفرها. الحساب هو نفسه هنا؛ التطبيق مختلف. وباعتباره نموذجًا ملائمًا لبيانات السوق، فإن المصطلح التكعيبي ليس استبعادًا للأهلية بل ميزانية: فهو يضع سقفًا صارمًا لنافذة التدريب.
استراتيجيات قابلية التوسع لتطبيقات التداول:
-
** نقاط GP متفرقة (تحفيز النقاط). ** استبدل مصفوفة مع مصفوفة حيث . النقاط التحريضية هي مدخلات زائفة تلخص بيانات التدريب. صياغة SVGP (Stochastic Variational GP) بواسطة Hensman et al. (2013) يسمح بتدريب دفعة صغيرة بتكلفة لكل التكرار. يدعم GPyTorch هذا محليًا.
-
** استيفاء النواة المنظم (SKI/KISS-GP).** يستغل بنية كرونيكر وتويبليتز في مصفوفة النواة عندما تقع المدخلات على الشبكة. يقلل التكلفة ل أين هو حجم الشبكة. مثالية للسلاسل الزمنية التي يتم أخذ عينات منها بانتظام (على سبيل المثال، أشرطة مدتها دقيقة واحدة).
-
** الأطباء العامون المحليون على النوافذ المنزلقة. ** تدريب الأطباء العامين المنفصلين على البيانات الحديثة فقط. هذا هو المكان الذي يعض فيه القيد الخاص بـ GP: النوى القياسية ثابتة ( يعتمد فقط على ) والأسواق ليست كذلك، وبالتالي فإن الإجابة المعتادة هي نافذة متدحرجة - ولكن طول النافذة محدد من الأعلى وليس فقط عن طريق الإحصائيات. التحسين المسبق يغطي النوافذ المثبتة مقابل النوافذ الدوارة، وأطوال التدريب/الاختبار، وتكرار إعادة التحسين بشكل عام؛ بالنسبة للطبيب العام، يعد تغيير حجم النافذة قرارًا حسابيًا بقدر ما هو قرار إحصائي، والنافذة الثابتة (المتنامية باستمرار) لا تتوفر ببساطة بعد بضعة آلاف من النقاط دون تقريب. إن إعادة الصياغة هذه هي النتيجة العملية: مع الأطباء العامين، لا يمكنك اختيار "استخدام التاريخ بأكمله".
الممارسات العامة للتنبؤ بالعودة: إطار عملي
تصميم الميزات: لماذا 5-20 ميزة، وليس 500
إن تصنيف السمات العامة لتعلم الآلة لبيانات السوق - عدم توازن دفتر الطلبات، وضغط الكتاب، وVPIN، وKyle's lambda، وميزات التقلب المحققة، وترميز الوقت الدوري، وإشارات الأصول المتقاطعة ومعدل التمويل - تم وضعه بالفعل في نمذجة الانتشار باستخدام التعلم الآلي؛ استخدم تلك القائمة.
ما هو خاص بـ GP هو حجم القائمة. تتحلل أساليب النواة في الأبعاد العالية: تتركز المسافات، وتفقد النواة الثابتة التمييز. النطاق العملي للطبيب العام المالي هو 5-20 مدخلاً، وليس المئات التي تأكلها الشجرة المعززة بالتدرج بسعادة. الآلية التي تجعل هذا الأمر قابلاً للبقاء هي ARD (تحديد الملاءمة التلقائي): امنح كل بُعد مُدخل مقياس الطول الخاص به ، ويدفع التدريب الاحتمالية الهامشية للأبعاد التي لا تحمل أي إشارة، حيث أن مقياس الطول اللانهائي يعني أن النواة تتجاهل هذا الإحداثي. يصبح اختيار الميزة نتيجة ثانوية للتركيب والتعلم يمكن قراءتها مباشرة كتصنيف للملاءمة - وهو أيضًا ما يجعلها قابلة للتزييف: ضع النواة المركبة على أشرطة حقيقية، واطبع مقاييس الطول، وانظر ما إذا كانت الميزات التي تؤمن بها هي تلك التي يحتفظ بها النموذج.
تحديد حجم الموقف والامتناع عن التصويت
يعطي GP الخلفي مباشرة، بحيث ينخفض مباشرة إلى حجم نسبة الحافة ومرشح عدم التجارة الذي تم تطويره في [التنبؤ المطابق لتحديد حجم المركز المدرك للمخاطر] (/ar/blog/post/conformal-prediction-trading)، مع عرض الفاصل الزمني . والفرق الوحيد هو المصدر: ينتج GP العرض من النموذج نفسه وليس من مجموعة المعايرة، لذلك فهو يختلف باختلاف مكان نقطة الاختبار بالنسبة لبيانات التدريب بدلاً من الكمية العالمية للبقايا السابقة.
التنفيذ باستخدام GPyTorch
GPyTorch هي مكتبة تعتمد على PyTorch لاستدلال GP قابل للتطوير. إنه يعزز تسريع GPU، والتمايز التلقائي، وتقنيات الجبر الخطي الحديثة (التدرجات المترافقة، وتحلل Lanczos) لتوسيع نطاق GP إلى ما هو أبعد من السذاجة حد.
GP الدقيق الأساسي للتنبؤ بالعودة
import torch
import gpytorch
import numpy as np
from torch.utils.data import TensorDataset, DataLoader
class ExactGPModel(gpytorch.models.ExactGP):
"""Exact GP with a composite kernel for financial returns."""
def __init__(self, train_x, train_y, likelihood):
super().__init__(train_x, train_y, likelihood)
self.mean_module = gpytorch.means.ZeroMean()
self.covar_matern = gpytorch.kernels.ScaleKernel(
gpytorch.kernels.MaternKernel(nu=1.5, ard_num_dims=train_x.shape[1])
)
self.covar_periodic = gpytorch.kernels.ScaleKernel(
gpytorch.kernels.PeriodicKernel()
)
self.covar_rbf_decay = gpytorch.kernels.ScaleKernel(
gpytorch.kernels.RBFKernel()
)
def forward(self, x):
mean = self.mean_module(x)
covar = self.covar_matern(x) + self.covar_periodic(x) * self.covar_rbf_decay(x)
return gpytorch.distributions.MultivariateNormal(mean, covar)
ard_num_dims هو ما يمكّن مقاييس الطول لكل بعد التي تمت مناقشتها أعلاه. بعد التدريب، model.covar_matern.base_kernel.lengthscale هو المتجه لقراءة.
حلقة التدريب
def train_gp(train_x, train_y, n_epochs=200, lr=0.05, device=None):
"""Train the GP by maximizing the marginal log-likelihood.
Returns the device alongside the model so that callers move test
tensors to the same place -- otherwise prediction crashes on GPU.
"""
if device is None:
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
train_x = train_x.to(device)
train_y = train_y.to(device)
likelihood = gpytorch.likelihoods.GaussianLikelihood().to(device)
model = ExactGPModel(train_x, train_y, likelihood).to(device)
model.train()
likelihood.train()
optimizer = torch.optim.Adam(model.parameters(), lr=lr)
mll = gpytorch.mlls.ExactMarginalLogLikelihood(likelihood, model)
losses = []
for epoch in range(n_epochs):
optimizer.zero_grad()
output = model(train_x)
loss = -mll(output, train_y)
loss.backward()
optimizer.step()
losses.append(loss.item())
if (epoch + 1) % 50 == 0:
noise = likelihood.noise.item()
print(
f"Epoch {epoch+1}/{n_epochs} | "
f"Loss: {loss.item():.4f} | "
f"Noise: {noise:.6f}"
)
return model, likelihood, device, losses
التنبؤ مع عدم اليقين
def predict_with_uncertainty(model, likelihood, test_x, device):
"""Generate predictions with uncertainty estimates."""
model.eval()
likelihood.eval()
test_x = test_x.to(device)
with torch.no_grad(), gpytorch.settings.fast_pred_var():
posterior = likelihood(model(test_x))
mean = posterior.mean
variance = posterior.variance
lower, upper = posterior.confidence_region() # 2-sigma bounds
return {
"mean": mean.cpu().numpy(),
"std": variance.sqrt().cpu().numpy(),
"lower_2sigma": lower.cpu().numpy(),
"upper_2sigma": upper.cpu().numpy(),
}
ال fast_pred_var() يستخدم مدير السياق خوارزمية LOVE (تقديرات التباين Lanczos) لحساب التباينات التنبؤية في الوقت بدلا من .
خط أنابيب التداول الشامل
ملاحظة حول أداة إنشاء الميزات أدناه: يجب أن تكون كل إحصائية متدرجة رجعية بشكل صارم، ويجب أن يتم تركيب توحيد الإدخال على شريحة التدريب فقط. هذه النقطة الثانية لا تتعلق بالنظافة العامة - فهي على وجه التحديد قناة تسرب التطبيع التي تم تحليلها وقياسها في تصنيف تحيز النظرة المستقبلية، والتي تشير إلى تضخم شارب الناتج عن كل نوع من أنواع التسرب. يقوم الطبيب العام بتوحيد مدخلاته من خلال البناء، لذلك فإن هذا هو التسرب الأكثر تعرضًا له.
import pandas as pd
def build_features(df: pd.DataFrame, lookback: int = 10) -> pd.DataFrame:
"""Build features for GP-based return prediction."""
features = pd.DataFrame(index=df.index)
for lag in range(1, lookback + 1):
features[f"ret_lag_{lag}"] = df["close"].pct_change().shift(lag)
ret = df["close"].pct_change()
features["vol_ratio"] = (
ret.rolling(10).std() / ret.rolling(50).std()
)
features["vol_zscore"] = (
(df["volume"] - df["volume"].rolling(50).mean())
/ df["volume"].rolling(50).std()
)
if "bid_vol" in df.columns and "ask_vol" in df.columns:
features["obi"] = (
(df["bid_vol"] - df["ask_vol"])
/ (df["bid_vol"] + df["ask_vol"])
)
if hasattr(df.index, "hour"):
hours = df.index.hour + df.index.minute / 60.0
features["time_sin"] = np.sin(2 * np.pi * hours / 24)
features["time_cos"] = np.cos(2 * np.pi * hours / 24)
features.dropna(inplace=True)
return features
def run_gp_strategy(
df: pd.DataFrame,
train_window: int = 500,
retrain_every: int = 50,
confidence_threshold: float = 1.0,
risk_fraction: float = 0.02,
max_leverage: float = 1.0,
):
"""Walk-forward GP trading strategy with uncertainty-based sizing."""
features = build_features(df)
returns = df["close"].pct_change().reindex(features.index)
target = returns.shift(-1) # predict next-bar return
mask = features.notna().all(axis=1) & target.notna()
features = features[mask]
target = target[mask]
positions = pd.Series(0.0, index=features.index)
predictions = pd.DataFrame(
index=features.index, columns=["mean", "std"], dtype=float
)
model = likelihood = device = None
x_mean = x_std = y_mean = y_std = None
for i in range(train_window, len(features)):
if model is None or (i - train_window) % retrain_every == 0:
train_x = torch.tensor(
features.iloc[i - train_window : i].values,
dtype=torch.float32,
)
train_y = torch.tensor(
target.iloc[i - train_window : i].values,
dtype=torch.float32,
)
x_mean, x_std = train_x.mean(0), train_x.std(0) + 1e-8
y_mean, y_std = train_y.mean(), train_y.std() + 1e-8
train_x_norm = (train_x - x_mean) / x_std
train_y_norm = (train_y - y_mean) / y_std
model, likelihood, device, _ = train_gp(
train_x_norm, train_y_norm, n_epochs=100
)
test_x = torch.tensor(
features.iloc[i : i + 1].values, dtype=torch.float32
)
test_x_norm = (test_x - x_mean) / x_std
pred = predict_with_uncertainty(model, likelihood, test_x_norm, device)
pred_mean = pred["mean"][0] * y_std.item() + y_mean.item()
pred_std = pred["std"][0] * y_std.item()
predictions.iloc[i] = [pred_mean, pred_std]
z_score = abs(pred_mean) / (pred_std + 1e-8)
if z_score > confidence_threshold:
size = min(z_score * risk_fraction, max_leverage)
positions.iloc[i] = np.sign(pred_mean) * size
strategy_returns = positions.shift(1) * returns
return strategy_returns, predictions, positions
التوسع في مجموعات بيانات أكبر باستخدام نقاط محددة متفرقة
عندما تتجاوز فترة التدريب بضعة آلاف من النقاط، يصبح استنتاج GP الدقيق بطيئًا. قم بالتبديل إلى GP المتفرق المتنوع:
class SparseGPModel(gpytorch.models.ApproximateGP):
"""Sparse variational GP for large-scale return prediction."""
def __init__(self, inducing_points):
variational_distribution = (
gpytorch.variational.CholeskyVariationalDistribution(
inducing_points.size(0)
)
)
variational_strategy = (
gpytorch.variational.VariationalStrategy(
self,
inducing_points,
variational_distribution,
learn_inducing_locations=True,
)
)
super().__init__(variational_strategy)
self.mean_module = gpytorch.means.ZeroMean()
self.covar_module = gpytorch.kernels.ScaleKernel(
gpytorch.kernels.MaternKernel(nu=1.5)
)
def forward(self, x):
mean = self.mean_module(x)
covar = self.covar_module(x)
return gpytorch.distributions.MultivariateNormal(mean, covar)
def train_sparse_gp(train_x, train_y, n_inducing=128, n_epochs=50, batch_size=256):
"""Train sparse GP with mini-batch stochastic variational inference."""
indices = torch.randperm(train_x.size(0))[:n_inducing]
inducing_points = train_x[indices]
model = SparseGPModel(inducing_points)
likelihood = gpytorch.likelihoods.GaussianLikelihood()
model.train()
likelihood.train()
optimizer = torch.optim.Adam(
[{"params": model.parameters()}, {"params": likelihood.parameters()}],
lr=0.01,
)
mll = gpytorch.mlls.VariationalELBO(
likelihood, model, num_data=train_y.size(0)
)
dataset = TensorDataset(train_x, train_y)
loader = DataLoader(dataset, batch_size=batch_size, shuffle=True)
for epoch in range(n_epochs):
for x_batch, y_batch in loader:
optimizer.zero_grad()
output = model(x_batch)
loss = -mll(output, y_batch)
loss.backward()
optimizer.step()
return model, likelihood
مع 128 نقطة تحفيزية، تكون تكلفة الدفعة الواحدة - ما يقرب من 4 ملايين عملية لكل دفعة. يتعامل هذا بسهولة مع مجموعات البيانات التي تضم أكثر من 100000 ملاحظة على وحدة معالجة رسومات واحدة.
التعلم العميق للنواة: GP يلتقي بالشبكات العصبية
عندما تكون مساحة الإدخال عالية الأبعاد أو تكون العلاقة بين الميزات والعائدات غير خطية إلى حد كبير، فقد تواجه النواة البسيطة صعوبات. يقوم التعلم العميق للنواة (DKL) بتمرير المدخلات عبر الشبكة العصبية قبل تطبيق نواة GP:
أين هي شبكة عصبية مع المعلمات و هي نواة قياسية (على سبيل المثال، Matern-3/2). تتعلم الشبكة تمثيل الميزات حيث تكون نواة GP أكثر فعالية. يتم تدريب النموذج بأكمله - معلمات الشبكة ومعلمات kernel الفائقة - من طرف إلى طرف من خلال تعظيم الاحتمالية الهامشية.
class DeepKernelGP(gpytorch.models.ExactGP):
"""GP with a neural network feature extractor."""
def __init__(self, train_x, train_y, likelihood, input_dim):
super().__init__(train_x, train_y, likelihood)
self.mean_module = gpytorch.means.ZeroMean()
self.feature_extractor = torch.nn.Sequential(
torch.nn.Linear(input_dim, 8),
torch.nn.ReLU(),
torch.nn.Linear(8, 4),
torch.nn.ReLU(),
torch.nn.Linear(4, 2),
)
self.covar_module = gpytorch.kernels.ScaleKernel(
gpytorch.kernels.MaternKernel(nu=1.5, ard_num_dims=2)
)
def forward(self, x):
features = self.feature_extractor(x)
mean = self.mean_module(features)
covar = self.covar_module(features)
return gpytorch.distributions.MultivariateNormal(mean, covar)
يجمع DKL بين التعلم التمثيلي للشبكات العصبية مع القياس الكمي لعدم اليقين لدى الأطباء العامين. تضمن طبقة GP أن تكون التنبؤات البعيدة عن بيانات التدريب ذات درجة عالية من عدم اليقين، وهو أمر من المعروف أن الشبكات العصبية القياسية تفشل في توفيره. لاحظ أيضًا أن DKL يعيد تقديم المرونة التي كان من المفترض أن تراقبها الاحتمالية الهامشية: يعاقب عامل Occam النواة، لكن الشبكة التي أمامها تحتوي على آلاف المعلمات الحرة ولا توجد مثل هذه العقوبة.
Ludkovski and Risk (2025)، نماذج العمليات الغوسية للتمويل الكمي، دراسة DKL في سياق أوسع للتمويل الكمي بما في ذلك تسعير الخيارات وتحسين المحفظة؛ هذه النتائج تخصهم بشأن مشاكلهم، وليست دليلاً على التنبؤ بعودة العملات المشفرة.
التشخيص والمزالق
المعايرة
يحتوي الطبيب العام الذي تمت معايرته جيدًا على فترات تنبؤية تتوافق مع التغطية التجريبية. الفحص هو نفسه المستخدم في التنبؤ المطابق - والذي يغطي أيضًا نظرية لماذا التغطية الهامشية ليست تغطية مشروطة، وهو قيد ينطبق على فترات GP بنفس القدر:
from scipy.stats import norm
def calibration_report(predictions, actuals):
"""Check if GP uncertainty is well-calibrated."""
z_scores = (actuals - predictions["mean"]) / (predictions["std"] + 1e-8)
for sigma in [1, 2, 3]:
expected_outside = 2 * (1 - norm.cdf(sigma))
actual_outside = (np.abs(z_scores) > sigma).mean()
print(
f"{sigma}-sigma | Expected outside: {expected_outside:.3f} | "
f"Actual outside: {actual_outside:.3f}"
)
التجاوز المتوقع هو 0.317 / 0.046 / 0.003 عند 1/2/3 سيجما. الرقم المهم هو ما يطبعه هذا على مسار حقيقي للأمام على أشرطة العملات المشفرة، وهذا الجدول ليس موجودًا في هذه المقالة بعد. التوقع السابق هو أن الشريك العام مفرط الثقة - الاحتمالية الغوسية للعوائد غير الثابتة يجب أن تكون سيئة عند 3 سيجما - ولكن "ينبغي" ليس قياسًا.
المزالق المتبقية
-
تحجيم الإدخال. ترتبط مقاييس الطول بمقياس الإدخال، لذلك تتراوح الميزة وتراوحت واحدة لا يمكن مشاركة ذات معنى ; ARD هو ما ينقذ النطاقات غير المتجانسة، والتوحيد هو ما يجعل تهيئة ARD معقولة.
-
تجاوز الاحتمال الهامشي. مع وجود العديد من معلمات النواة المفرطة (خاصة الحبات المركبة أو الخليط الطيفي)، لا يزال من الممكن أن يكون الاحتمال الهامشي مفرطًا. استخدم الأسبقية: سجل سابق عادي على مقاييس الطول المتمركزة عند المسافة الزوجية المتوسطة، ونصف عادي سابق على الفروق.
-
تكييف مصفوفة التغاير. يمكن أن تصبح مفردة عدديا عندما الضوضاء صغير جدًا أو عندما تكون نقاط التدريب مكررة تقريبًا. يضيف GPyTorch غضب إلى قطري. فالبيانات المالية سيئة التكييف غالبا ما تحتاج إلى المزيد.
-
تحيز النظر إلى المستقبل. تم تناوله أعلاه، وبتفاصيل محسوبة، في تصنيف تحيز النظر إلى المستقبل.
متى يجب استخدام الأجهزة العامة مقابل النماذج الأخرى
| المعيار | سباق الجائزة الكبرى | اكس جي بوست | الشبكة العصبية |
|---|---|---|---|
| عدم اليقين المدمج | نعم (بنيوية) | لا (يحتاج إلى امتثال/تمهيد) | لا (يحتاج إلى ترك MC/مجموعة) |
| كفاءة البيانات | ممتاز (<1000 عينة) | * | * |
| قابلية التوسع | الفقراء الدقيق، متفرق جيد | * | * |
| اللاخطية | تعتمد على النواة | * | * |
| التفسير | تحلل النواة + مقاييس طول ARD | * | * |
| غير ثابتة | يتطلب نافذة منزلقة أو DKL | * | * |
* بالنسبة لأعمدة XGBoost والشبكة العصبية، قم بالتأجيل إلى المقارنات المنشورة بدلاً من التأكيد الجديد هنا: نمذجة الانتشار باستخدام التعلم الآلي تحتوي على جدول التدرج التدرجي مقابل التعلم العميق للبيانات المالية المجدولة (عتبات حجم البيانات، وقابلية التفسير، وتكيف النظام، وزمن الوصول)، والدمج الزمني المحولات لديها TFT مقابل LSTM مقابل Vanilla Transformer.
** استخدم الأطباء العامين عندما: **
- لديك مجموعات بيانات صغيرة إلى متوسطة (أقل من 10000 ملاحظة لكل نافذة تدريب)
- تريد فرضية هيكلية واضحة وقابلة للفحص حول الإشارة (الاتجاه + الموسمية + الضوضاء)
- يجب أن يختلف عدم اليقين مع المسافة من بيانات التدريب، وليس فقط مع الكمية المتبقية العالمية
لا تستخدم الأطباء العامين عندما:
- أنت بحاجة إلى استنتاج أقل من المللي ثانية على ملايين الملاحظات
- أبعاد الإدخال تتجاوز ~50
- تعيش الإشارة في تفاعلات ميزات معقدة عالية الترتيب لا تستطيع النواة الثابتة تمثيلها (يساعد DKL، على حساب خاصية Occam)
ما لم تقيسه هذه المقالة بعد
كل ما سبق هو آلات نموذجية. لا يعد أي من ذلك دليلاً على أن أحد الممارسين العامين يكسب المال من العملات المشفرة، ومعيار هذه المدونة هو أن المقالة تحمل أرقامًا خاصة بها. العناصر المفتوحة، بالترتيب الذي يجب تشغيلها به:
- ** مقاييس طول ARD على قضبان BTCUSDT الحقيقية التي يبلغ طولها 1 م. ** قم بتركيب النواة المركبة والطباعة لكل ميزة. يؤدي هذا إلى اختبار مباشر لمطالبة "اختيار الميزات المضمنة في ARD" وينتج تصنيفًا غير قابل للتزوير فيما يتعلق بملاءمة الميزات.
- جدول المعايرة من التشغيل المسبق. التجاوز المتوقع مقابل التجاوز التجريبي عند 1/2/3 سيجما، مذكور بوضوح، بما في ذلك الحالة التي يتبين فيها أن GP لديه ثقة زائدة.
- **استراتيجية بوابة الثقة، المضي قدمًا، على نفس التخصصات الخمسة مثل السلبية الصادقة، تم تقليصها لعدد التجارب. ** إذا فشلت، فسيتم إدراجها في تلك السلسلة كنتيجة سلبية أخرى.
- ** ساعة الحائط منحنى ** ل ، بالضبط مقابل SVGP، لذلك يرتكز قسم قابلية التوسع على مخطط بدلاً من التأكيد.
الخلاصة
إن حالة العمليات الغوسية في التداول ليست "إنها تعطيك أشرطة خطأ" - فالتنبؤ المطابق يمنحك أشرطة خطأ مع افتراضات توزيعية أقل وضمان تغطية لا يمتلكه الممارس العام. الحالة هي أن الممارس العام يجعلك تكتب فرضيتك الهيكلية كنواة، ويلائمها مع هدف يسعره بتعقيده الخاص، ثم يخبرك عن ميزاتك التي استخدمها بالفعل عبر مقاييس طول ARD. وهذا نموذج واضح بشكل غير عادي.
التكاليف ملموسة بنفس القدر: القياس المكعب الذي يغطي نافذة التدريب الخاصة بك، وافتراضات الثبات التي مفادها أن النافذة المتدحرجة لا يتم إصلاحها إلا جزئيًا، واحتمال غاوسي بأن العوائد الكبيرة سوف تنتهك، و- بمجرد الوصول إلى التعلم العميق للنواة - الخسارة الهادئة لخاصية أوكام ذاتها التي حفزت الاحتمالية الهامشية في المقام الأول. وما إذا كان ما تبقى قابلاً للتداول هو سؤال تجريبي، والقياسات الأربعة المذكورة أعلاه هي التي سوف تجيب عليه.
المراجع
- راسموسن، سي. إي.، وويليامز، سي. كيه. آي. (2006). العمليات الغوسية للتعلم الآلي. مطبعة معهد ماساتشوستس للتكنولوجيا.
- ويلسون، أ.، وآدامز، ر. (2013). حبات عملية غاوسية لاكتشاف الأنماط واستقراءها. آي سي إم إل.
- هينسمان، جيه، فوسي، إن، ولورنس، إن دي (2013). العمليات الغوسية للبيانات الضخمة. UAI.
- جاثرال، جي.، جيسون، تي، وروزنباوم، م. (2018). التقلبات قاسية. التمويل الكمي، 18(6).
- ريزفي، S. A. A.، روبرتس، S. J.، أوزبورن، M. A.، وNyikosa، F. (2017). نهج جديد للتنبؤ بالتقلبات المالية باستخدام مظاريف عملية غاوسية. * أرخايف:1705.00891*.
- لودكوفسكي، م.، وريسك، ج. (2025). نماذج العمليات الغوسية للتمويل الكمي. سبرينغر.
- جاردنر، جي آر، بليس، جي، بيندل، دي، واينبرجر، كيه كيو، وويلسون، إيه جي (2018). GPyTorch: استنتاج عملية Blackbox Matrix-Matrix Gaussian مع تسريع GPU. نيوريبس.
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.