پیش بینی قیمت سهام با کتابخانه کرس (Keras) — راهنمای کاربردی

۸۶۲ بازدید
آخرین به‌روزرسانی: ۱۷ تیر ۱۴۰۲
زمان مطالعه: ۵ دقیقه
پیش بینی قیمت سهام با کتابخانه کرس (Keras) — راهنمای کاربردی

«کرس» (Keras)، کتابخانه «متن‌باز» (Open Source) نوشته شده برای «زبان برنامه‌نویسی پایتون» (Python Programming Language) است. این کتابخانه قابل اجرا بر فراز کتابخانه «تنسورفلو» (TensorFlow)، «جعبه ابزار شناختی مایکروسافت» (CNTK | Microsoft Cognitive Toolkit) و «ثینو» (Theano) است. کتابخانه کرس، از مدل «» (Long Short-Term Memory | LSTM) برای پیش‌بینی قیمت بورس بهره می‌برد.

LSTM در پیش‌بینی  برای مسائل دارای توالی بسیار قدرتمند عمل می‌کند، زیرا قادر به ذخیره‌سازی اطلاعات گذشته است. در مساله پیش‌بینی قیمت بورس، این ویژگی بسیار مهم محسوب می‌شود زیرا قیمت پیشین سهام برای پیش‌بینی قیمت آینده آن عاملی حیاتی محسوب می‌شود.

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

در مطلب پیش رو، یک مدل «یادگیری عمیق» (Deep Learning) پایتون، که رفتار آینده  قیمت سهام را پیش‌بینی می‌کند، ارائه شده است. طی تدوین این مطلب، فرض بر آن بوده که مخاطبان با مفهوم یادگیری عمیق در پایتون و به ویژه حافظه کوتاه مدت بلند آشنایی دارند. به افرادی که نیازمند مطالعه بیشتر در این رابطه هستند، مطلب «یادگیری عمیق با پایتون»، توصیه می‌شود.

در حالیکه پیش‌بینی قیمت کنونی سهام کاری دشوار است، می‌توان مدلی ساخت که پیش‌بینی کند قیمت سهام افزایش یا کاهش می‌یابد. داده‌ها و نوت‌بوک مورد استفاده برای این مطلب از این مسیر (+) قابل دانلود هستند. لازم به ذکر است که همواره فاکتورهای دیگری مانند جو سیاسی و بازار نیز وجود دارند که قیمت سهام را تحت تاثیر قرار می‌دهند. اگرچه، در این راهنما این فاکتورها در نظر گرفته نشده‌اند.

مقدمه‌ای بر LSTM

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

کار پیش‌بینی با «وارد کردن» (Import) کتابخانه «نام‌پای» (NumPy) برای محاسبات علمی، «مَت‌پلات‌لیب» (Matplotlib) برای رسم نمودارها و «پانداس» (Pandas) برای کمک به بارگذاری و تغییر مجموعه داده‌ها آغاز می‌شود.

1import numpy as np
2import matplotlib.pyplot as plt
3import pandas as pd

بارگذاری مجموعه داده

گام بعدی، بارگذاری مجموعه داده‌های آموزش و انتخاب ستون‌های Open و High است که در مدل‌سازی مورد استفاده قرار خواهند گرفت.

1dataset_train = pd.read_csv('NSE-TATAGLOBAL.csv')
2training_set = dataset_train.iloc[:, 1:2].values

head مجموعه داده برای دریافت چکیده‌ای از نوع داده‌های موجود در مجموعه داده‌ای که قرار است با آن کار شود مورد بررسی قرار می‌گیرد.

1dataset_train.head()

پیش‌بینی قیمت سهام

ستون Open قیمت بازگشایی بازار و ستون Close قیمت پایانی یک سهام در یک روز تجاری است (برای مطالعه بیشتر پیرامون نمودار سهام، مطالعه مطلب «نمایش و رسم نمودار برای داده‌ها — معرفی و کاربردها» توصیه می‌شود). ستون‌های High و Low بالاترین و پایین‌ترین قیمت برای یک روز را نشان می‌دهند.

هم‌مقیاس کردن ویژگی‌ها

بر اساس تجربه‌های پیشین نویسنده این مطلب (+) از کار با مدل‌های یادگیری عمیق، می‌توان فهمید که برای داشتن کارایی بهینه باید داده‌ها را هم‌مقیاس کرد.

در مساله مطرح شده در اینجا، از MinMaxScaler کتابخانه «سایکیت‌لرن» (Scikit- Learn) برای هم‌مقیاس کردن داده‌ها به اعداد بین صفر و یک استفاده می‌شود.

1from sklearn.preprocessing import MinMaxScaler
2sc = MinMaxScaler(feature_range = (0, 1))
3training_set_scaled = sc.fit_transform(training_set)

ساخت داده‌ها با گام زمانی

LSTM، از داده‌ها انتظار دارد تا در قالب مشخصی باشند، که معمولا آرایه‌های سه‌بُعدی است. کار با ساخت داده‌ها در ۶۰ «گام زمانی» (Time Step) و تبدیل آن‌ها به یک آرایه با استفاده از NumPy انجام می‌شود.

سپس، داده‌ها به یک آرایه سه‌بُعدی با نمونه‌های X_train، تعداد ۶۰ گام زمانی و یک ویژگی در هر گام تبدیل می‌شوند.

1X_train = []
2y_train = []
3for i in range(60, 2035):
4    X_train.append(training_set_scaled[i-60:i, 0])
5    y_train.append(training_set_scaled[i, 0])
6X_train, y_train = np.array(X_train), np.array(y_train)
7
8X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))

ساخت LSTM

به منظور ساخت LSTM، نیاز به «وارد کردن» (import) تعدادی از ماژول‌ها از کرس است که در ادامه بیان شده‌اند.

  • Sequential برای مقداردهی اولیه شبکه عصبی
  • Dense برای افزودن یک لایه شبکه عصبی به شدت متصل (Densely Connected)
  • LSTM برای افزودن لایه
  • Dropout برای افزودن لایه dropout که از «بیش برازش» (Overfitting) جلوگیری می‌کند.
1from keras.models import Sequential
2from keras.layers import Dense
3from keras.layers import LSTM
4from keras.layers import Dropout

لایه LSTM اضافه می‌شود و بعدا چند لایه Dropout برای پیش‌گیری از بیش‌برازش اضافه می‌شوند. لایه LSTM  با آرگومان‌های زیر افزوده می‌شود.

  1. ۵۰ واحد که ابعاد فضای خروجی است.
  2. return_sequences=True که تعیین می‌کند آخرین خروجی در توالی خروجی بازگردانده شود و یا کل توالی
  3. input_shape به عنوان شکل مجموعه داده آموزش

هنگام تعریف لایه Dropout، مقدار ۰.۲ تعیین می‌شود که به معنای آن است که ٪۲۰ از لایه‌ها رها می‌شوند (dropping). پس از آن، یک لایه Dense اضافه می‌شود که خروجی یک واحد را تعیین می‌کند. سپس، مدل با استفاده از بهینه‌ساز محبوب Adam کامپایل و هزینه به عنوان mean_squarred_error تعیین می‌شود. این کار به منظور محاسبه «میانگین مربعات خطا» (Mean Squared Error) است. سپس، مدل برای اجرا روی ۱۰۰ «دوره» (epoch) و اندازه دسته ۳۲ برازش می‌شود. باید به خاطر داشت که بسته به حافظه کامپیوتر، این کار دقایقی به طول خواهد انجامید.

1regressor = Sequential()
2
3regressor.add(LSTM(units = 50, return_sequences = True, input_shape = (X_train.shape[1], 1)))
4regressor.add(Dropout(0.2))
5
6regressor.add(LSTM(units = 50, return_sequences = True))
7regressor.add(Dropout(0.2))
8
9regressor.add(LSTM(units = 50, return_sequences = True))
10regressor.add(Dropout(0.2))
11
12regressor.add(LSTM(units = 50))
13regressor.add(Dropout(0.2))
14
15regressor.add(Dense(units = 1))
16
17regressor.compile(optimizer = 'adam', loss = 'mean_squared_error')
18
19regressor.fit(X_train, y_train, epochs = 100, batch_size = 32)

پیش‌بینی سهام آینده با استفاده از مجموعه آزمون

ابتدا باید «مجموعه آزمون» (Test Set) را ایمپورت کرد که برای انجام پیش‌بینی‌ها استفاده خواهند شد.

1dataset_test = pd.read_csv('tatatest.csv')
2real_stock_price = dataset_test.iloc[:, 1:2].values

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

  1. ادغام «مجموعه آموزش» (Training Set) و مجموعه تست روی محور ۰
  2. تنظیم گام زمانی روی ۶۰ (چنانکه پیش‌تر مشاهده شد.)
  3. استفاده از MinMaxScaler برای تبدیل مجموعه داده جدید
  4. شکل‌دهی مجدد مجموعه داده به صورتی که پیش‌تر بیان شد.

پس از انجام پیش‌بینی، از inverse_transform برای بازگشت قیمت‌های سهام در فرمت نرمال قابل خواندن استفاده می‌شود.

1dataset_total = pd.concat((dataset_train['Open'], dataset_test['Open']), axis = 0)
2inputs = dataset_total[len(dataset_total) - len(dataset_test) - 60:].values
3inputs = inputs.reshape(-1,1)
4inputs = sc.transform(inputs)
5X_test = []
6for i in range(60, 76):
7    X_test.append(inputs[i-60:i, 0])
8X_test = np.array(X_test)
9X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))
10predicted_stock_price = regressor.predict(X_test)
11predicted_stock_price = sc.inverse_transform(predicted_stock_price)

ترسیم نمودار نتایج

در نهایت، از Matplotlib برای بصری‌سازی نتایج قیمت سهام پیش‌بینی شده و قیمت سهام واقعی استفاده می‌شود.

1plt.plot(real_stock_price, color = 'black', label = 'TATA Stock Price')
2plt.plot(predicted_stock_price, color = 'green', label = 'Predicted TATA Stock Price')
3plt.title('TATA Stock Price Prediction')
4plt.xlabel('Time')
5plt.ylabel('TATA Stock Price')
6plt.legend()
7plt.show()

پیش بینی قیمت سهام با پایتون

از نمودار مشهود است که قیمت‌های واقعی سهام هنگامی افزایش یافته‌اند که مدل نیز پیش‌بینی کرده که افزایش می‌یابند. این مساله نشان می‌دهد که LSTM ابزاری قدرتمند برای تحلیل سری‌های زمانی و داده‌های ترتیبی است.

نتیجه‌گیری

در این مطلب از مدل LSTM موجود در کتابخانه Keras پایتون برای پیش‌بینی قیمت سهام استفاده شد. روش‌های دیگری نیز برای این کار وجود دارند که از آن جمله می‌توان به «میانگین متحرک» (Moving Averages)، «رگرسیون خطی» (linear regression)، «میانگین متحرک خودهمبسته یکپارچه» (Autoregressive Integrated Moving Average | ARIMA) و Prophet اشاره کرد.

این‌ها روش‌هایی هستند که می‌توان آن‌ها را روی مجموعه داده استفاده شده در این مطلب اعمال و نتایج آن را با Keras LSTM مقایسه کرد.

اگر نوشته بالا برای شما مفید بوده، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

^^

بر اساس رای ۲۷ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
kdnuggets
۶ دیدگاه برای «پیش بینی قیمت سهام با کتابخانه کرس (Keras) — راهنمای کاربردی»

اینکه قیمت غیرایستا هست مشکلی نداره برای استفاده در lstm؟ داده های غیرایستا مثل درصد تغییر قیمت بجای خود قیمت بهتر نیست برای استفاده ؟

با سلام
خواستم بدونم الگوریتم LSTM فقط یک رشته از پرامترها رو به عنوان ورودی در نظر میگیره یا میشه مثل MLP چند ورودی بهش داد و یک خروجی ازش گرفت؟؟

با سلام
لطفا راه ارتباطی معرفی می کنید، در مورد پایان نامه ام چندتا سوال دارم.
ممنون

سلام
چند سوال داشتم :
1- بازه زمانی میتواند در زیر یک ثانیه نیز عمل کرده و کارایی داشته باشد ؟
2- تشخیص پارامترهای open , close و … فقط برای یک نماد است یا میتوان چندین نماد را همزمان بررسی گکرد ؟
3- آیا برنامه نویسی در mql5 بهتر است یا استفاده از توابع و کتابخانه های پایتون ؟
با تشکر

سلام یعنی با این کار میشه قیمت های سهام در چند روز اینده پیش بینی کرد؟؟

با سلام؛

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

با سپاس.

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *