Quintuitive.
وجهات نظر بديهية كميا على الأسواق.
التداول مع سفمز: الأداء.
للحصول على شعور أداء سفم في التداول، وأنا تشغيل مختلف الاجهزة على S & # 038؛ P 500 البيانات التاريخية من & # 8230؛ 50s. وكان الحافز الرئيسي وراء استخدام هذا العقد هو تحديد ما هي المعلمات لتختلف وما تبقى ثابتة قبل تشغيل أهم الاختبارات. التعامل معها على أنها & # 8220؛ في العينة & # 8221؛ اختبار لتجنب (مزيد؛)) الإفراط في تركيب. أولا مخطط الأداء:
S & # 038؛ P 500 أداء التداول.
لطيف جدا! استخدام 5 عائدات اليومية تخلفت يظهر أداء مماثل لاستراتيجية أرما + غارتش، التي وجدت واعدة جدا. إذا كنت أتساءل لماذا أنا متحمس جدا حول هذه الحقيقة، انها & # 8217؛ s لأن هنا نحن في المنطقة حيث أرما + غارتش هو الأفضل، ومع ذلك، سفمز تظهر أداء مقارنة.
والإحصاءات مثيرة للإعجاب أيضا:
أثناء كتابة هذا المنصب، وجدت جهدا آخر لاستخدام سفمز في التداول من قبل الممول الكم. يستخدم نهجه مؤشر القوة النسبية من طول مختلف كإدخال إلى سفم، ولكنه يستخدم أيضا تصنيف (خرائط العودة إلى قيمتين، قصيرة أو طويلة) بدلا من الانحدار. منذ كنت تخطط لمحاولة تصنيف على أي حال، منصبه ألهمني لتنفيذ ذلك وإجراء مقارنة إضافية، الانحدار مقابل التصنيف:
S & # 038؛ P 500 سفم ترادينغ & # 8211؛ الانحدار مقابل التصنيف.
ماذا يمكنني أن أقول & # 8211؛ كلاهما يبدو أن تعمل تماما. وكقارئ مقترح في التعليقات، فإن التصنيف يظهر عوائد أكثر اتساقا.
وبالنظر إلى الجدول، خفض تصنيف في نصف الحد الأقصى للسحب، ولكن من المثير للاهتمام، فإنه لم يحسن نسبة شارب بشكل كبير. لا شيء حاسمة هنا على الرغم من، كان سريعا من أسرع (من حيث وقت التشغيل) استراتيجيات.
لا تزال هناك قائمة طويلة من الموضوعات لاستكشاف، فقط لتعطيك فكرة، في أي ترتيب معين:
إضافة ميزات أخرى. في معظم الأحيان التفكير في إضافة بعض سلسلة ذات الصلة بنك الاحتياطي الفيدرالي، وهذه البيانات يعود إلى عام 1960، لذلك سوف تأتي قريبا :) :) محاولة المعلمات سفم الأخرى: الانحدارات الأخرى، والتصنيفات الأخرى، كيرنلس أخرى، وما إلى ذلك هذا هو أشبه الاستقرار اختبار. حاول وظائف خطأ أخرى. الافتراضي هو استخدام متوسط خطأ مربع، ولكن في حالة الانحدار، لماذا لا تستخدم نسبة شارب (في عينة)؟ حالة الانحدار هي أبسط، لأن لدينا العوائد الفعلية & # 8211؛ تحقق من إدخال tune. control. جرب فترات أطول بدلا من أيام. أسبوعيا هو بداية، ولكن من الناحية المثالية أنا & # 8217؛ د ترغب في تنفيذ فترتين أو ثلاثة أيام. تختلف فترة الاسترداد. استخدام المزيد من الفئات مع التصنيف: أيام كبيرة، أيام متوسطة، إلخ.
وهذا سيستغرق وقتا. كما هو الحال دائما، وردود الفعل والتعليقات هي موضع ترحيب.
1) هل لديك نسب شارب ل سفم الانحدار مقابل تصنيف سفم؟ من خلال إيبالينغ الرسم البياني، ويبدو أن تصنيف يعطي عائدات تعديل المخاطر بشكل أفضل.
2) هل سمعت عن حزمة كاريت (caret. r-forge. r-بروجيكت / index. html)؟ يبدو أنه قد أدرج بالفعل الكثير من العمل أراك تستخدم في التعليمات البرمجية الموجودة لديك. فائدة كبيرة أخرى هي أنه يمكنك بسهولة مب مل تعلم ألغو (على سبيل المثال الشبكات العصبية) دون الحاجة إلى ترميز كل شيء.
مدونة مثيرة جدا للاهتمام!
1) نقطة جيدة، فإنه خفض الانسحاب، ولكن ليس نسبة شارب بشكل ملحوظ & # 8211؛ لقد قمت بتحديث المشاركة.
2) شكرا لترحيب حزمة كاريت، وهذه هي المرة الثانية أسمع عن ذلك، وذلك عن الوقت لإلقاء نظرة فاحصة. :) تبدو واعدة جدا، وبالتأكيد الكثير للتعلم منه.
هل تشارك شفرتك؟ النتائج مثيرة للإعجاب حقا. أنا & # 8217؛ م تحاول بناء سفم المصنف تفعل شيئا مماثلا، ولكن أريد استخدام المزيد من المعلمات من التسعير. على الرغم من أنه ربما لا يكون مفيدا، لأنه يبدو أن الأسعار وحدها توفر قيمة تنبؤية. شكر.
أنا أيضا تخطط لاستخدام أكثر من مجرد الأسعار، ولكن هذا النوع من البيانات غير متوفر لل 50 s. بشكل عام، 50s على S & # 038؛ P 500 تنبؤية تماما. ومن المرجح أن تكون هناك حاجة إلى نماذج أكثر تعقيدا فصاعدا.
تحقق من المشاركة السابقة (كينتيتيف / 2018/11/30 / ترادينغ-ويث-سوبورت-فيكتور-ماشينس-سفم /) في السلسلة & # 8211؛ هناك رابط إلى التعليمات البرمجية التي استخدمتها على أساس حزمة e1071. منذ أن نشرت الرمز، انتقلت إلى حزمة كاريت الذي يعطي واجهة موحدة لكثير من النماذج. تبدو جيدة جدا حتى الآن.
يبدو جيدا، وذلك بفضل لتقاسم. أتمنى لك كل خير.
أنا أيضا في محاولة لاستخدام سفم-سفر للتنبؤ سعر وثيق للأسهم i. e: قيمة المؤشر كما CAC40 دج الخ ..
فكرتي هي أبسط وسهلة، وأنا تحميل البيانات على موقع وسيط، لقد حصلت على الوصول إلى 3 سنوات من البيانات أطروحات. الاستجابة هي قيمة وثيقة للمؤشر، افترض أن ملامح اليوم السابق يكون لها تأثير على قيمة قريبة من الأيام القادمة أي: أعلى قيمة أصغر قيمة افتتاح قيمة لعيد هي ملامح للتنبؤ، لشرح القيمة الختامية من الثلاثاء، أنا بناء مجموعة البيانات الخاصة بي مع هذه الافتراضات، لذلك يمكنني استخدام ميزة مع lag1، ومن الواضح أنني يمكن أن تضيف الآخرين ميزة مثل lag2، lag3. أضع عينة من بنية البيانات الخاصة بي هنا:
openlag1 higherlag1 smallestlag1 إغلاق (استجابة) حجم lag1.
3950.59 3959.2 3936.33 4013.97 589818.
وأخيرا لدي 764 مجموعة البيانات، كل مجموعة البيانات أنا تستخدم لتدريب سفر، وأتوقع في الأيام القادمة كما ذكرنا أعلاه.
أسئلتي هي كيف يمكنني التنبؤ على سبيل المثال 5 أيام القادمة؟ هل بنية بياناتي صحيحة؟
غير سعيد مع توقعات المتداول في سفمكومبوتيفوريكاستس؟ اطلع على ما يفعله ل موديلبيريود = & # 8217؛ ويكس & # 8217؛ على سبيل المثال.
والبديل هو أن تفعل التوقعات الأسبوعية الحق مقدما. وبعبارة أخرى، تلخيص البيانات إلى أسابيع (أو ثلاثة / أربعة أيام قطع)، و استدعاء سفمكومبوتيفوريكاستس باستخدام & # 8216؛ أيام & # 8217؛ على هذه المجموعة. وينطبق كل تنبؤ على كامل الفترة.
بقدر ما أعرف، لا يمكن للمرء أن يفعل فقط التنبؤ الاحتمالية قبل خمسة أيام مع سفمز (وهذا هو قابل للتنفيذ مع تقنيات أرما).
أتمنى أن يساعدك هذا،
أنا & # 8217؛ كنت تتمتع مشاركاتك ويكون لديك سؤال. كنت أتساءل ما هو نوع من التحسن الذي وجدته عند الانتقال من نموذج أرما بسيط لنموذج أرما-غارتش؟ هل اختبرت أي غيرها من المعلمات المتداول نافذة التدحرج؟ أيضا هل وجدت أن الجانب القصير جعل الكثير من الفرق (أي أنها كبيرة / أفضل أو أسوأ) من فترة طويلة فقط؟
مرحبا، تناولت بعض هذه الأسئلة في وظيفة لاحقة: كينتيتيف / 2018/12/27 / أرماغارتش-إكسيرينسس /. إضافة المزيد من الإحصاءات إلى أرما + غارتش البرنامج التعليمي هو بالتأكيد على قائمتي، ولكن الامر سيستغرق وقتا. يمكن للمرء أن يفعل كل هذه التحليلات باستخدام المؤشر (كينتيتيف / وب-كونتنت / أوبلوادس / 2018/08 / gspcInd3.csv) مع غسيك من ياهو. تم محاذاة المؤشر بالفعل & # 8211؛ لا حاجة لتأخر.
مبهر جدا. ولكن هل حاولت استخدام الغابات العشوائية & # 8211؛
فإنه يدعي أن تكون متفوقة على سفم لأنها تسمح للآثار غير الخطية الضمنية وشروط التفاعل بين المتغيرات الخارجية. كما أنه يذوب أسفل المتغير خارجي لأهم صانعي اللعب وسريعة نوعا ما وكذلك خاصة مع مجموعة البيانات الخاصة بك.
مرحبا وشكرا على الرد السابق. شيء واحد أنا & # 8217؛ ما قليلا الخلط حول هو أنه على أرما + غارتش آخر (كينتيتيف / 2018/08/22 / أرما-موديلز-فور-ترادينغ /) أن أذكر 18.87٪ معدل نمو سنوي مركب و B & أمب؛ H يبدو أن يكون حوالي 7 ٪ معدل نمو سنوي مركب من إيبالينغ المخطط. ومع ذلك، في الجدول أعلاه تظهر لك، 30.88٪ و 15.4٪ ل أرما + غارتش و ب، على التوالي.
هل هو إطار زمني مختلف أم أنا في عداد المفقودين شيئا؟ شكرًا لك مرة أخرى.
أرى & # 8230؛ انها ليست سوى عينة 5 سنوات هنا. لم أتمكن من حذف التعليق. هل لديك معدل نمو سنوي مركب لجميع الأنظمة عبر جميع السنوات؟
Quintuitive.
وجهات نظر بديهية كميا على الأسواق.
التداول مع سفمز: الأداء.
للحصول على شعور أداء سفم في التداول، وأنا تشغيل مختلف الاجهزة على S & # 038؛ P 500 البيانات التاريخية من & # 8230؛ 50s. وكان الحافز الرئيسي وراء استخدام هذا العقد هو تحديد ما هي المعلمات لتختلف وما تبقى ثابتة قبل تشغيل أهم الاختبارات. التعامل معها على أنها & # 8220؛ في العينة & # 8221؛ اختبار لتجنب (مزيد؛)) الإفراط في تركيب. أولا مخطط الأداء:
S & # 038؛ P 500 أداء التداول.
لطيف جدا! استخدام 5 عائدات اليومية تخلفت يظهر أداء مماثل لاستراتيجية أرما + غارتش، التي وجدت واعدة جدا. إذا كنت أتساءل لماذا أنا متحمس جدا حول هذه الحقيقة، انها & # 8217؛ s لأن هنا نحن في المنطقة حيث أرما + غارتش هو الأفضل، ومع ذلك، سفمز تظهر أداء مقارنة.
والإحصاءات مثيرة للإعجاب أيضا:
أثناء كتابة هذا المنصب، وجدت جهدا آخر لاستخدام سفمز في التداول من قبل الممول الكم. يستخدم نهجه مؤشر القوة النسبية من طول مختلف كإدخال إلى سفم، ولكنه يستخدم أيضا تصنيف (خرائط العودة إلى قيمتين، قصيرة أو طويلة) بدلا من الانحدار. منذ كنت تخطط لمحاولة تصنيف على أي حال، منصبه ألهمني لتنفيذ ذلك وإجراء مقارنة إضافية، الانحدار مقابل التصنيف:
S & # 038؛ P 500 سفم ترادينغ & # 8211؛ الانحدار مقابل التصنيف.
ماذا يمكنني أن أقول & # 8211؛ كلاهما يبدو أن تعمل تماما. وكقارئ مقترح في التعليقات، فإن التصنيف يظهر عوائد أكثر اتساقا.
وبالنظر إلى الجدول، خفض تصنيف في نصف الحد الأقصى للسحب، ولكن من المثير للاهتمام، فإنه لم يحسن نسبة شارب بشكل كبير. لا شيء حاسمة هنا على الرغم من، كان سريعا من أسرع (من حيث وقت التشغيل) استراتيجيات.
لا تزال هناك قائمة طويلة من الموضوعات لاستكشاف، فقط لتعطيك فكرة، في أي ترتيب معين:
إضافة ميزات أخرى. في معظم الأحيان التفكير في إضافة بعض سلسلة ذات الصلة بنك الاحتياطي الفيدرالي، وهذه البيانات يعود إلى عام 1960، لذلك سوف تأتي قريبا :) :) محاولة المعلمات سفم الأخرى: الانحدارات الأخرى، والتصنيفات الأخرى، كيرنلس أخرى، وما إلى ذلك هذا هو أشبه الاستقرار اختبار. حاول وظائف خطأ أخرى. الافتراضي هو استخدام متوسط خطأ مربع، ولكن في حالة الانحدار، لماذا لا تستخدم نسبة شارب (في عينة)؟ حالة الانحدار هي أبسط، لأن لدينا العوائد الفعلية & # 8211؛ تحقق من إدخال tune. control. جرب فترات أطول بدلا من أيام. أسبوعيا هو بداية، ولكن من الناحية المثالية أنا & # 8217؛ د ترغب في تنفيذ فترتين أو ثلاثة أيام. تختلف فترة الاسترداد. استخدام المزيد من الفئات مع التصنيف: أيام كبيرة، أيام متوسطة، إلخ.
وهذا سيستغرق وقتا. كما هو الحال دائما، وردود الفعل والتعليقات هي موضع ترحيب.
1) هل لديك نسب شارب ل سفم الانحدار مقابل تصنيف سفم؟ من خلال إيبالينغ الرسم البياني، ويبدو أن تصنيف يعطي عائدات تعديل المخاطر بشكل أفضل.
2) هل سمعت عن حزمة كاريت (caret. r-forge. r-بروجيكت / index. html)؟ يبدو أنه قد أدرج بالفعل الكثير من العمل أراك تستخدم في التعليمات البرمجية الموجودة لديك. فائدة كبيرة أخرى هي أنه يمكنك بسهولة مب مل تعلم ألغو (على سبيل المثال الشبكات العصبية) دون الحاجة إلى ترميز كل شيء.
مدونة مثيرة جدا للاهتمام!
1) نقطة جيدة، فإنه خفض الانسحاب، ولكن ليس نسبة شارب بشكل ملحوظ & # 8211؛ لقد قمت بتحديث المشاركة.
2) شكرا لترحيب حزمة كاريت، وهذه هي المرة الثانية أسمع عن ذلك، وذلك عن الوقت لإلقاء نظرة فاحصة. :) تبدو واعدة جدا، وبالتأكيد الكثير للتعلم منه.
هل تشارك شفرتك؟ النتائج مثيرة للإعجاب حقا. أنا & # 8217؛ م تحاول بناء سفم المصنف تفعل شيئا مماثلا، ولكن أريد استخدام المزيد من المعلمات من التسعير. على الرغم من أنه ربما لا يكون مفيدا، لأنه يبدو أن الأسعار وحدها توفر قيمة تنبؤية. شكر.
أنا أيضا تخطط لاستخدام أكثر من مجرد أسعار، ولكن هذا النوع من البيانات غير متوفر لل 50 s. بشكل عام، 50s على S & # 038؛ P 500 تنبؤية تماما. ومن المرجح أن تكون هناك حاجة إلى نماذج أكثر تعقيدا فصاعدا.
تحقق من المشاركة السابقة (كينتيتيف / 2018/11/30 / ترادينغ-ويث-سوبورت-فيكتور-ماشينس-سفم /) في السلسلة & # 8211؛ هناك رابط إلى التعليمات البرمجية التي استخدمتها على أساس حزمة e1071. منذ أن نشرت الرمز، انتقلت إلى حزمة كاريت الذي يعطي واجهة موحدة لكثير من النماذج. تبدو جيدة جدا حتى الآن.
يبدو جيدا، وذلك بفضل لتقاسم. أتمنى لك كل خير.
أنا أيضا في محاولة لاستخدام سفم-سفر للتنبؤ سعر وثيق للأسهم i. e: قيمة المؤشر كما CAC40 دج الخ ..
فكرتي هي أبسط وسهلة، وأنا تحميل البيانات على موقع وسيط، لقد حصلت على الوصول إلى 3 سنوات من البيانات أطروحات. الاستجابة هي قيمة وثيقة للمؤشر، افترض أن ملامح اليوم السابق يكون لها تأثير على قيمة قريبة من الأيام القادمة أي: أعلى قيمة أصغر قيمة افتتاح قيمة لعيد هي ملامح للتنبؤ، لشرح القيمة الختامية من الثلاثاء، أنا بناء مجموعة البيانات الخاصة بي مع هذه الافتراضات، لذلك يمكنني استخدام ميزة مع lag1، ومن الواضح أنني يمكن أن تضيف الآخرين ميزة مثل lag2، lag3. أضع عينة من بنية البيانات الخاصة بي هنا:
openlag1 higherlag1 smallestlag1 إغلاق (استجابة) حجم lag1.
3950.59 3959.2 3936.33 4013.97 589818.
وأخيرا لدي 764 مجموعة البيانات، كل مجموعة البيانات أنا تستخدم لتدريب سفر، وأتوقع في الأيام القادمة كما ذكرنا أعلاه.
أسئلتي هي كيف يمكنني التنبؤ على سبيل المثال 5 أيام القادمة؟ هل بنية بياناتي صحيحة؟
غير سعيد مع توقعات المتداول في سفمكومبوتيفوريكاستس؟ اطلع على ما يفعله ل موديلبيريود = & # 8217؛ ويكس & # 8217؛ على سبيل المثال.
والبديل هو أن تفعل التوقعات الأسبوعية الحق مقدما. وبعبارة أخرى، تلخيص البيانات إلى أسابيع (أو ثلاثة / أربعة أيام قطع)، و استدعاء سفمكومبوتيفوريكاستس باستخدام & # 8216؛ أيام & # 8217؛ على هذه المجموعة. وينطبق كل تنبؤ على كامل الفترة.
بقدر ما أعرف، لا يمكن للمرء أن يفعل فقط التنبؤ الاحتمالية قبل خمسة أيام مع سفمز (وهذا هو قابل للتنفيذ مع تقنيات أرما).
أتمنى أن يساعدك هذا،
أنا & # 8217؛ كنت تتمتع مشاركاتك ويكون لديك سؤال. كنت أتساءل ما هو نوع من التحسن الذي وجدته عند الانتقال من نموذج أرما بسيط لنموذج أرما-غارتش؟ هل اختبرت أي غيرها من المعلمات المتداول نافذة التدحرج؟ أيضا هل وجدت أن الجانب القصير جعل الكثير من الفرق (أي أنها كبيرة / أفضل أو أسوأ) من فترة طويلة فقط؟
مرحبا، تناولت بعض هذه الأسئلة في وظيفة لاحقة: كينتيتيف / 2018/12/27 / أرماغارتش-إكسيرينسس /. إضافة المزيد من الإحصاءات إلى أرما + غارتش البرنامج التعليمي هو بالتأكيد على قائمتي، ولكن الامر سيستغرق وقتا. يمكن للمرء أن يفعل كل هذه التحليلات باستخدام المؤشر (كينتيتيف / وب-كونتنت / أوبلوادس / 2018/08 / gspcInd3.csv) مع غسيك من ياهو. تم محاذاة المؤشر بالفعل & # 8211؛ لا حاجة لتأخر.
مبهر جدا. ولكن هل حاولت استخدام الغابات العشوائية & # 8211؛
فإنه يدعي أن تكون متفوقة على سفم لأنها تسمح للآثار غير الخطية الضمنية وشروط التفاعل بين المتغيرات الخارجية. كما أنه يذوب أسفل المتغير خارجي لأهم صانعي اللعب وسريعة نوعا ما وكذلك خاصة مع مجموعة البيانات الخاصة بك.
مرحبا وشكرا على الرد السابق. شيء واحد أنا & # 8217؛ ما قليلا الخلط حول هو أن على أرما + غارتش آخر (كينتيتيف / 2018/08/22 / أرما-موديلز فور ترادينغ /) أذكر 18.87٪ معدل نمو سنوي مركب و B & أمب؛ H يبدو أن يكون حوالي 7 ٪ معدل نمو سنوي مركب من إيبالينغ المخطط. ومع ذلك، في الجدول أعلاه تظهر لك، 30.88٪ و 15.4٪ ل أرما + غارتش و ب، على التوالي.
هل هو إطار زمني مختلف أم أنا في عداد المفقودين شيئا؟ شكرًا لك مرة أخرى.
أرى & # 8230؛ انها ليست سوى عينة 5 سنوات هنا. لم أتمكن من حذف التعليق. هل لديك معدل نمو سنوي مركب لجميع الأنظمة عبر جميع السنوات؟
تعلم الآلة: كيف يمكن دعم آلات المتجهات يمكن استخدامها في التداول.
ما هي آلة دعم ناقلات؟
جهاز ناقل الدعم هو وسيلة للتعلم الآلي الذي يحاول أخذ بيانات المدخلات وتصنيفها في واحدة من فئتين. ولكي تكون آلة ناقل الدعم فعالة، من الضروري استخدام مجموعة من بيانات المدخلات والمخرجات التدريبية لبناء نموذج جهاز ناقل الحركة الذي يمكن استخدامه لتصنيف البيانات الجديدة.
وتطور آلة ناقلات الدعم هذا النموذج من خلال أخذ مدخلات التدريب، ورسم الخرائط في حيز متعدد الأبعاد، ثم استخدام الانحدار للعثور على مفرط (وهي عبارة عن سطح في مساحة ن الأبعاد، تفصل بين الفضاءين إلى نصف المسافات) التي تفصل أفضل والفئتين من المدخلات. مرة واحدة وقد تم تدريب آلة ناقلات الدعم، وأنها قادرة على تقييم المدخلات الجديدة فيما يتعلق مفرطة فصل وتصنيفها في واحدة من الفئتين.
آلة ناقل الدعم هي في الأساس آلة الإدخال / الإخراج. يمكن للمستخدم أن يضع في المدخلات، واستنادا إلى نموذج وضعت من خلال التدريب، فإنه سيعود الناتج. عدد المدخلات لأي جهاز ناقل دعم معين يتراوح نظريا من واحد إلى ما لا نهاية، ولكن من الناحية العملية قوة الحوسبة لا تحد من عدد المدخلات يمكن استخدامها. على سبيل المثال، يتم استخدام المدخلات N لجهاز متجه دعم معين (القيمة الصحيحة لل N يمكن أن تتراوح من واحد إلى ما لا نهاية)، يجب على جهاز ناقل الدعم تعيين كل مجموعة من المدخلات في الفضاء N الأبعاد، والعثور على (N-1 ) - dimensional هيبيربلان أن أفضل يفصل البيانات التدريب.
الشكل 1. دعم آلات المتجهات هي آلات الإدخال / الإخراج.
أفضل طريقة لتصور كيف تعمل آلة دعم ناقلات هو النظر في حالة ثنائية الأبعاد. نفترض أننا نريد إنشاء جهاز ناقل الدعم الذي يحتوي على اثنين من المدخلات ويعود إخراج واحد الذي يصنف نقطة البيانات كما تنتمي إلى واحدة من فئتين. يمكننا تصور هذا عن طريق التآمر على الرسم البياني 2-الأبعاد مثل الرسم البياني أدناه.
الشكل 2. اليسار: دعم ناقلات آلة ناقلات تعيينها إلى الرسم البياني 2D. وتستخدم الدوائر الحمراء والصلبان الزرقاء للدلالة على فئتي المدخلات.
الشكل 3. الحق: دعم المدخلات آلة ناقلات تعيينها إلى الرسم البياني 2D. وتستخدم الدوائر الحمراء والصلبان الزرقاء للدلالة على فئتين من المدخلات مع خط أسود يشير إلى فصل مفرط.
في هذا المثال، تشير المعابر الزرقاء إلى نقاط البيانات التي تنتمي إلى الفئة 1 والدوائر الحمراء التي تمثل نقاط البيانات التي تنتمي إلى الفئة 2. كل نقطة من نقاط البيانات الفردية لها قيمة مدخلات فريدة من نوعها 1 (ممثلة بموقفها على المحور س ) وقيمة إدخال 2 فريدة (ممثلة بموقفها على المحور الصادي) وقد تم تعيين كل هذه النقاط إلى الفضاء ثنائي الأبعاد.
آلة ناقلات الدعم قادرة على تصنيف البيانات عن طريق إنشاء نموذج من هذه النقاط في 2 الفضاء الأبعاد. آلة ناقلات الدعم مراقبة البيانات في الفضاء 2 الأبعاد، ويستخدم خوارزمية الانحدار للعثور على 1 هيبيربلان الأبعاد (ويعرف أيضا باسم الخط) التي تفصل أكثر دقة البيانات إلى فئتين. ثم يتم استخدام خط الفصل هذا بواسطة جهاز ناقل الدعم لتصنيف نقاط البيانات الجديدة إلى الفئة 1 أو الفئة 2.
الرسوم المتحركة أدناه توضح عملية تدريب جهاز ناقل دعم جديد. سوف تبدأ الخوارزمية عن طريق جعل تخمين عشوائي العثور على لوحة مفرغة فصل، ثم بشكل متكرر تحسين دقة لوحة مفرغة. كما ترون الخوارزمية تبدأ بقوة جدا، ولكن بعد ذلك يبطئ كما يبدأ في الاقتراب من الحل رغبات.
الشكل 4. الرسوم المتحركة تظهر تدريب جهاز ناقل الدعم. وتتقارب الطفرة تدريجيا مع الهندسة المثالية لفصل فئتي البيانات.
السيناريو ثنائي الأبعاد أعلاه المقدمة يسمح لنا لتصور عملية آلة ناقلات الدعم، ومع ذلك فإنه هو فقط قادرة على تصنيف نقطة بيانات باستخدام اثنين من المدخلات. ماذا لو أردنا استخدام المزيد من المدخلات؟ الحمد لله، خوارزمية آلة ناقلات الدعم يسمح لنا أن نفعل الشيء نفسه في أبعاد أعلى، على الرغم من أنه يصبح من الصعب بكثير لتصور.
النظر في هذا، كنت ترغب في إنشاء دعم ناقلات الجهاز الذي يأخذ 20 المدخلات ويمكن تصنيف أي نقطة البيانات باستخدام هذه المدخلات في أي فئة 1 أو الفئة 2. من أجل القيام بذلك، تحتاج آلة ناقلات الدعم لنموذج البيانات في 20 الفضاء الأبعاد واستخدام خوارزمية الانحدار للعثور على 19 هيبيربلان الأبعاد التي تفصل نقاط البيانات إلى فئتين. هذا يصعب من الصعب تصور كما أنه من الصعب بالنسبة لنا أن نفهم أي شيء فوق 3 أبعاد، ولكن كل ما تحتاج إلى معرفته هو أن يعمل بنفس الطريقة تماما كما يفعل لحالة 2 الأبعاد.
كيف "دعم ناقلات آلات العمل"؟ مثال: هل هو سنيك؟
تخيل هذا السيناريو الافتراضي، كنت باحثا التحقيق في حيوان نادر فقط وجدت في أعماق القطب الشمالي دعا شنيكس. وبالنظر إلى بعد هذه الحيوانات، لم يتم العثور سوى حفنة صغيرة من أي وقت مضى (دعونا نقول حوالي 5000). كباحث، كنت عالقة مع هذا السؤال. كيف يمكنني تحديد سنيك؟
كل ما لديك تحت تصرفكم هي الأبحاث التي نشرت سابقا من قبل حفنة من الباحثين التي شهدت واحدة. في هذه الأبحاث، يصف المؤلفون خصائص معينة عن سنيكس وجدوا، أي الارتفاع والوزن وعدد الساقين، وما إلى ذلك ولكن كل هذه الخصائص تختلف بين الأوراق البحثية التي لا يوجد بها نمط ملحوظ.
كيف يمكننا استخدام هذه البيانات للتعرف على حيوان جديد باعتباره سنيك؟
أحد الحلول الممكنة لمشكلتنا هو استخدام آلة ناقلات الدعم لتحديد الأنماط في البيانات وإنشاء إطار عمل يمكن استخدامه لتصنيف الحيوانات على أنها سنيك أو لا سنيك. الخطوة الأولى هي إنشاء مجموعة من البيانات التي يمكن استخدامها لتدريب جهاز ناقلات الدعم لتحديد شنيكس. بيانات التدريب هي مجموعة من المدخلات والمخرجات مطابقة لآلة ناقلات الدعم لتحليل واستخراج نمط من.
ولذلك، يجب أن نقرر ما هي المدخلات التي سيتم استخدامها وكم. نظريا، يمكن أن يكون لدينا العديد من المدخلات كما نريد، ولكن هذا يمكن أن يؤدي في كثير من الأحيان إلى التدريب بطيئة (والمزيد من المدخلات لديك المزيد من الوقت الذي يستغرق آلة ناقلات الدعم لاستخراج أنماط). أيضا، كنت ترغب في اختيار المدخلات القيم التي تميل إلى أن تكون متسقة نسبيا عبر جميع شنيكس. على سبيل المثال، ارتفاع أو وزن الحيوان سيكون مثالا جيدا على المدخلات لأنك تتوقع أن هذا سيكون متسقا نسبيا في جميع سشنيكس. ومع ذلك، فإن متوسط عمر الحيوان سيكون خيارا ضعيفا من المدخلات لأنك تتوقع سن الحيوانات التي تم تحديدها من شأنها أن تختلف اختلافا كبيرا.
ولهذا السبب، تم اختيار المدخلات التالية:
ارتفاع الوزن عدد الساقين عدد العيون طول الذراع الحيوان متوسط سرعة الحيوانات تردد الحيوانات الدعوة التزاوج.
مع المدخلات المختارة، يمكننا أن نبدأ في تجميع بيانات التدريب لدينا. يجب أن تستوفي بيانات التدريب الفعالة لآلة ناقلات الدعم متطلبات معينة:
يجب أن يكون البيانات أمثلة من الحيوانات التي هي سنيكس يجب أن يكون البيانات أمثلة من الحيوانات التي ليست سنيكس.
في هذه الحالة لدينا أوراق بحثية من العلماء التي حددت بنجاح سنيك و سرد خصائصها. لذلك يمكننا قراءة هذه الأوراق البحثية واستخراج البيانات تحت كل من المدخلات وتخصيص مخرجات صحيحة أو خاطئة لكل من الأمثلة. قد تبدو بيانات التدريب في هذه الحالة مشابهة للجدول أدناه.
الجدول 1. مثال لجدول الملاحظات.
وبمجرد أن جمعنا البيانات لجميع المدخلات والمخرجات التدريبية لدينا، يمكننا استخدامه لتدريب لدينا ناقلات دعم الجهاز. خلال عملية التدريب، فإن آلة ناقلات الدعم إنشاء نموذج في سبعة أبعاد الفضاء التي يمكن استخدامها لفرز كل من الأمثلة التدريبية في إما صحيحة أو خاطئة. وستستمر آلة ناقلات الدعم في القيام بذلك إلى أن يكون لها نموذج يمثل بدقة بيانات التدريب (ضمن التسامح المحدد للخطأ). وبمجرد اكتمال التدريب، يمكن استخدام هذا النموذج لتصنيف نقاط بيانات جديدة إما صحيحة أو خاطئة.
هل آلة دعم الدعم في الواقع العمل؟
وباستخدام سينيك سنيك، قمت بكتابة نص برمجي يختبر مدى قدرة جهاز متجه الدعم على التعرف على سنيكس جديدة. للقيام بذلك، لقد استخدمت "دعم ناقلات آلة التعلم أداة" مكتبة مكتبة التي يمكن تحميلها من السوق.
لنموذج هذا السيناريو بشكل فعال، نحن بحاجة إلى أن نقرر أولا ما هي الخصائص الفعلية لل سنيك. وقد تم إدراج الخصائص التي افترضتها في هذه الحالة في الجدول أدناه. إذا كان الحيوان يفي بجميع المعايير أدناه، فإنه هو سنيك.
الجدول 2. ملخص المعلمات التي تحدد سنيك.
الآن بعد أن عرفنا سنيك لدينا، يمكننا استخدام هذا التعريف لتجربة آلات ناقلات الدعم. الخطوة الأولى هي إنشاء وظيفة قادرة على اتخاذ المدخلات السبعة لأي حيوان معين والعودة التصنيف الفعلي للحيوان كما سنيك أم لا. وسوف تستخدم هذه الوظيفة لتوليد بيانات التدريب للجهاز ناقلات الدعم وكذلك تقييم أداء منه في نهاية المطاف. ويمكن القيام بذلك باستخدام الدالة أدناه؛
الخطوة التالية في العملية هي إنشاء وظيفة يمكن أن تولد المدخلات والمخرجات التدريبية. سيتم إنشاء الإدخالات في هذه الحالة بإنشاء أرقام عشوائية ضمن نطاق محدد لكل من قيم الإدخال السبعة. ثم لكل من مجموعات من المدخلات العشوائية ولدت، سيتم استخدام الدالة إسيتاسشنيك () أعلاه لتوليد الناتج المطلوب المقابلة. ويتم ذلك في الوظيفة التالية:
لدينا الآن مجموعة من المدخلات والمخرجات التدريب، فقد حان الوقت الآن لإنشاء آلات ناقلات الدعم باستخدام "دعم ناقلات آلة التعلم أداة" المتاحة في السوق. مرة واحدة يتم إنشاء جهاز ناقل دعم جديد، فمن الضروري لتمرير مدخلات التدريب والمخرجات له وتنفيذ التدريب.
لدينا الآن آلة ناقلات الدعم التي تم تدريبها بنجاح في تحديد سنيكس. للتحقق من ذلك، يمكننا اختبار جهاز ناقل الدعم النهائي عن طريق طرحه لتصنيف نقاط بيانات جديدة. ويتم ذلك من خلال توليد المدخلات العشوائية أولا، ثم استخدام الدالة إسيتاسشنيك () لتحديد ما إذا كانت هذه المدخلات تتوافق مع سنيك الفعلي، ثم استخدام آلة ناقلات الدعم لتصنيف المدخلات وتحديد ما إذا كانت النتيجة المتوقعة تتطابق مع النتيجة الفعلية. ويتم ذلك في الوظيفة التالية:
أوصي اللعب مع القيم ضمن الوظائف المذكورة أعلاه لنرى كيف أداء ناقلات الدعم أداء في ظل ظروف مختلفة.
لماذا هو دعم ناقلات آلة مفيدة جدا؟
الاستفادة من استخدام آلة ناقلات الدعم لاستخراج نمط معقد من البيانات هو أنه ليس من الضروري فهم مسبق لسلوك البيانات. آلة ناقلات الدعم قادرة على تحليل البيانات واستخراج رؤى وعلاقات فقط. وبهذه الطريقة، فإنه يعمل على غرار مربع أسود تلقي المدخلات وتوليد الانتاج التي يمكن أن تكون مفيدة جدا في إيجاد أنماط في البيانات التي هي معقدة جدا وغير واضحة.
واحدة من أفضل ميزات آلات ناقلات الدعم هي أنها قادرة على التعامل مع الأخطاء والضوضاء في البيانات بشكل جيد للغاية. وغالبا ما تكون قادرة على رؤية النمط الأساسي داخل البيانات وتصفية القيم المتطرفة البيانات والتعقيدات الأخرى. النظر في السيناريو التالي، في إجراء البحوث الخاصة بك على سنيكس، كنت تأتي عبر العديد من الأبحاث التي تصف سنيكس مع خصائص مختلفة بشكل كبير (مثل سنيك الذي هو 200kg و 15000mm طويل القامة).
أخطاء مثل هذا يمكن أن يؤدي إلى تشوهات النموذج الخاص بك ما هو سنيك، والتي يمكن أن تسبب لك أن تجعل من الخطأ عند تصنيف اكتشافات سنيك جديدة. فائدة آلة ناقلات الدعم هي أنه سيتم تطوير نموذج يتفق مع النمط الأساسي المعارض لنموذج يناسب جميع نقاط بيانات التدريب. ويتم ذلك عن طريق السماح بمستوى معين من الخطأ في النموذج لتمكين آلة ناقل الدعم من التغاضي عن أي أخطاء في البيانات.
في حالة سنيك آلة ناقلات الدعم، إذا سمحنا تحمل الخطأ من 5٪، ثم التدريب سوف تحاول فقط لتطوير نموذج يتفق مع 95٪ من بيانات التدريب. وهذا يمكن أن يكون مفيدا لأنه يسمح للتدريب لتجاهل النسبة المئوية الصغيرة من القيم المتطرفة.
يمكننا التحقيق في هذه الخاصية من جهاز دعم ناقلات أخرى عن طريق تعديل السيناريو لدينا سنيك. وقد أضيفت الوظيفة أدناه لإدخال أخطاء عشوائية متعمدة في مجموعة بيانات التدريب لدينا. هذه الوظيفة سوف تختار نقاط التدريب عشوائيا واستبدال المدخلات والمخرجات المقابلة مع المتغيرات العشوائية.
هذه الوظيفة تسمح لنا لإدخال أخطاء متعمدة في بيانات التدريب لدينا. باستخدام هذا الخطأ شغل البيانات، يمكننا إنشاء وتدريب جديد ناقلات دعم الجهاز ومقارنة أدائها مع واحد الأصلي.
عند تشغيل البرنامج النصي، ينتج النتائج التالية في سجل الخبراء. ضمن مجموعة بيانات التدريب مع 5000 نقطة التدريب، كنا قادرين على إدخال 500 أخطاء عشوائية. عند مقارنة أداء هذا الخطأ شغل آلة ناقلات الدعم مع واحد الأصلي، يتم تقليل الأداء فقط من قبل & لوت؛ 1٪. وذلك لأن آلة ناقل الدعم قادرة على التغاضي عن القيم المتطرفة في مجموعة البيانات عند التدريب ولا تزال قادرة على إنتاج نموذج دقيق لافت للنظر من البيانات الحقيقية. ويشير هذا إلى أن آلات ناقلات الدعم يمكن أن تكون أداة أكثر فائدة في استخراج الأنماط المعقدة والأفكار من مجموعات البيانات الصاخبة.
الشكل 5. سجل الخبير الناتج بعد تشغيل السيناريو "سنيك" في ميتاتريدر 5.
يمكن تحميل النسخة الكاملة من التعليمات البرمجية أعلاه من قاعدة التعليمات البرمجية، ولكن لا يمكن تشغيل هذا البرنامج النصي إلا في المحطة الطرفية الخاصة بك إذا كنت قد اشتريت نسخة كاملة من أداة دعم آلة ناقلات الدعم من السوق. إذا كان لديك فقط نسخة تجريبية من هذه الأداة تحميلها، سوف تكون محدودة لاستخدام الأداة عن طريق اختبار الاستراتيجية. للسماح لاختبار رمز "سنيك" باستخدام الإصدار التجريبي من الأداة، لقد أعدت كتابة نسخة من البرنامج النصي إلى مستشار خبير يمكن نشرها باستخدام اختبار الاستراتيجية. يمكن تنزيل كل من هذين النسختين البرمجيتين باتباع الروابط أدناه:
النسخة الكاملة - استخدام البرنامج النصي الذي يتم نشره في محطة ميتاتريدر 5 (يتطلب نسخة مشتراة من أداة دعم أداة ناقلات الدعم)
الإصدار التجريبي - استخدام مستشار الخبراء التي يتم نشرها في اختبار ميتاتريدر 5 استراتيجية (يتطلب فقط نسخة تجريبية من أداة دعم ناقلات الدعم أداة)
كيف يمكن دعم آلات المتجهات أن تستخدم في السوق؟
ومن المسلم به أن مثال سنيك الذي نوقش أعلاه بسيط جدا، ولكن هناك بعض أوجه الشبه التي يمكن استخلاصها بين هذا المثال واستخدام أجهزة ناقل الدعم لتحليل السوق التقنية.
التحليل الفني هو أساسا حول استخدام بيانات السوق التاريخية للتنبؤ بتحركات الأسعار في المستقبل. على نفس المنوال في المثال سنيك، كنا نستخدم الملاحظات التي أدلى بها العلماء الماضي للتنبؤ ما إذا كان حيوان جديد هو سنيك أم لا. وعلاوة على ذلك، يعاني السوق من الضوضاء والأخطاء والمتغيرات الإحصائية التي تجعل استخدام آلة ناقلات الدعم مفهوما للاهتمام.
وأساس عدد كبير من نهج التداول في التحليل التقني ينطوي على الخطوات التالية:
رصد عدة مؤشرات تحديد ما هي الشروط لكل مؤشر يرتبط مع احتمال التجارة الناجحة مشاهدة كل من المؤشرات وتقييم متى جميع (أو أكثر) مما يشير إلى التجارة.
ومن الممكن اعتماد نهج مماثل لاستخدام آلات ناقلات الدعم للإشارة إلى الصفقات الجديدة بطريقة مماثلة. وقد تم تطوير أداة التعلم آلة ناقلات الدعم مع هذا في الاعتبار. وصف كامل لكيفية استخدام هذه الأداة يمكن العثور عليها في السوق، ولذا فإنني سوف تعطي فقط لمحة سريعة. عملية استخدام هذه الأداة هي كما يلي:
الشكل 6. مخطط الرسم البياني يوضح عملية تنفيذ أداة دعم ناقلات الدعم في أحد مستشاري الخبراء.
قبل أن تتمكن من استخدام أداة دعم آلة ناقلات الدعم، من المهم أن نفهم أولا كيف يتم توليد مدخلات التدريب والمخرجات.
كيف يتم توليد مدخلات التدريب؟
لذا، تم بالفعل تهيئة المؤشرات التي تريد استخدامها كمدخلات بالإضافة إلى جهاز ناقل الحركة الجديد. الخطوة التالية هي تمرير مقابض المؤشر إلى جهاز ناقل الحركة الجديد الخاص بك وإرشاده حول كيفية إنشاء بيانات التدريب. يتم ذلك عن طريق استدعاء الدالة سيتانديكاتورهاندلز (). هذه الوظيفة تسمح لك لتمرير مقابض المؤشرات تهيئة في آلة ناقلات الدعم. ويتم ذلك عن طريق تمرير ومجموعة صحيحة تحتوي على مقابض. The two other inputs for this function is the offset value and the number of data points.
The offset value denotes the offset between the current bar and the starting bar to be used in generating the training inputs and the number of training points (denoted by N) sets the size your training data. The diagram below illustrates how to use these values. An offset value of 4 and an N value of 6 will tell the support vector machine to only use the bars captured in the white square to generate training inputs and outputs. Similarly, an offset value of 8 and an N value of 8 will tell the support vector machine to only use the bars captured in the blue square to generate training inputs and outputs.
Once the setIndicatorHandles() function has been called, it is possible to call the genInputs() function. This function will use the indicator handles to passed to generate an array of input data to be used for training.
Figure 7. Candle chart illustrating the values of Offset and N.
How are Training Outputs Generated?
Training outputs are generated by simulating hypothetical trades based on historical price data and determining whether such a trade would have been successful or unsuccessful. In order to do this, there are a few parameters that are used to instruct the support vector machine learning tool how to assess a hypothetical trade as either successful or unsuccessful.
The first variable is OP_TRADE. The value of this can either be BUY or SELL and will correspond to either hypothetical buy or sell trades. If the value of this is BUY, then when generating the outputs it will only look at the potential success of hypothetical buy trades. Alternatively, if the value of this is SELL, then when generating the outputs it will only look at the potential success of hypothetical sell trades.
The next values used is the Stop Loss and Take Profit for these hypothetical trades. The values are set in pips and will set the stop and limit levels for each of the hypothetical trades.
The final parameter is the trade duration. This variable is measured in hours and will ensure that only trades that are complete within this maximum duration will be deemed successful. The reason for including this variable is to avoid the support vector machine signalling trades in a slow moving sideways market.
Considerations to Make When Choosing Inputs.
It is important to put some thought into the input selection when implementing support vector machines in your trading. Similar the Schnick example, it is important to choose an input that would be expected to have similar across difference incidences. For example, you may be tempted to use a moving average as an input, however since the long term average price tends to change quite dramatically over time, a moving average in isolation may not be the best input to use. This is because there won't be any significant similarity between the moving average value today and the moving average values six months ago.
Assume we are trading EURUSD and using a support vector machine with a moving average input to signal 'buy' trades. Say the current price is 1.10, however it is generating training data from six months ago when the price was 0.55. When training the support vector machine, the pattern it finds may only lead to a trade being signaled when the price is around 0.55, since this is the only data it knows. Therefore, your support vector machine may never signal a trade until the price drops back down to 0.55.
Instead, a better input to use for the support vector machine may be a MACD or a similar oscillator because the value of the MACD is independent of the average price level and only signals relative movement. I recommend you experiment with this to see what produces the best results for you.
Another consideration to make when choosing inputs is ensuring that the support vector machine has an adequate snapshot of an indicator to signal a new trade. You may find in your own trading experience that a MACD is only useful when you have the past five bars to look at, as this will show a trend. A single bar of the MACD may be useless in isolation unless you can tell if it is heading up or down. Therefore, it may be necessary to pass the past few bars of the MACD indicator to the support vector machine. There are two possible ways you can do this:
You can create a new custom indicator that uses the past five bars of the MACD indicator to calculate a trend as a single value. This custom indicator can then be passed to the support vector machine as a single input, or.
You can use the previous five bars of the MACD indicator in the support vector machine as five separate inputs. The way to do this is to initialize five different instances of the MACD indicator. Each of the indicators can be initialized with a different offset from the current bar. Then the five handles from the separate indicators can be passed to the support vector machine. It should be noted, that option 2 will tend to cause longer execution times for your Expert Advisor. The more inputs you have, the longer it will take to successfully train.
Implementing Support Vector Machines in and Expert Advisor.
I have prepared an Expert Advisor that is an example of how someone could potentially use support vector machines in their own trading (a copy of this can be downloaded by following this link https://mql5/en/code/1229). Hopefully the Expert Advisor will allow you to experiment a little with support vector machines. I recommend you copy/change/modify the Expert Advisor to suit your own trading style. The EA works as follows:
Two new support vector machines are created using the svMachineTool library. One is set up to signal new 'Buy' trades and the other is set up to signal new 'Sell' trades.
Seven standard indicators are initialized with each of their handles stored to an integer array (Note: any combination of indicators can be used as inputs, they just need to be passed to the SVM in a single integer array).
The array of indicator handles is passed to the new support vector machines.
Using the array of indicator handles and other parameters, historical price data is used to generate accurate inputs and outputs to be used for training the support vector machines.
Once all of the inputs and outputs have been generated, both of the support vector machines are trained.
The trained support vector machines are used in the EA to signal new 'buy' and 'sell' trades. When a new 'buy' or 'sell' trade is signaled, the trade opens along with manual Stop Loss and Take Profit orders.
The initialization and training of the support vector machine are executed within the onInit() function. For your reference, this segment of the svTrader EA has been included below with notes.
Advanced Support Vector Machine Trading.
Additional capability was built into the support vector machine learning tool for the more advanced users out there. The tool allows users to pass in their own custom input data and output data (as in the Schnick example). This allows you to custom design your own criteria for support vector machine inputs and outputs, and manually pass in this data to train it. This opens up the opportunity to use support vector machines in any aspect of your trading.
It is not only possible to use support vector machines to signal new trades, but it can also be used to signal the closing of trades, money management, new advanced indicators etc. However to ensure you don’t receive errors, it is important to understand how these inputs and outputs are to be structured.
Inputs: Inputs are passed to SVM as a 1 dimensional array of double values. Please note that any input you create must be passed in as a double value. Boolean, integer, etc. must all be converted into a double value before being passed into the support vector machine. The inputs are required in the following form. For example, assume we are passing in inputs with 3 inputs x 5 training points. To achieve this, our double array must be 15 units long in the format:
| A 1 | B 1 | C 1 | A 2 | B 2 | C 2 | A 3 | B 3 | C 3 | A 4 | B 4 | C 4 | A 5 | B 5 | C 5 |
It is also necessary to pass in a value for the number of inputs. In the case, N_Inputs=3.
Outputs: outputs are passed in as an array of Boolean values. These boolean values are the desired output of the SVM corresponded to each of the sets of inputs passed in. Following the above example, say we have 5 training points. In this scenario, we will pass in a Boolean array of output values that is 5 units long.
When generating your own inputs and outputs, be sure that the length of your arrays matches the values you pass in. If they don’t match, an error will be generated notifying you of the discrepancy. For example, if we have passed in N_Inputs=3, and inputs is an array of length 16, an error will be thrown (since, a N_inputs value of 3 will mean that the length of any input array will need to be a multiple of 3). Similarly, ensure that the number of sets of inputs and the number of outputs that you pass in are equal. Again, if you have N_Inputs=3, length of inputs of 15 and a length of outputs of 6, another error will be thrown (as you have 5 sets of inputs and 6 outputs).
Try to ensure you have enough variation in your training outputs. For example, if you pass in 100 training points, which means an output array of length 100, and all of the values are false with only one true, then the differentiation between the true case and the false case is not sufficient enough. This will tend to lead to the SVM training very fast, but the final solution being very poor. A more diverse training set will often lead to a more affective SVM.
Quintuitive.
وجهات نظر بديهية كميا على الأسواق.
Trading with Support Vector Machines (SVM)
Finally all the stars have aligned and I can confidently devote some time for back-testing of new trading systems, and Support Vector Machines (SVM) are the new “toy” which is going to keep me busy for a while.
SVMs are a well-known tool from the area of supervised Machine Learning, and they are used both for classification and regression. For more details refer to the literature.
It seems to me that the most intuitive application for trading is regression, so let’s start by building an SVM regression model.
Following our experience with ARMA+GARCH models, we will start by trying to forecast returns, instead of prices. Likewise, in our first tests, we will use only the returns of the previous 5 days as the features determining the return of a particular day. We will start with history of 500 days as the training set.
In more mathematical terms, for the training set we have N features, for each of them we have M samples. We also have M responses.
Given a row of feature values, the left matrix, the SVM is trained to produce the response value. In our specific example, we have five columns (features), each column corresponding to the returns with a different lag (from 1 to 5). We have 500 samples and the corresponding responses.
Once the SVM is trained on this set, we can start feeding it with sets of five features, corresponding to the returns for the five previous days, and the SVM will provide us with the response, which is the forecasted return. For example, after training the SVM on the previous 500 days, we will use the returns for days 500, 499, 498, 497 and 496 (these are ours as the input to obtain the forecasted return for day 501.
From all the packages available in R, I decided to choose the e1071 package. A close second choice was the kernlab package, which I am still planning to try in the future.
Then I tried a few strategies. First I tried something very similar to the ARMA+GARCH approach – the lagged returns from the five previous days. I was quite surprised to see this strategy performing better than the ARMA+GARCH (this is the home land of the ARMA+GARCH and I would have been quite happy just with comparable performance)!
Next, I tried to the same five features, but trying to select the best subset. The selection was done using a greedy approach, starting with 0 features, and interactively adding the feature which minimizes the error best. This approach improved things further.
Finally, I tried a different approach with about a dozen features. The features included returns over different period of time (1-day, 2-day, 5-day, etc), some statistics (mean, median, sd, etc) and volume. I used the same greedy approach to select features. This final system showed a very good performance as well, but it took a hell of a time to run.
Time to end this post, the back-testing results have to wait. Until then you can play with the full source code yourself. Here is an example of using it:
Hello, is it possible to have an example of application if your function?
Updated the post.
Great post about SVM’s. شكرا للمشاركة. I’m an R newbie, could you please tell me what is the difference between doing this.
In windows doesn’t work because of multicore problem.
One more thing that I don’t understand is reflected in this to rows of the code.
In my opinion it’s more effective to merge series.
and to have only one argument=object to function call instead of 2.
Interesting work, thanks.
Argh, Windows – I use it seldom lately. Quite surprised still, since the parallel package is part of the base R distribution now. Hopefully it will be addressed soon.
Meanwhile, how about not using parallel execution? Also there are other packages providing parallel execution, but that would be more work.
You are right about the merge – I still wonder why I did it this way this time.:)
I’m receiving errors.
Now the error is.
وGT. data = svmFeatures( tt )[,c(1,2)]
Error in match. fun(FUN) : object ‘skewness’ not found.
But when I make manually data object I receive error in prediction.
svmComputeOneForecast <- function related to dimensions and.
It's difficult to me to debug.
skewness comes from the PerformanceAnalytics package, which you need to install from CRAN. Adding require(PerformanceAnalytics) as the first line of svmFeatures should address the first problem.
Error in merge. xts(res, xts(na. trim(lag(rollmean(rets, k = 21, align = “right”), :
length of ‘dimnames’ [2] not equal to array extent.
it seems that in windows code needs a lot of changes.
Mike, I never meant the code to be used directly (until now I was providing only snippets), but I am surprised that R on Windows is so ugly. Not sure what’s your goal, but to analyze the strategies performance, you can use the indicator series which are already computed.
It’s just pure academic interest on SVM. I used to work with clusters, PCA and I am curious how SVM is doing the same work.
In windows a lot of error are related to objects with dates as xts is or data frames.
UNIX is better but all brokers give API for windows. Some of them in Java and only this we may use from UNIX.
I don’t like win architecture but it’s a habit already and I don’t have time to change OS.
I just tried it on windows 7, 64 bit, R version 2.15.2. I get a warning from svmFeatures, which I know how to fix (calling sd on an xts/zoo object does interesting conversion to a matrix), but no problems. Running:
One question if you don’t mind.
Why are you using get with function cetSymbols from quantmod package?
I use call vers.
SPY <- getSymbols('SPY', auto. assign = FALSE)
You have a lot to compute and get consume memory and takes time to obtain objects name.
as a string var.
But I’m surprised with this result before call.
1 function (…, list = character(), package = NULL, lib. loc = NULL,
2 verbose = getOption(“verbose”), envir =.GlobalEnv)
4 fileExt <- function(x)
It seems that data is reserved word.
And now I don't know what is going to features function.
I am using R 2.15.2 on 64-bit linux. On my system data is also a function, but I don’t think this is the problem.
That’s probably a better way. Have seen it before, but didn’t pay attention till now to realize that it does exactly that. شكر.
What do you mean when you speak about the lagged returns? IS it the value 500,499,498,497,496 for the prediction of the return 501?
Yes, these returns are used to forecast the return of 501, which is used as the position (long/short depending on the sign) for 501. The model is trained on the previous data only, i. e. the last “row” in the training set is 499,498,497,496,495.
Ok, that’s sound good, and for the return do you use this formule :
return t=log(Price t+1/Price t)
And after you normalize (center and scale ) the return?
You can find these details in the accompanied source code. I use the discrete returns:
I don’t don’t center the data, neither I scale it. However, both packages which I use (caret+kernlab and e1071) seem to do that by default.
Another things, sorry, but you build your model on the previous 499 values, this is your training data set,
And afte, r to forecast the 501 return you use the last row as test values?
Why build a model on the 500 values and use the last row i. e 500,499 etc another time to test or to train?
in your tutorial you said: For example, after training the SVM on the previous 500 days, we will use the returns for days 500, 499, 498, 497 and 496 (these are ours as the input to obtain the forecasted return for day 501.
And in your response you said:Yes, these returns are used to forecast the return of 501, which is used as the position (long/short depending on the sign) for 501. The model is trained on the previous data only, i. e. the last “row” in the training set is 499,498,497,496,495.
Are you ok if i claim, i build the model on the 500 values, and to forecasted the 501 i use the model build previously and give him to “eat” the last row of the training dataset ie:500,499etc as input to obtain the forecasted 501’s value?
Regards and sorry for the multiple post, but i have got trouble with my network.
In general, I think it should be ok to use the approach you are suggesting. Notice that this approach will be much more demanding to implement in real-life trading, or at least the way I do it.
If one is to compute all reasonable closing prices in advance, the new approach will need to do one fit for each individual close and one predict. Compare to the other approach – the model is fit based on the previous 500 days, then only the new data (different for each close) is being fed. In other words, here we have one fit, many predicts.
Really admire your work mate, Im new to SVM with R, Im trying to use ten technical indictors to forecast stock index tommorrow’s movements(up or down as 1 or -1), when you train the model, what would you use as response column…if you are at 07/07/2018…you use that day movement or 08/07’s movement for 07/07’s technical indicators…if you use 07/07’s input…how do you forcast tommorrow’s results as you dont know tommorrow’s inputs…I hope that makes sense…
any help would be appreciated.
Hi Louis, if the target is only long/short, you may want to use classification instead of regression. Most packages silently switch to classification if the response vector is “factors” rather than numericals. Check quantumfinancier. wordpress/2018/06/26/support-vector-machine-rsi-system/ for an example.
Before starting the step forward process, I align the desired response with the data that predicts it. In general, this is a lag(1) of the predictors (data). This aligns the desired value of 08/07 (the return of 08/07) with its predictors (the indicators as of 07/07 close). Then I fit the model using the data by excluding the last date. In other words, let’s say I am about to predict 08/07. The last date I look when fitting is 07/07. Since the data is already lagged, the last date for the indicators is in fact 06/07. Finally to forecast one day ahead, I feed the data for 08/07, which corresponds to the indicators on 07/07. Now I can compare the predicted with the real value. This can relatively-easily be applied in practice, as long as the indicators are based on closing prices only. Anything using high/low/volume/etc (stochastics for instance), needs to either be lagged by an extra day, or the trading cannot happen right at the close … see my other post: quintuitive/2018/08/23/trading-at-the-close-the-mechanics/.
أتمنى أن يساعدك هذا.
Thats really helpful, thanks a lot mate…
most papers about SVM online are quite pointless…I guess not everyone likes to share their secrets haha.
sorry, one more question: for the model with the best performance, what inputs did you use to forecast tommorrow’s return..
AS quote”Finally, I tried a different approach with about a dozen features. The features included returns over different period of time (1-day, 2-day, 5-day, etc), some statistics (mean, median, sd, etc) and volume. I used the same greedy approach to select features. This final system showed a very good performance as well, but it took a hell of a time to run.”
The model with the best performance, by just a bit, was using lagged (by 1,2,3,4 and 5 days) daily returns. The only twist was that it was using a greedy method to select the “best” combination of features.
I just finished my work, I adopted a classification approach to predict tommorrow’s movement…
the accuracy is almost 86% on a 140days testdate.. I wonder if this is a little bit too high…
Nevertheless…Thank you so much.
Sounds too high to me. I’d certainly review it a few more times before taking it seriously – that’s like having a crystal ball.;)
Here is an idea, when you select the training set, try to divede your training set into two equal parts, one is the response returns above the average, the other is the returns below the average…this way, your forecast accuracy might not change much, but you can forecast the BIG movements much more accurate…
the performance should be improved…I’ve tried this and the results are quite nice…please let me know if this works for you..cheers.
My names is Krzysztof and I’m an author of this thread.
In this project I was using different machine learning algorithms (including SVM) trying to predict if certain trade with fixed TP/SL will be successful or not so classification.
Some comments/questions to your code.
1)Using cross validation (tune. control, cross=cross). Are you sure that using cross validation is correct in case of time series ?? In such case training will be done on past data and by definition of time series it introduce future leak and inflated results. Perhaps fix option should be used instead.
2)Kernel constants. The most important parameters for SVM are kernel constants. Why those fixed values are used and not another ??
3)Sample size/Choice of SVM. The training time of this SVM is exponentially correlated to the training sample size as far as I remember. But there are other SVMs specialized for use with bigger training sample size e. g. I was training my system on up to 150 000 bars within few hours. For example pegassos, libocas or SVMLight. In such case it is possible e. g. to use hourly data and bigger sample size which will give much better accuracy.
4) Why not use RWeka package and have the access perhaps more than hundred ML algos.
Quite an interesting thread, certainly something to take a look at – thanks for bringing it up. What do you mean by “TP/SL”?
1) The code is mostly for illustration purposes, and I didn’t find it very useful overall. I agree, it is dubious to consider each row in the training set as independent from the rest in the case of time series with their correlations, but it is an approach. According to robjhyndman/hyndsight/crossvalidation/, a better approach might be a one-step cross-validation using the past data, which should be relatively easy to add.
2) Nothing special about these kernel constants – just a set to iterate through. I think I used values found in examples using the package(s). The optimization chooses the best.
3) Good to know. Currently I don’t trade intraday, so I never had the need to deal with such big amounts of data. For daily data, increasing the window improves the performance, but up to a point from my experience. A bit counter intuitive that longer time window will improve the forecasts indefinitely - at some point the data is too much (as a ratio vs the number of parameters optimized).
4) Haven’t really looked into RWeka. Originally I started with e1071 because it’s fast and very stable. Then I switched to caret, which provides unified interface to many other packages, including some algorithms from RWeka. In my experience, I haven’t found an ML approach that really stands out for prediction of time series data. Have you?
Thanks for sharing,
1)Using cross validation (tune. control, cross=cross). Are you sure that using cross validation is correct in case of time series ?? In such case training will be done on past data and by definition of time series it introduce future leak and inflated results. Perhaps fix option should be used instead.
should be ‘In such case training will be done on future data’
My implementation doesn’t (at least by design;)) use future data. If the history is 500 points, the cross validation is used within these 500 to determine the best fit.
TP/SL – take profit/ stop loss. System was trying to trade on every bar (buy or sell) than label.
was determined (trade successful/unsuccessful) depends if TP or SL was hit first.
“If the history is 500 points, the cross validation is used within these 500 to determine the best fit”
Well in such case in sample results will be inflated and has no meaning. For example if you divide training period for 10 sub periods and train on periods 1-8 and 10 than evaluate on period 9, future leak occurs as period 10 is after period 9 so in the future.
this how cross validation works i think and it is applicable only for static patterns. Only walk forward has a meaning in case of time series.
When i try the code i find the ROC 2 for the row 29/03/195: Is the difference of : value of 28/03 and 24/03 divide by value of 24/03, why is not the value of 27/03- value of 24/03 divide by value of 24/03….
The code is just for illustration. You can modify it anyway you want and use whatever features you think may improve the predictions. The ROC function comes from the TTR package.
Is it possible to have a plot of the ARMA model and SVM out-of-sample to compare their performance?
Not likely to get the time to go back to it, but will keep it in mind.
Support Vector Machine RSI System.
Better late than never, as promised, the R code for the SVM system discussed in a previous post.
For the record this code is based on the random forest system created by Max Dama. I thought that it would make it easier for common reader to compare and evaluate. I also want to state that this isn’t anywhere close to optimal programming, I did that I long time ago and I was only starting with R at the time.
Here is the system :
SVMClassifModel = function(data, targets, returns, lookback = 252, ktype = "C-svc", crossvalid = 10, C = 10)
# Construct a predictive model using support vector machine.
# Input data must be lagged one period to avoid look-ahead bias.
# Print predictions and confidence, accuracy, equity curves plot, and performance statistics v. s. benchmark.
# Make sure targets is a factor (for classification)
# Generate indexes for backtest.
idx = data. frame(targets = lookback:(nrow(data)-1))
# Isolate index to be used later.
# Prediction function to be used for backtesting.
model = trainSVM(data[(t-lookback):t, ], ktype, C, crossvalid)
pred = predict(model, data[t+1, -1], type="prob")
# Print for user inspection.
# backtest by looping over the calendar previously generated.
preds = sapply(idx$targets, pred1pd)
preds = data. frame(t(rbind(mle = max. col(t(preds)), preds)))
print(summaryStats((returns[idx$targets] * (preds$mle*2-3)), returns[idx$targets], comp = TRUE))
equity = xts(cumprod((returns[idx$targets] * (preds$mle*2-3))+1), inx)
Benchmark = xts(cumprod(returns[idx$targets] + 1), inx)
# y axis values range.
yrngMin = abs(min(equity, Benchmark))
yrngMax = abs(max(equity, Benchmark))
chartSeries(equity, log. scale = TRUE, name='Equity Curves', yrange=c(yrngMin, yrngMax))
addTA(Benchmark, on=1, col='gold')
trainSVM = function(data, ktype, C, crossvalid)
# Return a trained svm model.
., data = data, type = ktype, kernel="rbfdot", kpar=list(sigma=0.05), C = C, prob. model = TRUE, cross = crossvalid)
featureGen = function(sym, returns)
# Return a data frame to be used as input by the SVM system.
rsi2 = RSI(Cl(sym), 2 )
rsi3 = RSI(Cl(sym), 3 )
rsi4 = RSI(Cl(sym), 4 )
rsi5 = RSI(Cl(sym), 5 )
rsi6 = RSI(Cl(sym), 6 )
rsi7 = RSI(Cl(sym), 7 )
rsi8 = RSI(Cl(sym), 8 )
rsi9 = RSI(Cl(sym), 9 )
rsi10 = RSI(Cl(sym), 10 )
rsi11 = RSI(Cl(sym), 11 )
rsi12 = RSI(Cl(sym), 12 )
rsi13 = RSI(Cl(sym), 13 )
rsi14 = RSI(Cl(sym), 14 )
rsi15 = RSI(Cl(sym), 15 )
rsi16 = RSI(Cl(sym), 16 )
rsi17 = RSI(Cl(sym), 17 )
rsi18 = RSI(Cl(sym), 18 )
rsi19 = RSI(Cl(sym), 19 )
rsi20 = RSI(Cl(sym), 20 )
rsi21 = RSI(Cl(sym), 21 )
rsi22 = RSI(Cl(sym), 22 )
rsi23 = RSI(Cl(sym), 23 )
rsi24 = RSI(Cl(sym), 24 )
rsi25 = RSI(Cl(sym), 25 )
rsi26 = RSI(Cl(sym), 26 )
rsi27 = RSI(Cl(sym), 27 )
rsi28 = RSI(Cl(sym), 28 )
rsi29 = RSI(Cl(sym), 29 )
rsi30 = RSI(Cl(sym), 30 )
# lagged RSIs to correspond RSI with target period.
rsi2 = Lag(rsi2, 1)
rsi3 = Lag(rsi3, 1)
rsi4 = Lag(rsi4, 1)
rsi5 = Lag(rsi5, 1)
rsi6 = Lag(rsi6, 1)
rsi7 = Lag(rsi7, 1)
rsi8 = Lag(rsi8, 1)
rsi9 = Lag(rsi9, 1)
rsi10 = Lag(rsi10, 1)
rsi11 = Lag(rsi11, 1)
rsi12 = Lag(rsi12, 1)
rsi13 = Lag(rsi13, 1)
rsi14 = Lag(rsi14, 1)
rsi15 = Lag(rsi15, 1)
rsi16 = Lag(rsi16, 1)
rsi17 = Lag(rsi17, 1)
rsi18 = Lag(rsi18, 1)
rsi19 = Lag(rsi19, 1)
rsi20 = Lag(rsi20, 1)
rsi21 = Lag(rsi21, 1)
rsi22 = Lag(rsi22, 1)
rsi23 = Lag(rsi23, 1)
rsi24 = Lag(rsi24, 1)
rsi25 = Lag(rsi25, 1)
rsi26 = Lag(rsi26, 1)
rsi27 = Lag(rsi27, 1)
rsi28 = Lag(rsi28, 1)
rsi29 = Lag(rsi29, 1)
rsi30 = Lag(rsi30, 1)
data = data. frame(targets, rsi2, rsi3, rsi4, rsi5, rsi6, rsi7, rsi8, rsi9, rsi10, rsi11, rsi12, rsi13, rsi14, rsi15, rsi16, rsi17, rsi18, rsi19, rsi20, rsi21, rsi22, rsi23, rsi24, rsi25, rsi26, rsi27, rsi28, rsi29, rsi30)
# names(data) = c("targets", "data")
summaryStats = function(x, bmk, comp = FALSE)
#Compute stats of interest for strategy.
annRetx = Return. annualized(x, scale=252)
sharpex = SharpeRatio. annualized(x, scale=252)
winpctx = length(x[x > 0])/length(x[x != 0])
annSDx = sd. annualized(x, scale=252)
#Compute stats of interest for benchmark.
annRetbmk = Return. annualized(bmk, scale=252)
sharpebmk = SharpeRatio. annualized(bmk, scale=252)
winpctbmk = length(bmk[bmk > 0])/length(bmk)
annSDbmk = sd. annualized(bmk, scale=252)
#Return result vectors.
Benchmark = c(cumRetbmk, annRetbmk, sharpebmk, winpctbmk, annSDbmk, maxDDbmk, avDDbmk)
Strategy = c(cumRetx, annRetx, sharpex, winpctx, annSDx, maxDDx, avDDx)
nms = c("Cumulative Return", "Annualized Return", "Annualized Sharpe Ratio", "Winning Percentage", "Annualized Volatility", "Maximum Drawdown", "Average Drawdown")
result = data. frame(Strategy, Benchmark, row. names = nms)
#Return result vectors.
nms = c("Cumulative Return", "Annualized Return", "Annualized Sharpe Ratio", "Winning Percentage", "Annualized Volatility", "Maximum Drawdown", "Average Drawdown")
Strategy = c(cumRetx, annRetx, sharpex, winpctx, annSDx, maxDDx, avDDx)
result = data. frame(Strategy, row. names = nms)
Here is the harness used to use the system. Don’t forget to change the first two line of the code and replace with your directory.
source("NAME OF THE RSI SYSTEM FILE IN THE FOLDER")
# Load data with quantmod.
returns = dailyReturn(Cl(SPY), type='log')
# Generate data frame of data and targets.
data = featureGen(SPY, returns)
SVMClassifModel(data[30:nrow(data),], targets[30:length(targets)], returns, lookback = 252, ktype = "C-svc", crossvalid = 10, C = 60)
Lastly I would like to know if anyone has a better idea to share code. This is not very good way and I would like to improve it. I also welcome suggestions to make the code more efficient. I also want to make clear that I do not think that this is a good system and I know that it could be improved by adding predictors and all, it is only to give an example to follow-up on the post mentioned above.
شارك هذا:
ذات صلة.
آخر الملاحة.
While you have interesting articles, it’s really really hard to read them. The combination of black background and gray letters is very unreadable and my eyes are in pain. Would you consider setting up your site to have white background like 95% of other sites and make it much more pleasing to the eyes and readable?
I looking for a more appropriate background, but I don’t want to take a theme already used by someone else is the quant finance blogosphere. I always keep an eye open for new themes on wordpress and will update the theme when I find an interesting one.
I think just making the default font color white instead of gray would help a lot!
Here’s a more compact version of your featureGen() function. It is not more computationally efficient, but it produces the same output (except for column names) with 80% fewer lines.
featureGen2 = function(sym, n=30, steps=1)
# Return a data frame to be used as input by the SVM system.
targets = as. factor(ifelse(dailyReturn(Cl(sym), type=’log’)>=0,1,-1))
# lagged RSIs to correspond RSI with target period.
for(i in seq. int(2,n, steps))
Regarding a better way to share code, I know of a few people who put their scripts in their dropbox account and link to them.
Indeed this is much more concise way to do it. I was also looking into dropbox. I think in the future this is the way I will proceed.
Regarding how to share the code, you can use a gist on github: gist. github/.
Thank you Shane,
I will look into it.
I was just looking over your code here and was curious about this line:
Does t+1 imply that you’re using data from the future (i. e. look-ahead bias)?
Thank you for the comment. The short answer is no, essentially, you can think of the period t+1 as being today’s data fed into the model in order to get tomorrow’s prediction. In [t+1, -1] the -1 implies that the first column, which is the dependent variable is excluded from the data frame. Let me know if there is still confusion.
I vote for github. R is biased towards subversion, but git is the future. It’s basically a distributed svn model. It’s very convenient to share code this way because others can clone your code from their command line (internet connection assumed).
Interesting code, by the way. One may reasonably object that multiple RSI values have predictive value, but this modeling framework can easily be modified with inputs to the network of one’s choosing.
I like dropbox, but I’m starting the get a feeling that it’s a hobbyists hangout, and that feeling just won’t go away.
Thanks for your input, I will have a look at it soon. Heard of it before though seems like a good option.
Thanks for publishing this code. I have been using it as a tool to learn R and it has been challenging. I am puzzled by one thing I have run into; the solution does not seem to be unique or stable. I run this code and copy the solution, shut down R, and then open R and rerun the same identical code a few minutes later, I get different results. Each run is different, and the differences are substantial. I thought that SVM typically prvided a unique solution, am I mistaken? ANy thoughts on how to approach debugging this?
It is a very good question and I forgot to mention it in the post, I shall rectify that today. The SVM does not always have a unique solution and when it doesn’t we need to find another way to end our threshold; minimizing the Bayes error is often employed.
Hey QF – great post, great use of R. Noticed a tiny problem with the indexing on the graphs. It doesn’t alter the strategy returns, but shifts the x-axis graphs out by the 30 days you chop off the front of the data. Email me for a full explain if you’d like. Other than that – awesome!
I am interested in R and Machine Learning for finance. What would be your thoughts into using Price and Time as the data.
Price would be 30 points with the first point being 0. Each point after that would be assign +- the difference from the first point. Sort of a pattern….
Time would be Minute/Hour/Weekday/Month.
I am a total newb to machine learning and I am not even sure this data would be applicable. Any input or thoughts would be appreciated 😀
It is an interesting post. I am just curious whether you have encountered the same situation. I used the same parameters and ran the model against SPY time series for multiple times. It turned out that sometimes it generated different results. Do you know why and how to control it? توماس.
Comments
Post a Comment