پیش بینی قیمت سهام – پروژه یادگیری ماشین در پایتون

یادگیری ماشین کاربردهای مهمی در پیش‌بینی قیمت سهام دارد. در این پروژه یادگیری ماشین، در مورد پیش‌بینی بازده سهام صحبت خواهیم کرد. این یک کار بسیار پیچیده است و با عدم قطعیت همراه است. ما این پروژه را به دو بخش بسط می‌دهیم:

  • اول، نحوه پیش‌بینی قیمت سهام با استفاده از شبکه عصبی 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]
  1. مجموعه داده های فیلتر شده جدید را نرمال کنید:
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)
  1. مدل LSTM را ذخیره کنید.
lstm_model.save("saved_model.h5")
  1. هزینه های پیش بینی شده سهام را با هزینه های واقعی سهام ، نمودار کنید:
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 یک داشبورد برای پروژه طراحی کردیم.

آیا مایل هستید پروژه های کاربردی دیگری در پایتون به همراه کد های آن ها را بررسی کنیم؟ لطفا در نظرات دیدگاه خود را با ما به اشتراک بگذارید.

همچنین ببینید

فناوری تشخیص چهره و کاربردهای آن، تاریخچه تکنولوژی تشخیص چهره

فناوری تشخیص چهره و کاربردهای آن + تاریخچه

فناوری تشخیص چهره یک فناوری بیومتریک است که با استفاده از تجزیه و تحلیل الگوهایی …

6 نظر

  1. متاسفانه لینک دانلود موجود در سایت معرفی شده کار نمیکنه
    https://data-flair.training/blogs/download-stock-price-prediction-project-code/

    اگر امکانش هست دانلود کرده و لینک مستقیم دانلود قرار بدین

    تشکر

  2. باسلام،میخواستم بدونم آیا امکان پذیر هست که کتابخانه ها و اجزای کامل کد رو تشریح کنید؟یا منبعی که به صورت جز به جز کد رو مشخص کرده باشه؟

  3. علی قاسمی زاده

    سلام و خسته نباشید من گام بهگام کد های شما را رفتم جلو در زمان اینکه داده های فیلتر شده نرمال می شود این اررو بوجود می اید علت چیست ؟

    TypeError: float() argument must be a string or a number, not ‘Timestamp’

دیدگاهتان را بنویسید

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