یادگیری ماشین کاربردهای مهمی در پیشبینی قیمت سهام دارد. در این پروژه یادگیری ماشین، در مورد پیشبینی بازده سهام صحبت خواهیم کرد. این یک کار بسیار پیچیده است و با عدم قطعیت همراه است. ما این پروژه را به دو بخش بسط میدهیم:
- اول، نحوه پیشبینی قیمت سهام با استفاده از شبکه عصبی LSTM را یاد میگیریم.
- سپس با استفاده از Plotly Dash ، یک داشبورد برای تحلیل سهام ایجاد خواهیم کرد.
پروژه پیشبینی قیمت سهام
مجموعه داده ها
برای ساخت مدل پیش بینی قیمت سهام ، از مجموعه داده NSE TATA GLOBAL استفاده خواهیم کرد. این مجموعه دادهها، از نوشابه های تاتا شرکت جهانی تاتا، سهام ملی هند است: Tata Global Dataset
برای استفاده از داشبورد برای تحلیل سهام، ما از مجموعه دادههای دیگر سهام ها مانند اپل، مایکروسافت، فیس بوک استفاده خواهیم کرد: Stocks Dataset
کد منبع
قبل از ادامه کار ، لطفاً کد منبع را دانلود کنید:
دانلود پروژه پیش بینی قیمت سهام
پیشبینی قیمت سهام با استفاده از LSTM
۱. وروردی ها :
import pandas as pd import numpy as np import matplotlib.pyplot as plt %matplotlib inline from matplotlib.pylab import rcParams rcParams['figure.figsize']=20,10 from keras.models import Sequential from keras.layers import LSTM,Dropout,Dense from sklearn.preprocessing import MinMaxScaler
۲. مجموعه دادهها را بخوانید:
df=pd.read_csv("NSE-TATA.csv") df.head()
۳. قیمت نهایی را از قاب داده ( dataframe ) تحلیل کنید :
df["Date"]=pd.to_datetime(df.Date,format="%Y-%m-%d") df.index=df['Date'] plt.figure(figsize=(16,8)) plt.plot(df["Close"],label='Close Price history')
۴. مجموعه دادهها را براساس تاریخ مرتب کرده و ستون های ” تاریخ ( Date ) ” و ” نهایی ( close ) ” را فیلتر کنید:
data=df.sort_index(ascending=True,axis=0) new_dataset=pd.DataFrame(index=range(0,len(df)),columns=['Date','Close']) for i in range(0,len(data)): new_dataset["Date"][i]=data['Date'][i] new_dataset["Close"][i]=data["Close"][i]
- مجموعه داده های فیلتر شده جدید را نرمال کنید:
scaler=MinMaxScaler(feature_range=(0,1)) final_dataset=new_dataset.values train_data=final_dataset[0:987,:] valid_data=final_dataset[987:,:] new_dataset.index=new_dataset.Date new_dataset.drop("Date",axis=1,inplace=True) scaler=MinMaxScaler(feature_range=(0,1)) scaled_data=scaler.fit_transform(final_dataset) x_train_data,y_train_data=[],[] for i in range(60,len(train_data)): x_train_data.append(scaled_data[i-60:i,0]) y_train_data.append(scaled_data[i,0]) x_train_data,y_train_data=np.array(x_train_data),np.array(y_train_data) x_train_data=np.reshape(x_train_data,(x_train_data.shape[0],x_train_data.shape[1],1))
۶. مدل LSTM را ساخته و آموزش دهید:
lstm_model=Sequential() lstm_model.add(LSTM(units=50,return_sequences=True,input_shape=(x_train_data.shape[1],1))) lstm_model.add(LSTM(units=50)) lstm_model.add(Dense(1)) inputs_data=new_dataset[len(new_dataset)-len(valid_data)-60:].values inputs_data=inputs_data.reshape(-1,1) inputs_data=scaler.transform(inputs_data) lstm_model.compile(loss='mean_squared_error',optimizer='adam') lstm_model.fit(x_train_data,y_train_data,epochs=1,batch_size=1,verbose=2)
۷. یک نمونه از مجموعه داده ها را بردارید تا پیش بینی های قیمت سهام را با استفاده از مدل LSTM انجام دهید:
X_test=[] for i in range(60,inputs_data.shape[0]): X_test.append(inputs_data[i-60:i,0]) X_test=np.array(X_test) X_test=np.reshape(X_test,(X_test.shape[0],X_test.shape[1],1)) predicted_closing_price=lstm_model.predict(X_test) predicted_closing_price=scaler.inverse_transform(predicted_closing_price)
- مدل LSTM را ذخیره کنید.
lstm_model.save("saved_model.h5")
- هزینه های پیش بینی شده سهام را با هزینه های واقعی سهام ، نمودار کنید:
train_data=new_dataset[:987] valid_data=new_dataset[987:] valid_data['Predictions']=predicted_closing_price plt.plot(train_data["Close"]) plt.plot(valid_data[['Close',"Predictions"]])
می توانید ملاحظه کنید، LSTM سهام را تقریبا مشابه سهام واقعی پیش بینی کرده است.
ساخت داشبورد با استفاده از Plotly dash
در این بخش یک داشبورد برای تحلیل سهام خواهیم ساخت. Dash یک چارچوب پایتون است که یک انتزاع بر روی Flask ( یک پارچوب قدرتمند در پایتون ) و react.js ایجاد می کند و به ساخت برنامه های کاربردی وب تحلیلی واکنش نشان می دهد.
قبل از اینکه جلوتر بروید، باید داشبورد را نصب کنید. دستور زیر را در کادر اجرا کنید.
pip3 install dash pip3 install dash-html-components pip3 install dash-core-components
اکنون یک پرونده جدید پایتون به نام stock_app.py ایجاد کنید و اسکریپت زیر را در آن اضافه کنید:
import dash import dash_core_components as dcc import dash_html_components as html import pandas as pd import plotly.graph_objs as go from dash.dependencies import Input, Output from keras.models import load_model from sklearn.preprocessing import MinMaxScaler import numpy as np app = dash.Dash() server = app.server scaler=MinMaxScaler(feature_range=(0,1)) df_nse = pd.read_csv("./NSE-TATA.csv") df_nse["Date"]=pd.to_datetime(df_nse.Date,format="%Y-%m-%d") df_nse.index=df_nse['Date'] data=df_nse.sort_index(ascending=True,axis=0) new_data=pd.DataFrame(index=range(0,len(df_nse)),columns=['Date','Close']) for i in range(0,len(data)): new_data["Date"][i]=data['Date'][i] new_data["Close"][i]=data["Close"][i] new_data.index=new_data.Date new_data.drop("Date",axis=1,inplace=True) dataset=new_data.values train=dataset[0:987,:] valid=dataset[987:,:] scaler=MinMaxScaler(feature_range=(0,1)) scaled_data=scaler.fit_transform(dataset) x_train,y_train=[],[] for i in range(60,len(train)): x_train.append(scaled_data[i-60:i,0]) y_train.append(scaled_data[i,0]) x_train,y_train=np.array(x_train),np.array(y_train) x_train=np.reshape(x_train,(x_train.shape[0],x_train.shape[1],1)) model=load_model("saved_model.h5") inputs=new_data[len(new_data)-len(valid)-60:].values inputs=inputs.reshape(-1,1) inputs=scaler.transform(inputs) X_test=[] for i in range(60,inputs.shape[0]): X_test.append(inputs[i-60:i,0]) X_test=np.array(X_test) X_test=np.reshape(X_test,(X_test.shape[0],X_test.shape[1],1)) closing_price=model.predict(X_test) closing_price=scaler.inverse_transform(closing_price) train=new_data[:987] valid=new_data[987:] valid['Predictions']=closing_price df= pd.read_csv("./stock_data.csv") app.layout = html.Div([ html.H1("Stock Price Analysis Dashboard", style={"textAlign": "center"}), dcc.Tabs(id="tabs", children=[ dcc.Tab(label='NSE-TATAGLOBAL Stock Data',children=[ html.Div([ html.H2("Actual closing price",style={"textAlign": "center"}), dcc.Graph( id="Actual Data", figure={ "data":[ go.Scatter( x=train.index, y=valid["Close"], mode='markers' ) ], "layout":go.Layout( title='scatter plot', xaxis={'title':'Date'}, yaxis={'title':'Closing Rate'} ) } ), html.H2("LSTM Predicted closing price",style={"textAlign": "center"}), dcc.Graph( id="Predicted Data", figure={ "data":[ go.Scatter( x=valid.index, y=valid["Predictions"], mode='markers' ) ], "layout":go.Layout( title='scatter plot', xaxis={'title':'Date'}, yaxis={'title':'Closing Rate'} ) } ) ]) ]), dcc.Tab(label='Facebook Stock Data', children=[ html.Div([ html.H1("Facebook Stocks High vs Lows", style={'textAlign': 'center'}), dcc.Dropdown(id='my-dropdown', options=[{'label': 'Tesla', 'value': 'TSLA'}, {'label': 'Apple','value': 'AAPL'}, {'label': 'Facebook', 'value': 'FB'}, {'label': 'Microsoft','value': 'MSFT'}], multi=True,value=['FB'], style={"display": "block", "margin-left": "auto", "margin-right": "auto", "width": "60%"}), dcc.Graph(id='highlow'), html.H1("Facebook Market Volume", style={'textAlign': 'center'}), dcc.Dropdown(id='my-dropdown2', options=[{'label': 'Tesla', 'value': 'TSLA'}, {'label': 'Apple','value': 'AAPL'}, {'label': 'Facebook', 'value': 'FB'}, {'label': 'Microsoft','value': 'MSFT'}], multi=True,value=['FB'], style={"display": "block", "margin-left": "auto", "margin-right": "auto", "width": "60%"}), dcc.Graph(id='volume') ], className="container"), ]) ]) ]) @app.callback(Output('highlow', 'figure'), [Input('my-dropdown', 'value')]) def update_graph(selected_dropdown): dropdown = {"TSLA": "Tesla","AAPL": "Apple","FB": "Facebook","MSFT": "Microsoft",} trace1 = [] trace2 = [] for stock in selected_dropdown: trace1.append( go.Scatter(x=df[df["Stock"] == stock]["Date"], y=df[df["Stock"] == stock]["High"], mode='lines', opacity=0.7, name=f'High {dropdown[stock]}',textposition='bottom center')) trace2.append( go.Scatter(x=df[df["Stock"] == stock]["Date"], y=df[df["Stock"] == stock]["Low"], mode='lines', opacity=0.6, name=f'Low {dropdown[stock]}',textposition='bottom center')) traces = [trace1, trace2] data = [val for sublist in traces for val in sublist] figure = {'data': data, 'layout': go.Layout(colorway=["#5E0DAC", '#FF4F00', '#375CB1', '#FF7400', '#FFF400', '#FF0056'], height=600, title=f"High and Low Prices for {', '.join(str(dropdown[i]) for i in selected_dropdown)} Over Time", xaxis={"title":"Date", 'rangeselector': {'buttons': list([{'count': 1, 'label': '1M', 'step': 'month', 'stepmode': 'backward'}, {'count': 6, 'label': '6M', 'step': 'month', 'stepmode': 'backward'}, {'step': 'all'}])}, 'rangeslider': {'visible': True}, 'type': 'date'}, yaxis={"title":"Price (USD)"})} return figure @app.callback(Output('volume', 'figure'), [Input('my-dropdown2', 'value')]) def update_graph(selected_dropdown_value): dropdown = {"TSLA": "Tesla","AAPL": "Apple","FB": "Facebook","MSFT": "Microsoft",} trace1 = [] for stock in selected_dropdown_value: trace1.append( go.Scatter(x=df[df["Stock"] == stock]["Date"], y=df[df["Stock"] == stock]["Volume"], mode='lines', opacity=0.7, name=f'Volume {dropdown[stock]}', textposition='bottom center')) traces = [trace1] data = [val for sublist in traces for val in sublist] figure = {'data': data, 'layout': go.Layout(colorway=["#5E0DAC", '#FF4F00', '#375CB1', '#FF7400', '#FFF400', '#FF0056'], height=600, title=f"Market Volume for {', '.join(str(dropdown[i]) for i in selected_dropdown_value)} Over Time", xaxis={"title":"Date", 'rangeselector': {'buttons': list([{'count': 1, 'label': '1M', 'step': 'month', 'stepmode': 'backward'}, {'count': 6, 'label': '6M', 'step': 'month', 'stepmode': 'backward'}, {'step': 'all'}])}, 'rangeslider': {'visible': True}, 'type': 'date'}, yaxis={"title":"Transactions Volume"})} return figure if __name__=='__main__': app.run_server(debug=True)
اکنون فایل را اجرا کرده و برنامه را در وب باز کنید:
python3 stock_app.py
جمع بندی
پیش بینی قیمت سهام یک پروژه یادگیری ماشین برای مبتدیان است. در این آموزش ما یاد گرفتیم که چگونه یک مدل پیش بینی هزینه سهام و نحوه ساخت یک داشبورد تعاملی برای تجزیه و تحلیل سهام بسازیم. ما پیش بینی بازار سهام را با استفاده از مدل LSTM پیاده سازی کردیم. از طرف دیگر ، با استفاده از چارچوب پایتون Plotly Dash یک داشبورد برای پروژه طراحی کردیم.
آیا مایل هستید پروژه های کاربردی دیگری در پایتون به همراه کد های آن ها را بررسی کنیم؟ لطفا در نظرات دیدگاه خود را با ما به اشتراک بگذارید.
متاسفانه لینک دانلود موجود در سایت معرفی شده کار نمیکنه
https://data-flair.training/blogs/download-stock-price-prediction-project-code/
اگر امکانش هست دانلود کرده و لینک مستقیم دانلود قرار بدین
تشکر
سلام
درحال بررسی از سایت منبع هستیم
در اسرع وقت که لینک اصلاح بشه فایل رو قرار میدیم
لینک دانلود اصلاح شد
باسلام،میخواستم بدونم آیا امکان پذیر هست که کتابخانه ها و اجزای کامل کد رو تشریح کنید؟یا منبعی که به صورت جز به جز کد رو مشخص کرده باشه؟
سلام
انشاالله سعی می کنیم توی مطالب بعدی کد ها رو کامل تر توضیح بدیم.
سلام و خسته نباشید من گام بهگام کد های شما را رفتم جلو در زمان اینکه داده های فیلتر شده نرمال می شود این اررو بوجود می اید علت چیست ؟
TypeError: float() argument must be a string or a number, not ‘Timestamp’