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

- ارز دیجیتالی بیتکوین (Bitcoin)
- ارز دیجیتالی لایتکوین (Litecoin)
- ارز دیجیتالی اتریوم (Ethereum)
- ارز دیجیتالی ریپل (Ripple)

در این میان، بیتکوین، پر استفادهترین و مهمترین ارز دیجیتالی است. در طی چند سال اخیر، بازار ارزهای دیجیتال نوسان به شدت زیادی را تجربه کرده است. قیمت ارز دیجیتالی بیتکوین، در تاریخ 16 دسامبر 2017 میلادی به بالاترین حد در تاریخ خود، یعنی رقم بیسابقه 20 هزار دلار رسید. با این حال، از ابتدای سال 2018 میلادی، شیب تند قیمت بیتکوین شروع شد و این ارز دیجیتال در سرازیری کاهش قیمت افتاد. به طور کلی، قیمت بیتکوین از ابتدای حیات خود تاکنون، فراز و نشیب زیادی به خود دیده است. با نگاهی گذرا به بازه تغییرات قیمت بیتکوین (شکل زیر) در طول چند سال اخیر، به راحتی مشخص میشود که قیمت آن، هنوز هم در سطح بالایی قرار دارد. با این اوصاف، پیش بینی قیمت بیت کوین میتواند سود سرشاری عاید افراد کند. واقعیت تکاندهنده دیگر در مورد ارز دیجیتالی بیتکوین این است که قیمت آن در سه سال پیش، چیزی در حدود یک دهم قیمت کنونی آن بود. نمودار تغییرات قیمت بیتکوین در طی چند سال گذشته، در شکل زیر نمایش داده شده است.

جمعآوری قیمتهای تاریخی بیتکوین
منابع اندکی برای جمعآوری دادههای تاریخی، در رابطه با قیمت بیتکوین وجود دارد. برخی از این منابع، اطلاعات مرتبط با قیمت بیتکوین را در قالب مجموعه دادههای ساخت یافته در اختیار کاربران قرار میدهند. کاربران، باید این اطلاعات را به صورت دستی از این منابع «بارگیری» (Download) و پس از آمادهسازی، در الگوریتمهای پیادهسازی شده استفاده کنند. منابع دیگر، یک «واسط برنامهنویسی کاربردی» (Application Programming Interface) در اختیار کاربران قرار میدهند تا از این طریق، اطلاعات مرتبط با قیمت بیتکوین را جمعآوری کنند. استفاده از واسط برنامهنویسی کاربردی برای جمعآوری دادهها، دو مزیت عمده برای الگوریتم پیادهسازی شده به ارمغان میآورند:
- اطلاعات جمعآوری شده به روز خواهند بود؛ در نتیجه، دقت مدل پیشبینی قیمت بیتکوین افزایش خواهد یافت.
- اطلاعات جمعآوری شده به صورت «بلادرنگ» (Real-Time)، برای یکپارچهسازی با مدل یادگیری پیادهسازی شده در دسترس خواهند بود.
از جمله بهترین واسطهای برنامهنویسی کاربردی ارائه شده برای جمعآوری قیمت بیتکوین، واسط ارائه شده توسط وبسایت (CoinRanking.com) است که اطلاعات به روز و دقیقی از قیمتهای لحظهای بیتکوین در اختیار کاربران قرار میدهد.
شبکههای عصبی بازگشتی

روش پیشنهادی برای پیش بینی قیمت بیت کوین
برای اینکه بتوان یک مدل هوشمند یادگیری برای آموزش شبکه عصبی بازگشتی روی دادههای تاریخی قیمت بیتکوین و در نهایت، پیش بینی قیمت بیت کوین در روز آینده طراحی کرد، لازم است تا مراحل زیر، جهت تضمین عملکرد مناسب مدل پیشیبینی طی شوند:
- جمعآوری، «پاکسازی» (Cleaning) و «نرمالسازی» (Normalizing) دادههای تاریخی مرتبط با قیمت بیتکوین.
- طراحی مدل شبکه عصبی بازگشتی با واحد حافظه کوتاه مدتِ بلند (LSTM).
- آموزش شبکه عصبی بازگشتی طراحی شده روی دادههای تاریخی مرتبط با قیمت بیتکوین و ذخیرهسازی مدل آموزش داده شده.
- پیش بینی قیمت بیت کوین در روز آینده توسط شبکه آموزش دیده و در آخر، «تبدیل» (Deserialize) خروجی شبکه عصبی (منظور از تبدیل در این مطلب، تبدیل فرم سری دادهها به فرمت دادههای مورد نیاز برای نمایش قیمت بیتکوین است).
جمعآوری، پاکسازی و نرمالسازی دادهها
در این بخش، راهکارهای لازم برای جمعآوری دادههای تاریخی مورد نیاز برای آموزش شبکه عصبی، پاکسازی دادههای جمعآوری شده و در نهایت، نرمالسازی آنها ارائه میشود.
جمعآوری دادههای تاریخی قیمت بیتکوین
با مطالعه این کد مشخص میشود که تابع تعریف شده برای چنین کاری، دادههای مرتبط با قیمت بیتکوین در پنج سال اخیر را جمعآوری میکند. همچنین، قیمت بیتکوین بر اساس «دلار آمریکا» (US Dollar) نمایش داده خواهد شد. با این حال، این امکان برای کاربران فراهم شده است تا دادههای قیمت بیتکوین را در بازههای زمانی مختلف و با واحدهای قیمتی متفاوت جمعآوری کنند.
پاکسازی و نرمالسازی دادههای جمعآوری شده
پس از جمعآوری دادهها و تبدیل آنها به ساختارهای دادهای (Pandas)، لازم است توابعی تعریف شوند تا دادههای جمعآوری شده، برای آموزش شبکه عصبی بازگشتی آماده شوند. این توابع عبارتند از:
- یک تابع خاص برای تولید ماتریس دادههای قیمت بیتکوین (در این ماتریس، هر سطر حاوی 30 ستون است و هر ستون بیانگر قیمت بیتکوین در یک روز خاص خواهد بود).
- یک تابع خاص برای نرمالسازی دادههای جمعآوری شده جهت آموزش شبکه عصبی (دادهها به شکلی نرمالسازی میشوند که هر نمونه، به جای نمایش قیمت بیتکوین، درصد تغییرات قیمت از نقطه آغازین را نشان دهد).
- یک تابع خاص برای تقسیم دادههای جمعآوری شده به دادههای «آموزشی» (Train) و «تست» (Test) (در این مطلب، از توابع پیش فرض بسته نرمافزاری scikit-learn در زبان برنامهنویسی پایتون استفاده نشده است؛ دلیل این کار، حفظ ترتیب دادههای سری زمانی جمعآوری شده برای آموزش صحیح شبکه عصبی است).
از قطعه کد زیر، برای آمادهسازی دادههای جمعآوری شده استفاده میشود.
طراحی مدل شبکه عصبی بازگشتی با واحد حافظه کوتاه مدتِ بلند
در مرحله بعد با استفاده از قطعه کد زیر، یک «مدل ترتیبی» (Sequential Model) با دو واحد حافظه کوتاه مدتِ بلند (LSTM) و دو «لایه متراکم» (Dense Layer) طراحی میشود.
آموزش شبکه عصبی بازگشتی و ذخیره مدل آموزش دیده
پس از طراحی مدل شبکه عصبی بازگشتی برای پیش بینی قیمت بیت کوین، وقت آن فرا رسیده است که مدل شبکه عصبی را روی دادههای آماده شده، آموزش دهیم. همچنین، این امکان وجود دارد که زمان پردازشی لازم برای آموزش این شبکه را نیز محاسبه کنیم. برای آموزش شبکه عصبی و محاسبه زمان پردازشی، از قطعه کد زیر استفاده میشود.
در مرحله بعد، مدل آموزش دیده را ذخیره میکنیم. یکی از ویژگیهای مهم بسته نرمافزاری (Keras)، امکان ذخیره سازی یک مدل آموزش دیده است. همچنین، میتوان مدل آموزش دیده ذخیره شده را در دفعات آتی و یا در کدهای دیگر بارگذاری و استفاده کنیم. چنین کاری با استفاده از قطعه کد زیر انجام میشود.
پیش بینی قیمت بیت کوین در روز آینده و تبدیل خروجی
پس از اینکه مرحله آموزش شبکه عصبی بازگشتی روی دادههای تاریخی قیمت بیتکوین به پایان رسید، در مرحله بعد لازم است دادههای مرتبط با قیمت کنونی بیتکوین جمعآوری شوند تا برای تولید پیشبینی توسط مدل آموزش دیده مورد استفاده قرار بگیرند. از آنجایی که دادههای استفاده شده برای آموزش شبکه عصبی نرمالسازی شدهاند، دادههای جمعآوری شده از قیمت کنونی بیتکوین نیز باید نرمالسازی شوند. بنابراین، پس از انجام پیشبینی توسط مدل، لازم است تا خروجیهای پیشبینی شده، از حالت نرمالسازی شده خارج و به حالت ابتدایی خود (قیمت بیتکوین به دلار آمریکا) بازگردانده شوند. در مرحله اول، دادههای مرتبط با قیمت کنونی بیتکوین (قیمت طی روز 30 روز گذشته)، با استفاده از قطعه کد زیر جمعآوری میشوند. در این قطعه کد، دادههای لازم برای تولید پیشبینی جمعآوری و آمادهسازی میشوند.
پس از پاکسازی و آمادهسازی دادهها، مدل آموزش دیده بارگذاری و از آن برای پیش بینی قیمت بیت کوین در روز آینده استفاده میشود.
نکته شایان توجه در مورد پیشبینیهای تولید شده توسط مدل آموزش دیده این است که خروجیهای تولید شده، مقادیری بین 1 و 1- دارند؛ در نتیجه، نمیتوان بر اساس آنها قیمت روز آینده بیتکوین را پیشبینی کرد. در نتیجه، نیاز است تا خروجیهای تولید شده از حالت نرمال خارج و به حالت اصلی خود بازگردانده شوند. یا استفاده از قطعه کد زیر و از طریق تعریف یک تابع خاص، به راحتی میتوان چنین کاری را انجام داد.
تبدیل دادههای خروجی (پیشبینیهای انجام شده) و تولید نمودار
شاید بسیاری از کاربران تمایل داشته باشند که نتایج کلی مدل شبکه عصبی بازگشتی را در قالب نمودار داشته باشند. به عبارت دیگر، به جای پیش بینی قیمت بیت کوین در یک روز آینده، قیمت برای یک بازه زمانی خاص پیشبینی و با مقادیر واقعی قیمت بیتکوین مقایسه شود. از طریق چنین رویکردی، تصویر واضحتری از عملکرد مدل شبکه عصبی در پیش بینی قیمت بیت کوین ترسیم میشود. برای چنین کاری، میتوان از ساختار دادهای X_test (این ساختار دادهای، در کدهای مرتبط با آموزش شبکه عصبی قابل بررسی است) استفاده کرد که در مرحله آموزش شبکه عصبی بازگشتی تعریف شده است. بنابراین، ابتدا مدل آموزش دیده بارگذاری میشود. سپس، دادههای X_test به مدل آموزش دیده وارد میشوند تا مدل بتواند روی آنها و برای یک بازه زمانی خاص، قیمت بیتکوین را پیشبینی کند.
در نهایت، با استفاده از بسته نرمافزاری (Plotly) زبان برنامهنویسی پایتون و تنظیم کردن پارامترهای آن، امکان نمایش «مقادیر مشاهده شده» (Observation Values) و «مقادیر پیشبینی شده» (Prediction Values) در یک نمودار وجود دارد. برای چنین کاری، از قطعه کد زیر استفاده میشود.
با اجرای کد بالا، نموداری به شکل زیر برای شما تولید خواهد شد. در این نمودار، مقادیر واقعی قیمت بیتکوین در یک بازه زمانی خاص به همراه مقادیر پیشبینی شده قیمت بیتکوین توسط مدل شبکه عصبی بازگشتی (در همان بازه زمانی)، نمایش داده شده است.

میزان قابل اعتماد بودن نتایج پیشبینی
با مقایسه بصری میان مقادیر واقعی و مقادیر پیشبینی شده قیمت بیتکوین، میتوان دریافت که پیشبینیهای انجام شده تا حدی با مقادیر واقعی سازگار هستند. با این حال، باید به این نکته مهم توجه شود که اگرچه الگوهای قیمتی با یکدیگر تطابق زیادی دارند، ولی مقادیر قیمتهای پیشبینی شده با قیمتهای واقعی بیتکوین، تفاوت چشمگیری دارند. به ویژه، با بررسی قیمتهای واقعی و پیشبینی قیمتها بهصورت روزانه، این واقعیت بیشتر آشکار خواهد شد. بنابراین، برای دستیابی به نتایج بهتر، باید کد پیادهسازی شده در این مطلب مورد بررسی قرار بگیرد و با تنظیم بهینه پارامترها، عملکرد مدل در پیشبینی قیمتها بهتر شود.
جمعبندی
اگر نوشته بالا برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای دادهکاوی و یادگیری ماشین
- آموزش اصول و روشهای دادهکاوی (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) استفاده شده است. در این راستا، مطالعه مطلب زیر پیشنهاد میشود:
سلام خسته نباشید بابت مطالب خوبتون ممنونم! خب ما چطوری از این کدها استفاده کنیم؟ اگر امکانش هست این رو هم بفرمایید! چون خیلی ها بلد نیستن کد نویسی کنند