در این مقاله ما به بررسی وضعیت تغییر قیمت نفت برنت در سی سال گذشته از 1992 تا کنون میپردازم و پس از آن به پیش بینی قیمت نفت با استفاده از الگوریتم های ماشین لرنینگ و شبکه های عصبی خواهم پرداخت . ابتدا فیچرهای ( ستون های ) دیتافریم و بررسی میکنم که شامل :
Date : تاریخ مربوط به اطلاعات یک ردیف
Price : میانگین قیمت معامله شده در یک هفته
Open : قیمت شروع در یک هفته
High : بالاترین قیمت معامله شده در یک هفته
Low : پایین ترین قیمت معامله شده در یک هفته
Vol : حجم معاملات انجام شده درهفته
Change % : درصد تغییر قیمت نسبت به تاریخ قبلی (هفته پیشین)
این مساله یک مساله سری زمانی هست که برای حل اون کلاسی را میسازیم که پارامتر های ورودی آن را n تعداد هفته یِ قبل برای پیش بینیِ قیمت (ستون Price) m تعداد هفته بعد و زمان t که داده ها از اون زمان به قبل به داده های train و از اون زمان به بعد به داده های test تقسیم میشن در نظر گرفته شده و متدهایی برای ساختن دیتافریم داینامیک ، جدا کردن داده ها به test و train نسبت به زمان t و پیش بینی قیمت را در کلاس میسازیم . با استفاده از داده های بالا با الگوریتم های ماشین لرنینگی به نتایج موثری برای پیش بینی قیمت نرسیدم به همین دلیل متوجه شدم برای اینکار نیازمند داده های تاثیر گذار دیگری هم میباشم .
تحلیل ، بررسی و مهندسی فیچرها :
نمودار تغییرات قیمت نفت در طول زمان را در شکل زیر مشاهده میکنیم :
با بررسی نمودار بالا میتوان به افزایش صعودی قیمت نفت از سال 2000 به بعد به بالای 20 دلار پی برد.
نمودار فراوانی قیمت نفت را رسم کردم :
مشاهده میکنیم که دیتا فریم ما بالانس نیست میتوان پی برد که فراوانی در قیمت 20 دلار بسیار زیاد بوده و در قیمت بالای 130 دلار بسیار کم و از اونجایی که اکثر قیمت های 20 دلار مربوط به سال 2000 به قبل میباشد پس با حذف این دو قیمت به دیتا فریم بالانس تری میرسیم که نمودار فراوانی آن به شکل زیر میباشد :
با توجه به نمودار بدست آمده و تغیرات آن به نتایج زیر میتوان پی برد :
الف) تغییر قیمت تدریجی نفت از سال 2004 ببعد و افت شدید قیمت در سال 2008
ب) بالاترین رکورد قیمت نفت از 2008 تا 2016
ج) کاهش و افزایش قیمت در سال 2012
د) کاهش و افزایش قیمت در سال 2016
بررسی مورد ج و د :
ج) بررسی مورد افزایش قیمت در سال 2012 :
1- کاهش 15 درصدی تولید نفت نروژ ( کاهش عرضه )
2- افزایش 0.7 درصدی سفارش کالاهای صنعتی آمریکا ( افزایش تقاضا )
3- افزایش تقاضای چین برای نفت خام ( افزایش تقاضا )
د) بررسی کاهش و افزایش قیمت در سال 2016 :
1 - دلیل کاهش قیمت
1.1- افزایش ذخایر نفتی آمریکا ( افزایش عرضه )
1.2- عبور ایران از تحریم های نفتی و عرضه آن به بازار ( ژیوپولیتیک )
2 - دلیل افزایش قیمت
2.1- محدودیت 1.9 درصدی اوپک در عرضه جهانی ( کاهش عرضه )
با توجه به مثال های بالا میتوان به مفهوم دو عامل مهم یعنی ژیوپولیتیک و عرضه و تقاضا پی برد . که من از عرضه و تقاضا بعنوان فیچر تاثیر گذار استفاده میکنم .
عرضه تقاضا :
با استفاده از سایت datasource.kapsarc.org به دیتا فریم شاخص عرضه و تقاضا جهانی دست یافتم :
با توجه به دیتافریم و تقسیم تقاضا نسبت به عرضه میتوان به مقداری دست یافت که این مقدار را در ستونی به اسم supply_demand ذخیره کردم . حال نمودار عرضه-تقاضا را نسبت به زمان رسم کردم : ( زمان از سال 2018 ببعد است )
هرچه مقدار عددی ای که در ستون عرضه و تقاضا هست کمتر باشد نشان دهنده این است که عرضه نسبت به تقاضا زیاد تر بوده و قیمت هم کمتر میشود در واقع این نمودار با نمودار قیمت نفت نسبت مستقیم دارد .
شاخص دلار :
از دیگر عوامل تاثیرگذار میتوان به شاخص دلار اشاره کرد . که این دو مقدار رابطه عکس ای باهم دارند . نمودار شاخص دلار را از سال 2000 به بعد مشاهده میکنیم و میتوان دید در سال هایی که قیمت نفت بالا بوده شاخص دلار به کمترین مقدار خود رسیده است .
نوسانات قیمت :
پس از اضافه کردن فیچرها بصورت تحلیلی میتوان از روش های تکنیکال برای مهندسی فیچر استفاده میکنیم که یکی از روش ها تجزیه نوسانات قیمت به نوسانات بلندمدت، میان مدت و کوتاه مدت است و سپس این نوسانات را بعنوان ویژگی در دیتافریم اضافه کردم .
که دیتافریم نهایی به صورت زیر حاصل شد :
دیتافریم بدست آمده شامل فیچرهای زیر است :
Date : تاریخ مربوط به اطلاعات یک ردیف
Price : میانگین قیمت معامله شده در یک هفته
Index_dolar : شاخص دلار در یک هفته
Long-term volatility : نوسانات بلند مدت در یک هفته
Medium-term volatility : نوسانات میان مدت در یک هفته
Short-term volatility : نوسانات کوتاه مدت در یک هفته
Supply_demand : نسبت عرضه به تقاضا در یک هفته قبل
پیشبینی قیمت :
برای پیش بینی قیمت هم از روش ماشین لرنینگ کلاسیک و هم شبکه عصبی استفاده کردم .
الف) مدل های کلاسیک : در روش کلاسیک با استفاده از تکنیک Stack Modeling و استفاده از مدل های Random Forest و Gradient Boosting Regressor بعنوان بیس مدل و Linear Regressor بعنوان متا مدل به MAE=1.68 دست یافتم .
ب) شبکه عصبی : در روش پیاده سازی با استفاده از شبکه های عصبی با پیاده سازی الگوریتم LMSکه یک شبکه عصبی تک لایه میباشد به MAE=1.46 دست پیدا کردم .
امیدوارم از مطالب لذت برده باشین