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


مهمترین سؤالی که با شنیدن اصطلاحاتی نظیر «بیتکوین» (Bitcoin) و «ارز مجازی» (Virtual Currency) در ذهن بسیاری از مردم شکل میگیرد این است که مفهوم «ارز دیجیتال» (Digital Currency) یا ارز مجازی چیست؟ ارز دیجیتال یا مجازی که در زبان انگلیسی به آن Cryptocurrency گفته میشود، ارزی دیجیتال است که از روشهای «رمزنگاری» (Cryptography) بسیار قدرتمند برای تضمین امنیت آن استفاده میشود. به دلیل استفاده از روشهای امنیتی و رمزنگاری بسیار قدرتمند، «جعل» (Counterfeit) ارزهای دیجیتال بسیار سخت است. ارز دیجیتال، یک دارایی دیجیتال است که با هدف ایجاد یک «واسط داد و ستد» (Medium of Exchange) برای «تراکنشهای مالی» (Financial Transactions) و صحت سنجی «انتقال داراییها» (Transfer of Assets) ایجاد شده است. بسیاری از ارزهای دیجیتال، «سیستمهای غیرمتمرکزی» (Decentralized Systems) هستند که بر اساس فناوریهایی نظیر «بلاكچين» (Blockchain) بنا نهاده شدهاند. سودآوری بالای این ارز دیجیتال، بسیاری از افراد را به سمت ایجاد روشهایی برای پیش بینی قیمت بیت کوین سوق داده است. مهمترین ارزهای دیجیتالی که تاکنون تولید شدهاند، عبارتند از:
- ارز دیجیتالی بیتکوین (Bitcoin)
- ارز دیجیتالی لایتکوین (Litecoin)
- ارز دیجیتالی اتریوم (Ethereum)
- ارز دیجیتالی ریپل (Ripple)
در این میان، بیتکوین، پر استفادهترین و مهمترین ارز دیجیتالی است. در طی چند سال اخیر، بازار ارزهای دیجیتال نوسان به شدت زیادی را تجربه کرده است. قیمت ارز دیجیتالی بیتکوین، در تاریخ 16 دسامبر 2017 میلادی به بالاترین حد در تاریخ خود، یعنی رقم بیسابقه 20 هزار دلار رسید. با این حال، از ابتدای سال 2018 میلادی، شیب تند قیمت بیتکوین شروع شد و این ارز دیجیتال در سرازیری کاهش قیمت افتاد. به طور کلی، قیمت بیتکوین از ابتدای حیات خود تاکنون، فراز و نشیب زیادی به خود دیده است. با نگاهی گذرا به بازه تغییرات قیمت بیتکوین (شکل زیر) در طول چند سال اخیر، به راحتی مشخص میشود که قیمت آن، هنوز هم در سطح بالایی قرار دارد. با این اوصاف، پیش بینی قیمت بیت کوین میتواند سود سرشاری عاید افراد کند. واقعیت تکاندهنده دیگر در مورد ارز دیجیتالی بیتکوین این است که قیمت آن در سه سال پیش، چیزی در حدود یک دهم قیمت کنونی آن بود. نمودار تغییرات قیمت بیتکوین در طی چند سال گذشته، در شکل زیر نمایش داده شده است.
بدون شک، ایجاد روشهایی برای پیش بینی قیمت بیت کوین، برای هر شخصی که با این حوزه آشنایی دارد، بسیار هیجانبرانگیز و وسوسهانگیز خواهد بود. اولین قدم در جهت پیش بینی قیمت بیت کوین، مطالعه دلایل نوسان (سقوط یا افزایش) قیمت آن در جهان است. در این زمینه، نظربههای متفاوتی وجود دارد که ریشه در دلایل سیاسی، اقتصادی و اجتماعی دارد. با این حال، در این مطلب سعی شده است تا از دیدگاهی متفاوت برای مدلسازی نوسان قیمت بیتکوین در چند سال اخیر و پیشبینی قیمت آن در آینده استفاده شود. در این مطلب، از دیدگاه الگوریتمی برای پیش بینی قیمت بیت کوین استفاده شده است. به بیان دیگر، هدف این است که از «دادههای تاریخی عددی» (Numerical Historical Data) برای آموزش یک «شبکه عصبی بازگشتی» (Recurrent Neural Network) استفاده شود. شبکه عصبی بازگشتی، رفتار دادههای آموزشی را یاد میگیرد و آن را مدلسازی میکند. سپس، از شبکه عصبی آموزش دیده برای پیش بینی قیمت بیت کوین استفاده میشود.
جمعآوری قیمتهای تاریخی بیتکوین
منابع اندکی برای جمعآوری دادههای تاریخی، در رابطه با قیمت بیتکوین وجود دارد. برخی از این منابع، اطلاعات مرتبط با قیمت بیتکوین را در قالب مجموعه دادههای ساخت یافته در اختیار کاربران قرار میدهند. کاربران، باید این اطلاعات را به صورت دستی از این منابع «بارگیری» (Download) و پس از آمادهسازی، در الگوریتمهای پیادهسازی شده استفاده کنند. منابع دیگر، یک «واسط برنامهنویسی کاربردی» (Application Programming Interface) در اختیار کاربران قرار میدهند تا از این طریق، اطلاعات مرتبط با قیمت بیتکوین را جمعآوری کنند. استفاده از واسط برنامهنویسی کاربردی برای جمعآوری دادهها، دو مزیت عمده برای الگوریتم پیادهسازی شده به ارمغان میآورند:
- اطلاعات جمعآوری شده به روز خواهند بود؛ در نتیجه، دقت مدل پیشبینی قیمت بیتکوین افزایش خواهد یافت.
- اطلاعات جمعآوری شده به صورت «بلادرنگ» (Real-Time)، برای یکپارچهسازی با مدل یادگیری پیادهسازی شده در دسترس خواهند بود.
از جمله بهترین واسطهای برنامهنویسی کاربردی ارائه شده برای جمعآوری قیمت بیتکوین، واسط ارائه شده توسط وبسایت (CoinRanking.com) است که اطلاعات به روز و دقیقی از قیمتهای لحظهای بیتکوین در اختیار کاربران قرار میدهد.
شبکههای عصبی بازگشتی
از آنجایی که دادههای تاریخی مرتبط با قیمت بیتکوین از نوع دادههای «سری زمانی» (Time Series) هستند، استفاده از «شبکههای عصبی پیشخور» (Feedforward Neural Networks) پیشنهاد نمیشود. این دسته از شبکههای عصبی برای پیشبینی بر اساس دادههای سری زمانی قیمت بیتکوین مناسب نیستند؛ زیرا، قیمت روز آینده بیتکوین همبستگی بسیار زیادی به قیمت امروز بیتکوین دارد و نه قیمت یک ماه گذشته آن. شبکه عصبی بازگشتی، دستهای از «شبکههای عصبی مصنوعی» (Artificial Neural Networks) است که در آن ارتباطات میان نودها (نرونها)، «گرافی جهتدار» (Directed Graph) در راستای یک «دنباله زمانی» (Temporal Sequence) تشکیل میدهد.
ویژگی مهم شبکههای عصبی بازگشتی، توانایی نمایش رفتار پویای یک دنباله زمانی است. شبکه عصبی بازگشتی قادر است از وضعیت داخلی خود برای پردازش این دنبالهها استفاده کند. در عمل، چنین امکانی از طریق اضافه کردن لایههایی نظیر «حافظه کوتاه مدتِ بلند» (long Short-Term Memory) و «واحد بازگشتی محصور» (Gated Recurrent Unit) به شبکههای عصبی بازگشتی حاصل میشود. در شکل زیر، تفاوت میان معماریهای یک شبکه عصبی پیشخور معمولی و یک شبکه عصبی بازگشتی نمایش داده شده است. همانطور که ملاحظه میشود برخلاف شبکههای عصبی پیشخور، در شبکههای عصبی بازگشتی، دادهها میتوانند در دو جهت در شبکه جریان پیدا کنند؛ از سمت ورودی به سمت خروجی و برعکس.
روش پیشنهادی برای پیش بینی قیمت بیت کوین
برای اینکه بتوان یک مدل هوشمند یادگیری برای آموزش شبکه عصبی بازگشتی روی دادههای تاریخی قیمت بیتکوین و در نهایت، پیش بینی قیمت بیت کوین در روز آینده طراحی کرد، لازم است تا مراحل زیر، جهت تضمین عملکرد مناسب مدل پیشیبینی طی شوند:
- جمعآوری، «پاکسازی» (Cleaning) و «نرمالسازی» (Normalizing) دادههای تاریخی مرتبط با قیمت بیتکوین.
- طراحی مدل شبکه عصبی بازگشتی با واحد حافظه کوتاه مدتِ بلند (LSTM).
- آموزش شبکه عصبی بازگشتی طراحی شده روی دادههای تاریخی مرتبط با قیمت بیتکوین و ذخیرهسازی مدل آموزش داده شده.
- پیش بینی قیمت بیت کوین در روز آینده توسط شبکه آموزش دیده و در آخر، «تبدیل» (Deserialize) خروجی شبکه عصبی (منظور از تبدیل در این مطلب، تبدیل فرم سری دادهها به فرمت دادههای مورد نیاز برای نمایش قیمت بیتکوین است).
جمعآوری، پاکسازی و نرمالسازی دادهها
در این بخش، راهکارهای لازم برای جمعآوری دادههای تاریخی مورد نیاز برای آموزش شبکه عصبی، پاکسازی دادههای جمعآوری شده و در نهایت، نرمالسازی آنها ارائه میشود.
جمعآوری دادههای تاریخی قیمت بیتکوین
همانطور که پیش از این نیز اشاره شد، بهترین راه جمعآوری دادههای مورد نیاز برای آموزش شبکه عصبی، استفاده از واسطهای برنامهنویسی کاربردی ارائه شده برای چنین کاری است. در این مطلب، از واسط برنامهنویسی کاربردی وبسایت (CoinRanking.com) برای جمعآوری دادههای مرتبط با قیمت بیتکوین استفاده شده است. چنین کاری به ما اجازه میدهد که بلافاصله پس از جمعآوری دادهها، آنها را به ساختارهای دادهای قابل تعریف توسط بسته نرمافزاری (Pandas) در زبان برنامهنویسی پایتون تبدیل کنیم. برای چنین کاری از قطعه کد زیر استفاده میشود:
با مطالعه این کد مشخص میشود که تابع تعریف شده برای چنین کاری، دادههای مرتبط با قیمت بیتکوین در پنج سال اخیر را جمعآوری میکند. همچنین، قیمت بیتکوین بر اساس «دلار آمریکا» (US Dollar) نمایش داده خواهد شد. با این حال، این امکان برای کاربران فراهم شده است تا دادههای قیمت بیتکوین را در بازههای زمانی مختلف و با واحدهای قیمتی متفاوت جمعآوری کنند.
پاکسازی و نرمالسازی دادههای جمعآوری شده
پس از جمعآوری دادهها و تبدیل آنها به ساختارهای دادهای (Pandas)، لازم است توابعی تعریف شوند تا دادههای جمعآوری شده، برای آموزش شبکه عصبی بازگشتی آماده شوند. این توابع عبارتند از:
- یک تابع خاص برای تولید ماتریس دادههای قیمت بیتکوین (در این ماتریس، هر سطر حاوی 30 ستون است و هر ستون بیانگر قیمت بیتکوین در یک روز خاص خواهد بود).
- یک تابع خاص برای نرمالسازی دادههای جمعآوری شده جهت آموزش شبکه عصبی (دادهها به شکلی نرمالسازی میشوند که هر نمونه، به جای نمایش قیمت بیتکوین، درصد تغییرات قیمت از نقطه آغازین را نشان دهد).
- یک تابع خاص برای تقسیم دادههای جمعآوری شده به دادههای «آموزشی» (Train) و «تست» (Test) (در این مطلب، از توابع پیش فرض بسته نرمافزاری scikit-learn در زبان برنامهنویسی پایتون استفاده نشده است؛ دلیل این کار، حفظ ترتیب دادههای سری زمانی جمعآوری شده برای آموزش صحیح شبکه عصبی است).
از قطعه کد زیر، برای آمادهسازی دادههای جمعآوری شده استفاده میشود.
طراحی مدل شبکه عصبی بازگشتی با واحد حافظه کوتاه مدتِ بلند
پس از پاکسازی دادههای جمعآوری شده، نوبت طراحی مدل شبکه عصبی بازگشتی است. از دادههای پاکسازی و نرمالسازی شده، برای آموزش شبکه عصبی طراحی شده استفاده میشود. برای چنین کاری، از بسته نرمافزاری (Keras) و واحدهای قابل تعریف توسط آن، جهت طراحی شبکه عصبی بازگشتی استفاده میشود. با استفاده از قطعه کد زیر، شبکه عصبی بازگشتی و پارامترهای آن (نظیر ابعاد دادههای ورودی، ابعاد بردار خروجی، تعداد «دورهای» (Epoch) لازم برای آموزش شبکه عصبی، «تابع زیان» (Loss Function) لازم برای ارزیابی مدل، «بهینهساز» (Optimizers) شبکه عصبی بازگشتی، طول دنباله سری زمانی و سایر موارد) تعریف میشوند. شایان توجه است که این قابلیت برای کاربران وجود دارد که پارامترهای شبکه طراحی شده را مطابق با نیازهای مسأله خود تغییر دهند.
در مرحله بعد با استفاده از قطعه کد زیر، یک «مدل ترتیبی» (Sequential Model) با دو واحد حافظه کوتاه مدتِ بلند (LSTM) و دو «لایه متراکم» (Dense Layer) طراحی میشود.
آموزش شبکه عصبی بازگشتی و ذخیره مدل آموزش دیده
پس از طراحی مدل شبکه عصبی بازگشتی برای پیش بینی قیمت بیت کوین، وقت آن فرا رسیده است که مدل شبکه عصبی را روی دادههای آماده شده، آموزش دهیم. همچنین، این امکان وجود دارد که زمان پردازشی لازم برای آموزش این شبکه را نیز محاسبه کنیم. برای آموزش شبکه عصبی و محاسبه زمان پردازشی، از قطعه کد زیر استفاده میشود.
در مرحله بعد، مدل آموزش دیده را ذخیره میکنیم. یکی از ویژگیهای مهم بسته نرمافزاری (Keras)، امکان ذخیره سازی یک مدل آموزش دیده است. همچنین، میتوان مدل آموزش دیده ذخیره شده را در دفعات آتی و یا در کدهای دیگر بارگذاری و استفاده کنیم. چنین کاری با استفاده از قطعه کد زیر انجام میشود.
پیش بینی قیمت بیت کوین در روز آینده و تبدیل خروجی
پس از اینکه مرحله آموزش شبکه عصبی بازگشتی روی دادههای تاریخی قیمت بیتکوین به پایان رسید، در مرحله بعد لازم است دادههای مرتبط با قیمت کنونی بیتکوین جمعآوری شوند تا برای تولید پیشبینی توسط مدل آموزش دیده مورد استفاده قرار بگیرند. از آنجایی که دادههای استفاده شده برای آموزش شبکه عصبی نرمالسازی شدهاند، دادههای جمعآوری شده از قیمت کنونی بیتکوین نیز باید نرمالسازی شوند. بنابراین، پس از انجام پیشبینی توسط مدل، لازم است تا خروجیهای پیشبینی شده، از حالت نرمالسازی شده خارج و به حالت ابتدایی خود (قیمت بیتکوین به دلار آمریکا) بازگردانده شوند. در مرحله اول، دادههای مرتبط با قیمت کنونی بیتکوین (قیمت طی روز 30 روز گذشته)، با استفاده از قطعه کد زیر جمعآوری میشوند. در این قطعه کد، دادههای لازم برای تولید پیشبینی جمعآوری و آمادهسازی میشوند.
پس از پاکسازی و آمادهسازی دادهها، مدل آموزش دیده بارگذاری و از آن برای پیش بینی قیمت بیت کوین در روز آینده استفاده میشود.
نکته شایان توجه در مورد پیشبینیهای تولید شده توسط مدل آموزش دیده این است که خروجیهای تولید شده، مقادیری بین 1 و 1- دارند؛ در نتیجه، نمیتوان بر اساس آنها قیمت روز آینده بیتکوین را پیشبینی کرد. در نتیجه، نیاز است تا خروجیهای تولید شده از حالت نرمال خارج و به حالت اصلی خود بازگردانده شوند. یا استفاده از قطعه کد زیر و از طریق تعریف یک تابع خاص، به راحتی میتوان چنین کاری را انجام داد.
با استفاده از کد زیر، تابع بالا فراخوانی شده و قیمت روز آینده بیتکوین استخراج میشود. به عبارت دیگر، با استفاده از کد زیر، پیشبینی مدل شبکه عصبی از قیمت روز آینده بیتکوین (بر اساس دلار آمریکا) نمایش داده خواهد شد.
تبدیل دادههای خروجی (پیشبینیهای انجام شده) و تولید نمودار
شاید بسیاری از کاربران تمایل داشته باشند که نتایج کلی مدل شبکه عصبی بازگشتی را در قالب نمودار داشته باشند. به عبارت دیگر، به جای پیش بینی قیمت بیت کوین در یک روز آینده، قیمت برای یک بازه زمانی خاص پیشبینی و با مقادیر واقعی قیمت بیتکوین مقایسه شود. از طریق چنین رویکردی، تصویر واضحتری از عملکرد مدل شبکه عصبی در پیش بینی قیمت بیت کوین ترسیم میشود. برای چنین کاری، میتوان از ساختار دادهای X_test (این ساختار دادهای، در کدهای مرتبط با آموزش شبکه عصبی قابل بررسی است) استفاده کرد که در مرحله آموزش شبکه عصبی بازگشتی تعریف شده است. بنابراین، ابتدا مدل آموزش دیده بارگذاری میشود. سپس، دادههای X_test به مدل آموزش دیده وارد میشوند تا مدل بتواند روی آنها و برای یک بازه زمانی خاص، قیمت بیتکوین را پیشبینی کند.
در نهایت، با استفاده از بسته نرمافزاری (Plotly) زبان برنامهنویسی پایتون و تنظیم کردن پارامترهای آن، امکان نمایش «مقادیر مشاهده شده» (Observation Values) و «مقادیر پیشبینی شده» (Prediction Values) در یک نمودار وجود دارد. برای چنین کاری، از قطعه کد زیر استفاده میشود.
با اجرای کد بالا، نموداری به شکل زیر برای شما تولید خواهد شد. در این نمودار، مقادیر واقعی قیمت بیتکوین در یک بازه زمانی خاص به همراه مقادیر پیشبینی شده قیمت بیتکوین توسط مدل شبکه عصبی بازگشتی (در همان بازه زمانی)، نمایش داده شده است.
میزان قابل اعتماد بودن نتایج پیشبینی
با مقایسه بصری میان مقادیر واقعی و مقادیر پیشبینی شده قیمت بیتکوین، میتوان دریافت که پیشبینیهای انجام شده تا حدی با مقادیر واقعی سازگار هستند. با این حال، باید به این نکته مهم توجه شود که اگرچه الگوهای قیمتی با یکدیگر تطابق زیادی دارند، ولی مقادیر قیمتهای پیشبینی شده با قیمتهای واقعی بیتکوین، تفاوت چشمگیری دارند. به ویژه، با بررسی قیمتهای واقعی و پیشبینی قیمتها بهصورت روزانه، این واقعیت بیشتر آشکار خواهد شد. بنابراین، برای دستیابی به نتایج بهتر، باید کد پیادهسازی شده در این مطلب مورد بررسی قرار بگیرد و با تنظیم بهینه پارامترها، عملکرد مدل در پیشبینی قیمتها بهتر شود.
جمعبندی
در این مطلب، نحوه طراحی و آموزش شبکه عصبی بازگشتی برای پیش بینی قیمت بیت کوین در اختیار مخاطب قرار گرفته است. ویژگی مهم این آموزش، توانایی ذخیره کردن مدل آموزش دیده برای یکپارچهسازی آن با برنامههای کاربردی تحت وب یا موبایل است. این آموزش، مجموعهای از مفاهیم حوزه هوش مصنوعی و دادهکاوی را برای کاربرد در حوزه مالی، با یکدیگر ترکیب میکند. نکته مهم و شایان توجه در رابطه با کدهای ارائه شده در این مطلب این است که این کدها، یک پیادهسازی ساده از مدلهای شبکه عصبی بازگشتی برای پیش بینی قیمت بیت کوین ارائه میدهند. این کدها و مدل «یادگیری ماشین» (Machine Learning) پیادهسازی شده، به هیچ وجه نباید به عنوان مبنایی برای تصمیمگیریهای مالی در زمینه خرید، فروش و یا داد و ستد ارز دیجیتالی مورد استفاده قرار بگیرند.
اگر نوشته بالا برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای دادهکاوی و یادگیری ماشین
- آموزش اصول و روشهای دادهکاوی (Data Mining)
- مجموعه آموزشهای هوش مصنوعی
- برترین الگوریتمهای پیشبینی در یادگیری ماشین (Machine Learning)
- پیشبینی قیمت سهام با کتابخانه کرس (Keras) — راهنمای کاربردی
- دستگاه ماینر بیت کوین چیست و چگونه کار می کند؟ | گام به گام و به زبان ساده
^^
باسلام این مقاله رو من اجرا کردم و بررسی کردم یک ایراد داره کد های این مقاله.
در نمودار آخر, پیش بینی ها یک گام عقب تر از قیمت اصلی هستند که این نمودار رو جذاب تر میکنه ولی در واقع نویسنده کد اشتباه کرده یا عمدا این کارو کرده.
در تابع deserializer در قطعه کد return [date, y_test, preds_original]
در واقع ایندکس 1 قیمت واقعی هست و ایندکس 2 قیمت پیش بینی شده.
ولی در قطعه کد ایجاد نمودار در مکان قیمت واقعی پیش بینی گذاشته و در قسمت قیمت پیش بینی قیمت واقعی
prices = pd.DataFrame({‘Predictions’:plotlist[1], ‘Real Prices’:plotlist[2]},index=plotlist[0])
در قسمت Predictions ایندکس 1 رو گذاشته که داده های واقعی یعنی y_test هستش و در قسمت Price ایندکس 2 رو گذاشته که قیمت پیش بینی شده هستش جای اینها رو اشتباه گذاشته که باعث سردرگمی در نمایش نمودار میشه
با سلام و احترام؛
صمیمانه از همراهی شما با مجله فرادرس و ارائه بازخورد سپاسگزاریم. اصلاحات لازم انجام شد.
برای شما آرزوی سلامتی و موفقیت داریم.
سلام کدهای مقاله بالا رو اصلاح و اجرا کردم و تو گیت هاب گذاشتم به آدرس زیر
https://github.com/MeysamRT76/BitCoin-AI
سلام آقاي دكتر .من با نرم افزار متلب كار كردم آيا كدهايي كه دربالا ذكر كرديد .مي شود با متلب جلو رفت .باتشكر
با سلام اون قطعه کد model.fit لون قسمت x_train و y_train دیفاین نشدن.راهنمایی میکنید؟
با سلام و تشکر از شما
لطفا دوره ای در زمینه بازه زمانی و پیش بینی قیمت ارز دیجیتال و بورس و ارز با یادگیری ماشین و هوش مصنوعی تدریس کنید ممنون میشم.
طرفدار زیاد داره ولی خب اموزشش نیست
سلام،
از تابع
train_test_split_
کجا استفاده کردید؟
با سلام؛
از همراهی شما با مجله فرادرس سپاسگزاریم. از این تابع در قطعه کد دوم ارائه شده در این مطلب،، برای تقسیم دادههای موجود در مجموعه داده به دو بخش دادههای «آزمون» (Test) و دادههای آموزش (Train) استفاده شده است. در این راستا، مطالعه مطلب زیر پیشنهاد میشود:
اعتبار سنجی متقابل (Cross Validation) — به زبان ساده
سلام خسته نباشید بابت مطالب خوبتون ممنونم! خب ما چطوری از این کدها استفاده کنیم؟ اگر امکانش هست این رو هم بفرمایید! چون خیلی ها بلد نیستن کد نویسی کنند