آیا می توان قیمت سهام را با شبکه عصبی پیش بینی کرد؟

  • 2022-04-15

وقتی نوبت به پیش‌بینی سری‌های زمانی می‌رسد، خواننده (شنونده، بیننده...) شروع به پیش‌بینی قیمت سهام می‌کند. انتظار می رود این به تعیین زمان فروش و زمان خرید بیشتر کمک کند. گاهی اوقات ما مقالاتی را می بینیم که توضیح می دهند چگونه می توان این کار را انجام داد. مقاله [1] در اینجا مثالی ارائه می دهد، نویسندگان حتی برخی از نتایج را ارائه می دهند. با این حال، کتاب "یادگیری عمیق با پایتون" توسط Chollet تاکید می کند که نباید از تکنیک های پیش بینی سری های زمانی برای پیش بینی قیمت سهام استفاده کرد. Chollet به نوعی توضیح می دهد که در مورد بازار سهام، داده های مربوط به وضعیت قبلی مبنای خوبی برای تخمین وضعیت آینده نیست. در مقاله [3] نویسندگان حتی به این نتیجه رسیدند که قیمت سهام یک مارتینگل است و بنابراین، بهترین برآورد قیمت آتی (از نظر خطای تخمین) قیمت فعلی است.

بنابراین، آیا می توان از شبکه عصبی برای پیش بینی قیمت سهام استفاده کرد؟

برخی نظریه ها

سلب مسئولیت: این بررسی اجمالی نظری منعکس کننده دانش خودم از موضوع است، بنابراین ممکن است از اصطلاحات نادرست، کاملا نادرست و غیره استفاده کند. پس اگر بیشتر از من بدانید، ممکن است از خنده بمیرید. من به شما هشدار داده ام.

سهم چیست؟سهم سندی است که گواه حق دارنده در مطالبه بخشی از سود شرکت است. این بدان معناست که قیمت سهم باید به سود شرکت بستگی داشته باشد. علاوه بر این، قیمت سهم به سود دقیق شرکت بستگی ندارد، بلکه به سود مورد انتظار بستگی دارد. این بدان معنی است که قیمت سهم بیانگر نظر معامله گران بازار در مورد سودهای آتی است. و نظرات ممکن است اشتباه باشد. همه ما داستان‌های استارت‌آپ‌هایی را به یاد می‌آوریم که هزینه زیادی داشتند، اما در نهایت به نظر می‌رسید که هیچ چیز انقلابی نداشته باشند و سپس قیمت بازار خود را تقریباً به طور کامل از دست دادند. بنابراین می توان نتیجه گرفت که قیمت سهام به نظر ذهنی معامله گران بازار بستگی دارد.

شکل زیر را در نظر بگیرید. شکل نمودار قیمت سهام شرکت مرسک را نشان می دهد. همانطور که می بینید، یک سهم در 2 آوریل 2019 7718 DKK قیمت داشت. روز بعد قیمت هر سهم 7750 DKK بود. علتش چه بود؟ما می توانیم یک حرف D کوچک کوچک را در پایین طرح ببینیم. این نامه به این معنی است که شرکت در این روز سود سهام پرداخت می کند و ظاهراً سود سهام آنقدر زیاد بود که تقاضا را افزایش داد. بنابراین، رویداد پیش رو می تواند باعث رشد قیمت شود.

اکنون یک طرح دیگر را در نظر بگیرید. این طرح قیمت سهم را برای Yandex نشان می دهد. این روزهایی است که ما شایعاتی شنیده ایم که یکی از بانک ها قصد دارد یاندکس را به دست بگیرد. معمولاً در میان چنین شایعاتی که قیمت سهم در آن افزایش می یابد ، زیرا این بدان معنی است که خریدار قصد خرید سهام از بازار را دارد ، بنابراین تقاضا را افزایش می دهد. این بار سرمایه گذاران تصمیم گرفتند که اینها خبر خوبی نیستند.

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

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

تمرین

از نظر تئوری ، تئوری و عمل بسیار بهم پیوسته است ، اما در عمل ، اینگونه نیستند. در اینجا ما قصد داریم چیزی را پیش بینی کنیم و ببینیم چه اتفاقی می افتد.

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

ما قیمت های روزانه را پیش بینی خواهیم کرد ، به این معنی که یک روز در مجموعه داده با یک مقدار واحد نشان داده می شود. ما برای چند روز قبل قیمت نزدیک را با استفاده از قیمت های نزدیک پیش بینی خواهیم کرد. ما از Maersk به عنوان شرکت آزمایش استفاده خواهیم کرد. ما داده ها را با استفاده از بسته yfinance python دریافت خواهیم کرد. باید در نظر بگیریم که یاهو ممکن است API خود را تغییر دهد ، بنابراین بسته ممکن است کار غیر منتظره ای را متوقف کند. این حداقل یک بار اتفاق افتاده است ، بنابراین ما باید برای تغییرات دیگر آماده شویم. بنابراین ، بیایید بسته را نصب کنیم:

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

ما هنوز هیچ داده‌ای را دانلود نکرده‌ایم، فقط شیئی را ایجاد کرده‌ایم که بتوانیم از آن برای درخواست داده استفاده کنیم. Yahoo Finance اطلاعات سود سهام را برای Maersk فراهم می کند و همانطور که قبلاً دیدیم، سود سهام بر قیمت سهام تأثیر می گذارد. بنابراین ما می خواهیم شبکه عصبی هنگام پیش بینی قیمت ها، سود سهام را در نظر بگیرد. این به این معنی است که وقتی به شبکه می‌گوییم قیمت بسته شدن یک روز خاص را با استفاده از مجموعه‌ای از قیمت‌های روزهای قبل پیش‌بینی کند، باید یک نشانگر نیز برای آن ارائه کنیم که نشان دهد آیا سود سهام در آن روز پرداخت شده است یا خیر. برای دریافت تاریخ پرداخت سود سهام، ویژگی maersk. dividends را بررسی کنید. برای بدست آوردن قیمت سهام روش تاریخچه را فرا می خوانیم. این روش چندین آرگومان می گیرد و ما به ویژه به دوره و فاصله علاقه مندیم.

آرگومان period دوره ای را تعریف می کند که برای آن داده ها را درخواست می کنیم. آرگومان برخی از مقادیر رشته از پیش تعریف شده را پشتیبانی می کند و ما از یکی از آنها استفاده خواهیم کرد. ما رشته «max» را پاس می‌کنیم که به آن می‌گوید همه داده‌های موجود را به ما می‌دهد: از اولین روزی که سهام در بازار در دسترس قرار گرفت تا امروز. با استفاده از آرگومان شروع و پایان می توان دوره دقیق را تعریف کرد. با این حال، از آنجایی که از تمام داده‌های موجود استفاده خواهیم کرد، از آرگومان نقطه استفاده می‌کنیم و «max» را پاس می‌کنیم.

پارامتر فاصله فاصله بین دو مقدار بعدی را به روش می گوید. یکی از مقادیر از پیش تعریف شده را می گیرد و از آنجایی که قرار است از قیمت های روزانه استفاده کنیم، '1d' را رد می کنیم.

در اینجا می توانید در مورد روش تاریخچه و استدلال های آن بیشتر بخوانید.

بنابراین، وقت آن رسیده است که برخی از داده ها را دریافت کنید!

اکنون متغیر history یک DataFrame پانداها را با قیمت ها نگه می دارد. بیایید به آنها نگاه کنیم:

زمان آماده سازی داده ها فرا رسیده است. هنگام طراحی یک شبکه عصبی برای پیش‌بینی سری‌های زمانی، باید تصمیم گرفت که شبکه چند ورودی داشته باشد. در مورد ما، ما باید تعداد قیمت های وارد شده به شبکه را برای پیش بینی قیمت بعدی انتخاب کنیم. از آنجایی که در حال حاضر این عدد را نمی دانیم، بهتر است بتوانیم مجموعه داده هایی را با مقادیر ورودی متفاوت تولید کنیم. خوشبختانه، توسعه‌دهندگان Keras قبلاً در مورد آن فکر کرده‌اند و اکنون Keras یک مولد برای سری‌های زمانی ارائه می‌کند که می‌تواند مجموعه داده‌هایی را با مقادیر مختلف ورودی تولید کند. در مورد پیش‌بینی سری‌های زمانی، هر دو مقدار ورودی و هدف از یک سری گرفته می‌شوند. به این معنی که ما از پنجره کشویی با اندازه j استفاده می کنیم، جایی که j تعداد مقادیری است که برای پیش بینی (j+1) -مین مقدار استفاده می کنیم. به عبارت دیگر، j عناصر بعدی ( ) سری زمانی را می گیریم، سپس عنصر (j+1) -امین (x₍ⱼ₊1₎) را می گیریم و آن را به عنوان مقدار هدف قرار می دهیم. جفت ( j مقادیر، (j+1) -th مقدار) یک مثال آموزشی واحد می سازد. برای ساختن یک مثال آموزشی دیگر، پنجره کشویی را یکی یکی جابجا می کنیم و به عنوان ورودی و x₍ⱼ₊₂₎ را به عنوان مقدار هدف استفاده می کنیم.

Keras کلاس TimeseriesGenerator را در اختیار ما قرار می دهد و ما از این کلاس برای تولید مجموعه آموزشی استفاده خواهیم کرد. تنها مشکل در اینجا این است که ما همچنین می خواهیم که شبکه سود سهام را در نظر بگیرد. بنابراین باید تابعی بنویسیم که از کلاس TimeseriesGenerator برای تولید مجموعه آموزشی استفاده کند و سپس خروجی ژنراتور را با اطلاعات مربوط به سود سهام غنی کند.

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

همانطور که می دانید، شبکه های عصبی با استفاده از Gradient Descent که گرادیان تابع هزینه را به کار می گیرد، آموزش داده می شوند. ساده ترین رویکرد فرض می کند که ما گرادیان تابع هزینه را با استفاده از کل مجموعه داده محاسبه می کنیم. با این حال، در اینجا نکات منفی وجود دارد. اولا، مجموعه داده ممکن است بسیار بزرگ باشد، که محاسبه گرادیان را بسیار وقت گیر می کند. ثانیاً، اگر مجموعه داده بسیار بزرگ باشد، آنگاه مقدار گرادیان نیز می‌تواند بسیار بزرگ باشد، آنقدر بزرگ که به سادگی در دقت ماشین قرار نگیرد. مسئله دوم، البته، معمولاً در موارد شدید مهم است (جناسی خفیف). برخی از افراد باهوش اشاره کرده اند که ما در واقع به مقدار گرادیان دقیق نیاز نداریم[4]. ما فقط به برآورد آن نیاز داریم که تعیین می کند برای به حداقل رساندن تابع هزینه در کدام جهت حرکت کنیم. بنابراین ما می‌توانیم شیب را با استفاده از زیرمجموعه کوچکی از مثال‌های آموزشی تخمین بزنیم. البته، ما در نهایت کل مجموعه داده را طی خواهیم کرد، اما نیازی به محاسبه گرادیان برای کل مجموعه داده به یکباره نیست. ما می توانیم مجموعه داده را به چندین زیر مجموعه به نام دسته تقسیم کنیم و در هر زمان فقط یک دسته را پردازش کنیم. وزن های شبکه را با استفاده از گرادیان محاسبه شده برای یک دسته به روز می کنیم. هنگامی که همه دسته ها را پردازش کردیم، می توانیم بگوییم که یک دوره آموزشی واحد را اجرا کرده ایم. در یک جلسه آموزشی، ممکن است بیش از یک دوره وجود داشته باشد، تعداد دقیق دوره‌ها به کار بستگی دارد. همین افراد باهوش تاکید می کنند که نمونه های آموزشی باید به هم ریخته شود[4]. این بدان معناست که یک جفت نمونه آموزشی بعدی نباید به یک دسته تعلق داشته باشد. بیایید تابع را آزمایش کنیم و مجموعه داده ای تولید کنیم که از چهار مقدار ورودی استفاده می کند.

بیایید به یک مثال واحد نگاه کنیم.

همانطور که می بینیم، یک مثال آموزشی یک بردار با چهار قیمت و یک پنجم ارزش اضافی است که نشان می دهد آیا سود سهام در آن روز پرداخت شده است یا خیر. توجه داشته باشید که مقادیر نسبتاً بزرگ هستند. در واقع، محدوده قیمت بسته از 767. 7 تا 12740. 0 شبکه های عصبی با چنین محدوده هایی به خوبی کار نمی کنند، بنابراین باید داده ها را نرمال سازی کنیم. ما از ساده ترین استراتژی عادی سازی، نرمال سازی MinMax استفاده خواهیم کرد.

از آنجایی که داده های اولیه را اصلاح کرده ایم، باید مجموعه داده را دوباره تولید کنیم.

بیایید به داده های نرمال شده نگاه کنیم.

همانطور که می بینیم، مقادیر اکنون از 0 تا 1 متغیر هستند. این کار را آسان تر می کند. با این حال، اکنون باید h. min() و h. max() را نگه داریم تا بتوانیم ورودی های شبکه را هنگام پیش بینی قیمت ها عادی سازی کنیم و خروجی آن را غیرعادی کنیم تا مقدار دقیق را بدست آوریم.

بالاخره نوبت به شبکه های عصبی می رسد. شبکه (n+1) ورودی، n برای قیمت و یکی برای نشانگر سود سهام و یک خروجی خواهد داشت. ما هنوز باید n را تعیین کنیم. برای این کار تابعی می نویسیم که یک شبکه عصبی با تعداد مشخصی ورودی ایجاد می کند. ما از عبارت input_shape=(n+1,) برای گنجاندن نشانگر سود استفاده می کنیم.

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

بیایید یک تابع دیگر بنویسیم. این تابع به ما کمک می کند تصمیم بگیریم که شبکه چه تعداد ورودی باید داشته باشد. این تابع تعداد ورودی‌ها را برای بررسی تعداد دوره‌هایی که باید برای آنها آموزش داده شود، می‌گیرد. این تابع یک شبکه ایجاد می کند، داده ها را برای آن آماده می کند، سپس شبکه را آموزش می دهد و عملکرد آن را در مجموعه آزمایشی ارزیابی می کند.

اکنون، بیایید شبکه‌هایی را با 2 تا 10 ورودی برای 20 دوره آموزش دهیم:

وقتی آموزش تمام شد، می‌توانیم خلاصه‌ای از کد زیر را دریافت کنیم:

با چاپ مقادیر model_stats می‌توانیم خلاصه را ببینیم:

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

اکنون می توانیم خطای تست را بسته به شماره ورودی شبکه رسم کنیم.

با نمودار، می توانیم ببینیم که کدام شبکه کمترین خطای تست را نشان داده است. نتیجه دقیق ممکن است با گذشت زمان بسته به میزان داده های تاریخی موجود از طریق Yahoo Finance تغییر کند.

یک مشاهده جالب وجود دارد. اگر کسی این اسکریپت را دو بار اجرا کند، انتظار می رود نتایج متفاوتی دریافت کند. به عبارت دیگر کمترین خطای تست توسط شبکه های مختلف تولید می شود. از آنجایی که تنها تفاوت بین شبکه‌ها تعداد ورودی‌ها است، پس می‌توان نتیجه گرفت که خطای تست آنقدر به تعداد ورودی‌ها بستگی ندارد. این به نوبه خود، از حدس و گمان اولیه حمایت می کند که ما نمی توانیم قیمت سهام را با یک شبکه عصبی پیش بینی کنیم. ظاهراً شبکه آموزش می دهد تا برخی از ورودی ها را نادیده بگیرد و به این نتیجه می رسد که خروجی به آنها بستگی ندارد.

به یاد داشته باشید که ما داده ها را عادی کرده ایم. حالا بیایید خطای دقیق شبکه ها را محاسبه کنیم.

وای! خطاها بسیار زیاد است. حتی برای شبکه ای که کمترین خطای تست را نشان داده است، خطای دقیق بسیار زیاد است. صادقانه بگویم، من به شبکه ای با چنین خطاهایی در هنگام تصمیم گیری برای خرید سهام اعتماد نمی کنم. به دیگران هم توصیه نمی کنم که به آن اعتماد کنند.

اکنون می توانیم نموداری را ترسیم کنیم که قیمت های دقیق و پیش بینی شده را با هم مقایسه می کند.

همانطور که می بینید نمودارها اغلب مطابقت ندارند.

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

باید توجه داشته باشیم که خود شبکه قیمت سهام را پیش بینی نمی کند. در عوض، سعی می کند با استفاده از مقادیر داده شده، مقدار بعدی یک سری را حدس بزند. این به این دلیل است که قیمت نحوه تغییر دفعه بعد را رمزگذاری نمی کند. اگر قیمت برای مدتی رشد کند، هیچ تضمینی وجود ندارد که در دقیقه بعد کاهش پیدا نکند. قیمت بیشتر تحت تأثیر رویداد خارجی است که شبکه از آن آگاه نیست.

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

اگر به نمودارهای قیمت سهام دقیق تر نگاه کنیم، می بینیم که تغییرات تصادفی به نظر می رسند. اگر ما فقط قیمت ها را داشته باشیم و هیچ ایده ای در مورد رویدادهای خارجی نداشته باشیم، احتمالاً این درست است. بنابراین، قیمت سهام در واقع مانند یک مارتینگل به نظر می رسد، فرآیندی که ما نمی توانستیم پیش بینی کنیم. من با Chollet موافقم، بهتر است قیمت سهام را با یک شبکه عصبی پیش بینی نکنید.

به روز رسانی

من به پست دیگری در اینجا در Towards Data Science برخوردم که به پیش بینی سهام اختصاص دارد. نویسنده سعی کرد با استفاده از تحلیل فنی شبکه عصبی را با مقادیر بیشتری تغذیه کند که می تواند برای پیش بینی استفاده کند. با این حال، نویسنده موفق نشد، او به این نتیجه رسید که قیمت سهام عمدتاً یک فرآیند تصادفی است که بر اساس مقادیر خود قابل پیش بینی نیست. این نتیجه گیری با یافته های این پست مطابقت دارد: شما نمی توانید قیمت سهام را با یک شبکه عصبی حتی با استفاده از تجزیه و تحلیل فنی برای به دست آوردن آمار بیشتر برای داده ها پیش بینی کنید.

  • نویسنده : اژدرزاده اسكوئي مهزاد
  • منبع : thesundayschool.space
  • بدون دیدگاه

ثبت دیدگاه

مجموع دیدگاهها : 0در انتظار بررسی : 0انتشار یافته : ۰
قوانین ارسال دیدگاه
  • دیدگاه های ارسال شده توسط شما، پس از تایید توسط تیم مدیریت در وب منتشر خواهد شد.
  • پیام هایی که حاوی تهمت یا افترا باشد منتشر نخواهد شد.
  • پیام هایی که به غیر از زبان فارسی یا غیر مرتبط باشد منتشر نخواهد شد.