پیش بینی تصادفات در قیمت های طلا با استفاده از یادگیری ماشین

ساخت وبلاگ

یک راهنمای گام به گام برای پیش بینی سقوط در قیمت های طلا با استفاده از طبقه بندی با Pycaret

رویکرد

در دو بخش قبلی سری پیش بینی طلا ، ما در مورد نحوه وارد کردن داده ها از API رایگان Yahoofinancials و ساخت یک مدل رگرسیون برای پیش بینی بازگشت از طلا در دو افق بحث کردیم. یعنی 14 روز و 22 روز.

در این بخش ، ما سعی خواهیم کرد پیش بینی کنیم که آیا "سقوط تیز" یا "سقوط" در قیمت های طلا در دوره 22 روزه آینده وجود خواهد داشت یا خیر. ما برای این آزمایش از یک تکنیک طبقه بندی استفاده می کنیم. ما همچنین یاد خواهیم گرفت که چگونه از مدل آموزش دیده استفاده کنیم تا هر روز در مورد داده های جدید پیش بینی کنیم. مراحل این تمرین این است:

  1. واردات و شکل دادن داده ها-این شبیه به آنچه در قسمت I در اینجا توضیح داده شده است. همچنین می توانید مجموعه داده نهایی را از repo git من بارگیری کنید.
  2. "سقوط تیز" را در قیمت های طلا تعریف کنید. شارپ یک اقدام مطلق نیست. ما سعی خواهیم کرد "سقوط تیز" را به صورت عینی تعریف کنیم
  3. بر اساس تعریف "سقوط تیز" ، ما برچسب ایجاد می کنیم ، ما برچسب هایی را بر روی داده های تاریخی ایجاد می کنیم
  4. مدل های قطار برای پیش بینی "سقوط تیز" و استفاده از مدل آموزش دیده برای پیش بینی داده های جدید

تهیه داده ها

این قسمت دقیقاً همان کاری است که در قسمت I. انجام دادیم. نوت بوک شامل کل کد برای واردات و دستکاری داده ها است یا می توانید مستقیماً با بارگیری مجموعه داده هایی که می توانید از لینک در اینجا بارگیری کنید ، شروع کنید.

تعریف "سقوط تیز"

هر مشکل طبقه بندی به برچسب نیاز دارد. در اینجا ما باید با تعریف و تعیین "سقوط تیز" برچسب ها ایجاد کنیم.

برای تعریف "تیز" ، من یک آستانه را تعریف می کنم به گونه ای که احتمال بازده پایین تر از آستانه برای هر پنجره (22 روز در اینجا و 14 روز در اینجا) 15 ٪ است (اساساً دم چپ توزیع عادی با P = 0. 15). برای این کار باید فرض کنم که توزیع بازده طبیعی است. با نگاهی به توزیع بازده ، این یک فرض بسیار مناسب است.

برای رسیدن به سطح بازگشت آستانه برای هر دو ویندوز (14 روز و 22 روز) ، ابتدا مقدار p دم چپ توزیع را تعریف می کنم ، که در این حالت 15 ٪ خواهد بود. با استفاده از این مقدار p ، ارزش z-1. 0364 را از یک توزیع عادی استاندارد دریافت می کنیم. کد زیر این کار را برای ما انجام می دهد.

اکنون ، بر اساس مقدار Z-مقدار و میانگین و SD بازده برای هر پنجره ، سطح بازگشت آستانه را دریافت خواهیم کرد. بازگشت به جلو به مدت 14 روز و 22 روز در ستون های "Gold-T+14" و "Gold-T+22" در "داده" قرار دارد.

بنابراین سطوح بازده آستانه 0. 0373- ی ا-3. 73٪ برای پنجره 14 روزه و-0. 0463 ی ا-4. 63٪ برای پنجره 22 روزه است. آنچه این بدان معناست این است که تنها 15 درصد احتمال دارد که بازده 14 روزه کمتر از 3. 73- درصد باشد و بازده 22 روزه کمتر ا ز-4. 63 درصد باشد. این مفهومی شبیه به آنچه در محاسبه ارزش در معرض خطر (VAR) استفاده می شود است.

ایجاد برچسب ها

ما از سطوح آستانه بالا برای ایجاد برچسب استفاده خواهیم کرد. هر بازگشتی در دو پنجره کمتر از آستانه مربوطه به عنوان 1 و در غیر این صورت 0 برچسب گذاری می شود.

از مجموع 2379 مورد، 338 مورد وجود داشته است که بازده 14 روزه کمتر از آستانه 3. 73- درصد بوده است و 356 مورد برای 22 روز که بازدهی کمتر از آستانه 4. 63- درصد بوده است.

هنگامی که این برچسب ها را داریم، در واقع به ستون های بازگشتی نیازی نداریم و از این رو ستون های بازگشتی واقعی را حذف می کنیم.

مدل سازی با PyCaret

پنجره 22 روزه

در اینجا با پنجره 22 روزه شروع خواهیم کرد. من از ماژول طبقه بندی PyCaret در اینجا برای آزمایش استفاده خواهم کرد.

ما ماژول بالا را از PyCaret وارد می کنیم و سپس برچسب را برای 14 روز حذف می کنیم زیرا در اینجا با یک پنجره 22 روزه کار می کنیم. درست مانند رگرسیون، برای شروع تمرین طبقه بندی، باید دستور setup() را اجرا کنیم تا به داده ها و ستون هدف اشاره کنیم. به یاد داشته باشید که تمام پیش پردازش های اولیه توسط PyCaret در پس زمینه انجام می شود.

برای ارزیابی مجموعه همه مدل ها، دستور compare_models() را با turbo تنظیم شده روی False اجرا می کنیم زیرا می خواهم تمام مدل های موجود در کتابخانه را ارزیابی کنم.

قبل از انتخاب مدل ها، باید بدانیم کدام معیار برای ما ارزشمندتر است. انتخاب یک معیار در آزمایش طبقه بندی به مشکل کسب و کار بستگی دارد. همیشه یک مبادله بین دقت و یادآوری وجود دارد. این بدان معناست که ما باید تعادلی را بین مثبت های واقعی و منفی های کاذب انتخاب کنیم.

در اینجا ، از مدل نهایی برای ایجاد پرچم برای سرمایه گذار/تحلیلگر استفاده می شود که به وی در مورد احتمال تصادف قریب الوقوع هشدار می دهد. سرمایه گذار سپس تصمیم می گیرد که موضع خود را در برابر سقوط احتمالی محافظت کند. بنابراین ، بسیار مهم است که این مدل قادر به پیش بینی همه/بیشتر سقوط های شدید باشد. به عبارت دیگر ، ما می خواهیم مدلی را با توانایی بهتر برای داشتن مثبت واقعی (یادآوری بهتر) انتخاب کنیم ، حتی اگر با هزینه برخی از مثبت های کاذب (دقت پایین) همراه باشد. به عبارت دیگر ، ما نمی خواهیم این مدل احتمال "سقوط شدید" را از دست بدهد. ما می توانیم از این پس مثبت کاذب داشته باشیم زیرا اگر مدل پیش بینی کند که سقوط شدید رخ خواهد داد ، و سرمایه گذار موقعیت خود را محاصره می کند ، اما سقوط رخ نمی دهد ، سرمایه گذار هزینه فرصت سرمایه گذاری سرمایه گذاری شده یا حداکثر هزینه پرچین را از دست می دهد(بگویید اگر او از پول خریداری می کند گزینه های خود را قرار می دهد). این هزینه پایین تر از هزینه یک منفی کاذب است که در آن مدل پیش بینی نمی کند "سقوط شدید" باشد ، اما سقوط گسترده ای اتفاق می افتد. با این حال ، ما باید یک برگه در مورد معاملات را با دقت و AUC نگه داریم.

ما پیش می رویم و چهار مدل یعنی طبقه بندی کننده MLP (MLP) ، طبقه بندی کننده فوق العاده درخت (ET) ، طبقه بندی Cat Boost (CATB) و دستگاه تقویت شیب نور (LGBM) با بهترین فراخوان و معقول AUC/Precision ایجاد خواهیم کرد.

بر اساس نتایج ما ، طبقه بندی کننده MLP با بالاترین فراخوان و AUC بسیار مناسب 94. 7 ٪ بهترین انتخاب است.

تنظیم پارامتری بیش از حد

هنگامی که چهار مدل برتر را که می خواهیم بیشتر دنبال کنیم ، باید بهترین مدل هایپر پارامترها را برای مدل ها پیدا کنیم. Pycaret عملکرد بسیار مناسبی از TUNE_MODEL () دارد که از طریق شبکه های بیش از حد پارامتر از پیش تعریف شده حلقه می کند تا بهترین پارامترها را برای مدل ما از طریق اعتبار سنجی متقاطع 10 برابر پیدا کند. Pycaret از جستجوی استاندارد شبکه تصادفی استاندارد برای تکرار از طریق پارامترها استفاده می کند. تعداد تکرارها (N_ITER) را می توان بر اساس ظرفیت محاسبه و محدودیت زمان به تعداد بالایی مشخص کرد. در TUNE_Function () ، Pycaret همچنین به ما امکان می دهد متریک مورد نظر خود را بهینه کنیم. پیش فرض دقت است ، اما می توانیم معیارهای دیگری را نیز انتخاب کنیم. همانطور که ما در اینجا فراخوان را انتخاب می کنیم زیرا این متریک است که می خواهیم افزایش یا بهینه سازی کنیم.

کد فوق طبقه بندی کننده CAT-Boost را برای بهینه سازی "فراخوان" با تکرار 50 بار در شبکه تعریف شده تنظیم می کند و 6 معیار را برای هر برابر نشان می دهد. ما می بینیم که میانگین فراخوان از 58. 2 ٪ در پایه گربه پایه به 62. 6 ٪ در اینجا بهبود یافته است. این یک پرش گسترده است ، در مرحله تنظیم آنقدر رایج نیست. با این حال ، هنوز هم پایین تر از 66. 6 ٪ از پایه "MLP" است که قبلاً ایجاد کردیم. برای سه مدل دیگر ، ما با تنظیم (مثال در نوت بوک) شاهد بهبود عملکرد نبودیم. دلیل این امر ماهیت تصادفی تکرار از طریق پارامترها است. با این وجود پارامتری وجود خواهد داشت که با عملکرد مدل پایه برابر باشد یا از آن فراتر رود ، اما برای همین ، ما باید N_iter را حتی بیشتر افزایش دهیم ، این به معنای زمان محاسبه بیشتر است.

بنابراین در حال حاضر مدل های برتر 4 ما عبارتند از:

مدل ها را ارزیابی کنید

قبل از پیشروی ، اجازه دهید عملکرد مدل را ارزیابی کنیم. ما برای ارزیابی و برجسته کردن جنبه های مهم مدل های برنده ، از عملکرد pycaret استفاده خواهیم کرد.

ماتریس سردرگمی

اهمیت

از آنجا که MLP و CATB_TUNED اهمیت ویژگی را ارائه نمی دهند ، ما از LGBM استفاده خواهیم کرد تا ببینیم کدام ویژگی ها در پیش بینی های ما مهمترین هستند:

می توانیم ببینیم که "بازگشت از طلا" در 180 روز گذشته مهمترین عامل در اینجا است. این همچنین بصری است زیرا اگر قیمت طلا در گذشته بسیار زیاد شده باشد ، احتمال سقوط/تصحیح آنها بیشتر و برعکس است. 3 ویژگی بعدی بازده از نقره بیش از 250 ، 60 و 180 روز است. باز هم ، نقره و طلا دو فلز گرانبها با تجارت و همبسته هستند ، از این رو رابطه بسیار بصری است.

مدل های گروه

پس از تنظیم پارامترهای بیش از حد مدل ، می توانیم روش های گروهی را برای بهبود عملکرد امتحان کنیم. دو روش گروهی که می توانیم امتحان کنیم "کیسه زدن" و "تقویت" است. مدلهایی که تخمین های احتمالی را ارائه نمی دهند ، نمی توانند برای تقویت استفاده شوند. از این رو ، ما می توانیم فقط با "LGBM" و "ET" از تقویت استفاده کنیم. برای دیگران ، ما سعی کردیم تا ببینیم که آیا پیشرفتی در عملکرد وجود داشته است یا خیر. در زیر عکسهای فوری کد و نتایج 10 برابر وجود دارد.

همانطور که در بالا مشاهده می کنیم ، نتایج برای این دو مدل بهبود نیافته است. برای سایر مدل ها نیز بدتر شدن عملکرد (نوت بوک را بررسی کنید). از این رو مدل برنده ما یکسان است.

مدل های مخلوط

مدل های ترکیبی اساساً در حال ساختن یک طبقه بندی رای دهنده در بالای برآوردگرها هستند. برای مدلهایی که احتمال پیش بینی را ارائه می دهند ، می توانیم از رای گیری نرم (با استفاده از احتمالات آنها) استفاده کنیم ، در حالی که برای دیگران ، از رای گیری سخت استفاده می کنیم. blend_model () به طور پیش فرض برای استفاده از رای گیری سخت ، که می تواند به صورت دستی تغییر کند. من دو ترکیب ساختم تا ببینم عملکرد دیگری وجود دارد که می توان آنرا استخراج کرد.

اگرچه هیچ یک از مدل ها نمی توانند "MLP" را از موقعیت برتر از بین ببرند ، اما دیدن ترکیب دوم ، "Blend2" ، که ترکیبی نرم از "LGBM" و "ET" است ، بسیار جالب است. عملکرد در فراخوان و AUC 62. 25 ٪ و 97. 43 ٪ بالاتر از هر دو "LGBM" و "ET" به صورت جداگانه است. این نشان از فواید مدل های ترکیبی دارد. اکنون مدل های برنده ما به 3 کاهش می یابد.

مدل های انباشت روشی است که در آن ما به پیش بینی های یک مدل (یا مجموعه ای از مدل ها) در یک لایه اجازه می دهیم به عنوان ویژگی برای لایه های بعدی استفاده شود و در آخر ، مدل متا مجاز به آموزش بر روی پیش بینی های لایه های قبلی و اصلی استویژگی ها (اگر restack = true) برای پیش بینی نهایی. Pycaret اجرای بسیار ساده ای از این کار دارد که در آن می توانیم با استفاده از stack_model () یا چندین لایه و یک متا مدل با استفاده از Create_StackNet () یک پشته با یک لایه و یک مدل متا بسازیم. من از ترکیب های متفاوتی برای ساخت پشته های مختلف و ارزیابی عملکرد استفاده کرده ام.

در پشته اول ، "Stack1" ، من از مدل های کم عملکرد ، CATB_TUNED و ILEND2 در لایه اول استفاده کردم تا پیش بینی های خود را به مدل رهبر MLP منتقل کنم که به آن کمک می کند تا پیش بینی ها انجام شود و پیش بینی MLP توسط META استفاده می شود-مودل ، که به طور پیش فرض در اینجا به تگرگ لجستیک (LR) است ، تا پیش بینی نهایی را انجام دهد. از آنجا که LR با داده های کامل خیلی خوب عمل نکرد (به نتایج مقایسه مدل ها مراجعه کنید) من از Restack = False استفاده کردم ، این بدان معنی است که فقط پیش بینی های مدل های قبلی به برآوردگرهای بعدی منتقل می شود ، نه ویژگی های اصلی. آنچه در اینجا می بینیم چیزی از جادو نیست. این فراخوان از 66. 63 ٪ از بهترین مدل "MLP" ما به 77. 8 ٪ عظیم پرش می کند و AUC و دقت نیز همینطور است."Stack1" قطعاً نسبت به تمام مدلهایی که قبلاً ساخته ایم بسیار برتر است. بدیهی است ، من مجبور شدم تنظیمات دیگر را نیز امتحان کنم تا ببینم آیا عملکرد بهتری حاصل می شود یا خیر. و من پیکربندی بهتری پیدا کردم:

پشته بالا ، 'Stack3 ، با یادآوری به طور متوسط 80. 7 ٪ ، یعنی 14 ٪ بالاتر از مدل MLP برنده ما بدون قربانی کردن دقت (95 ٪ ، بهبود 3 ٪) ، AUC (97. 34 ٪ ، یک ، یک موفقیت آمیزترین موفقیت بود. بهبود 2. 5 ٪) یا دقت (86. 28 ٪ ، بهبود عظیم 7. 7 ٪)

ما می توانیم از این مدل برای پیش بینی داده های آزمون ، (30 ٪ از کل مشاهدات) که در مرحله تنظیم جدا شده ایم استفاده کنیم. ما می توانیم این کار را با استفاده از predict_model () انجام دهیم

ما می توانیم ببینیم که عملکرد مدل در داده های آزمون با فراخوان 86. 9 ٪ حتی بهتر است

از آنجا که ما "Stack3" را به عنوان مدل پیشرو داریم ، ما مدل را بر روی کل داده ها (از جمله داده های آزمون) قرار می دهیم و مدل را برای پیش بینی در داده های جدید ذخیره می کنیم.

کد فوق متناسب با مدل در کل داده ها و با استفاده از عملکرد Save_model () ، من مدل آموزش دیده و خط لوله پیش پردازش را در یک پرونده PKL به نام "طبقه بندی 22D" در فهرست فعال خود ذخیره کرده ام. این مدل ذخیره شده می تواند و برای پیش بینی داده های جدید فراخوانده می شود.

پیش بینی داده های جدید

برای پیش بینی ما باید داده های قیمت خام را فقط به روشی که در ابتدای تمرین انجام دادیم برای استخراج ویژگی ها و سپس بارگذاری مدل برای پیش بینی ها وارد کنیم. تنها تفاوت این است که ما می توانیم تا آخرین روز معاملاتی داده ها را وارد کنیم تا در مورد جدیدترین داده ها پیش بینی کنیم ، دقیقاً مانند زندگی واقعی. نوت بوک با عنوان "پیش بینی طلا داده های جدید - طبقه بندی" در repo کدهای واردات ، تهیه و پیش بینی داده ها را به نمایش می گذارد.

ما قسمت واردات و آماده سازی داده ها را رد خواهیم کرد (نوت بوک را برای جزئیات بیشتر بررسی کنید) و روند پیش بینی را مشاهده می کنیم.

با استفاده از PREPICT_MODEL () می توانیم مدل بارگذاری شده را در مجموعه جدید داده ها اعمال کنیم تا پیش بینی (1 یا 0) و نمره (احتمال متصل به پیش بینی) ایجاد شود."پیش بینی" dataframe همچنین شامل تمام ویژگی هایی است که ما استخراج کردیم.

با نگاهی به ستون و ستون نمره پیش بینی ، مدل سقوط قابل توجهی در هر روز پیش بینی نکرد. به عنوان مثال ، با توجه به بازده تاریخی از 29 آوریل ، این مدل پیش بینی می کند که سقوط قابل توجهی در قیمت های طلا در دوره 22 روزه بعدی به احتمال زیاد ، از این رو برچسب = 0 ، با احتمال ناچیز 9. 19 ٪ نیست.

نتیجه

بنابراین در اینجا من مراحل ایجاد یک طبقه بندی کننده برای پیش بینی سقوط قابل توجه قیمت ها در دوره 22 روزه بعدی با قیمت طلا را طی کرده ام. این نوت بوک حاوی کدهایی برای مدل 14 روزه است. شما می توانید سعی کنید برچسب ها را ایجاد کنید و سعی کنید سقوط مشابهی را نسبت به ویندوزهای مختلف زمان با روشی مشابه پیش بینی کنید. تاکنون ، ما یک رگرسیون و یک مدل طبقه بندی ایجاد کرده ایم. در آینده ، ما سعی خواهیم کرد از پیش بینی مدل های طبقه بندی به عنوان ویژگی های مشکل رگرسیون استفاده کنیم و ببینیم که آیا عملکرد رگرسیون را بهبود می بخشد یا خیر.

پلتفرمهای تجاری...
ما را در سایت پلتفرمهای تجاری دنبال می کنید

برچسب : نویسنده : حامد بهداد بازدید : 49 تاريخ : يکشنبه 6 فروردين 1402 ساعت: 15:05