یکی از ابزارهای پیشبینی سریهای زمانی که اخیرا مورد توجه متخصصین داده قرار گرفته است، کتابخانه prophet فیسبوک میباشد. این کتابخانه که به زبانهای پایتون و R توسعه داده شده است، قابلیت پیشبینی سریهای زمانی غیرخطی با خاصیت فصلی بودن (seasonality) سالیانه، هفتگی و روزانه با مدل افزوده را دارا میباشد. در این نوشته در یک مثال کاملا ابتدایی اقدام به پیشبینی روند تغییرات رمز ارزها خواهیم نمود.
بسم الله الرحمن الرحیم
برای انجام پیشبینی با استفاده از کتابخانه prophet ابتدا نیاز به دادههای رمز ارزها داریم. این دادهها میتوانند از سایتهای مختلف اشتراک داده یا صرافیهای آنلاین بین المللی دریافت گردند. در این آموزش از دادههای بایننس استفاده خواهد شد. این دادهها از آدرس زیر قابل دریافت میباشند:
https://www.cryptodatadownload.com/cdd/Binance_BTCUSDT_minute.csv
داده مورد استفاده در این آموزش قیمت دقیقه به دقیقه بیت کوین بر اساس دلار آمریکا خواهد بود. حال نوبت نوشتن کدها میرسد. قبل از هر چیز کتابخانههای مورد نیاز خود را فراخوانی مینماییم:
import pandas as pd import csv from fbprophet import Prophet
فرض میکنیم برای پیشبینی از بیست هزار دقیقه آخر قیمت بیت کوین استفاده مینماییم. از فایل csv دانلود شده ۲۰۰۰۰ داده ابتدایی را میخوانیم. دقت نمایید که دو سطر اول دادهها توضیحی بوده و لذا آنها را از لیست خود حذف مینماییم:
rawdata = [] L = 20000 with open("Binance_BTCUSDT_minute.csv", newline="") as csvfile: reader = csv.reader(csvfile, delimiter=",", quotechar="|") i = 0 for row, i in zip(reader, range(L)): rawdata.append(row) rawdata = rawdata[2:L]
هر سطر داده حاوی اطلاعاتی از قبیل بالاترین قیمت، پایینترین قیمت، قیمت آغازین، قیمت پایانی و حجم بیت کوین و دلار معامله شده میباشد. این اطلاعات را در لیستهای مربوط به هر کدام به صورت زوجِ زمان و مقدار قرار میدهیم. دقت کنید که کتابخانه prophet بر روی سریهای زمانی کار میکند و seasonality را به عنوان یک عامل مهم در نظر دارد. لذا ورودی دادهها به آن به صورت زوجِ زمان و مقدار انجام میگیرد.
dataH = [] dataL = [] dataO = [] dataC = [] volBTC = [] volUSDT = [] for row in rawdata: dataH.insert(0, [row[1], row[4]]) dataL.insert(0, [row[1], row[5]]) dataO.insert(0, [row[1], row[3]]) dataC.insert(0, [row[1], row[6]]) volBTC.insert(0, [row[1], row[7]]) volUSDT.insert(0, [row[1], row[8]])
برای پیشبینی، ما حداکثر قیمت در دقیقه را مد نظر قرار داده ایم. با دادههای استخراج کرده یک چارچوب داده پاندا با ستونهای ds، نشاندهنده زمان و y نشاندهنده دادهها، ایجاد مینماییم. حال آمادهایم تا کلاس پیشبین prophet خود را ایجاد نموده و اقدام به آموزش آن نماییم:
m = Prophet() m.fit(df)
حال میتوانیم دادههای آتی را پیشبینی کرده و نتایج را رسم نماییم:
future = m.make_future_dataframe(periods=20, freq="H") forecast = m.predict(future) fig1 = m.plot(forecast) fig2 = m.plot_components(forecast)
در عبارت بالا periods بیان کننده تعداد اندیسهای زمانی متوالی که باید پیشبینی شود است. همچنین freq فرکانس این اندیسها میباشد. ما freq را برابر با H قرار داده ایم که به معنی ساعتی بودن پیشبینی است. این پارامتر میتواند D (روزانه) یا min (دقیقهای) نیز تعیین گردد.
خروجیهای این کد به شکل زیر خواهد بود:
یکی از نمودارها مربوط به پیشبینی بوده و چشم اندازی از روند تغییر قیمت ارائه میدهد. نمودار دوم که عناصر پیشبینی میباشد، روند تغییرات در زمانهای مختلف، در روزهای هفته و ساعات هر روز را نشان میدهد. نمودار دوم خروجی برای مثال مورد نظر ما میخواهد این را بگوید که بطور معمول در فلان روزهای هفته قیمت از مقدار نرمال خود پایینتر یا بالاتر است. یا در ساعات خاص از شبانه روز (به وقت بایننس) قیمت معمولا افزایش یا کاهش دارد. البته صحت این نمودارها وابسته به مناسب بودن دادهها میباشد. بیست هزار دادهی دقیقه به دقیقه برابر حدود چهارده روز داده است. دو هفته اطلاعات برای پیشبینی رفتار قیمت در طی روزهای هفته کم میباشد و لذا قابل اطمینان نیست. برای داشتن پیشبینی هفتهای دقیقتر بهتر است از دادههای ساعتی استفاده کرده و تعداد روزهای بیشتری را به عنوان ورودی داد.