یادگیری ماشینی این روزها در حال پیشرفت و محبوبیت فزایندهای است و تعداد بیشتری از مردم جهان آن را همچون گوی جادویی میبینند (پیشبینی اینکه چه زمانی و چه اتفاقی در آینده رخ خواهد داد). این آزمایش از شبکههای عصبی مصنوعی برای نمایش ترندهای بازار سهام استفاده میکند و توانایی پیشبینی سریزمانی را به منظور پیشبینی قیمتهای بعدی سهم بر اساس اطلاعات گذشته را دارد.
سلب مسئولیت: نوسانات بازار سهام به دلیل عوامل متعدد، پویا و غیرقابل پیشبینی هستند و این آزمایش صرفاً جهت اهداف آموزشی است و به هیچ وجه ابزاری برای پیشبینی معاملات نمیباشد.
این آزمایش شامل چهار بخش است:
پیش از اینکه بتوانیم شبکه عصبی را آموزش دهیم و هرگونه پیشبینی انجام دهیم، نیازمند داده هستیم. نوع دادهای که به دنبال آن هستیم سریزمانی (دنبالهای از اعداد به ترتیب زمانی) است. یک جای مناسب برای به دست آوردن این اطلاعات سایت فناوری بورس تهران است. این سایت به ما اجازه میدهد که دادههای زمانی را راجع به قیمتهای معاملات سهام شرکتها از ۲۰ سال گذشته به دست آوریم.
این سایت مقادیر زیر را در اختیار میگذارد:
برای آمادهسازی مجموعه دادههای آموزشی برای شبکه عصبی ما، ما از قیمتهای بستهشده سهام استفاده میکنیم؛ که همچنین به این معناست که ما به دنبال پیشبینی قیمت بستهشده آینده هستیم.
پس از دریافت فایل اکسل از سایت فناوری بورس تهران اکسل را در این بخش اضافه کنید تا اطلاعات مورد نیاز دریافت شود
برای این آزمایش، ما از یادگیری نظارتشده استفاده میکنیم، که به این معناست اطلاعات را به شبکه عصبی میدهیم و این شبکه با نگاشت دادههای ورودی به برچسب خروجی یاد میگیرد. یکی از روشهای آمادهسازی مجموعه دادههای آموزشی، استخراج میانگین متحرک ساده از دادههای سریزمانی است.
میانگین متحرک ساده (SMA) یک روش برای شناسایی جهت روندها در یک دوره زمانی معین است، که با نگاه کردن به میانگین همه ارزشها در آن دوره زمانی محاسبه میشود. تعداد قیمتها در یک دوره زمانی به صورت تجربی انتخاب میشود. به عنوان مثال، فرض کنید قیمتهای بسته شدن در ۵ روز گذشته ۱۳، ۱۵، ۱۴، ۱۶، ۱۷ بوده است، SMA برابر خواهد بود با (۱۳+۱۵+۱۴+۱۶+۱۷)/۵ = ۱۵. پس ورودی برای مجموعه دادههای آموزشی ما مجموعه قیمتها در یک دوره زمانی واحد، و برچسب میانگین متحرک محاسبهشده از این قیمتها است.
شروع کنیمحتما ابتدا، از مرحله قبلی دادههای سهام را واکش کنید.
حال که شما دادههای آموزشی را دارید، وقت آن است تا یک مدل برای پیشبینی دادههای سری زمانی بسازید، برای این کار ما از کتابخانه TensorFlow.js استفاده خواهیم کرد.
مدل Sequential انتخاب شده که به سادگی هر لایه را به هم متصل میکند و اطلاعات را از ورودی به خروجی در طول فرآیند آموزش انتقال میدهد. برای اینکه مدل بتواند دادههای سری زمانی که پشت سر هم هستند را بیاموزد، لایه شبکههای عصبی بازگشتی (RNN) ایجاد شده و تعداد سلولهای LSTM به RNN اضافه میشوند.
مدل با استفاده از الگوریتم بهینهسازی محبوب Adam (بیشتر بخوانید) آموزش داده خواهد شد. از خطای میانگین مربعات اصلاحشده برای تعیین تفاوت بین مقادیر پیشبینیشده و مقادیر واقعی استفاده میشود، بنابراین مدل میتواند با کم کردن خطا در طی فرآیند آموزش یاد بگیرد.
اینها پارامترهای Metacognition (پارامترهای استفادهشده در فرآیند آموزش) هستند که برای تنظیم در دسترس هستند:
میتوانید پارامترهای Metacognition را تنظیم کنید و سپس دکمه آغاز آموزش مدل را برای آموزش مدل بزنید.
نیاز به دادههای آموزشی دارید؟ بخش قبلی را برای آمادهسازی دادههای آموزشی کاوش کنید.
حالا که مدل خود را آموزش دادهاید، زمان آن رسیده که از تابع model.predict در TFJS برای پیشبینی مقادیر آینده استفاده کنید. ما اطلاعات را به دو بخش تقسیم کردهایم، یک زیرمجموعه از اطلاعات برای آموزش و بقیه برای مجموعه اعتبارسنجی استفاده میشود. مجموعه آموزشی برای تمرین مدل استفاده شدهاند، بنابراین مجموعه اعتبارسنجی برای اعتبارسنجی مدل استفاده خواهد شد. از آنجا که مدل قبلاً اطلاعات را در مجموعه اعتبارسنجی ندیده است، خوب خواهد بود اگر مدل بتواند مقادیری نزدیک به مقادیر دقیق پیشبینی کند.
آزمایش کنیدبیایید از دادههای باقیمانده برای پیشبینی استفاده کنیم تا ببینیم چقدر مقادیر پیشبینیمان با مقادیر واقعی مطابقت دارند.
اما اگر مدل مقادیری را پیشبینی نکرد که به مقادیر واقعیشان نزدیک باشند، نمودار ضرر آموزشی را چک کنید. به طور کلی، این مدل باید با کاهش ضرر به کمتر از 1 همگرا شود. شما میتوانید تعداد دورهها را افزایش دهید، یا پارامترهای فرا یادگیری دیگری را تنظیم کنید.
مدلی برای انجام پیشبینی ندارید؟ مدل خود را آموزش دهید.
سرانجام، مدل اعتبارسنجی شده و مقادیر پیشبینیشده به خوبی با مقادیر واقعی همپوشانی دارند، حال ما از آن برای پیشبینی آینده استفاده خواهیم کرد. ما همان تابع model.predict را به کار خواهیم بست و آخرین {{input_windowsize}} نقاط داده را به عنوان ورودی استفاده خواهیم کرد، زیرا این اندازه دوره ما است. این بدان معناست که، اگر دادههای آموزشی ما روزانه تکمیل شوند، ما از {{input_windowsize}} روز گذشته به عنوان ورودی استفاده خواهیم کرد، برای پیشبینی روز بعد.
آزمایش کنیدمدلی برای انجام پیشبینی ندارید؟ مدل خود را آموزش دهید.
چرا مدل من عملکرد خوبی ندارد؟
این مدل هیچگاه دادههای مشابهی در گذشته ندیده است. در روز ۲۰ مرداد ۱۳۹۹ شاخص بورس درحالی که به تازگی عدد ۲ میلیون واحد را رد کرده بود شروع به ریزش کرد تا تاریخ ۸ مهر ۱۳۹۹ حدوداً ۲۵ درصد از ارزش خود را از دست داد. البته برخی از شرکتها افت تا ۷۰ درصد را تجربه کردند. در روز دوشنبه ۲۸ مهر ۹۹ شاخص بورس باقدرت بسیار حمایت ۱۵۰۰۰۰۰ را از دست داد.
ما میتوانیم ویژگیهای بیشتری اضافه کنیم. به طور کلی، ویژگیهای بیشتر معمولاً باعث بهبود عملکرد مدل
میشوند. میتوانیم شاخصهای معاملاتی مانند همگرایی میانگین متحرک (MACD)، شاخص قدرت نسبی (RSI) یا
نوارهای بولینگر را بگنجانیم.
حتی ویژگیهای بیشتری اضافه کنید. یکی از چیزهای شگفتانگیزی که سایت فناوری بورس ارائه میدهد، دادههای بنیادی است. این به آن معنی است که شما همچنین میتوانید
صورتهای درآمد سالانه و فصلی و جریانهای نقدی شرکت مورد علاقه خود را بگنجانید. که میداند، شاید این
ویژگیها مفید باشند.
ممکن است دلایل بسیار دیگری وجود داشته باشد که مدل موفق به یادگیری و پیشبینی نمیشود. این چالش
یادگیری ماشین است؛ ساخت مدلهایی با عملکرد خوب هم هنر است و هم علم.
راههای بسیاری برای پیشبینی سری زمانی به غیر از استفاده از میانگین متحرک ساده وجود دارد.
امکان دیگر این است که این کار را با دادههای بیشتری از منابع مختلف پیادهسازی کنیم.
با TensorFlow.js، یادگیری ماشین در مرورگر وب امکانپذیر است و واقعاً بسیار جالب است.
این آزمایش ۱۰۰٪ آموزشی است و به هیچ وجه ابزاری برای پیشبینی معاملات
نیست.