├── abc.png ├── source ├── 1.png ├── 2.png ├── 3.png ├── 4.png ├── 5.png ├── 6.png ├── a.png ├── c.png ├── c2.png ├── c3.png ├── c4.png ├── c5.png ├── c6.png ├── c7.png ├── c8.png ├── c9.png ├── i.png ├── i1.png ├── i4.png ├── ii.png └── c10.png ├── Model ├── FB_High.h5 ├── FB_Low.h5 ├── FB_Open.h5 ├── AAPL_High.h5 ├── AAPL_Low.h5 ├── AAPL_Open.h5 ├── AMZN_High.h5 ├── AMZN_Low.h5 ├── AMZN_Open.h5 ├── FB_Close.h5 ├── FB_Volume.h5 ├── GOOG_High.h5 ├── GOOG_Low.h5 ├── GOOG_Open.h5 ├── TLSA_High.h5 ├── TLSA_Low.h5 ├── TLSA_Open.h5 ├── AAPL_Close.h5 ├── AAPL_Volume.h5 ├── AMZN_Close.h5 ├── AMZN_Volume.h5 ├── GOOG_Close.h5 ├── GOOG_Volume.h5 ├── TLSA_Close.h5 └── TSLA_Volume.h5 ├── function.py ├── train.py ├── predict_stock_web.py ├── README.md ├── .gitignore ├── NFLX.csv └── code_stock_lstm_train_final.ipynb /abc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/abc.png -------------------------------------------------------------------------------- /source/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/source/1.png -------------------------------------------------------------------------------- /source/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/source/2.png -------------------------------------------------------------------------------- /source/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/source/3.png -------------------------------------------------------------------------------- /source/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/source/4.png -------------------------------------------------------------------------------- /source/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/source/5.png -------------------------------------------------------------------------------- /source/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/source/6.png -------------------------------------------------------------------------------- /source/a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/source/a.png -------------------------------------------------------------------------------- /source/c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/source/c.png -------------------------------------------------------------------------------- /source/c2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/source/c2.png -------------------------------------------------------------------------------- /source/c3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/source/c3.png -------------------------------------------------------------------------------- /source/c4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/source/c4.png -------------------------------------------------------------------------------- /source/c5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/source/c5.png -------------------------------------------------------------------------------- /source/c6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/source/c6.png -------------------------------------------------------------------------------- /source/c7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/source/c7.png -------------------------------------------------------------------------------- /source/c8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/source/c8.png -------------------------------------------------------------------------------- /source/c9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/source/c9.png -------------------------------------------------------------------------------- /source/i.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/source/i.png -------------------------------------------------------------------------------- /source/i1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/source/i1.png -------------------------------------------------------------------------------- /source/i4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/source/i4.png -------------------------------------------------------------------------------- /source/ii.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/source/ii.png -------------------------------------------------------------------------------- /Model/FB_High.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/Model/FB_High.h5 -------------------------------------------------------------------------------- /Model/FB_Low.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/Model/FB_Low.h5 -------------------------------------------------------------------------------- /Model/FB_Open.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/Model/FB_Open.h5 -------------------------------------------------------------------------------- /source/c10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/source/c10.png -------------------------------------------------------------------------------- /Model/AAPL_High.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/Model/AAPL_High.h5 -------------------------------------------------------------------------------- /Model/AAPL_Low.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/Model/AAPL_Low.h5 -------------------------------------------------------------------------------- /Model/AAPL_Open.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/Model/AAPL_Open.h5 -------------------------------------------------------------------------------- /Model/AMZN_High.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/Model/AMZN_High.h5 -------------------------------------------------------------------------------- /Model/AMZN_Low.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/Model/AMZN_Low.h5 -------------------------------------------------------------------------------- /Model/AMZN_Open.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/Model/AMZN_Open.h5 -------------------------------------------------------------------------------- /Model/FB_Close.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/Model/FB_Close.h5 -------------------------------------------------------------------------------- /Model/FB_Volume.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/Model/FB_Volume.h5 -------------------------------------------------------------------------------- /Model/GOOG_High.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/Model/GOOG_High.h5 -------------------------------------------------------------------------------- /Model/GOOG_Low.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/Model/GOOG_Low.h5 -------------------------------------------------------------------------------- /Model/GOOG_Open.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/Model/GOOG_Open.h5 -------------------------------------------------------------------------------- /Model/TLSA_High.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/Model/TLSA_High.h5 -------------------------------------------------------------------------------- /Model/TLSA_Low.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/Model/TLSA_Low.h5 -------------------------------------------------------------------------------- /Model/TLSA_Open.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/Model/TLSA_Open.h5 -------------------------------------------------------------------------------- /Model/AAPL_Close.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/Model/AAPL_Close.h5 -------------------------------------------------------------------------------- /Model/AAPL_Volume.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/Model/AAPL_Volume.h5 -------------------------------------------------------------------------------- /Model/AMZN_Close.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/Model/AMZN_Close.h5 -------------------------------------------------------------------------------- /Model/AMZN_Volume.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/Model/AMZN_Volume.h5 -------------------------------------------------------------------------------- /Model/GOOG_Close.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/Model/GOOG_Close.h5 -------------------------------------------------------------------------------- /Model/GOOG_Volume.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/Model/GOOG_Volume.h5 -------------------------------------------------------------------------------- /Model/TLSA_Close.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/Model/TLSA_Close.h5 -------------------------------------------------------------------------------- /Model/TSLA_Volume.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhonvo/PredictsStockPricesLSTM-algorithm/HEAD/Model/TSLA_Volume.h5 -------------------------------------------------------------------------------- /function.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import pandas as pd 3 | from sklearn.preprocessing import MinMaxScaler 4 | from keras.models import Sequential 5 | from tensorflow import keras 6 | import streamlit as st 7 | import plotly.graph_objects as go 8 | from pandas.tseries.offsets import BDay 9 | import datetime 10 | import matplotlib.pyplot as plt 11 | import seaborn as sns 12 | 13 | def got_data(data): 14 | input = list() 15 | input.append(data[:]) 16 | return np.asarray(input) 17 | def xuly(data,SYMB,fd): 18 | input = got_data(data) 19 | scaler = MinMaxScaler() 20 | scaler.fit_transform(input) 21 | input.reshape(-1,30,1) 22 | model = keras.models.load_model('Model\\' + SYMB+'_'+fd+'.h5') 23 | testk = model.predict(input) 24 | m = float(testk) 25 | mn = min(scaler.data_min_) 26 | e = (max(scaler.data_max_)-min(scaler.data_min_)) 27 | return m*e+mn 28 | def xuatdothi_1(bang): 29 | st.line_chart(bang) 30 | def plot_raw_data(date1,ketqua,SYMB): 31 | fig = go.Figure() 32 | fig.add_trace(go.Scatter(x=date1, y=ketqua, name="stock_open")) 33 | fig.layout.update(title_text='Predict Chart of '+ str(SYMB), xaxis_rangeslider_visible=True) 34 | st.plotly_chart(fig) 35 | def got_day(): 36 | st.sidebar.markdown("## Predict") 37 | train_test_forecast_c = st.sidebar.container() 38 | st.title('Predict stock price') 39 | 40 | day = train_test_forecast_c.date_input("Day need to predict") 41 | 42 | day = day-BDay(0) + datetime.timedelta(days=1) - datetime.timedelta(hours=1) 43 | return day 44 | def predict(data,fd,SYMB,day): 45 | 46 | today = datetime.datetime.today() 47 | today = today - BDay(0) 48 | 49 | 50 | 51 | data = data[:][fd] 52 | data = data[-30:] 53 | L = list() 54 | for i in data: 55 | L.append(i) 56 | # print(L) 57 | # print(day,today) 58 | date1 = list() 59 | ketqua = list() 60 | mix = {} 61 | while today <= day: 62 | date1.append(today) 63 | x = xuly(data,SYMB,fd) 64 | L = L[1:] + [x] 65 | data = np.asarray(L) 66 | ketqua.append(x) 67 | mix[today]=x 68 | today = today - BDay(-1) 69 | 70 | plot_raw_data(date1,ketqua,SYMB) 71 | data_item = mix.items() 72 | data_list = list(data_item) 73 | df = pd.DataFrame(data_list,columns=['Day','Value']) 74 | st.write(df) 75 | def fig_1(stock,fd,SYMB): 76 | fig_1,ax = plt.subplots() 77 | fig_1.set_figheight(5) 78 | fig_1.set_figwidth(12) 79 | r_t = np.log((stock[fd]/stock[fd].shift(1))) 80 | mean = np.mean(r_t) 81 | r_t[0] = mean 82 | ax.plot(r_t, linestyle='--', marker='o') 83 | ax.axhline(y=mean, label='mean return', c='red') 84 | ax.legend() 85 | st.write('\n') 86 | st.title('Prive movement chart '+str(fd)+' of '+SYMB) 87 | st.pyplot(fig_1) 88 | return r_t,mean 89 | def fig_3(stock,fd,SYMB,r_t,mean): 90 | st.title('Overall average daily profit of '+SYMB) 91 | fig_3,ax = plt.subplots() 92 | fig_3.set_figheight(5) 93 | fig_3.set_figwidth(12) 94 | sns.distplot(r_t, bins = 20) 95 | plt.axvline(x=mean, label='mean return', c='red') 96 | plt.legend() 97 | plt.xlabel('return rate') 98 | plt.ylabel('frequency') 99 | st.pyplot(fig_3) -------------------------------------------------------------------------------- /train.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import pandas as pd 3 | import yfinance as yf 4 | import matplotlib.pyplot as plt 5 | from sklearn.preprocessing import MinMaxScaler 6 | from keras.preprocessing.sequence import TimeseriesGenerator 7 | from keras.models import Sequential 8 | from keras.layers import Dense 9 | from keras.layers import LSTM 10 | from keras.layers import Dropout 11 | from tensorflow import keras 12 | plt.style.use("fivethirtyeight") 13 | import warnings 14 | import streamlit as st 15 | 16 | warnings.filterwarnings("ignore") 17 | def get_data(train,test,time_step,num_predict,date): 18 | x_train= list() 19 | y_train = list() 20 | x_test = list() 21 | y_test = list() 22 | date_test= list() 23 | 24 | for i in range(0,len(train) - time_step - num_predict): 25 | x_train.append(train[i:i+time_step]) 26 | y_train.append(train[i+time_step:i+time_step+num_predict]) 27 | 28 | for i in range(0, len(test) - time_step - num_predict): 29 | x_test.append(test[i:i+time_step]) 30 | y_test.append(test[i+time_step:i+time_step+num_predict]) 31 | date_test.append(date[i+time_step]) 32 | return np.asarray(x_train), np.asarray(y_train), np.asarray(x_test), np.asarray(y_test), np.asarray(date_test) 33 | def train(data,prop): 34 | data_end = int(np.floor(0.8*(data.shape[0]))) 35 | train = data[0:data_end][prop] 36 | test = data[data_end:][prop] 37 | date_test = data[data_end:]['Date'] 38 | train = train.values.reshape(-1) 39 | test = test.values.reshape(-1) 40 | date_test = date_test.values.reshape(-1) 41 | x_train, y_train, x_test, y_test, date_test = get_data(train,test,30,1, date_test) 42 | 43 | x_train = x_train.reshape(-1,30) 44 | x_test = x_test.reshape(-1,30) 45 | 46 | scaler = MinMaxScaler() 47 | x_train = scaler.fit_transform(x_train) 48 | y_train = scaler.fit_transform(y_train) 49 | 50 | x_test = scaler.fit_transform(x_test) 51 | y_test = scaler.fit_transform(y_test) 52 | x_train = x_train.reshape(-1,30,1) 53 | y_train = y_train.reshape(-1,1) 54 | 55 | x_test = x_test.reshape(-1,30,1) 56 | y_test = y_test.reshape(-1,1) 57 | date_test = date_test.reshape(-1,1) 58 | n_input = 30 59 | n_features = 1 60 | 61 | model = Sequential() 62 | model.add(LSTM(units = 50, input_shape=(n_input, n_features), return_sequences=True)) 63 | 64 | model.add(Dropout(0.3)) 65 | model.add(LSTM(units = 50, return_sequences=True)) 66 | model.add(Dropout(0.3)) 67 | model.add(LSTM(units = 50)) 68 | model.add(Dropout(0.3)) 69 | model.add(Dense(1)) 70 | model.compile(optimizer ='adam', loss ='mse') 71 | model.fit(x_train, y_train, epochs=500, validation_split=0.2, verbose=1, batch_size=30) 72 | model.save(f'Model\\Your_stock_{prop}.h5') 73 | model = keras.models.load_model(f'Model\\Your_stock_{prop}.h5') 74 | test_output = model.predict(x_test) 75 | 76 | test_1 = scaler.inverse_transform(test_output) 77 | test_2 =scaler.inverse_transform(y_test) 78 | fig,ax = plt.subplots() 79 | fig.set_figheight(5) 80 | fig.set_figwidth(12) 81 | plt.title(prop) 82 | plt.plot(test_1, color='r') 83 | plt.plot(test_2, color='b') 84 | plt.xlabel("Date") 85 | plt.ylabel("Price") 86 | plt.legend(('prediction', 'reality'),loc='upper right') 87 | st.pyplot(fig) 88 | # plt.show() 89 | # stock = pd.read_csv("NFLX.csv") 90 | # train(stock,'Open') -------------------------------------------------------------------------------- /predict_stock_web.py: -------------------------------------------------------------------------------- 1 | import streamlit as st 2 | import datetime 3 | import numpy as np 4 | import pandas as pd 5 | import matplotlib.pyplot as plt 6 | import plotly.graph_objects as go 7 | import plotly.figure_factory as ff 8 | import yfinance as yf 9 | from pandas.tseries.offsets import BDay 10 | import pandas as pd 11 | from sklearn.preprocessing import MinMaxScaler 12 | from keras.models import Sequential 13 | from tensorflow import keras 14 | import warnings 15 | import seaborn as sns 16 | from function import * 17 | from train import * 18 | plt.style.use("fivethirtyeight") 19 | warnings.filterwarnings("ignore") 20 | 21 | 22 | 23 | st.set_page_config(layout="wide", initial_sidebar_state="expanded") 24 | st.image("abc.png",width = 150) #logo 25 | st.markdown('# Nhóm Rạp Xiếc \n** Prestige and quality **') # brand name 26 | 27 | 28 | # ------ layout setting--------------------------- 29 | window_selection_c = st.sidebar.container() # create an empty container in the sidebar 30 | window_selection_c.markdown("## Nhóm Rạp Xiếc") # add a title to the sidebar container 31 | sub_columns = window_selection_c.columns(2) #Split the container into two columns for start and end date 32 | 33 | today = datetime.datetime.today() 34 | YESTERDAY = today - BDay(0) 35 | 36 | DEFAULT_START=today - BDay(365) 37 | START = sub_columns[0].date_input("From", value=DEFAULT_START, max_value=YESTERDAY) 38 | END = sub_columns[1].date_input("To", value=YESTERDAY, max_value=YESTERDAY, min_value=START) 39 | 40 | 41 | STOCKS = np.array([ "GOOG", "AMZN", "FB","AAPL","TSLA","Another Choice"]) # TODO : include all stocks 42 | SYMB = window_selection_c.selectbox("select stock", STOCKS) 43 | 44 | if SYMB != "Another Choice": 45 | # # # # ------------------------Plot stock linecharts-------------------- 46 | st.title('Price data of '+SYMB+' stock') 47 | tickerData = yf.Ticker(SYMB) 48 | stock = tickerData.history(period='1d', start=START, end=END) 49 | field = np.array([ "Open", "High", "Low","Close","Volume"]) # TODO : include all stocks 50 | fd = window_selection_c.selectbox("select field", field) 51 | xuatdothi_1(stock[fd]) 52 | st.title('Price data of '+SYMB+' stock') 53 | stock = stock.drop('Stock Splits',1) 54 | stock = stock.drop('Dividends',1) 55 | st.write(stock[:][:]) 56 | 57 | #-------------------------------------------------------------------------------------------------------------------------------------- 58 | r_t,mean = fig_1(stock,fd,SYMB) 59 | 60 | 61 | 62 | #-------------------------------------------------------------------------------------------------------------------------------------- 63 | fig_3(stock,fd,SYMB,r_t,mean) 64 | 65 | 66 | 67 | # #----part-1--------------------------------Session state intializations--------------------------------------------------------------- 68 | 69 | if "TEST_INTERVAL_LENGTH" not in st.session_state: 70 | # set the initial default value of test interval 71 | st.session_state.TEST_INTERVAL_LENGTH = 60 72 | 73 | if "TRAIN_INTERVAL_LENGTH" not in st.session_state: 74 | # set the initial default value of the training length widget 75 | st.session_state.TRAIN_INTERVAL_LENGTH = 500 76 | 77 | if "HORIZON" not in st.session_state: 78 | # set the initial default value of horizon length widget 79 | st.session_state.HORIZON = 60 80 | 81 | if 'TRAINED' not in st.session_state: 82 | st.session_state.TRAINED=False 83 | 84 | # #---------------------------------------------------------Train_test_forecast_splits--------------------------------------------------- 85 | today = today - BDay(0) 86 | d30bf = today - BDay(100) 87 | data = tickerData.history(period='1d', start=d30bf, end=today) 88 | data.reset_index(inplace=True) 89 | day = got_day() 90 | predict(data,fd,SYMB,day) 91 | # THêm bảng testing error ss dữ liệu test vs dự đoán 92 | else: 93 | uploaded_file = window_selection_c.file_uploader("Choose a file") 94 | stock = pd.DataFrame() 95 | if uploaded_file is not None: 96 | stock = pd.read_csv(uploaded_file,index_col=0,parse_dates=True,infer_datetime_format=True) 97 | # print(stock) 98 | 99 | sl = stock.columns 100 | fd = window_selection_c.selectbox("select field to show", sl) 101 | st.title('Price data of your stock') 102 | xuatdothi_1(stock[fd]) 103 | st.write(stock) 104 | SYMB = 'Your_stock' 105 | r_t,mean = fig_1(stock,fd,SYMB) 106 | fig_3(stock,fd,SYMB,r_t,mean) 107 | Size = stock[fd].shape[0] 108 | stock.reset_index(inplace=True) 109 | Button = window_selection_c.button("Train") 110 | if Button: 111 | for ld in sl: 112 | train(stock,ld) 113 | day = got_day() 114 | fdd = window_selection_c.selectbox("select field to predict",sl) 115 | 116 | predict(stock[:30],fd,'Your_stock',day) 117 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Web predicts stock prices using Long - Short Term Memory algorithm 2 | 3 | *Give me some stars please!!!* 4 | 5 |
Long - Short Term Memory Algorithm
6 | 7 | ***Link video demo project*** [Click here!!!](https:////youtu.be/dJPBohy9x44) 8 | 9 | ## Introduction 10 | 11 | Long - Short Term Memory (LSTM) is a good algorithm for predicting stock prices. By the way use prices of past we can predict the prices of present and future. 12 | 13 | 14 | 15 | Long - Short Term Memory networks, commonly known as LSTMs, are a special type of RNN that also handle ordered sequence data well, but LSTMs are resistant to vanishing gradients from which to learn dependencies. far. 16 | 17 | 18 | Image 1: LSTM network 19 | 20 | 21 | - Input: $C t-1 , h t-1 , x t$ . Where x t is the input in the tth state of the model. $C t-1 , h t-1$ are the output of the previous layer. 22 | 23 | - Output: $ C t , h$ t , we call c cell state, h is hidden state. K sign: σ, tanh means that step uses sigmoid, tanh activation function. The multiplication here is element-wise multiplication, the addition is matrix addition. Where: $ f t , i t , O t$ corresponding to forget gate, input gate and output gate. 24 | - Forget gate: $f t = σ(U f * x f + W f * h t -1 + b f )$ 25 | - Input gate: $i t = σ(U i * x t +W i * h t-1 + b i )$ 26 | - Output gate: $o t = σ (U o * x t + W o * h t-1 + b o )$ 27 | 28 | ## Explanation of the LSTM algorithm 29 | 30 | - The LSTM network is an improvement of the traditional regression network, so the model has the following new points: 31 | 32 | 33 | 34 | Image 2: Cell state 35 | 36 | Cell state is the horizontal line that runs through the top of the diagram, like a carousel , the memory of an LSTM network . It runs through the entire chain, with only a small linear number of interactions LSTMs are capable of removing or adding information to the cell state, which is carefully regulated by structures called gates. 37 | Portals are an optional way to pass information. They use sigmoid and tanh activation functions. An LSTM has three ports, for protection and control of cell state. 38 | 39 | ### a. Forget gate: 40 | 41 | 42 | 43 | Image 3: Forget gate 44 | 45 | - Forget gate : t does not pass through the sigmod layer to make informed decisions about whether to enter the cell state. h value t-1 and x t passing through the sigmod class yields a value between 0 and 1 for each cell state. 46 | 47 | - The sigmoid class outputs numbers from 0 to 1, describing the throughput of each component. A value of 0 means "nothing through", while a value of one means "let everything pass!" 48 | 49 | 50 | 51 | ### b. Input gate: 52 | 53 | 54 | 55 | Image 4: Input gate 56 | 57 | - Input gate : q determines the new information to be stored in the cell state. Consists of two parts: The sigmod class that decides which values are updated and a tanh class that holds new values that can be added to the cell state . 58 | 59 | 60 | 61 | 62 | - Finally combine the above two to create a new value to update the cell state. 63 | 64 | 65 | 66 | 67 | - Next we update the old cell state C t-1 with C t . Multiply f t forget information to forget and add new values 68 | 69 | 70 | 71 | ### c. Output gate: 72 | 73 | 74 | 75 | Image 5: Output gate 76 | 77 | - Output gate: q decides what information will be approved. First, we run a sigmoid class, which determines what part of the cell state we should output. Then we set the cell state via tanh function (push the value to range from -1 to 1). 78 | 79 | 80 | 81 | 82 | - Finally multiply by the output of the sigmoid gate to get the necessary information. 83 | 84 | 85 | 86 | 87 | ## Application to stock prediction problem 88 | 89 | ### 1. Get data 90 | 91 | - Data is downloaded from yahoo finance 92 | - From the downloaded dataset we extract the data field that we will use to train 93 | - After getting the required data, we divide the data into 2 datasets: Data_train and Data_test 94 | + Data_train will be used by us in training to create Model 95 | + Data_test will be used in evaluating Model 96 | 97 | 98 | 99 | Image 1: Data 100 | 101 | - The dataset is taken from the finance.yahoo.com package . The information about the stock exchange from March 8, 2010 to October 31, 2021 includes 2795 lines and 7 columns. Data fields: 102 | 103 | 104 | 105 | 106 | Image 2: Data Netflix stock 107 | 108 | ### 2. Data processing 109 | 110 | - Here, we use the MinMaxScaler function of scikit learn library and scale the data set to numbers in the range (0, 1) to put into the neural network. 111 | 112 | ### 3. Building LSTM neuron model 113 | 114 | - As a first step, we need to instantiate the Sequential class. Sequential is a model where layers are stacked linearly 115 | The model class of the problem includes the LSTM, Dropout, and Dense classes . 116 | Above we add 3 consecutive LSTM layers, and every 1 layer is 1 dropout 0.3 . Finally, we pass a Dense layer with 1-dimensional output. 117 | 118 | 119 | 120 | 121 | Image 3: LSTM neural network 122 | 123 | ### 4. Experimental results: 124 | 125 | - Accuracy of the model on stock Facebook account: 126 | 127 | 128 | 129 | Image 4: The chart shows the predicted and actual Facebook shares in the period of 2020 - 2021 130 | 131 | + MSE = 47.55213519067378 132 | + MAE = 5.282921711782391 133 | + Max = 23.76751708984375 134 | + M in = 0.061798095703125 135 | 136 | The value of Facebook votes tends to increase, from the chart above we can see that the prediction line matches the actual line, the average sum of squares is about 47.55 , the average price difference is low at dollar 5.28 , the price difference is high. approx. 23.7 7 dollar, lowest 0.06 dollar 137 | => Good predictive model. 138 | 139 | ## The flow of website 140 | 141 | ### 1. User interface 142 | 143 | 144 | 145 | 146 | Image 1: User interface 147 | 148 | ### __2. Select: __Stocks__, __Field stocks 149 | 150 | - To predict price stock you need to input the name of stock and the number of days you want to predict 151 | 152 | 153 | 154 | Image 2: Select stocks and field stocks 155 | 156 | - At here if we don't have stock you want, we can add it by clicking the button "Another stock" and input file csv of stock. 157 | - Tips: If your stock is new one, you can choose stock already on the market but similar with your stock. 158 | 159 | ### 3. Choose day to predict: DayBegin, DayEnd 160 | 161 | 162 | 163 | Image 3: Select stocks and field stocks 164 | 165 | ### 4. Predict stock price 166 | 167 | - Output: Stock price in future 168 | 169 | This train live with data of historical stock prices. So time to predict quite long. 170 | 171 | 172 | 173 | Image 4: Predict stock price 174 | 175 |
How to install project
176 | 177 | ## Library required 178 | 179 | - [Numpy](https://www.numpy.org/) = 1.21.5 180 | - [Pandas](https://pandas.pydata.org/) = 1.3.5 181 | - [Matplotlib](https://matplotlib.org/) = 3.3.4 182 | - [Streamlit](https://streamlit.io/) = 1.0.0 183 | - [tensorflow](https://www.tensorflow.org/) = 2.7.0 184 | - skikit-learn = 1.0 185 | - Yfinance = 0.1.64 186 | 187 |

Run tutorial

188 | 189 | 190 | 191 | run web in terminal 192 | 193 |
Conclusion and comments
194 | 195 | - After running the experiment for each stock code, the model gives results with different accuracy. Details for stock code Amazon, Google , T esla : actual price and predicted price are different. Many prediction models are not good, affecting the quality of the transaction, but can predict the up or down trend of stocks. promissory note. As for the code Facebook and Apple , the predicted price is quite similar to the actual price . 196 | 197 | - However, in reality, the stock market depends not only on numbers but also on political factors, domestic and global economic contexts, unexpected shocks (Covid-19 and natural disasters). disaster, crop failure,...), the company's financial performance, etc. 198 | 199 | - In addition, the prediction accuracy is still lacking because the LSTM network still has many disadvantages such as: Information must be processed sequentially, only learning information from previous states, cannot learn information. distant due to vanishing gradient. 200 | 201 | - Ways to improve and develop direction : add data, add features ( Quarterly profit , Income from service activities, Other operating expenses, General and administrative expenses, ...). Research using algorithms to overcome the disadvantages of LSTM networks . 202 | 203 |
References
204 | 205 | 206 | 1.https://en.wikipedia.org/wiki/Average_Average_Number_Available 207 | Accessed December 20, 2021 Wikipedia 208 | 2. https://ndquy.github.io/posts/cac-phuong-phap-scaling/ 209 | accessed on December 28, 2021 ndquy blog 210 | 3. https://medium.com/analytics-vidhya/long-short-term-memory-networks-23119598b66b 211 | accessed on December 28, 2021 Author Vinithavn – medium.com 212 | 4. https://medium.com/@asmello/introduction-to-model-evaluation-part-1-regression-and-classification-metrics-e75179d01db 213 | accessed on December 28, 2021 Author André Mello – medium.com 214 | 5. https://nttuan8.com/bai-14-long-short-term-memory-lstm/ 215 | accessed on 1/12/2021 Author Nguyen Thanh Tuan 216 | 6. https://nttuan8.com/bai-13-recurrent-neural-network/ 217 | accessed on 1/12/2021 Author Nguyen Thanh Tuan 218 | 7. https://www.kaggle.com/towarddatascience/sample-code?fbclid=IwAR3St8P2IhS6r18Oso18_PYLObLjH03lIUYoFusasFMR0tOKHM4_i0xv2As 219 | accessed 12/27/2021 – Kaggle 220 | 8. https://viblo.asia/p/optimizer-hieu-sau-ve-cac-thuat-toan-toi-uu-gdsgdadam-Qbq5QQ9E5D8 221 | accessed on December 27, 2021 – Author Tran Trung Truc 222 | 9. https://streamlit.io 223 | accessed 12/15/2021 – Streamlit 224 | 10. https://blog.mlreview.com/understanding-lstm-and-its-diagrams-37e2f46f1714 225 | accessed 12/15/2021 – Author Shi Yan 226 | 11. https://stanford.edu/~shervine/l/en/teaching/cs-230/cheatsheet-recurrent-neural-networks 227 | accessed 12/15/2021 - Author Shervine Amidi 228 | 12. https://medium.datadriveninvestor.com/how-do-lstm-networks-solve-the-problem-of-vanishing-gradients-a6784971a577 229 | accessed 12/15/2021 - Author Nir Arbel 230 | 13. https://dominhhai.github.io/vi/2018/04/nn-bp 231 | accessed 11/28/2021- Hai's Blog 232 | 233 | 234 | # License 235 | 236 | Any questions? Feel free to contact me at: vothuongtruongnhon2002@gmail.com 237 | 238 | # Author 239 | 240 | [Võ Thương Trường Nhơn](https://github.com/truongnhon-hutech) 241 | 242 | [Phạm Đức Tài](https://github.com/tai121) 243 | 244 | Nguyễn Hồng Thái 245 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.toptal.com/developers/gitignore/api/visualstudiocode,python,jupyternotebooks,visualstudio 2 | # Edit at https://www.toptal.com/developers/gitignore?templates=visualstudiocode,python,jupyternotebooks,visualstudio 3 | 4 | ### JupyterNotebooks ### 5 | # gitignore template for Jupyter Notebooks 6 | # website: http://jupyter.org/ 7 | 8 | .ipynb_checkpoints 9 | */.ipynb_checkpoints/* 10 | 11 | # IPython 12 | profile_default/ 13 | ipython_config.py 14 | 15 | # Remove previous ipynb_checkpoints 16 | # git rm -r .ipynb_checkpoints/ 17 | 18 | ### Python ### 19 | # Byte-compiled / optimized / DLL files 20 | __pycache__/ 21 | *.py[cod] 22 | *$py.class 23 | 24 | # C extensions 25 | *.so 26 | 27 | # Distribution / packaging 28 | .Python 29 | build/ 30 | develop-eggs/ 31 | dist/ 32 | downloads/ 33 | eggs/ 34 | .eggs/ 35 | lib/ 36 | lib64/ 37 | parts/ 38 | sdist/ 39 | var/ 40 | wheels/ 41 | share/python-wheels/ 42 | *.egg-info/ 43 | .installed.cfg 44 | *.egg 45 | MANIFEST 46 | 47 | # PyInstaller 48 | # Usually these files are written by a python script from a template 49 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 50 | *.manifest 51 | *.spec 52 | 53 | # Installer logs 54 | pip-log.txt 55 | pip-delete-this-directory.txt 56 | 57 | # Unit test / coverage reports 58 | htmlcov/ 59 | .tox/ 60 | .nox/ 61 | .coverage 62 | .coverage.* 63 | .cache 64 | nosetests.xml 65 | coverage.xml 66 | *.cover 67 | *.py,cover 68 | .hypothesis/ 69 | .pytest_cache/ 70 | cover/ 71 | 72 | # Translations 73 | *.mo 74 | *.pot 75 | 76 | # Django stuff: 77 | *.log 78 | local_settings.py 79 | db.sqlite3 80 | db.sqlite3-journal 81 | 82 | # Flask stuff: 83 | instance/ 84 | .webassets-cache 85 | 86 | # Scrapy stuff: 87 | .scrapy 88 | 89 | # Sphinx documentation 90 | docs/_build/ 91 | 92 | # PyBuilder 93 | .pybuilder/ 94 | target/ 95 | 96 | # Jupyter Notebook 97 | 98 | # IPython 99 | 100 | # pyenv 101 | # For a library or package, you might want to ignore these files since the code is 102 | # intended to run in multiple environments; otherwise, check them in: 103 | # .python-version 104 | 105 | # pipenv 106 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 107 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 108 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 109 | # install all needed dependencies. 110 | #Pipfile.lock 111 | 112 | # poetry 113 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 114 | # This is especially recommended for binary packages to ensure reproducibility, and is more 115 | # commonly ignored for libraries. 116 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 117 | #poetry.lock 118 | 119 | # pdm 120 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 121 | #pdm.lock 122 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 123 | # in version control. 124 | # https://pdm.fming.dev/#use-with-ide 125 | .pdm.toml 126 | 127 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 128 | __pypackages__/ 129 | 130 | # Celery stuff 131 | celerybeat-schedule 132 | celerybeat.pid 133 | 134 | # SageMath parsed files 135 | *.sage.py 136 | 137 | # Environments 138 | .env 139 | .venv 140 | env/ 141 | venv/ 142 | ENV/ 143 | env.bak/ 144 | venv.bak/ 145 | 146 | # Spyder project settings 147 | .spyderproject 148 | .spyproject 149 | 150 | # Rope project settings 151 | .ropeproject 152 | 153 | # mkdocs documentation 154 | /site 155 | 156 | # mypy 157 | .mypy_cache/ 158 | .dmypy.json 159 | dmypy.json 160 | 161 | # Pyre type checker 162 | .pyre/ 163 | 164 | # pytype static type analyzer 165 | .pytype/ 166 | 167 | # Cython debug symbols 168 | cython_debug/ 169 | 170 | # PyCharm 171 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 172 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 173 | # and can be added to the global gitignore or merged into this file. For a more nuclear 174 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 175 | #.idea/ 176 | 177 | ### VisualStudioCode ### 178 | .vscode/* 179 | !.vscode/settings.json 180 | !.vscode/tasks.json 181 | !.vscode/launch.json 182 | !.vscode/extensions.json 183 | !.vscode/*.code-snippets 184 | 185 | # Local History for Visual Studio Code 186 | .history/ 187 | 188 | # Built Visual Studio Code Extensions 189 | *.vsix 190 | 191 | ### VisualStudioCode Patch ### 192 | # Ignore all local history of files 193 | .history 194 | .ionide 195 | 196 | ### VisualStudio ### 197 | ## Ignore Visual Studio temporary files, build results, and 198 | ## files generated by popular Visual Studio add-ons. 199 | ## 200 | ## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore 201 | 202 | # User-specific files 203 | *.rsuser 204 | *.suo 205 | *.user 206 | *.userosscache 207 | *.sln.docstates 208 | 209 | # User-specific files (MonoDevelop/Xamarin Studio) 210 | *.userprefs 211 | 212 | # Mono auto generated files 213 | mono_crash.* 214 | 215 | # Build results 216 | [Dd]ebug/ 217 | [Dd]ebugPublic/ 218 | [Rr]elease/ 219 | [Rr]eleases/ 220 | x64/ 221 | x86/ 222 | [Ww][Ii][Nn]32/ 223 | [Aa][Rr][Mm]/ 224 | [Aa][Rr][Mm]64/ 225 | bld/ 226 | [Bb]in/ 227 | [Oo]bj/ 228 | [Ll]og/ 229 | [Ll]ogs/ 230 | 231 | # Visual Studio 2015/2017 cache/options directory 232 | .vs/ 233 | # Uncomment if you have tasks that create the project's static files in wwwroot 234 | #wwwroot/ 235 | 236 | # Visual Studio 2017 auto generated files 237 | Generated\ Files/ 238 | 239 | # MSTest test Results 240 | [Tt]est[Rr]esult*/ 241 | [Bb]uild[Ll]og.* 242 | 243 | # NUnit 244 | *.VisualState.xml 245 | TestResult.xml 246 | nunit-*.xml 247 | 248 | # Build Results of an ATL Project 249 | [Dd]ebugPS/ 250 | [Rr]eleasePS/ 251 | dlldata.c 252 | 253 | # Benchmark Results 254 | BenchmarkDotNet.Artifacts/ 255 | 256 | # .NET Core 257 | project.lock.json 258 | project.fragment.lock.json 259 | artifacts/ 260 | 261 | # ASP.NET Scaffolding 262 | ScaffoldingReadMe.txt 263 | 264 | # StyleCop 265 | StyleCopReport.xml 266 | 267 | # Files built by Visual Studio 268 | *_i.c 269 | *_p.c 270 | *_h.h 271 | *.ilk 272 | *.meta 273 | *.obj 274 | *.iobj 275 | *.pch 276 | *.pdb 277 | *.ipdb 278 | *.pgc 279 | *.pgd 280 | *.rsp 281 | *.sbr 282 | *.tlb 283 | *.tli 284 | *.tlh 285 | *.tmp 286 | *.tmp_proj 287 | *_wpftmp.csproj 288 | *.tlog 289 | *.vspscc 290 | *.vssscc 291 | .builds 292 | *.pidb 293 | *.svclog 294 | *.scc 295 | 296 | # Chutzpah Test files 297 | _Chutzpah* 298 | 299 | # Visual C++ cache files 300 | ipch/ 301 | *.aps 302 | *.ncb 303 | *.opendb 304 | *.opensdf 305 | *.sdf 306 | *.cachefile 307 | *.VC.db 308 | *.VC.VC.opendb 309 | 310 | # Visual Studio profiler 311 | *.psess 312 | *.vsp 313 | *.vspx 314 | *.sap 315 | 316 | # Visual Studio Trace Files 317 | *.e2e 318 | 319 | # TFS 2012 Local Workspace 320 | $tf/ 321 | 322 | # Guidance Automation Toolkit 323 | *.gpState 324 | 325 | # ReSharper is a .NET coding add-in 326 | _ReSharper*/ 327 | *.[Rr]e[Ss]harper 328 | *.DotSettings.user 329 | 330 | # TeamCity is a build add-in 331 | _TeamCity* 332 | 333 | # DotCover is a Code Coverage Tool 334 | *.dotCover 335 | 336 | # AxoCover is a Code Coverage Tool 337 | .axoCover/* 338 | !.axoCover/settings.json 339 | 340 | # Coverlet is a free, cross platform Code Coverage Tool 341 | coverage*.json 342 | coverage*.xml 343 | coverage*.info 344 | 345 | # Visual Studio code coverage results 346 | *.coverage 347 | *.coveragexml 348 | 349 | # NCrunch 350 | _NCrunch_* 351 | .*crunch*.local.xml 352 | nCrunchTemp_* 353 | 354 | # MightyMoose 355 | *.mm.* 356 | AutoTest.Net/ 357 | 358 | # Web workbench (sass) 359 | .sass-cache/ 360 | 361 | # Installshield output folder 362 | [Ee]xpress/ 363 | 364 | # DocProject is a documentation generator add-in 365 | DocProject/buildhelp/ 366 | DocProject/Help/*.HxT 367 | DocProject/Help/*.HxC 368 | DocProject/Help/*.hhc 369 | DocProject/Help/*.hhk 370 | DocProject/Help/*.hhp 371 | DocProject/Help/Html2 372 | DocProject/Help/html 373 | 374 | # Click-Once directory 375 | publish/ 376 | 377 | # Publish Web Output 378 | *.[Pp]ublish.xml 379 | *.azurePubxml 380 | # Note: Comment the next line if you want to checkin your web deploy settings, 381 | # but database connection strings (with potential passwords) will be unencrypted 382 | *.pubxml 383 | *.publishproj 384 | 385 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 386 | # checkin your Azure Web App publish settings, but sensitive information contained 387 | # in these scripts will be unencrypted 388 | PublishScripts/ 389 | 390 | # NuGet Packages 391 | *.nupkg 392 | # NuGet Symbol Packages 393 | *.snupkg 394 | # The packages folder can be ignored because of Package Restore 395 | **/[Pp]ackages/* 396 | # except build/, which is used as an MSBuild target. 397 | !**/[Pp]ackages/build/ 398 | # Uncomment if necessary however generally it will be regenerated when needed 399 | #!**/[Pp]ackages/repositories.config 400 | # NuGet v3's project.json files produces more ignorable files 401 | *.nuget.props 402 | *.nuget.targets 403 | 404 | # Microsoft Azure Build Output 405 | csx/ 406 | *.build.csdef 407 | 408 | # Microsoft Azure Emulator 409 | ecf/ 410 | rcf/ 411 | 412 | # Windows Store app package directories and files 413 | AppPackages/ 414 | BundleArtifacts/ 415 | Package.StoreAssociation.xml 416 | _pkginfo.txt 417 | *.appx 418 | *.appxbundle 419 | *.appxupload 420 | 421 | # Visual Studio cache files 422 | # files ending in .cache can be ignored 423 | *.[Cc]ache 424 | # but keep track of directories ending in .cache 425 | !?*.[Cc]ache/ 426 | 427 | # Others 428 | ClientBin/ 429 | ~$* 430 | *~ 431 | *.dbmdl 432 | *.dbproj.schemaview 433 | *.jfm 434 | *.pfx 435 | *.publishsettings 436 | orleans.codegen.cs 437 | 438 | # Including strong name files can present a security risk 439 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 440 | #*.snk 441 | 442 | # Since there are multiple workflows, uncomment next line to ignore bower_components 443 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 444 | #bower_components/ 445 | 446 | # RIA/Silverlight projects 447 | Generated_Code/ 448 | 449 | # Backup & report files from converting an old project file 450 | # to a newer Visual Studio version. Backup files are not needed, 451 | # because we have git ;-) 452 | _UpgradeReport_Files/ 453 | Backup*/ 454 | UpgradeLog*.XML 455 | UpgradeLog*.htm 456 | ServiceFabricBackup/ 457 | *.rptproj.bak 458 | 459 | # SQL Server files 460 | *.mdf 461 | *.ldf 462 | *.ndf 463 | 464 | # Business Intelligence projects 465 | *.rdl.data 466 | *.bim.layout 467 | *.bim_*.settings 468 | *.rptproj.rsuser 469 | *- [Bb]ackup.rdl 470 | *- [Bb]ackup ([0-9]).rdl 471 | *- [Bb]ackup ([0-9][0-9]).rdl 472 | 473 | # Microsoft Fakes 474 | FakesAssemblies/ 475 | 476 | # GhostDoc plugin setting file 477 | *.GhostDoc.xml 478 | 479 | # Node.js Tools for Visual Studio 480 | .ntvs_analysis.dat 481 | node_modules/ 482 | 483 | # Visual Studio 6 build log 484 | *.plg 485 | 486 | # Visual Studio 6 workspace options file 487 | *.opt 488 | 489 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 490 | *.vbw 491 | 492 | # Visual Studio 6 auto-generated project file (contains which files were open etc.) 493 | *.vbp 494 | 495 | # Visual Studio 6 workspace and project file (working project files containing files to include in project) 496 | *.dsw 497 | *.dsp 498 | 499 | # Visual Studio 6 technical files 500 | 501 | # Visual Studio LightSwitch build output 502 | **/*.HTMLClient/GeneratedArtifacts 503 | **/*.DesktopClient/GeneratedArtifacts 504 | **/*.DesktopClient/ModelManifest.xml 505 | **/*.Server/GeneratedArtifacts 506 | **/*.Server/ModelManifest.xml 507 | _Pvt_Extensions 508 | 509 | # Paket dependency manager 510 | .paket/paket.exe 511 | paket-files/ 512 | 513 | # FAKE - F# Make 514 | .fake/ 515 | 516 | # CodeRush personal settings 517 | .cr/personal 518 | 519 | # Python Tools for Visual Studio (PTVS) 520 | *.pyc 521 | 522 | # Cake - Uncomment if you are using it 523 | # tools/** 524 | # !tools/packages.config 525 | 526 | # Tabs Studio 527 | *.tss 528 | 529 | # Telerik's JustMock configuration file 530 | *.jmconfig 531 | 532 | # BizTalk build output 533 | *.btp.cs 534 | *.btm.cs 535 | *.odx.cs 536 | *.xsd.cs 537 | 538 | # OpenCover UI analysis results 539 | OpenCover/ 540 | 541 | # Azure Stream Analytics local run output 542 | ASALocalRun/ 543 | 544 | # MSBuild Binary and Structured Log 545 | *.binlog 546 | 547 | # NVidia Nsight GPU debugger configuration file 548 | *.nvuser 549 | 550 | # MFractors (Xamarin productivity tool) working folder 551 | .mfractor/ 552 | 553 | # Local History for Visual Studio 554 | .localhistory/ 555 | 556 | # Visual Studio History (VSHistory) files 557 | .vshistory/ 558 | 559 | # BeatPulse healthcheck temp database 560 | healthchecksdb 561 | 562 | # Backup folder for Package Reference Convert tool in Visual Studio 2017 563 | MigrationBackup/ 564 | 565 | # Ionide (cross platform F# VS Code tools) working folder 566 | .ionide/ 567 | 568 | # Fody - auto-generated XML schema 569 | FodyWeavers.xsd 570 | 571 | # VS Code files for those working on multiple tools 572 | *.code-workspace 573 | 574 | # Local History for Visual Studio Code 575 | 576 | # Windows Installer files from build outputs 577 | *.cab 578 | *.msi 579 | *.msix 580 | *.msm 581 | *.msp 582 | 583 | # JetBrains Rider 584 | *.sln.iml 585 | 586 | ### VisualStudio Patch ### 587 | # Additional files built by Visual Studio 588 | 589 | # End of https://www.toptal.com/developers/gitignore/api/visualstudiocode,python,jupyternotebooks,visualstudio 590 | -------------------------------------------------------------------------------- /NFLX.csv: -------------------------------------------------------------------------------- 1 | Date,Open,High,Low,Close,Adj Close,Volume 2 | 2020-12-28,516.429993,523.659973,507.130005,519.119995,519.119995,2891900 3 | 2020-12-29,519.900024,536.549988,515.479980,530.869995,530.869995,4022400 4 | 2020-12-30,530.130005,533.260010,523.690002,524.590027,524.590027,1876300 5 | 2020-12-31,525.530029,545.500000,523.150024,540.729980,540.729980,5392300 6 | 2021-01-04,539.000000,540.799988,515.090027,522.859985,522.859985,4444400 7 | 2021-01-05,521.549988,526.780029,515.890015,520.799988,520.799988,3133900 8 | 2021-01-06,511.970001,513.099976,499.500000,500.489990,500.489990,5346200 9 | 2021-01-07,508.279999,516.440002,506.420013,508.890015,508.890015,3686400 10 | 2021-01-08,511.309998,513.239990,504.510010,510.399994,510.399994,2973900 11 | 2021-01-11,507.839996,510.730011,497.950012,499.100006,499.100006,3806200 12 | 2021-01-12,500.000000,501.089996,485.670013,494.250000,494.250000,5990400 13 | 2021-01-13,495.500000,512.349976,493.010010,507.790009,507.790009,5032100 14 | 2021-01-14,507.350006,514.500000,499.579987,500.859985,500.859985,4177400 15 | 2021-01-15,500.000000,506.320007,495.100006,497.980011,497.980011,5895800 16 | 2021-01-19,501.000000,509.250000,493.540009,501.769989,501.769989,12315800 17 | 2021-01-20,565.419983,593.289978,556.859985,586.340027,586.340027,32637500 18 | 2021-01-21,582.450012,588.750000,570.400024,579.840027,579.840027,11802100 19 | 2021-01-22,582.099976,583.989990,564.349976,565.169983,565.169983,7550800 20 | 2021-01-25,567.000000,569.750000,548.650024,556.780029,556.780029,7207300 21 | 2021-01-26,554.729980,567.989990,554.059998,561.929993,561.929993,5023800 22 | 2021-01-27,550.710022,556.419983,515.729980,523.280029,523.280029,8670300 23 | 2021-01-28,535.880005,553.150024,530.739990,538.599976,538.599976,5969000 24 | 2021-01-29,538.000000,541.000000,530.179993,532.390015,532.390015,4325300 25 | 2021-02-01,536.789978,545.059998,531.729980,539.039978,539.039978,3547500 26 | 2021-02-02,542.010010,555.479980,538.929993,548.159973,548.159973,3767600 27 | 2021-02-03,550.169983,550.479980,538.239990,539.450012,539.450012,3172300 28 | 2021-02-04,539.809998,559.479980,537.510010,552.159973,552.159973,5164500 29 | 2021-02-05,552.260010,554.440002,545.479980,550.789978,550.789978,2376200 30 | 2021-02-08,555.000000,555.000000,543.700012,547.919983,547.919983,2791700 31 | 2021-02-09,546.000000,566.000000,543.000000,559.070007,559.070007,3703500 32 | 2021-02-10,562.500000,566.650024,553.460022,563.590027,563.590027,3991300 33 | 2021-02-11,564.440002,565.929993,554.219971,557.590027,557.590027,2730600 34 | 2021-02-12,556.940002,561.250000,550.849976,556.520020,556.520020,2197100 35 | 2021-02-16,557.289978,563.630005,552.729980,557.280029,557.280029,2624100 36 | 2021-02-17,550.989990,555.250000,543.030029,551.340027,551.340027,2069600 37 | 2021-02-18,549.000000,550.000000,538.229980,548.219971,548.219971,2456200 38 | 2021-02-19,548.000000,548.989990,538.809998,540.219971,540.219971,2841500 39 | 2021-02-22,534.989990,541.789978,530.789978,533.780029,533.780029,3078600 40 | 2021-02-23,525.000000,548.539978,518.280029,546.150024,546.150024,4136500 41 | 2021-02-24,539.799988,556.849976,539.070007,553.409973,553.409973,3245000 42 | 2021-02-25,550.270020,556.479980,535.750000,546.700012,546.700012,4252900 43 | 2021-02-26,546.510010,553.090027,538.000000,538.849976,538.849976,3755600 44 | 2021-03-01,545.570007,552.140015,542.000000,550.640015,550.640015,3041400 45 | 2021-03-02,553.340027,556.989990,546.020020,547.820007,547.820007,3042200 46 | 2021-03-03,545.929993,548.010010,517.809998,520.700012,520.700012,5362400 47 | 2021-03-04,521.500000,531.500000,507.679993,511.290009,511.290009,5034800 48 | 2021-03-05,511.980011,517.760010,498.790009,516.390015,516.390015,5070000 49 | 2021-03-08,514.460022,518.840027,492.850006,493.329987,493.329987,3981800 50 | 2021-03-09,507.309998,513.109985,503.820007,506.440002,506.440002,3470000 51 | 2021-03-10,513.500000,518.969971,504.250000,504.540009,504.540009,3771500 52 | 2021-03-11,512.200012,530.239990,510.709991,523.059998,523.059998,4714500 53 | 2021-03-12,512.500000,526.510010,506.589996,518.020020,518.020020,3981700 54 | 2021-03-15,516.320007,520.729980,508.029999,520.250000,520.250000,3484300 55 | 2021-03-16,524.469971,533.419983,523.210022,524.030029,524.030029,3238900 56 | 2021-03-17,522.000000,528.369995,514.299988,524.440002,524.440002,2817400 57 | 2021-03-18,516.400024,517.900024,503.850006,504.790009,504.790009,4094500 58 | 2021-03-19,504.959991,513.190002,501.630005,512.179993,512.179993,4386400 59 | 2021-03-22,509.130005,529.309998,509.130005,523.109985,523.109985,3360600 60 | 2021-03-23,529.869995,543.119995,529.400024,535.090027,535.090027,5583500 61 | 2021-03-24,533.780029,534.419983,520.000000,520.809998,520.809998,4102200 62 | 2021-03-25,516.989990,518.530029,497.000000,502.859985,502.859985,4926800 63 | 2021-03-26,502.820007,508.720001,496.679993,508.049988,508.049988,3467800 64 | 2021-03-29,505.660004,518.000000,504.399994,513.950012,513.950012,3330000 65 | 2021-03-30,510.510010,514.409973,506.910004,513.390015,513.390015,2418100 66 | 2021-03-31,515.669983,528.130005,515.440002,521.659973,521.659973,3503100 67 | 2021-04-01,529.929993,540.500000,527.030029,539.419983,539.419983,3938600 68 | 2021-04-05,540.010010,542.849976,529.229980,540.669983,540.669983,3355900 69 | 2021-04-06,544.809998,554.169983,543.299988,544.530029,544.530029,3474200 70 | 2021-04-07,543.500000,549.640015,541.450012,546.989990,546.989990,2151300 71 | 2021-04-08,551.130005,556.900024,547.570007,554.580017,554.580017,4309800 72 | 2021-04-09,552.690002,556.900024,547.109985,555.309998,555.309998,2894000 73 | 2021-04-12,551.049988,557.979980,549.580017,552.780029,552.780029,2944100 74 | 2021-04-13,557.000000,559.750000,550.299988,553.729980,553.729980,2720300 75 | 2021-04-14,554.869995,554.869995,538.530029,540.020020,540.020020,3740300 76 | 2021-04-15,544.169983,553.489990,542.659973,549.219971,549.219971,3139100 77 | 2021-04-16,550.539978,551.979980,539.510010,546.539978,546.539978,3209100 78 | 2021-04-19,546.900024,556.440002,545.530029,554.440002,554.440002,4288700 79 | 2021-04-20,554.419983,563.559998,546.299988,549.570007,549.570007,11257600 80 | 2021-04-21,508.000000,515.460022,503.600006,508.899994,508.899994,22897400 81 | 2021-04-22,513.820007,513.960022,500.549988,508.779999,508.779999,9061100 82 | 2021-04-23,509.010010,509.700012,500.700012,505.549988,505.549988,7307700 83 | 2021-04-26,506.760010,510.480011,503.000000,510.299988,510.299988,4388800 84 | 2021-04-27,512.619995,512.989990,504.579987,505.549988,505.549988,3761300 85 | 2021-04-28,505.200012,508.399994,503.339996,506.519989,506.519989,3193000 86 | 2021-04-29,507.600006,509.290009,499.000000,509.000000,509.000000,5127800 87 | 2021-04-30,505.000000,514.549988,505.000000,513.469971,513.469971,4413200 88 | 2021-05-03,512.650024,518.950012,505.200012,509.109985,509.109985,4091900 89 | 2021-05-04,510.779999,511.630005,496.790009,503.179993,503.179993,4349500 90 | 2021-05-05,504.989990,507.779999,494.630005,496.079987,496.079987,3129400 91 | 2021-05-06,495.989990,499.549988,491.369995,499.549988,499.549988,3783700 92 | 2021-05-07,504.619995,508.549988,501.119995,503.839996,503.839996,3132800 93 | 2021-05-10,502.000000,503.149994,486.109985,486.690002,486.690002,5131600 94 | 2021-05-11,479.750000,497.989990,478.630005,495.079987,495.079987,4401000 95 | 2021-05-12,486.829987,493.540009,482.700012,484.980011,484.980011,4121500 96 | 2021-05-13,489.130005,490.779999,482.709991,486.660004,486.660004,2712500 97 | 2021-05-14,487.859985,494.850006,486.589996,493.369995,493.369995,2882500 98 | 2021-05-17,485.589996,492.709991,482.809998,488.940002,488.940002,2705200 99 | 2021-05-18,488.399994,493.480011,486.190002,486.279999,486.279999,2350500 100 | 2021-05-19,481.630005,488.570007,478.540009,487.700012,487.700012,3349900 101 | 2021-05-20,489.549988,502.700012,488.980011,501.670013,501.670013,3721200 102 | 2021-05-21,503.119995,505.399994,497.260010,497.890015,497.890015,3322900 103 | 2021-05-24,501.049988,504.250000,499.510010,502.899994,502.899994,2412600 104 | 2021-05-25,506.000000,506.369995,499.220001,501.339996,501.339996,2699500 105 | 2021-05-26,502.339996,504.140015,500.500000,502.359985,502.359985,2465300 106 | 2021-05-27,501.799988,505.100006,498.540009,503.859985,503.859985,3253800 107 | 2021-05-28,504.399994,511.760010,502.529999,502.809998,502.809998,2910300 108 | 2021-06-01,504.010010,505.410004,497.739990,499.079987,499.079987,2482600 109 | 2021-06-02,499.820007,503.220001,495.820007,499.239990,499.239990,2269000 110 | 2021-06-03,495.190002,496.660004,487.250000,489.429993,489.429993,3887400 111 | 2021-06-04,492.000000,501.859985,490.950012,494.739990,494.739990,3160500 112 | 2021-06-07,492.920013,496.700012,490.549988,494.660004,494.660004,2791900 113 | 2021-06-08,497.000000,498.820007,489.369995,492.390015,492.390015,2374000 114 | 2021-06-09,494.500000,496.089996,484.649994,485.809998,485.809998,3055000 115 | 2021-06-10,487.170013,490.209991,482.140015,487.269989,487.269989,4382900 116 | 2021-06-11,490.000000,491.410004,487.779999,488.769989,488.769989,3124000 117 | 2021-06-14,489.679993,503.500000,486.910004,499.890015,499.890015,4400200 118 | 2021-06-15,501.230011,501.230011,490.399994,491.899994,491.899994,3104100 119 | 2021-06-16,495.000000,496.459991,486.279999,492.410004,492.410004,3533200 120 | 2021-06-17,490.250000,501.799988,490.149994,498.339996,498.339996,3198300 121 | 2021-06-18,496.399994,504.489990,495.239990,500.769989,500.769989,5197600 122 | 2021-06-21,501.640015,502.049988,492.279999,497.000000,497.000000,5277300 123 | 2021-06-22,498.540009,513.549988,495.799988,508.820007,508.820007,5809300 124 | 2021-06-23,508.480011,516.630005,508.200012,512.739990,512.739990,3944800 125 | 2021-06-24,517.960022,520.960022,514.400024,518.059998,518.059998,3361200 126 | 2021-06-25,528.840027,533.059998,525.000000,527.070007,527.070007,5299100 127 | 2021-06-28,528.119995,533.940002,524.559998,533.030029,533.030029,2820200 128 | 2021-06-29,533.549988,536.130005,528.570007,533.500000,533.500000,2314600 129 | 2021-06-30,534.059998,534.380005,526.820007,528.210022,528.210022,2773400 130 | 2021-07-01,525.719971,537.039978,525.719971,533.539978,533.539978,2805400 131 | 2021-07-02,535.500000,538.539978,529.390015,533.979980,533.979980,1975500 132 | 2021-07-06,533.000000,542.859985,533.000000,541.640015,541.640015,2775100 133 | 2021-07-07,544.239990,544.640015,531.659973,535.960022,535.960022,2722500 134 | 2021-07-08,530.929993,535.500000,529.090027,530.760010,530.760010,3269000 135 | 2021-07-09,531.000000,538.260010,528.580017,535.979980,535.979980,2777200 136 | 2021-07-12,540.299988,540.650024,532.919983,537.309998,537.309998,1780700 137 | 2021-07-13,535.760010,545.330017,535.760010,540.679993,540.679993,2751600 138 | 2021-07-14,541.010010,554.099976,541.010010,547.950012,547.950012,4659500 139 | 2021-07-15,553.969971,557.539978,538.200012,542.950012,542.950012,5713900 140 | 2021-07-16,541.809998,544.059998,527.049988,530.309998,530.309998,3442100 141 | 2021-07-19,526.049988,534.909973,522.239990,532.280029,532.280029,3885800 142 | 2021-07-20,526.070007,536.640015,520.299988,531.049988,531.049988,6930400 143 | 2021-07-21,526.130005,530.989990,505.609985,513.630005,513.630005,11906800 144 | 2021-07-22,510.209991,513.679993,507.000000,511.769989,511.769989,4328100 145 | 2021-07-23,512.159973,517.409973,504.660004,515.409973,515.409973,3820500 146 | 2021-07-26,514.380005,521.130005,509.010010,516.489990,516.489990,2254500 147 | 2021-07-27,518.080017,521.950012,512.049988,518.909973,518.909973,2759000 148 | 2021-07-28,521.820007,524.469971,516.979980,519.299988,519.299988,2390500 149 | 2021-07-29,519.960022,520.780029,513.789978,514.250000,514.250000,1736000 150 | 2021-07-30,512.690002,519.789978,510.959991,517.570007,517.570007,2534900 151 | 2021-08-02,519.000000,519.849976,510.510010,515.150024,515.150024,2096600 152 | 2021-08-03,514.390015,515.630005,505.369995,510.820007,510.820007,2579400 153 | 2021-08-04,513.000000,517.979980,510.369995,517.349976,517.349976,2039400 154 | 2021-08-05,517.130005,525.409973,514.020020,524.890015,524.890015,2556700 155 | 2021-08-06,524.000000,526.840027,519.390015,520.549988,520.549988,1919400 156 | 2021-08-09,521.150024,522.669983,517.989990,519.969971,519.969971,1367800 157 | 2021-08-10,520.000000,520.789978,512.969971,515.840027,515.840027,1960500 158 | 2021-08-11,517.000000,519.570007,509.769989,512.400024,512.400024,1673900 159 | 2021-08-12,511.859985,513.000000,507.200012,510.720001,510.720001,1685700 160 | 2021-08-13,512.640015,521.440002,511.510010,515.919983,515.919983,2176300 161 | 2021-08-16,515.239990,523.380005,512.299988,517.919983,517.919983,2032800 162 | 2021-08-17,515.469971,520.789978,514.200012,518.909973,518.909973,2309800 163 | 2021-08-18,520.000000,526.380005,518.650024,521.869995,521.869995,2582000 164 | 2021-08-19,522.739990,548.390015,521.869995,543.710022,543.710022,7497300 165 | 2021-08-20,545.090027,551.390015,539.099976,546.880005,546.880005,3774300 166 | 2021-08-23,545.979980,555.549988,543.739990,553.330017,553.330017,2602000 167 | 2021-08-24,551.479980,555.309998,549.270020,553.409973,553.409973,2109500 168 | 2021-08-25,550.159973,552.840027,545.450012,547.580017,547.580017,2065600 169 | 2021-08-26,546.159973,552.599976,545.900024,550.119995,550.119995,1595500 170 | 2021-08-27,551.599976,564.169983,549.250000,558.919983,558.919983,3251100 171 | 2021-08-30,557.250000,567.159973,556.450012,566.179993,566.179993,2434800 172 | 2021-08-31,566.119995,569.479980,561.609985,569.190002,569.190002,2431900 173 | 2021-09-01,569.000000,591.000000,569.000000,582.070007,582.070007,5626200 174 | 2021-09-02,583.679993,598.760010,583.679993,588.549988,588.549988,6179900 175 | 2021-09-03,585.799988,591.880005,583.140015,590.530029,590.530029,2681200 176 | 2021-09-07,594.690002,613.849976,593.989990,606.710022,606.710022,5821400 177 | 2021-09-08,603.840027,615.599976,595.710022,606.049988,606.049988,5424500 178 | 2021-09-09,606.469971,609.440002,596.549988,597.539978,597.539978,2954200 179 | 2021-09-10,598.159973,609.450012,593.669983,598.719971,598.719971,3948000 180 | 2021-09-13,598.570007,598.570007,582.780029,589.289978,589.289978,3062900 181 | 2021-09-14,584.890015,587.280029,575.559998,577.760010,577.760010,3457000 182 | 2021-09-15,578.169983,584.619995,575.369995,582.869995,582.869995,2755600 183 | 2021-09-16,584.299988,587.479980,577.719971,586.500000,586.500000,1832000 184 | 2021-09-17,587.849976,590.280029,580.849976,589.349976,589.349976,4145100 185 | 2021-09-20,586.789978,591.530029,568.080017,575.429993,575.429993,3732200 186 | 2021-09-21,578.309998,581.880005,569.369995,573.140015,573.140015,2250900 187 | 2021-09-22,579.690002,595.650024,579.690002,590.650024,590.650024,4021800 188 | 2021-09-23,590.789978,599.320007,589.130005,593.260010,593.260010,2526200 189 | 2021-09-24,592.500000,592.979980,583.640015,592.390015,592.390015,2126200 190 | 2021-09-27,587.950012,593.580017,576.929993,592.640015,592.640015,2504700 191 | 2021-09-28,589.000000,599.539978,580.159973,583.849976,583.849976,4431100 192 | 2021-09-29,589.010010,609.880005,588.010010,599.059998,599.059998,6221000 193 | 2021-09-30,608.049988,619.000000,608.049988,610.340027,610.340027,6612600 194 | 2021-10-01,604.239990,614.989990,597.510010,613.150024,613.150024,4090800 195 | 2021-10-04,613.390015,626.130005,594.679993,603.349976,603.349976,4995900 196 | 2021-10-05,606.940002,640.390015,606.890015,634.809998,634.809998,9534300 197 | 2021-10-06,628.179993,639.869995,626.359985,639.099976,639.099976,4580400 198 | 2021-10-07,642.229980,646.840027,630.450012,631.849976,631.849976,3556900 199 | 2021-10-08,634.169983,643.799988,630.859985,632.659973,632.659973,3271100 200 | 2021-10-11,633.200012,639.419983,626.780029,627.039978,627.039978,2862500 201 | 2021-10-12,633.020020,637.659973,621.989990,624.940002,624.940002,3227300 202 | 2021-10-13,632.179993,632.179993,622.099976,629.760010,629.760010,2420300 203 | 2021-10-14,632.229980,636.880005,626.789978,633.799988,633.799988,2671700 204 | 2021-10-15,638.000000,639.419983,625.159973,628.289978,628.289978,4114400 205 | 2021-10-18,632.099976,638.409973,620.590027,637.969971,637.969971,4669100 206 | 2021-10-19,636.969971,641.000000,632.299988,639.000000,639.000000,7633100 207 | 2021-10-20,625.570007,637.400024,617.150024,625.140015,625.140015,10622000 208 | 2021-10-21,628.890015,654.010010,628.650024,653.159973,653.159973,8437100 209 | 2021-10-22,651.809998,665.460022,651.809998,664.780029,664.780029,6186000 210 | 2021-10-25,663.739990,675.880005,657.070007,671.659973,671.659973,3833500 211 | 2021-10-26,673.760010,676.489990,662.770020,668.520020,668.520020,2904800 212 | 2021-10-27,669.000000,671.409973,661.849976,662.919983,662.919983,2276900 213 | 2021-10-28,670.950012,676.799988,668.030029,674.049988,674.049988,2859400 214 | 2021-10-29,673.059998,690.969971,671.239990,690.309998,690.309998,3817500 215 | 2021-11-01,689.059998,689.969971,676.539978,681.169983,681.169983,3110900 216 | 2021-11-02,683.109985,687.679993,673.820007,677.719971,677.719971,3888600 217 | 2021-11-03,677.270020,689.390015,677.270020,688.289978,688.289978,2334900 218 | 2021-11-04,685.890015,685.940002,665.500000,668.400024,668.400024,4865000 219 | 2021-11-05,663.969971,665.640015,645.010010,645.719971,645.719971,5277400 220 | 2021-11-08,650.289978,656.000000,643.789978,651.450012,651.450012,2887500 221 | 2021-11-09,653.700012,660.500000,650.520020,655.989990,655.989990,2415600 222 | 2021-11-10,653.010010,660.330017,642.109985,646.909973,646.909973,2405800 223 | 2021-11-11,650.239990,665.820007,649.710022,657.580017,657.580017,2868300 224 | 2021-11-12,660.010010,683.340027,653.820007,682.609985,682.609985,4192700 225 | 2021-11-15,681.239990,685.260010,671.489990,679.330017,679.330017,2872200 226 | 2021-11-16,678.270020,688.359985,676.900024,687.400024,687.400024,2077400 227 | 2021-11-17,690.000000,700.989990,686.090027,691.690002,691.690002,2732800 228 | 2021-11-18,691.609985,691.739990,679.739990,682.020020,682.020020,2012900 229 | 2021-11-19,692.349976,694.159973,675.000000,678.799988,678.799988,2613700 230 | 2021-11-22,676.020020,679.479980,656.469971,659.200012,659.200012,2764400 231 | 2021-11-23,658.179993,666.429993,646.049988,654.059998,654.059998,2320200 232 | 2021-11-24,658.010010,661.440002,651.099976,658.289978,658.289978,1867300 233 | 2021-11-26,675.000000,676.409973,660.669983,665.640015,665.640015,2872500 234 | 2021-11-29,663.200012,667.989990,658.289978,663.840027,663.840027,2529400 235 | 2021-11-30,668.200012,675.380005,640.010010,641.900024,641.900024,5608900 236 | 2021-12-01,649.479980,654.520020,617.070007,617.770020,617.770020,3882800 237 | 2021-12-02,617.099976,625.359985,612.880005,616.469971,616.469971,3331100 238 | 2021-12-03,622.750000,625.500000,594.000000,602.130005,602.130005,4825200 239 | 2021-12-06,606.010010,617.289978,601.000000,612.690002,612.690002,3075700 240 | 2021-12-07,619.830017,628.890015,611.400024,625.580017,625.580017,3125200 241 | 2021-12-08,630.000000,632.460022,623.200012,628.080017,628.080017,2220300 242 | 2021-12-09,627.580017,630.239990,610.440002,611.000000,611.000000,2376300 243 | 2021-12-10,616.780029,617.739990,605.880005,611.659973,611.659973,2747900 244 | 2021-12-13,612.000000,612.640015,599.520020,604.559998,604.559998,2517900 245 | 2021-12-14,598.710022,602.289978,588.130005,597.989990,597.989990,2984500 246 | 2021-12-15,598.179993,605.690002,584.510010,605.039978,605.039978,2866200 247 | 2021-12-16,597.090027,602.830017,588.000000,591.059998,591.059998,3143200 248 | 2021-12-17,591.609985,593.250000,581.739990,586.729980,586.729980,4386900 249 | 2021-12-20,586.429993,602.880005,584.260010,593.739990,593.739990,3358400 250 | 2021-12-21,597.539978,607.820007,593.859985,604.919983,604.919983,2319400 251 | 2021-12-22,603.359985,614.820007,602.630005,614.239990,614.239990,2335700 252 | 2021-12-23,616.400024,616.880005,607.570007,614.090027,614.090027,1620600 -------------------------------------------------------------------------------- /code_stock_lstm_train_final.ipynb: -------------------------------------------------------------------------------- 1 | {"cells":[{"cell_type":"code","execution_count":1,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":28656,"status":"ok","timestamp":1640934492549,"user":{"displayName":"0542_Võ Thương Trường Nhơn","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"10797139682346268390"},"user_tz":-420},"id":"taTgS5yMoSsO","outputId":"3f634e6a-d327-46ce-be4b-9ac0ad8326de"},"outputs":[{"name":"stdout","output_type":"stream","text":["Mounted at /content/drive\n"]}],"source":["from google.colab import drive\n","drive.mount('/content/drive')"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"GW-hE_1WoZzR"},"outputs":[],"source":["!pip install yfinance\n","!pip install --upgrade pandas"]},{"cell_type":"code","execution_count":1,"metadata":{"executionInfo":{"elapsed":3209,"status":"ok","timestamp":1640934521823,"user":{"displayName":"0542_Võ Thương Trường Nhơn","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"10797139682346268390"},"user_tz":-420},"id":"fa1d67d1-f744-47d9-a84a-ff4e65551292"},"outputs":[],"source":["import numpy as np\n","# hỗ trợ cho việc tính toán các mảng nhiều chiều\n","import pandas as pd\n","# thao tác và phân tích dữ liệu\n","import yfinance as yf\n","import matplotlib.pyplot as plt\n","# vẽ biểu đồ, đồ thị\n","%matplotlib inline\n","from sklearn.preprocessing import MinMaxScaler\n","# hàm đưa dữ liệu về giá trị (0,1)\n","from keras.preprocessing.sequence import TimeseriesGenerator\n","# Gộp dữ liệu vào chuyển thành dữ liệu time series\n","from keras.models import Sequential\n","# khởi tạo mạng neurol\n","from keras.layers import Dense\n","# một lớp để chuyển dữ liệu từ lớp input vào model ????\n","from keras.layers import LSTM\n","# mô hình LSTM \n","from keras.layers import Dropout\n","# giúp bỏ bớt các node, giúp lọc lại những node có thông tin cần thiết \n","from tensorflow import keras\n","# from datetime import datatime\n","plt.style.use(\"fivethirtyeight\")\n","# style của thư viện mathplotlib\n","import warnings\n","warnings.filterwarnings(\"ignore\")\n","# Những thư viện cần dùng"]},{"cell_type":"code","execution_count":2,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":822,"status":"ok","timestamp":1640934522642,"user":{"displayName":"0542_Võ Thương Trường Nhơn","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"10797139682346268390"},"user_tz":-420},"id":"26367fe2-497e-4236-9922-c6349ffe5737","outputId":"e48c58ca-a6ff-4772-daa8-d7f797b1f713"},"outputs":[{"name":"stdout","output_type":"stream","text":[" Date Open High ... Volume Dividends Stock Splits\n","0 2010-11-10 9.695574 9.760795 ... 384227200 0.0 0.0\n","1 2010-11-11 9.645357 9.749466 ... 361284000 0.0 0.0\n","2 2010-11-12 9.675977 9.691287 ... 795846800 0.0 0.0\n","3 2010-11-15 9.445104 9.508793 ... 403606000 0.0 0.0\n","4 2010-11-16 9.361198 9.418763 ... 657650000 0.0 0.0\n","... ... ... ... ... ... ... ...\n","2790 2021-12-10 175.210007 179.630005 ... 115228100 0.0 0.0\n","2791 2021-12-13 181.119995 182.130005 ... 153237000 0.0 0.0\n","2792 2021-12-14 175.250000 177.740005 ... 139380400 0.0 0.0\n","2793 2021-12-15 175.110001 179.500000 ... 131063300 0.0 0.0\n","2794 2021-12-16 179.279999 181.139999 ... 150185800 0.0 0.0\n","\n","[2795 rows x 8 columns]\n"]}],"source":["#@title Chương trình dự đoán cổ phiếu bằng thuật toán LSTM\n","Macophieu = \"AAPL\" #@param [\"GOOG\", \"AMZN\", \"FB\",\"AAPL\",\"TSLA\"]\n","\n","prop = 'Close' #@param [\"Open\", \"High\", \"Low\",\"Close\",\"Volume\"]\n","\n","companyName = 'Apple' #@param[\"Google\", \"Amazon\", \"Facebook\", \"Apple\", \"Tesla\"]\n","\n","# Chọn cổ phiếu cần dự doán\n","tickerData = yf.Ticker(Macophieu) \n","#@title Date fields\n","start ='2010-11-10'#@param {type:\"date\"}\n","end ='2021-12-17'#@param {type:\"date\"}\n","tickerDf = tickerData.history(period='1d', start=start, end=end)\n","#lấy giá trị từ ngày đến những ngày trước đó\n","data = tickerDf\n","data.reset_index(inplace=True)\n","# đánh số thứ tự lại cho data thay cho cột ngày\n","print(data)"]},{"cell_type":"code","execution_count":4,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":410},"executionInfo":{"elapsed":1036,"status":"ok","timestamp":1640934537755,"user":{"displayName":"0542_Võ Thương Trường Nhơn","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"10797139682346268390"},"user_tz":-420},"id":"h79Yv6RwszJ9","outputId":"fc19b34b-33a9-4076-e298-d97be3992f83"},"outputs":[{"data":{"image/png":"iVBORw0KGgoAAAANSUhEUgAABCUAAAGJCAYAAAC97omgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdd3hc1Z3/8c9XvVqSuw3GwlgG2xSD6b2FtiRAwiYkIZDADwjZ9CWBhE0gm4TskgLZsOmFwNIhlBASWgIYgsEUY0yVbQxukmX1OjOaOb8/ZmQ0M3dGMyozI+n9eh491px75t4z8iXx/eh7zjHnnAAAAAAAADItL9sDAAAAAAAAkxOhBAAAAAAAyApCCQAAAAAAkBWEEgAAAAAAICsIJQAAAAAAQFYQSgAAAAAAgKwglAAAYJIzsxvN7LEcGMcTZvbbIfpcbWbrMjUmAAAwtgglAACYwMxsmplda2ZvmVmfmW03s6fM7DwzK8j2+IbhR5IOTbWzma0zs6vHbjgAAGAkxuM/RgAAQArMbJ6kpyX1S/q2pJclBSQdLukySWskrc7aAIfBOdclqSvT1zWzPEnmnAtm+toAAExkVEoAADBx/VxSsaQDnHO3OOded87VO+f+KGm5pHqvN1nYZWa2wcz8ZrbezL4c0+cMM3vZzHrMrM3Mnjez/QcdX2hm90SOtZrZI2a2TyqDNrNvmVmDmbWY2U1mVjHoWNT0DTPbNXKdHZFKkA1m9rXIsSck7SHpKjNzka/ayLFDIxUjvZHx3WpmM2OvY2YfM7M3JfklXWxmwUjYM3i855lZu5mVp/L5AADA+wglAACYgMxsqqTTJN3gnGuPPe6cCzjnuhO8/XOSvivpvyQtlfRDSf9lZhdGzj1b0l2SboscP0zS9QpXZMjMZilcobFd0lEKT7d4S9ITZjZjiKGfLWmqpGMlnSPpdEmXJ+n/c0lVkk6UtJekCyVtjhz7sKSNkn4saU7ka1Nk/I9E+h0s6YOS9pZ0d8y550Z+FudLWiLp/xQOci6I6XeRpFuT/DwBAEACTN8AAGBiWqjwLx9eH8Z7r5D0M+fcryOv681sT0lXSvqdwg/3hZLudM5tjPR5Y9D7L5W00Tl36UCDmX1R4ZDkkwoHGIm865z7SuT7N83sDoUDh28l6D9f0r3OuYFpKAPjkXOuxcyCkrqccw2DxvJvkjokfdo554+0fUrSajM72jn3VKRriaRPOefeG/TeX0v6kpl91zkXMrO9JB0p6YtJPhMAAEiASgkAACYmG9abzKZI2lXSUzGHnpRUa2ZlCq9F8bCktWZ2r5l9KWZKw0GSlptZ18CXpE5JtZLqhhjCKzGvt0qalaT/9ZK+aWbPmdl/m9nRQ5xfCld3rBwIJCTJOfeKpPbIsQGNgwOJiD9Kminp5Mjr/yfpRefcyylcFwAAxCCUAABgYqqXFFJ42sGoiiz2eKqk4yWtkvQRSW+b2emRLnmSHpe0LOZrT0lXD3F6f8xrpyT/XnHO/UHhaolfKlzB8Vcz+780Pk4ycdMxnHPNCk/zuMjMiiSdJ+nXsf0AAEBqCCUAAJiAnHMtkv4q6fNmVhV73MwKvRZmdM51KLzWQmzFwTGS3nHO9UT6Oefc8865a5xzRytcSfGZSN8XFK442OycWxfz1TRqH/L9MW9zzv3BOXeewmtKfDJS8SGFQ478mLe8JunQSKggSTKz/RRem2JtCpf8lcLrUFwiqVThtTUAAMAwEEoAADBxfU7hLUBfNLNPmNmSyK4Y5yocHCSaSvEDSV8ws4vMrM7MLlF4nYhrJMnMDo/skHGIme1mZidI2lfvr19xg8JBwP1mdpSZ1ZrZkWb2fTM7fDQ/oJndYGanmdkeZrZU4cUtNyk8XUSS3pF0RGSc0yNbe94gaYqkG81sbzM7UtLNklY451YMdU3n3NMKL9z5I0m3O+c6h3gLAABIgFACAIAJKrIewgGS7lN42sRLkv6p8G4RP1TiqoBfSPq2pG8qHDRcLukK59zvIsfbFd5x436Fp4n8XtItCu/YIedcY+T4Dkl/UvgB/haFp1lsG8WPKIXXzrg+8lmeklQu6VTnnIscv0pSdWQMTZJ2i4zvJIXXzlgl6cHI+89O47q/kVQkpm4AADAi9v7/ZwMAACAVZnatpA845/bP9lgAABjP2BIUAAAgRZH1ORZJulhsAwoAwIgxfQMAACB19ys8TeReSaO1ywcAAJMW0zcAAAAAAEBWUCkBAAAAAACyYkKtKdHe3k7ZBwAAAAAAOaiqqspi26iUAAAAAAAAWUEoAQAAAAAAsoJQApNWfX19tocA7MT9iFzC/Yhcwz2JXML9iFwyEe5HQgkAAAAAAJAVhBIAAAAAACArCCUAAAAAAEBWEEoAAAAAAICsIJQAAAAAAABZQSgBAAAAAACyglACAAAAAABkBaEEAAAAAADICkIJAAAAAACQFYQSAAAAAAAgKwqyPQAAAAAAAODt1ZaAzn28We92BSVJ9588XcfMLc7yqEYPlRIAAAAAAOSo773UsTOQkKQzHt6hlr5gkneML4QSAAAAAADkqIc39cW1/e7N7iyMZGwQSgAAAAAAMI60+ELZHsKoIZQAAAAAAGAcyTPL9hBGDaEEAAAAAADjSN7EySSyF0qY2e/NbLuZrR3UdoeZrY58bTSz1ZH2WjPrHXTsl9kaNwAAAAAA2TSRqguyuSXojZJukHTTQINz7mMD35vZjyW1D+q/3jm3LGOjAwAAAAAgB02kSomshRLOuafMrNbrmJmZpI9KOj6TYwIAAAAAIFf09HsvaDmRQolcrfo4SlKjc65+UNvuZvaymT1pZkdla2AAAAAAAGTCim1+z3abQAtdmnMuexcPV0o86JzbO6b9F5LWOed+HHldLKnCOddsZssl3SdpqXOuY/D72tvbd36Y+vrBeQYAAAAAAOPLzZsL9D8bi+LaL5gX0KXzA1kYUfrq6up2fl9VVRWXpmRzTQlPZlYg6cOSlg+0Oed8knyR7180s/WSFkl6IdF5Bn9wwEt9fT33CXIG9yNyCfcjcg33JHIJ9yMyab/8Hmlja1z77rOmqa6uckLcj7k4feNESW865zYPNJjZDDPLj3y/QFKdpA1ZGh8AAAAAAGPOF/Se2RDI3oSHUZfNLUFvk/SspD3NbLOZXRg5dI6k22K6Hy1pTWSL0LslfdY515K50QIAAAAAkFl+73Uu1R+aOKlENnff+HiC9k97tN0j6Z6xHhMAAAAAALnC71EpcdXyKTpsVvw6E+NVzq0pAQAAAAAAJF9MRcTnlpbrK/tWZmk0YyMX15QAAAAAAGDS8wejXxfnTZytQAcQSgAAAAAAkINiKyWK8gklAAAAAABABgRi1pQoolICAAAAAABkQnylRJYGMoYIJQAAAAAAyEGsKQEAAAAAALLCFzN9o5g1JQAAAAAAQCb4WegSAAAAAABkQ+z0jaIJ+AQ/AT8SAAAAAADjWzDk9PDmvqg2KiUAAAAAAMCYu3RFq3r6Y9aUYKFLAAAAAAAwljr8Id21oTeuvZgtQQEAAAAAwFhq94fkPNpnlk68VIJQAgAAAACAHNIf8m6fW04oAQAAAAAAxpAv5FUnIVVNwO03Jt4nAgAAAABgHFvTHMj2EDKGUAIAAAAAgBzxTke/Ln6qNdvDyBhCCQAAAAAAcsTXV7Z5ts8tm5iP7xPzUwEAAAAAMM409wX16Baf57GfHF6d4dFkBqEEAAAAAAA54I71vQmPnTKvNIMjyRxCCQAAAAAAcsD6jn7P9g/OL8nwSDKHUAIAAAAAgBzQ0++9Fejs0vwMjyRzCCUAAAAAAMgBfQlCiV3KCSUAAAAAAMAY6g0SSgAAAAAAgCzopVICAAAAAAAMx9MNPh14T6P2u6tBj2zqS/v9fVRKAAAAAACAdDnn9KVnWrWuo1/vdgX15X+2KuS8Q4ZEElVKzCkjlAAAAAAAAAm81xXU+o7gztdbe0La0RdK6xxea0pcsrhcRfk24vHlqoJsDwAAAAAAgPHuxSZ/XNu2nqBmprGdZ2ylxA1HVuuTC8tGPLZcRqUEAAAAAAAjtMojlGjsSbNSIiaUOGnXEplN3CoJiVACAAAAAIARe7EpENfW0Bv06JlY7EKXpQUTO5CQCCUAAAAAABiRDn9Iz3tUSjT1pl4p4ZyLW1OidAKvJTGAUAIAAAAAgBH4+so2z/ZEW3xKUjDk9NNXO/XBvzbpZ692qjfoFBrUvTBPKsib+KEEC10CAAAAADACt6/v9WwPhBKHEo9u6dNVL3RIklY0+DU9ZkHMysLJUUOQtU9pZr83s+1mtnZQ29VmtsXMVke+Tht07Btmts7M3jKzk7MzagAAAAAAwurbA1q9I37axgBfkkqJy55tj3p96YrWqNcVhRO/SkLKbqXEjZJukHRTTPt1zrkfDW4wsyWSzpG0VNJcSY+Z2SLnXHqrhgAAAAAAMAp++0aXvrayXYljBymQZEmJzd3JH2cnSyiRtUoJ59xTklpS7H6GpNudcz7n3DuS1kk6eMwGBwAAAABAAs45XfNyZ9JAQkpeKTHUchFTmL6RNZ83szWR6R01kbZdJG0a1GdzpA0AAAAAgIza1hNSi2/onTXWtsZvEypJ/phFLb3sUp6fvMMEkWsLXf5C0nclucifP5Z0wXBOVF9fP4rDwkTFfYJcwv2IXML9iFzDPYlcwv04eWz3mVa05GtheUiLykNqDpjmFDs905IvqXjI97+8I6Cn167TrOL3E4iQk776erGk5KHDtGC76uubh7xGrt+PdXV1SY/nVCjhnGsc+N7MfiPpwcjLLZLmDeq6a6QtoaE+OFBfX899gpzB/Yhcwv2IXMM9iVzC/Th5dAZCOu3uRjX1RVdEHD6rSPtNK5TUndJ5Tl9VqrbPvF/o/9Q2n55p3THk+z5/yDztVpH8kX0i3I85NX3DzOYMenmWpIGdOR6QdI6ZFZvZ7pLqJD2f6fEBAAAAACaHRzf1xQUSkvTPRr9+8XpqgcSAwWtLPNvoS+k9QwUSE0XWPqWZ3SbpWEnTzWyzpKskHWtmyxSevrFR0iWS5Jx7zczulPS6pH5J/8bOGwAAAACAsbK62Xs9iOFo84U0qyw8XWOHR9ARa7eKybGehJTFUMI593GP5t8l6f99Sd8fuxEBAAAAABA2vWR4EwsWTinQuo7+qLZD7m3UX0+bocU1herwDx1KnL+ofFjXHo9yavoGAAAAAAC5YKgtOxO56fipcW1tfqevr2yTJHX4o7fduPn4qWo8b64uWlyu2sp8nVFbogv3mjyhxOSYpAIAAAAAQBp8w1gw4AcHV2lJTaEOmVmk57b7o46taPCrwx/S9t7oE08pzFNxvumHh1aPZLjjFpUSAAAAAADEeLs9vTUlvnvgFF26tEKSVFHoXWbxxFafXm2JPm9d1eSuFSCUAAAAAABgkPe6+nXH+t6U+5+/qEyfiwQSkjS3zHuhyt+/1a3BS0rMq8jX3PLJs6ill8kdyQAAAAAAEGPZ3Y0p9SvOl+7+wHQdNac4qj3R7hkrtkVvB3rwjKLhDXACIZQAAAAAAGCQkBu6zy3HT9Whs4o0rSQ+gNit0vtROxhz3sU1hcMZ3oRCKAEAAAAAyCpf0OmN1oB2Kc/XjNLcns7wxb0r9O/7VaqqKPFqCIkqJWLtMsmnbkiEEgAAAACALOrpD+kjjzTr2Ua/KgtN9548XQdmcVpD/xBlEv95UNWQ55iXYthQVTTMfUcnEBa6BAAAAABkze3revVsY3j7zM6A069e78rqeLoCKczdGMLc8nzNS6FaoryAR3J+AgAAAACArPndm9EhxN0bUt/1Yiy0Dd4eI8Zpu5WkdI48M/3qqJoh+yXaOnQyIZQAAAAAAGRNvkU/mI+8TmFkXmjyx7WZpFmlefrqvpUpn+fw2cXacu6cpH2K8wklWFMCAAAAAJA1XYHElQnZ8HTMtp1f2adCl+1XqeJ8U0FeeiFCeWGe9p5aqLUtAc/jM0qoE+AnAAAAAADImhZfjoUSDdGVEkfOKVZ5YV7agcSAm4+b6tl+4i7FmlXG7huEEgAAAACArAiGnNr82Z6w8T5f0GldR//O13kmHTJzZDuBzPEIHi7bt1K3nDBtROedKAglAAAAAABZsaPPu0piqG05x0rsVJIphaaKwpE9NpcUxFdYfHrPMtaTiCCUAAAAAABkRUNv0LPdn6VQojNmO9CRBhIDvrB3xc7vj5xdpF0rWN5xAD8JAAAAAEBWdAW8w4f3uoLaqzrzv0PvjgslRqea4TsHTtF+0wrV6Xf62MLSUTnnREEoAQAAAADIiGDIyUk7F430Bb1DiUPv3a6DZhTqwVNnZHSaw46+6MqNco+pF8ORZ6azF5SNyrkmGqZvAAAAAADG3Krtfu19V4Nm3rRVP1nTKUnq7U88TWNVU0A3v92dqeHtvOZgs9kdY8wRSgAAAAAAxtw1L3doW09IISdd81KHmnqD6ktQKTHg0S2+DI0ubE1z9HagJ+xSktHrT0aEEgAAAACAMfePre8HDP1O+mejX71DhBIPb+pTZ8B7h45EOvwhvdUWUMilv1hmY2/0teqqWPFgrPETBgAAAACMKa+1I0LOqS/J9I0Bv3mjW1/dt3LIfv6g0/I/NWpT1/vrQtRW5uvGY6dq2fSilMa5vqM/6vWMUn6PP9b4CQMAAADAJNYdCOmJrX16r6t/6M7DtK0nfuvPVp8bslJCkv76Xm9K11h6Z0NUICFJGzuDOv8fLSlVTXzh6Vbt6IuulJhZwiPzWKNSAgAAAAAmqb5+p+P+3KS32/tVXmC67+TpOmhmalUF6djaHR9KNPUFU/ot+SvNAfWH3M4dO7wEQ05Nfd7TPN7tCurVloD2m5b4c73eGtDN9T1RbbuU5WtqCQtdjjViHwAAAACYpO7a0KO328MVEt39Tl9b2TYm19nqUSnR1BuSL745jj8krW0JJO3z2BALYt4aEzjEeqM1/vyLa/gdfiYQSgAAAADAJPW3TX1Rr1c3J3/4Hy6vSonN3cGUpm9I4WqJZC4bIkz51RvdavQIRgZs8RjfyfPYeSMTiH4AAAAAYJIqSjIlYjT95b2+uLbYQCSZNn/yHThi15Lw8sC7vbpocUVce2cgpG+/0BHX/vGFZSmPD8NHpQQAAAAATFKFGXgi9AedntvuH9E5Ov2JKypcilt/PrnVe4rH7evip3b89yFVqsjEDweEEgAAAAAwWSVbPHK0DCeQOHGX4qjXHYHElRJ9KaxLISnhQphfW9ke13bE7GKPnhgLhBIAAAAAMEllohggtTqG932yrkxn1JZGtW3oSLxdaXd/8qkdA57b7tfmmG1PfQnWtNirmpUOMoVQAgAAAAAmqVC6icEwpDq9QpLuOHGa/vfIGs0qjd6K87EtvoTn6QrEt68+e5YuX1YZ1/5/MbtwbOz0DjsyUUGCMEIJAAAAAJik+jMQSnSncZGygnAYsGtFftyxbT3eFRFtvuj2pTUFqq0s0K7l8ed4clv0uhJeu278/pialMeLkSOUAAAAAIBJKphGFcNwhJzTJx5vSbl/aSSU8Jo+0ZBgS8/2mEUwq4vDj7nF+UNXO2z2CCXO2r3UoyfGCqEEAAAAAExS/hQXiRyuO9b3ptW/JBIk5JlpSU10MHH8g026alV73DSO9pjtQquKwo+5BR6ZxLONfn3q781a2RieDvJezFaiX9q7QmZM3cgkVu8AAAAAgEmq1ZfaIpHDdemK1rT6lw6qbjhgepFeb41e8+Gna7v0kQWl2nda0c62RKFEiVcqIenP7/bpz+/26YjZRXqmIXpnkNpKHpEzLWuVEmb2ezPbbmZrB7X90MzeNLM1ZnavmVVH2mvNrNfMVke+fpmtcQMAAADARLG9d2xLJcoTBAOJTC99/xF1dln8mhCS9L+vdUW9jg8lwtc8cEaRkokNJCRpnsdaFhhb2Zy+caOkU2LaHpW0t3NuX0lvS/rGoGPrnXPLIl+fzdAYAQAAAGBCqm8P6I22xFttjobSNEKJ03cr2VnlIElzyrwfV/tDUmNPUL2RBTTbYtaUGDjHzNJ83Xjs1LTG67XAJsZW1kIJ59xTklpi2h5xzg38V7FS0q4ZHxgAAAAATALHPdA05teoKU7tkXNpTYH+96joXS9itwUdcM87vdrzjgYtv6dBr7cG9HZbIOr44GDjzN1LVVmYejDitWMHxlYuL3R5gaS/Dnq9u5m9bGZPmtlR2RoUAAAAAIx3zX1BdXls1TnaSzzG5gGfXVKu3x1To4GlI2qKTTcdN1WPnT4zKkyQpL2nFiY999aekK5f06mXdkSHEvtOi35fUV5qn2p+Rb4qCnP5EXlistiVSzN6cbNaSQ865/aOab9S0oGSPuycc2ZWLKnCOddsZssl3SdpqXOuY/D72tvbd36Y+vr6sR4+AAAAAIxLf2rI1w/WFXsee/6IHsVuQOEPSU8056uqwOmQmtQWx/z7jnxd/mb0Ne48oFe7lzm902Nq9pv2rwop2c6dH36hRJv6Ug8K8s3pqcN6NTjfOGFlqTr6hw4m/nl4j8gkRl9dXd3O76uqquL+InJuaVEz+7Sk0yWd4CKJiXPOJ8kX+f5FM1svaZGkFxKdZ/AHB7zU19dznyBncD8il3A/ItdwTyKXTJT7cXNjq6Qez2N7LFyo/JjqgjP+tkNPbvNJkq5ePkVf3rcy6fnXt/frymca49rrdq/V7lMKlOpPcO7bTdrUF78gZSKLqgq1dM+YVQCe2yop+S/jKwtNS/Ycf3+vE+F+zKkcyMxOkfR1SR9yzvUMap9hZvmR7xdIqpO0ITujBAAAAIDx7ZXmQMJjwZjn97fbAjsDCUm6+sUODeXEv2yXx+wQFaT5BBoIpVfZv9RjyofXOGKx60b2ZHNL0NskPStpTzPbbGYXSrpBUqWkR2O2/jxa0hozWy3pbkmfdc61eJ4YAAAAAJBUb2zyMEh/zBT/jZ3pbRv6wMZetfq8z5/q+g4D+pKM08vSGo9QwiPY+Mo+FVGvv3XAlLSug9GTtekbzrmPezT/LkHfeyTdM7YjAgAAAIDJIVkFQmwOEExzHcLrXu1MeCzdNRt8aYYSSzxCic/vXaGfrOna+frixeX62rJKbesJ6ukGv06dV6ITdy1Jb2AYNTm3pgQAAAAAYGwFkhQ/BGPWsfTKBZxzstjVMCNe3pF4akhBmpUSvvSKNLSoKv4R95LFFbprQ682dQW1S1m+vrRPpcoK8vTLo6emd3KMCUIJAAAAAJhkAkmqH0Ixx7ymUARCUtEwlmEoTrbVhoeeVBaEGGR2WfygZpXl65kzZuqttn4tqi6I23oU2cXfBgAAAABMMv4k0yK6YoKArkB831VN0TtirGz06XMrWnX9msRTNw6fVZR2KPGR3UvT6l+SICiZUpSng2YWEUjkIColAAAAAGCS6Q8lPvZMg1+7LXz/UbHTH9/56QafjphdLEna2NmvUx7akfR659aV6arl6S8meezcYv3mze6U+yeaUoLcRSgBAAAAAJOMP8lCl7FVFJ0eUygae8JBRZsvpGV3NyY8V0WBafOn5g5zlNKpu5XousOq9ZVn24Z9DuQ2alcAAAAAYJIJJKmUaIupjPCqlGj2BbV6h1+1t25Lep2SgpFVLuSZ6TN7lWtK4dDnuWRx+YiuheygUgIAAAAAJpFgyCnZ8pHtMSGE15oSTb0h/e9rXXHtscpGGEoM+Mb+U/SN59uj2i5fVqmSfNPm7qBqK/J1yZKKUbkWMotQAgAAAAAmEY/Chyg7+mIqJTxCiX82+rW4eujHyd0rR+eRs7o4vsj/imWVrCExATB9AwAAAAAmEa8tPge76e0edUSSi+a+oP6xtc+z3xtt/UNea1EKwUUqKjymbxBITAyEEgAAAAAwiXQmW1Ai4v/qe/RmW0BL7mxQuz95iJHMoqrRCSUqU1hTAuMT0zcAAAAAYBLxWiMi1rWrO/Tk1iL5giO71qKqwpGdIGKqx/QNTAz8zQIAAADAJLKhI3raRYXHYpRtfqeHN/tGdJ3SfNP+00cnlNh7aqFqK/N3vj59t5JROS+yj1ACAAAAACaJ+vaAzv17S1Tb/EEP+6Pp6DlFmlI0Oo+ceWa69YRpOrO2VJ+qK9N1h1ePynmRfUzfAAAAAIBJ4o9v9cS1HTO3WK+1Dr1oZbrKC0f3d+BLagp143FTR/WcyD4qJQAAAABgErh9XY9ueK0rrv3YOWMzFSKftSmRAkIJAAAAAJjg2nwhffGZVs9jx8wtHpVrLK2JLsT/wK6s+4ChEUoAAAAAwAT3yOY++T12Ar3x2KkqTqOkIVHP4nzp28urlBfpML8iX2fUlqY/UEw6hBIAAAAAMMEFE+wCOq8ivUUuf3l0jWd7cb7p5HkleuKDM/S7Y2q04oyZaYUdmLwIJQAAAABggvPY9VOSVF4YPvDJurIhz3Hs3GKdMd+7+qEkEkDsO61IH1lQNmq7bmDiY/cNAAAAAJjgChJkBOWRtOInh1Xrlvr4nTkGbD53jiqS7KZBVQSGi/gKAAAAACa4RNM3BoKG4nzTrSck3m5zcCCxbFph3PESQgkME6EEAAAAAExwfQlSifJB8zpO2600bgcNL1ceMCWujdkaGC5uHQAAAACY4LZ0Bz3bi2IqHMoTzfMYpK4qPrioLubREsPDnQMAAAAAE9zqHYGU+qWQSagwL36qxjRCCQwTdw4AAAAATHDrOvrj2i5dUh7X1u4PDXmuKUXxocSM0vS2FgUGEEoAAAAAwAQWCDm9ExNK/M8R1fr+wVVxfVt8Q4cSlYV5+vjC97cQNUkfml8y4nFichr2lqBmVixpuqQm55x/9IYEAAAAABgt73b2q3/QOpezS/N03qL4KgkptVBCkn5+ZLVO361Eb7X365CZRTpidvFoDBWTUNqVEmZ2gJn9XVKnpPckHRlpn2lmj5vZiaM8RgAAAADAML3dHl0lsdBjocoBc8vip2EcPKMors3M9C/zS/XVfSsJJDAiaYUSZrZM0gpJe0i6afAx59x2SaWSzh+10QEAAAAARmRdTCjhtXvGgG95bPf5w8Pip3kAoyXdSon/lLRV0lJJVyg8fWiwxyUdPArjAgAAAACMgqa+6CkZ8ysShxIfrC3Vl/ep0LyKfId0N1MAACAASURBVO07tVCrz56l/abFV0oAoyXdNSWOkvQD51xXZE2JWO9JmjvyYQEAAAAARkN/yEW9LsyP3z1j57E809UHVunqA6mOQGakWylRIqk9yfH4Wh8AAAAAQNYEozMJJckkgIxLN5RYL2l5kuPHS3p9+MMBAAAAAIwmQgnksnRDiVslfSpmhw0nSWb275JOkXTzKI0NAAAAADBCwZjpGwVGKoHckW4o8SNJKyU9LOkphQOJ68xsi6RrJT0q6eepnszMfm9m281s7aC2qWb2qJnVR/6sibSbmf2Pma0zszVmdkCaYwcAAACASSeuUiLdp0BgDKV1Ozrn/JI+IOkySb2S+iQtkrRD0tclne6cCyU+Q5wbFa6uGOwKSY875+oU3s3jikj7qZLqIl8XS/pFOmMHAAAAgMmoPyaUyKNQAjkk3d035Jzrl3Rd5GtEnHNPmVltTPMZko6NfP9HSU9IujzSfpNzzklaaWbVZjbHObdtpOMAAAAAgIkq6Ji+gdw1aoU7CbYIHY5Zg4KGBkmzIt/vImnToH6bI20AAAAAgARCLHSJHJZWpYSZnSrpEOfc1YPaPifpvySVmdmdks53zgVGY3DOOWdmbuie8err60djCJjguE+QS7gfkUu4H5FruCeRS8bb/djWUaTBj37bGxtUHwpmb0AYVbl+P9bV1SU9nu70ja9J2j7wwswWS/qpwluFviPpY5Kel3R9mucdrHFgWoaZzRl0vS2S5g3qt2ukzdNQHxyor6/nPkHO4H5ELuF+RK7hnkQuGY/3Y+mmZmlH387Xu86do7ra0iyOCKNlPN6PsdKdvrFY0guDXn9M4QUvD3bOnSrpDknnj3BMDww6x/mS7h/Ufl5kF45DJbWzngQAAAAAJNYZCKkrEF18zvQN5JJ0KyVqFN5pY8CJkv7unOuIvH5C0mmpnszMblN4UcvpZrZZ0lUKTwW508wulPSupI9Guj8UOfc6ST2SPpPm2AEAAABg0rj57W5dtrJNvpiZGoQSyCXphhI7JM2XJDOrlHSQpG8OOl4oKT/VkznnPp7g0AkefZ2kf0t5pAAAAAAwSf3q9S5d/ly757F8dt9ADkk3lHhW0mfN7DVJp0be/9dBxxdKYkoFAAAAAGRJS18wYSAhSQWjtgcjMHLphhJXSfqHpDsjr//onHtdkszMJJ0VOQ4AAAAAyILHt/iSHmf6BnJJWqGEc+71yI4bRyi80ORTgw5XS7pO4XUlAAAAAABZcP2rnUmP5zF9Azkk3UoJOedaJP3Zo71V4e1BAQAAAABZ8OTWPr3W2p+0D9M3kEvSDiUkycz2kHSGpAWRpg2S7nfOrR+tgQEAAAAA0nPXht4h+0wtJpVA7kg7lDCz70q6QvG7bFxrZtc45749KiMDAAAAAKTl3c7kVRKSNKOEUAK5I6270cwukHSlpOcknSmpLvJ1psI7c1xpZp8e5TECAAAAAFKwqsk/ZJ9qKiWQQ9KtlPg3hQOJY51zgyO49Wb2kKQVkr4g6cbRGR4AAAAAIBV9/U59waH7sdAlckm6EdliSbfHBBKSpEjb7ZE+AAAAAIAMSqVKAsg16VZK+CVVJDleGekDAAAAAMiA7kBIN9f36LdvdA/Z97L9KjMwIiB16VZKrJJ0iZnNij1gZjMlXazw9A4AAAAAQAac9XCzrniuXes6ogvaP7GwTDNLox/5rlhGKIHckm6lxHclPS7pDTP7naTXI+1LJX1G4UqJT47e8AAAAAAAiWzrCer5BNM2Ll5crq/sW6GfrOnSlELT15ZVqiCP9SSQW9IKJZxzT5nZhyXdIOnfYw6/J+l859yK0RocAAAAACCxVl8o4bGlUwtVmGf6xVE1GRwRkJ50KyXknPuzmf1F0nJJu0eaN0h6yTmX+L8IAAAAAMCo6vR7P4ItrSlQIVURGAfSDiUkKRI+rIp8AQAAAACyYEefdyhxx4nTMjwSYHiGFUoAAAAAALKn3R/S/77WpWtXd3oe37WCRz2MD0nvVDPbMIxzOufcHsMcDwAAAABgCBc+0aLHtviyPQxgxIaKz96T5DIxEAAAAADA0AIhlzSQ+PbyKRkcDTAySUMJ59yxGRoHAAAAACAFXYHEvzc+cEahLtyrPIOjAUaGiUYAAAAAMI50JNhxozBPeuz0mRkeDTAyeUN1MLN8M/svM/vsEP0uNbNrzIx9ZwAAAABgjCSqlLjleHbcwPgzZCgh6VxJX9PQ238+L+lySR8f6aAAAAAAAN46A96VEntWUwiP8SeVUOKjkh5zzr2YrFPk+MMilAAAAACAMdOZoFJiXkV+hkcCjFwqocRySY+leL5/SDpw+MMBAAAAACTT6bGmxDFzipXHTHqMQ6mEElMlbU/xfE2R/gAAAACAMbClOxjXdkZtaRZGAoxcKqFEp6TpKZ5vmqSu4Q8HAAAAAJDMXRt649rOWUgogfEplVDiNUknpXi+D0T6AwAAAMCk0xkI6d3O/jE7f0NPUGtaAlFt1xxcpbKCVB7tgNyTyp37J0knmtkZyTqZ2YcUDiXuGY2BAQAAAMB48vx2n/a5s0H73d2ojzyyQ855L0g5Ek190etJlBeYLl1SPurXATIllVDiV5LWSbrTzL5vZrWDD5pZrZl9T9Kdkt6O9AcAAACACa+33+lHr3Rq6R0NOukvO9TmDwcRj2/xaY/bGtTbP7rBxM1vd0e9LsyTjAUuMY4NGUo453ol/YukdyR9Q9J6M2s1s/fMrFXSeknfjBw/3TnXN5YDBgAAAIBccdnKNn3vpQ5t6YlffLLFF9J3X2oflev4g04tfUH9+o3oUGIgBAHGq5QmHjnn1klaJulLkp6WFJQ0O/Lnikj7Ac659WM0TgAAAADIGZ2BkP7Z4NMt9T1J+/38te6kx1OxtiWgmTdt1YLbGuKOLajMH/H5gWwqSLVjpALiZ5EvAAAAAJiUHtvcp7MfbU65f1+/U0nB8KZYNPQEdeT92xMev+aQqmGdF8gVLNEKAAAAACl6t9fSCiQkqdkXGrqThxXbfFpyZ3x1xICPLyzTKfPYChTjG6EEAAAAAKToN+8Vpv2elmGGEt94vl2hJEtG/PgwqiQw/hFKAAAAAECKHm5KeQb8Ti196YcS73X1a21LwPPYnLI8vfOJOSor4HEO41/6/0WNMTPbU9Idg5oWSPq2pGpJF0lqirR/0zn3UIaHBwAAAGCSakux4qHApME7gTb2xu/MMZQnt/oSHnvjY3PSPh+Qq3IuWnPOveWcW+acWyZpuaQeSfdGDl83cIxAAgAAAEAmPbq5L6V+i6qif/e7zWO70KE09noHILefODXtcwG5LOdCiRgnSFrvnHs32wMBAAAAMLm91zV0uJBn0tFzi6ParnqhQ99a1a7WNNaWaPF5X+uo2cWe7cB4leuhxDmSbhv0+vNmtsbMfm9mNdkaFAAAAIDJ56H3eqNef++gKbp6+ZSotv84YIoOmF4U996fre3SJU+1pHytZo91KB44ZbrKC3P9EQ5IjzmXZDnXLDKzIklbJS11zjWa2SxJOyQ5Sd+VNMc5d8Hg97S3t+/8MPX19ZkcLgAAAIAJ7DfvFejX70WHDd9d5NMpM9+vaAi5cKXEi215+uzaEs/zPH9Ej8yGvt4FrxTr1c78na9/urRPh9cMbxcPIJvq6up2fl9VVRV39+fcQpeDnCrpJedcoyQN/ClJZvYbSQ8me/PgDw54qa+v5z5BzuB+RC7hfkSu4Z5EtoWc06+f3hrXvu/uc1U3Nz58yGvvl9Y2xrVL0q4L9khp14xNz29V+PexYccvma95Fbn8+IZsmAj/+5jLtT8f16CpG2Y2eInZsyStzfiIAAAAAEw6m7u913fYpTzfs31WWeLHrK7A0JXqd67vUZv//X4l+YmvBYx3ORm1mVm5pA9IumRQ87VmtkzhuHBjzDEAAAAAGBNvt/V7ti+sKvRsLy9IPD+j0+80szTxtdr9IV38VGtUW21lgfJSmfMBjEM5GUo457olTYtp+1SWhgMAAABgkgqEXFxIIEkNn5qb8D2WJEBo8YW0R5LrPbwpftvRBVNy8rENGBXc3QAAAACQwF3re9QSs5XnTw6rVkmSaohkNnb266CZRXFty+72XoNCko6fyzagmLhyeU0JAAAAAMiqhzfHVy58ePck8y+GcNFTrQrF7ID4iceak77n7AVlw74ekOsIJQAAAADAQzDkdP/G6FDiC7V+VReP7DHq8S2+qNevJ1izQpKqi2zE1wNyGXc3AAAAAMQIhJxOeagprv2s2YkDhMEu268y4bFb6ntSHsc5C6mSwMRGKAEAAAAAMX78SqdWNQWi2pbUFKgyxVX5ypKsOfHQe70pj6MtZj0LYKIhlAAAAACAQYIhp9+/1R3XfuX+U1I+R7J1MP0xOUNFks57sPMGJjhCCQAAAAAY5Nntfm3vjU4O9qou0MnzSlI+R1/QJT0eCIWPO+fUm6TveYvKU74mMB4RSgAAAABARHNfUGf+bUdc+70nT1dBXurbgA7VszsQDiI6Ak6JMolfH12jWWX5KV8TGI8IJQAAAABMav6gU8g5/X1Ln/a+s1H9MSHBjw6t0pw0w4HTdku+bWhP5CL3vZN4fYmP7sEil5j4mKAEAAAAYFJyzulHr3Tqp692qSs2iRhkr5rCtM+9dGqhfnxYlW5Y26V3OoNxx7v7Q5LydXN9/NoVwGRCpQQAAACASenYPzfp+y93Jg0kJOnQmUXDOv+Fe1Xo5bNnex7rDji19AX1QswOHwP+dUHySgtgoqBSAgAAAMCks7YloFeavQOBwS5dUp7WWhKp6ul3um9jX1x7nkm1Ffn66r6Vo35NIBcRSgAAAACYVPpDTic8uD2lvt88IPVtQBM5ZV6J/rYpOoD45vPtWu0RirR8epcRXw8YT5i+AQAAAGBS+f5LHfLFL/MQ5wO7FKuycOSPTAfNiJ/+4RVIAJMRoQQAAACASWP1Dr+ue7Urpb6f33t0plBYirM/Tt61eFSuB4wnTN8AAAAAMGlc83JHXNs9J03TvlMLtb6jX+f/o0WNvSGdWVuqo+cMb4HL4WIdCUxGhBIAAAAAJo2Vjf6o13PL8nTsnGLl55lmlOZr9dmz1eoLaW55/qhdM9VlMudV8HiGyYe7HgAAAMCksLYloI5A9PafK8+apfxBu2uUFphKC0YvkEjH1GJm12Py4a4HAAAAMOH19Tud/JemuPYpRWP/SDStJLVrlBSM/tajQK4jlAAAAAAw4d21oUfd/W7ojmPg7AWlWbkuMB4QSgAAAACY8H6ypjNr1y4ryNP8iuxMCQFyHaEEAAAAgAmtzRfSO53BuPYzaksyNob/OGBKxq4FjCeEEgAAAAAmrBXbfFp0+zbPY+ctKs/YOM6oTT6F49IlmRsLkEsIJQAAAABMSI9u7tMH/7ZD/lD8sSc/NEMn7JK5SomifNNFe3kHDwdML9T3DqrK2FiAXMKWoAAAAAAmpPs29nq2P/mhGdpvWlGGRyNVeez08dtjanT2grKMjwXIFVRKAAAAADnEH3R6rSWgroDHr/eRlsae+HUkPr6wLCuBhCQVe6x1WZjHNqCY3KiUAAAAAHJEZyCkE/7cpLfb+7Vreb7+dtp07VrBP9mHY2Nnvx7b4otrv2p59hacLCmIDyA8iieASYX/BAAAAIAMe6bBp6+vbNPlK9u0uat/Z/ut9T16uz38enN3UDfV92RriOOKc07t/pD6Q06S5As6Lbu7Ma7f6rNnaXZZ9rbm3M0jYKJSApMdsSsAAACQQb96vUuXP9f+/us3unXk7CJdtbwqql2Srl3dqWPnFOvw2cWZHua4EQw5nfePFv3lvT5J0h5T8rW+I37ahiTNr8heICFJx82N/3uM5CjApEWlBAAAAJBBN7zWFdf2dINfH/hLk2f/b7/QrjdaA3ql2a/+kFPI8RQ72IoG385AQlLCQGJxdYHMsluVMKUoT6fvFr3jx9KphVkaDZAbqJQAAAAAMqSpN6hNXd4PzYm80BTQYfdt3/m6KE/60WHVOm+R9/aSk82rzYGU+n1538oxHklqvn9wlRp6g9rYGdQX967QLuXZrd4Aso1QAgAAAMiA7kBI/2z0j/g8/pD0rVXtOmePMhXlsx5Bd//QlSN5Jn1sj9zYdnN+ZYEeO31mtocB5AxCCQAAAGCM3VLfra8+2yZfekUSCbX7nZr6QpPit+xbu4Nq9oW0d014+kUg5PTnjb0qyDOdtGuJ/nt155Dn+PvpMzIwUgDDQSgBAAAAjKFgyOlbqzpGLZAYEMjRFRLfaA2ooSeoQ2cVq9RjC8x0PLypT+f9o1m+oHRmbaluPG6qDr23MeG6EV5+dkS1lk0vGtE4AIydnA0lzGyjpE5JQUn9zrkDzWyqpDsk1UraKOmjzrnWbI0RAAAAGMqm7qBafKFRP29vCtMWMu2CJ1r0p3d6JUkHzijUX0+bMewtL19q8utjjzXvfH3fxl5V/2HLkO/7wcFVKs43nT6/RDNLJ34lCTDe5fruG8c555Y55w6MvL5C0uPOuTpJj0deAwAAADmpP+R0S31PXHueSX88bqoeOnW6LtqrXFOKwg/uB0wv1DufmKOPLxx6/YNvr2pXMEeqJdr9If3g5Y6dgYQUXqDz7g29Sd6V2IptPh3/oPduJMlcuX+lLl1aoQv2KieQAMaJnK2USOAMScdGvv+jpCckXZ6twQAAAACJ/H1Lnz78SLPnsRuPnaoP1ZZKkg6fXawfHlYddfzyZZV6usGXdKeOR7f4dNv6Hp1bl/1dOM55rFnPeizief2azpQClua+oG6t71GrP6THNvu0piW1HTVi5coOGwBSl8uhhJP0iJk5Sb9yzv1a0izn3LbI8QZJs7I2OgAAACCBVl9In3y8xfPY9YdX7wwkEqmtLNCLH56ldn9I00vy1OoLacFtDXH9rljZnvVQ4pqXOzwDCUl6q71/yPcHQ07nPNasVU3DCyIGLKjMH/ZUEQDZY87lRslXLDPbxTm3xcxmSnpU0hckPeCcqx7Up9U5VzPwur29feeHqa+vz+h4AQAAgAEPNubrO/XFce0LykL64359KhnGzIL/eKtIDzfF/05x1ZHx00MyYX236ZyXk4crknT/gb2aWxL/zOELSY815etqj5/TcFw6368L5g0dggDIrLq6up3fV1VVxSWHOVsp4ZzbEvlzu5ndK+lgSY1mNsc5t83M5kjanuj9gz844KW+vp77BDmD+xG5hPsRuWY83pMFvk5JHXHtj5wxV9OHk0hIOiXYrYeb2uLaF+yxUPkZrhB4t7Nf59zdmFLfdYWzdUxdRVSbL+g066atozae/zt+qv5ltxKZjf3PYTzej5i4JsL9mJMLXZpZuZlVDnwv6SRJayU9IOn8SLfzJd2fnRECAAAAibX7oysDZpbmaft5ww8kJOm4XbwrCjZ1j/Jeowl0+EN6ttGnNl9I33kxPnBJZPWO6GkZff1OZz68Y8TjWVxdoGsPqVLbZ3bR6fNLMxJIABh9uVopMUvSvZH/YSmQdKtz7m9mtkrSnWZ2oaR3JX00i2MEAAAA4jjn9EyDL6rtK/tUqih/ZA/NtZUFOnleiR7e1BfV/mZbQLWVY/vP+h19QR3356akC28m8mrMopUXPNmScA2KAYfNKtJNx03V9JI81dwYX1FRf85szWB3DWBCyMlQwjm3QdJ+Hu3Nkk7I/IgAAAAwmd2zoUc/fqVTVcV5+ub+U3TUHO+qBeecLnyyNe6hu6podH6L/6ujalR767aotnMea9GWc+eovHDsiqDvWN+bNJAozpeu3H+KLtirXI9s6tMFT7buPLa6OaBtPUHNKcvX+vZ+PfReX8Lz/PKoGh0+u0i7VSR+TPnXBaUEEsAEkpPTNwAAAIBcsbLRpwufbNXrbf16ttGvD/5thw64+/2dMJxz+sVrXar+wxbV3LhVf3qnN+4cVUWj88/u6uI8XbV8Slz7zfVju9jldWs6Ex67/vBqNXxqrr64T6UqCvN05u6lio1gPvBgk4Ihp2tfSTzt4z8OmKJzFpbFBRIX7hW9u8hn9sz+FqgARk9OVkoAAAAA2fCbN7p0/ZoubekJqqbY1Orz3qluQ2dQH/xrk/586gxd92qX/nOINRaqikfvd4HLZxTFtd2wtkufXVLh0XvkAiGnHX0hz2Mm6Zw9yqLWc8gzU+xPbXN3UB9+pFkv74iftnHl/pW6eElFwuDmC3tXaMU2n95u79cnFpbpsFnxnx/A+EUoAQAAAEja0NGvy59rVyjyRJ0okBiwosGv6j9sSenc1aNUKSFJtZXxUxc2dwd109vd2tDRr3PryrSwqnDUrpesSuL/LS5XSUFqU1Oe3OaLa3vto7O1S3nyqRi1lQV69syZCoSU8rUAjB9M3wAAAAAk3bexd2cgMZp2KcvXXtWj97vAWQnWU/jiM226/tUunfhgk3r6vSsbhiPR1JCSfOm/D6nyPPalvYeu2ti9Mn/IQGJAfp4RSAATFKEEAAAAJqTXWwP6zRtdWtceGLLvC01+ff+l1Le5HMq1h1Tp7AWlOreuTPedMk0FeaP3QF2cbzqjtiTh8Ta/09Pbku9ukaq32gKeC1xWF5mePmOm8hJsw3nuorIhz72oevSqOQCMX0zfAAAAwLgQck5dAafyAlN+gof8hp6g6tv7taMvqIuebFV/pPLh+bNmej4EO+dkZrp9XY+CQ1RJfHB+iW44skbzb9mWsM839q/U1/erlJnp4pQ/Wfp+ffRU3b8xfqvMAdt60t+608tv3+yOel1ZaPrnmTM1pyw/adBSV1WoNz82W3vd0ZCwz75TCSUAEEoAAABgHHi1JaCTHmxSb9BpXkW+7vrANO0VEzI8v92nD/1th/o8nscPvne7Wj89d+eCjM45/fuz7bp7Q48OnVWkFl/0dIe9qgv0vYOqdPjsIpUVRBcXrzxrpg69d3vcNX58WJUu3GtsFpuMVZxvOnpOsZ7yWKdBkvpdevNQdvQFVVmYp+J8k3Mu4eKd3zpgiuYl2a5zsNll+XryQzN0zANNnsfrqngUAcD0DQAAAGTIqu1+ffP5Nt2xvke+oNMTW/v06Oa+nesfBENO317Vruo/bFH1H7ZoY2e/ugIh/WRDoY66f7t6I6UMm7qCOvTe7Vo9aCcH55y+vrLdM5AYcOWq9p3fX/9ql37/Vrc6Ak6PbPbphaboKR4/PLRaJ+5aEhdISNJe1YV65F+ma15FeD2EL+9TodVnz8pYIDGguihxpcLz21ObvuGc0yVPtWjhbQ1acOs2PbCxVzU3bk24m8jp80vTGuN+04r0xQTrS8wo4VEEAJUSAAAAyIC1LQF96G87IsFCty55qnXnsdmlebrrpOn6xnNterrh/YfpZXc3Rr7zLvP/2dou/e7YqVrZ6NNHH21WRyB5dcDPX+vW+o6gHt7UN+R4Z5Qmf2A+eGaxXv3X2Tunf2TD/MrE/5S/Y32vDpnZrc/sWZZ0fE9s9emO9b2SpO5+p/P+0ZKwr0mam+LClIP950FV2t4b1O2R6wyYnmDBTgCTC/EkAAAAxlRPf0jn/6N5Z6VDrIbekI66f3tUIJGKe97plS/o9MnHW4YMJAakEkhI0qIUpxZkK5CQpC8MscPFV59t02NbvKd3DPj71uTHB/u3pcOvBLnhyBodM6d45+tdy/O1ZBR3JAEwfhFKAAAAYEz998udWt8xOgsvxrp0RauafaO3/aUkzavIT7irRC6ZWZqv4+cWJ+3zr482K5RgfQnnnH62tiulay2cUqDL9qtMe4wDCvJMd5w4Td89cIo+v7RCD502PeFipQAmF+JJAAAAjJm+fqefpvjgO5TF1QXa3B1U56CqiD+90+vZ9+dHVmuPKQVa2xrQvz/b7tknkdqK8TOt4FdH1+jnr3Up5KT73+3Vxs748OfWdT06t648rv2WdT1Jz/2dA6foksUVqu/o19KaghEHNSUFpi/sM/xgA8DERCgBAACAlISc0yOb+7S2pV9n1ZZqjxSmOPxja2rTJYZy/eHV+vSe5bpuTae+k2ARxgE/Pbxan4g8hA+1zaeXOWXjJ5SYUZqvqw6skiQtm16ozzzRGtfnd292e4YSj3hMZTmjtkRXL6/S7lPe/7vdh607AYwhpm8AAAAgoReb/Lp2dYee3+7TRU+26pzHWvS9lzq0/E+NOvWhJq1pTrwOhHNON76d/LfxVYN2kCjKk760d4VaPz1XPzy0amf79/f06dN7hh+qv7JvpQqT/Av2imWVOn/P9x/A9xzGugULx+lWlWftXqZ/njkzrv3lHQG93hrQpq7+qPZN3dFVFT8+rEp/PG5aVCABAGON/8UBAABAnDXNfh39QNPO19e83BnX59nGcJ8pRaYXPzxLMyK7KQRDTpc/167fvtkd955j5xbr3pOmKRCSivLfDyS6AyEV5tnOtosWV+iixeGFFevr66PO8cAp03XqQzs8x33A9KKo19NK8vWBXYr16KAFH6uKTDceO1XlhaaT/hJ/ng+mue1lLllSU6hfH12ji5+Krpg4/L7tkqTvHjRFM0ry9YVnWhWIWYpj/2nRPzsAyARCCQAAAETZ2h2MCiSG0uF3OvaBJj171kxNKcrTZ1e06q4N3ms93HvSNJmZimJmSJQnK3+IkWhnjHyTjpgd/2B90/HTdNu6HhXlSx/bo0yFgxZY/Np+lfrhK+8HLp/Zs0yLa8b3dIXTditJeOxbqxJPfakoZOFJAJlHKAEAADABrGn26+KnWrW1J6gjZhXrC3tXqKLQ9M3n2/V0g18fml+i7xxYNWRpfpsvpCV3NqR9/S09Qe12y7akfQ6dWTQqW2hOLfYOMHaryPcMN0oLTBfsFb+mgiRdecAU7TO1UNe/2ql/XVCmixd79xtPKgrzNKXQUt4mdfD7ACDTCCUAAADGuZBzUZUNf93Up7/GLGL4wLt9eqHJr5c+MlslBd7BwPPbfZ7TGUZLbeXoLCBpZvrKPhW6CLSAiwAAIABJREFU7tXoXT2OnJ18e8z/396dh0ddnf0ff5/ZMjOZ7CFhC3sEUVkEEREp7qi4VOu+1a12edrH1rZaa1vtYmulrdW2/tpq3er2uG8o7qioKCgKKsgiCgIhJGRfZju/P2YICZmsDJkkfF7XxZXku835Zk5mOPecc99tOWmEj5NG9N0lG4kM9Dupqgx3fGCcz2nI9yooISI9T688IiIiIn3c//ukde6GRDbVRfkgQWLK+rBl7nOlnQpI/OagTD46vZCLxvq73M6LxiZvFsIPJ7QuLfmDAwJJu35f19UKIr+dltkix4eISE/RTAkRERGRPiwStdzwfvslMpvbWt8yu+HnVWGOm1/Kll22N3f6KB/fGR+g0O9kSHpssPuXGTn8flo2A+/d1O7jpbsMtWHLf4/I5eDC7s1kSCTT4+CTMwZy6gvbCEfhp5MyKM7q27kgkmlinpuFmxs7PhB48YQBHFSgJJcikhoKSoiIiIj0EeGoxWlokZfhmGdLqQl3PnfAha+WN30/dYCbqKXdgMS/ZuVwxujEsyK8LsP39gvw949bLqM4MN/NE8fmk+nZs5NyB6c7eefrhXv0Mfqqc4v93LKips39Q/xOnj0+nxEZGg6ISGrpVUhERESkFyutj/CL9yp5cG2smsXEPDdXTshgygAPEx/eQlvxiDGZLh46Ko+fLq7g5a8Sf2K+pDTU7mO7DMwobP8T9F9OycQA962pZVy2m7tm51LYxaUDknxjs91cNNbPnavqWu0bHnDy/mmFOB1ariEiqaeghIiIiEgvYa1tmgXxTkkjc+a3zvHwYVmIC5rNdtjVzyZnsF+OmyOHePG5DP+elcOoBzpfTeOYoWl8VhmmKmi5bmomQwPt/3cxzWn47bQsfnNQZlIqa0jy3DQ9m5OG+/j6C2Uttv9lRrYCEiLSaygoISIiItIL3Le6lu+9WbFb1/A64coJGbiaDThzvU7OGOXj/9bVd3j+P2Zmc05xLBll8wBJZygg0fu4HIbDh3i5c3YOlyzcTtTGluwcPjh5uT1ERHaXghIiIiIiKWKt5e7P6nhobR1vl7SuitEVxxV5uf/I3ITBgX/OyuHZLxuobSf3xL9n5XB6s9wRCjL0H18f6WdMlpuNNWGOGOLVcysivYqCEiIiIiIpELWWs18qY8HGzlVIaM/jx+TxtcFpbQ42jTF88I1C/r6ihrCF7+0XIN1tWFwSZFlZkOOH+dg/V5Ur+rMDct0coOdYRHohBSVEREREelh92DLpkS2UtFP1YlcPHpXLsUO9fFET4b+r61heFuSQwjQuHpfeqSoXBT4n1x+U1WLbMUVejinydrn9IiIiyaKghIiI7JWi1lIVtGSnJadkYThqqQkl73rSf0WtZeaTJe0GJH48IYNRmU6OGOJl4C6VLEZkuLj2wMw93UwREZEeoaCEiIjsddZXhznp+W18WRPh2CIv9x6ei8fZ8RrrunCUKxZV8MLGBo4t8vL3mTm4HIZH1tVx6cLtTceluwxvnVLA8Iy232a3N0b59uvlLCkNcW6xn+unqnLB3iBqLQc/vpW1VZFW+y7Yx89l+wbYN9vVIlGliIhIf6aghIiI7HWmP15CQ3xMuGBDAwX3bGLF6YVkehwsLQ0yIc9NntfZ6ryfvFPZVMHgobX1LC8LkZXmaJWgsDZsmfhICQ4DF49NZ1qBh+2NUU4a4WOQ34m1lm+/Xt6US+CWFTUcVODhxOG+PXvjknKLtgRZXRlutf2+I3I5Qc+/iIjshRSUEBGRvcaGmjBHPVPaFJBobv+HS1ptG5ftYmVF6wHkDp+0sw8gauH2lbXcvrIWgKsWV+J1wqgMV6tzX97YoKBEPxe1lns+q221/dUTBzA535OCFomIiKSeghIiIrJXiEQtZ71U1qXEgu0FJLqrIZI4mHHXZ3VcOyWT/AQzNLpraWmQjbURjivydmp5iiRfaX2EB9bUMf/LBt7Z2rrk53FFXgUkRERkr6aghIiI7BU+KAvx8fbkBxmSaeyDW3jmuHxy0hyMy+5+6b6aUJTZT5Wypmrn/f5kYgZzirxUBaNML0yjPhylJmwpSncql0Uzm+si/GpJJUPTnWysiWAMfH2kjzlFHc9iaQhbXvqqgUfW1TM84GRrQ5T5X9ZTGbRtnnNgvko0iojI3k1BCRER6RNe2NDApxUhjhriZb/czg/kwlHLY5/X863Xt3d88G6YNSiNp+bkA/BOSSNz5m/r8jUiFo6Ln3foQA/3HJ6bMLdFe/64rIobPqhutf2mD6u56cPW20dkOPnbzBxmDkzrcnv7suc31PPm5iDTCjxMHeBhcLqT5eUhDntya6tjH15Xz+snFbB/G/0uai2XLdzOo5/Xd7kdswbtXb93ERGRXSkoISIivVrUWsY/tIUt8WUXv1pSxZ8OyeKScYFOnTvl0RK+qGmdRGLHNVZVhDj48dYD0baMzHDid5kWsy5uOTSbc8f4m36eXphGxUVDsNYSisKW+gj3fFbHvARBgbYs2hJk9AOxmRM7AgZrK8N8f9F23oon1vzxxAy+v3+ALE+sDOmqilDCgER71ldHmPvcNtafM2ivKWf62qYGznqpPPbDxx0fH7Uw88mtfHHuILI8Dhojlqe/qCcYsYzPcTP76dJuteMfM7OZVqClGyIisnfrdUEJY0wRcA9QCFjgX9bavxpjrgMuA3a8819jrZ2fmlaKiEhPWFsZZspjrRNQXvl2JbeuqOGVuQPISXPw8leNrK8OM70wrcWn2W9uCSYMSADMHuQFYGy2m1sPzeb7iyoA+OEBAZ7+ooE1VWFmDUrjn7NyGOR3Eola6iOWgLvzA3djDB4nDAu4uPbATK6alMGUR0v4Mt6m44q8/P7gLCY90voed5j73DYOKfQQjlreKw212Dfvw2rmfVjNsm8UUhmMcvXiyk63bVffeHEbL80t6Pb57QlGLAs3N/JVbYTFW4MUBZz87/4B0rvwu+yOqLVsa4jid5kWz9sT3ZjRADD8vs271Z4L9/FzSGEa0ws9jGinXKyIiMjepDe+I4aBK6217xtjMoClxpgX4/v+Yq2dl8K2iYhIDympiyQMSOywvjrCqAe2tNq+f66b2YPSOHqol5MXJF5C8b/7BxidtfMt8Px90jl9lB+XA1wOw6+mZrU6x+kwBBy7l3vB7TDcd2Qe8z6sIsPt4NoDMxnod3LbYTl85422l5fsWnJ0V+0FNTprSWmIO1bWcO6YdGzbKRC6xFrLVYsr+denrStObK2LcPOhOcl5oF28U9LIH5dV88qmxhbbvzM+nVA0llS0p+SkGc4e4+c3U7Nw7mb/ERER6Y96XVDCWrsZ2Bz/vtoY8ykwJLWtEhGRnmKt5eWvGvnGi2XdOn9FeYgV5SH+9nFNwv0vzR3A1AGtp8x7XT0zYDwg183dh+e12DZzoAenieWUSKUr367kyrcr8RgfbxSEGNvNZJvVoSgvbmjgn5/WsjhBxQmIBQZOHOHjyCHe3WlyK797vyph7gyA2z5pHRxJ5KghaTx4VB4LNjRw7ivlXXr8k0d4m57fqLU4lERURESkXb168agxZgQwGVgc3/Q/xpiPjDH/McbsmY9XREQkZSoao+TctanbAYmOfH//QMKARKoVBVz8+ZDspF/311MzeXnuAJoPi88Y5WP7Nwez6OS2l2oEreHgx7eyojzU5jGJWGtZXh5iv4e2cPHC7W0GJHY47YUynv2ie0spdhWJWmY9ubXNgER7hqbvTCZ666HZPHx0Hi6H4YThPv5nv45zl+xwxQGBFgEnBSREREQ6Zmyy5mgmmTEmACwEfmetfcwYUwhsI5Zn4jfAIGvtxc3PqaysbLqZ1atX92RzRURkN31Y5eDSj9r+1Pwv4xuYnhPlgmVeVtd2L6Z+076NzM5LnGOitwhHYd46N49uaXuWwmkDQ2xocPBuRduVOZ6aWs8gb+xt8fM6w/IqB9NyogxM2/m+H7ZwyCJ/W5cgy2V5blo9EQtBC5ltzK+0Fv60zs0jm11E6NpA3IHlXxMamZgZbdoWjMKWRkOBx9LZ4iMPbXIxb13XA06j/VEePLCh3WOe3OLkt2taV8m4f3I9f1zrYXm1g/OHhLl8eIgemnAjIiLSZxQXFzd9n5WV1eqdslcGJYwxbuAZYIG19s8J9o8AnrHW7t98e/OghEhHVq9e3eIPRCSV+lN/jEQtz3zZwHVLKtkar5hx1hg/YzJd/Hd1LZ9sD3P6aB/XTclioN9BSX2UYMQysZ28CD+ZmMHPD8xs+vnSheU8sq5rn7APDzhZcloh7j6wrv/ez2qbEm/u6rbDcjhjlI/qkGXWU1ubkmbmex2MyXTx44kZHDW080sifra4otPLGoAWVTqstVjgHx/XcO17VR2ee0ihJ2F+jCsOCHBdPI/HivIQxz9XSlVw51v6EL+Tb47186MJGS3yMlgb62s3f1TN0m2JZ3U8d3w+66rCfO/NxL/PX0/N5AcHZHTYdoDLFpbz8Lp6fE7DbYflcMpIX6fOk93Xn14jpe9Tf5TepK/1xz4RlDDGGOBuoNxae0Wz7YPi+SYwxvwQONhae1bzcxWUkK7oa3/A0r/11f7YGLHUh23TIPWjsiCznupeecREJua5+c74AGeO9mGaTYUPRy0nL9jGoi2xAe4th2ZTE7Jc827r6hN+l+GGaVmcMsLXZ0peljdEmPxoCZXNBuZHDUnjgaPykh5U2d4Y5duvl/NuaZDtjZ17G71zdg7pLgeXv1HeqXP8LsMth2bzjVF+otaSe9emFvvPHuPntsNiqzJnP7WVZWVtLxtxmFhgpqQuwi+XtB8I2TWAsrIizB+XVfP4+lhA67CBHh47Nr9Lv9PKYBQDZHr6Rl/qL/rqa6T0T+qP0pv0tf6YKCjR6xJdAocC5wPLjTHL4tuuAc42xkwitnxjPXB5apon0rfUhKK4jOmxJH7S/+0YlF34ajmvbmrEZeCM0X7OLfZzwnOJq110xytzB3BgG/kfXA7Dw0fn8ebmIAU+B5PyPVhryfc6WFIaZFjAyaqKMEPSnVxxQEaf6/+5Xie3HprDpQvLCUZh6gA39x+Z/IAEQE6ag4eOzm/6+Zp3K/jHx+3PnLjotbYrhTT36DF5zByYhtPEnjOI5Vm4/8hcznl5ZwLJB9bU4XHA3Z2oihG1cPnrHT/+F+cOIqtZ4MAYw745bv4zO4fzNvmpCVmOH+bt8u80S8EIERGRpOp1QQlr7ZuQcEHq/J5ui0hfVtYQ4arFlU1T3OcUebntsBxy+sgnxZI6lcEoqyvDTMxzNw3YttRF+NHbFcz/svXa+7CF+9fUcf+a5JVZXHP2QPI7SCbgdzk4pmjnMgVjDGeM9nPG6LZzJPQlJ43w8W5eIZtqIxxc4OmxcpJfG+TtMCjRkdNG+rh6cgbFWYnzYgz2t35uOxOQ6KxsjyHTnfj3ZYxJesUPERER6b5eF5QQka4LRix//7iGt0saeackSFWo9XTq5zc0MPL+zfzmoEy+PT7QJ9bVS89qjFgufLWc5zfsDDz8ckommW7DTR9WU1Ifbefs5LlorL/DgMTeYkSGixEZPftWfXCBB7/TUhfp3mvE32Zmc15xervHjM1243ZAqIMu5XbEcmVsruta3/vRhIwWy31ERESk91JQQqSPe6ekkTnzOz9l/hfvVfHounr+PjMHC+yf23aGf9k7WGu54NVynv6i9SyIXy/tOHlhInOHefnP7FxuXVHDb96PXaPA5+COr+Vy/dJKlpQmzhlQFHDy64OyuvWYkhzZaQ5uHNfIw+VZvL65sUvn3jk7h6+P7Himis9lOHO0n/+ubnt2xL9n5XB6fNZLWUOEK96qSNhHzy32c9WkDIYFXKysCOE0tDlDQ0RERHofBSVEkqQqGOXVTY1ErWXmwDQG+Pb8J73lDZEuBSR2WFYW4tAntwLgdcLy0wf2SHul96kORZn6aElSZ0H8eGIGP58c+6T6yokZXDkxVtnAWosxhpfmFhCJ2qblCFXBKH/6sJqKYJTv7hcgw60lRqk2PSfK+dN25pn4sibMRa+Wt6hwMSXfzZwiL+cWp7OuOsyUfA++LuTuuGl6NgN9TuZ9VN1q3w3TspoCEgB5Xif3HpHH8vIQl75WzqrKMNMGeHj02LwW/WVctoIRIiIifY2CEiK7qawhwgWvljdVAYBY+bpHjsljXLZrt6YQW2tZXRkm1+sgGIFg1DIiw8XayjC3rqjmriSswW6IQPGDW1h79kDyNGW+Xyupi/DAmjqe/KKesoZoUynJrhid6eSr2ggN8VO/uY+faw7M5NPtITbVRZk50ENRIPFbS/O/heb5ETI9Dq7X7IhebVjAxcsnFrS5f3B61187fC7DtVMyuXZKJuurw/z83UrKGqJcNC6dM9vIC3JArpt3vl7A1vooBT6HlmiIiIj0AwpKiHTTW1sauWRhecK1zl/VRTjkidhMhFEZTq6anNnmf7Lb8tDauk5lmG+PIfapdUl9hHs6CGCMfmALC08awMS8ndUOqkNRVm4PMzzDSYFmUvRp2xoiHPlMKRtrux6IgNi6/lsPzea4YT4AKhqjZHoMjvigUP1DdseIDBf3HZnXqWONMRQmSJQpIiIifZOCEiJdFI5aznqpjJe+6txa63XVES5/fTvvbg1y0/SspkFcKGp5c3MjDgPbGqJsqInwXmmQZxNUN+isD79RyPB4UryotdSFLYH41Oa/zsjm1hU1/HJJ2zkCvvZUKRPz3Dx//AA+2Bbk+GblHQt9Dp6ak89YTY/ulndKGjn/lXJKG2JBrHOL/XxeFWZDbYR0l+G4HBdXj7K4DKypCjMs4KIxYslOUrWUG5dVdyogcVyRl99Ny2JUZqwf1YWjfFYRZp9sF37XzrYkq10iIiIisndTUEKkix5ZV9/pgERzd6ys5Y6VtVw8Np3/rNq9cnu7mjrAzb9m5TYFJAAcxhBoVhLPGMMPDshgkN/JZe3MwPiwLMSgeze12l5SH+Vbr29n4Uktp3BHrW0KtEhif11eza92CQbdt0uCv5UVHv7yeevfO8C9R+Qyo9DD1Ytj09t9LsMP9g9wcGEaUWtZVREGICfNwbwPq1lRHiLTEyt7eOE+6VSHotzzWft97tgiLzfPyGbQLp9A+10OJuV72jhLRERERGT3KCgh0knLtgVZsLGB33/QOilbVyQ7IPHmyQVdqqBx+mg/p4/288wX9Zz3SnmXHuvDshC/fb+K84r9DEl38oNFFTz2eR2HFKZx1+zcvfbT8021Ea5fWslDa+s5fHAap4708WVNhJpQlFUVYV7Z1PUgVnPnJ3ieOjOj5oWNjVy1uLLN/QGXYeagNC4dl85RQ7271UYRERERke5QUEKkE25dUc0v3mt72cMxQ9M4aoiXM0b7OeqZUtZUhZP22GMyXZw1xs89n9W2SEw4p8jLg0d1bg12InOH+6i4aAhVwSjD7tvc6fPmfVjNvA9bBmZe29TIiPs384+Z2Zw9xk9lMHnLDnpK1Fo+2BYiGLVMyotVEdiRaHSg30mmJ/H9vLapgVMWlDX9/OqmRl7dzSDEnnZwgYcFJwxIdTNERERERBSUEGlLeUOEqxZX8vC6+naP23z+4BZl8F45cQBHP1PKqsrdD0ycMsLHnbNzYksv9g9w/dIqFm1p5LBBafxqSuZuXx9ilQ9WnjmQcQ9t2e1rfffNCr77ZgUQy5nw95k5u33NnvDe1iBHP1va5n6XgUePyaMmZClvjDImy8XGmgivbW7kic/b7x+90SGFWo4hIiIiIr2DghIiCSwpDXLic9uoj9h2j/vbzOwWAQmIDfIXn1rIqooQj35ez9gsF4PTnSwuCXLd0pazLfLSHJw+2sfIDBdnjvY3zS4IRizVoWiLEp0ep+F30/ZM2cSBfic3TMvimndbT/X/2eSMbi1ZuW91HZeNSwfgg20hphV42K8Ly0x6Sm0oyjkvl7V7TNjCyQvaP6Yzxme7eOPkApwOw6qKEO9uDTJ7cBqNEcup87fwZcOen12S4TacM6ZrlWBERERERPYUBSVEdlEXjg1S2wtIpDnh5hk5nN3O4G5stptrJu8chB9SmEZ9xPLHZdVY4IoDAlw3NXGQweM05Dl7tuTd5fumMyTdyYWvxvIXuAz8ZUY25++TTm3IcsuKmi5f86Tnt1EV2vl7nJTn5olj81ss7QhHLU+ur2dZWYiidCenjfK1CMY0t2xbkMte386YTBdXTcpoSsBYF47idZouJdxsjFh+8V4l//o0uTk+2jI+28UTc/JxOmJtHJvtblHJ5NGpDRQXF9MQtqQ5YVFJkLnNqp8AHJDr5uk5+Tyxvp7rl1bidhhuOTSbcdluVpSHyHA7mDLATcDtoCFs+c+qWq55t5J8r4NpBR4OKfBwxmi/yimKiIiISK9hrG3/k+C+pLKysv/cjOxxq1evpri4uOnnqmCUqxZX8sCaujbPuXJCgFNH+hnkd5DbxsC5I6X1ERoilqJA740Jrq8Ok5vmaJFHYUtdhHNfLmPptlCLY6cN8PBuabBL109zwlsnF7KpLsKJz7ceeC84IR+XMXicsQF8JGr59hvbO1xKAzAl381fD81pM/mntZZ7V9fxg0UVXWpze3xOw/VTMzlrjB+XA2pClnAUBqc7CUctThOrftKeXfsjwB0ra7j901rqwpYD8z3cOD2LAp8CCrLnJeqPIqmkPim9ifqj9CZ9rT9mZWW1+k9x7x0VifQAay2WWJnPb7VTJvO0kT7+PCObrDaSHXbFgD4wqByR0fqlYaDfycsnFhCOWlyOWBJIiA22t9ZHOPCREmrCnYsLNkZgymMlCfctLw8x+N6diTfPLfaT6TadCkgALN0WYuaTWwH416wcpuR7ePqLeq5bWoXDQLSDJv5ySiY3vF9FJ2+FM0f7uGFaVovZHf5mvz6Xo/vlUi8ZF+CScYFuny8iIiIi0tspKCG90raGCPetrsMAF+yTTnaag9L6CN98rZxFW4Jkug3f2S/Ad8YH8DoNYWuJWtqskLCDtZZNdVHe3NLIje97+fzNTXQ09vzgtEJGZupPZYcdg+zmn/wX+Jx8etZALn2tnAUbk1t54r7Vbc9c6ciugaaOAhInDvfywwMC/GhCBhCb1VL8YMsEoEcPSeNb4wMcNMCD2wHp7r5VZUREREREpDfRSEv2uLe2NPLnj6p56avYYHX24DT+e0QugWaDuS+qw2xvjDIxz8366gjHP1fK5rooAL9cUsXl+6azvjrMoi2xZQJVIcuNy6q5cdnOBIxOA1dOzOCnEzNwOQyl9RGeWF/PG5sbOWiAh+3BKE+ur2dt1Y6ymu0PJouzXNw5O1cBiU7KcDu4cXo2Cx8voSHS8fG9xfCAkzlFXibnezh9lK9FsGWAz8mm8wfxhw+q+ag8xPnFfk4bpSSRIiIiIiLJopwSskf985MarlrcuqIDxBIpdnaKfE+7YVoW3x6f3qXEiRKzYEMDt31Sg9dpyPIYhqY7uWzfALlpDm5fWZuwwsc+WS5ump7NuS+XdbgE5IRhXjbVRfggnttiUp6b8/fxE47SZl9rS5oTSi4Y0qVz9pS+th5Q+jf1R+lt1CelN1F/lN6kr/VH5ZToZ0JRiwOasvkDfF4V5mfvVvL8hgbG57g4e4yfnDQHty6vYXK+mzyvk2OLvByY72ZjbYSohZEZrhZlLVdXhthQEyHgNhQFXATcsX0ZzWY2RKK2xeM2F4zEsv5f3cEAsbcGJH54QIDv7qd1/N11bJGXY4u8Cfd9d78A5xX7+cOyKv7xcS2njvRxXrGfQwrT8LkM684ZxF+XV7O+JpJw2caZo338c1Yu1loqg5Ysj2kxs+Hy8bHn7bdLq5j3UeIypj+bnMFrmxqZUejhO3qeRURERERSSjMl+piotbyxuZHbV9by9BcNpLsMtbs5us/yGI4Z6mVYwMmdq+oob4y2eex+OS4+3h4GYsslzhnj5+Jx6QxNd5LpcfDE+np+s7SKjbW9f/7+9OwIV0wdwNQBHrI8DiJRcDtoM9giPWtlRYhjny2lMhjr3/vnull44oBOPz/PflHP9UurKGuIcvG4dK6ZnNFhBYxU6mtRbunf1B+lt1GflN5E/VF6k77WHzVTopcKRixf1oTJ9Dh4YWMD720NsrE2Ql3YMizgxADVIUtJfYQlpS3LMe5uQAKgMmg7XdlgR0ACIGLh3tV13LsbiQjbc9ZoHxfsk85pL5RRH9l5nwcXeJg73MvnVRHOHO1jU12EqxdXUlLfdjBlB48DLh6Xzu+nZbFmzRqKi3xN+5SvsHcZl+1m6WmFvLs1yH45boYnqAjSnhOG+zh+mBcLWoYjIiIiItJLKSjRC9zzWS0/fifxUoe3E1dN7HPmTc/i0n0DXLekkpuX1yQ85oJ9/BT6nAz0O5hekMZ+uW4APvhGIVcvruSJ9fWcMdrHLTNy8LpaDjK/PtLP1voIv3ivkofW7gywXDTWz19m5PBlTZgNNRH2zXaR6+39JTklJt/r5Phhvo4PbIMxBoUjRERERER6LwUleoH/rKpNdRP2mGOLvFwyNp1j4jkGfjUlk6HpTpaVhThlhI/11WHqI5aThvva/CR8oN/JXYfndvhYBT4n/5yVyz9nQThe+3FH+cphARfDAuruIiIiIiIivYlGaSkUjFiqQlG21HW87GBXhxR6OHO0n/lf1vPCxlipzVNH+jhhmJdTRvhwOgyVwSivbWokz+vg0EIPxhhuWlbF7z6IJQCcUejhrsNzWbYtxB0ra1gQv85BA9zcPCOnaaZCTSjK7Z/Wct3SqqbHnzvMS3ljlLdKggnb98CRuRyX4BNuYwyX7rvnkwu6lBdCRERERESk11NQIoU8TsP8tQ0JE0uOzHAyY2AaxZku8rwOAm5DvtdJ1FqGprsYnRV76r45Np1Q1OJOMAjP8jg4eUTLwMBPJmXyk0mZLbYdU+RsmsmQSMDt4IoJGVwxIaPVvmDEsrIixFPrG5hruS/eAAAJQUlEQVT/ZT2/nJrJnKLuT7cXERERERGRvYeCEil2wT7pnDTcx5Pr6zEGzi/2d7lCQKKARE/xOA0T8jxMyPNw7ZTMjk8QERERERERiVNQohfITnNw4dj0VDdDREREREREpEepCKKIiIiIiIiIpISCEiIiIiIiIiKSEgpKiIiIiIiIiEhKKCghIiIiIiIiIimhoISIiIiIiIiIpISCEiIiIiIiIiKSEgpKiIiIiIiIiEhKKCghIiIiIiIiIimhoISIiIiIiIiIpISCEiIiIiIiIiKSEsZam+o2JE1lZWX/uRkRERERERGRfiQrK8vsuk0zJUREREREREQkJRSUEBEREREREZGU6FfLN0RERERERESk79BMCRERERERERFJCQUlpN8wxhQZY141xnxijPnYGPO/8e25xpgXjTGr419z4tvHGWPeNsY0GmN+3NF1RLoqWX2y2fWcxpgPjDHP9PS9SN+XzP5ojMk2xjxijFlpjPnUGHNIKu5J+q4k98cfxq+xwhjzgDHGm4p7kr6rG/3xXGPMR8aY5caYt4wxE5tda44xZpUxZo0x5upU3ZP0Xcnqj31pTKPlG9JvGGMGAYOste8bYzKApcApwDeBcmvtH+JvDjnW2quMMQXA8Pgx262189q7jrX2kxTclvRhyeqTza73I2AqkGmtnduT9yJ9XzL7ozHmbuANa+3txhgP4LfWVvT0PUnflcT37CHAm8B4a229Meb/gPnW2rt6/q6kr+pGf5wBfGqt3W6MOQ64zlp7sDHGCXwGHA1sBN4Dztb/IaUrktgf+8yYRjMlpN+w1m621r4f/74a+BQYApwM3B0/7G5if9RYa7daa98DQp28jkiXJKtPAhhjhgInALf3QNOlH0pWfzTGZAGzgDvixwUVkJCuSubrI+ACfMYYF+AHNu3h5ks/043++Ja1dnt8+zvA0Pj304A11tp11tog8GD8GiKdlqz+2JfGNApKSL9kjBkBTAYWA4XW2s3xXVuAwm5eR6TbktAnbwZ+CkT3RPtk77Kb/XEkUArcGV9OdLsxJn1PtVX6v93pj9bar4B5wJfAZqDSWvvCHmus9Hvd6I+XAM/Fvx8CbGi2byO9dBAofcNu9se2rtPrKCgh/Y4xJgA8Clxhra1qvs/G1it1as1Se9cR6Yrd7ZPGmLnAVmvt0j3XStlbJOE10gUcCNxmrZ0M1AJaNy3dkoTXxxxinx6OBAYD6caY8/ZQc6Wf62p/NMYcTmwQeFWPNVL2Gsnqj31hTKOghPQrxhg3sT+6+6y1j8U3l8TXVO1Yo7W1m9cR6bIk9clDgZOMMeuJTQU9whjz3z3UZOnHktQfNwIbrbU7Pm15hFiQQqRLktQfjwI+t9aWWmtDwGPAjD3VZum/utofjTETiC2pPNlaWxbf/BVQ1OyyQ+PbRLokSf2xz4xpFJSQfsMYY4itcf7UWvvnZrueAi6Mf38h8GQ3ryPSJcnqk9ban1lrh1prRwBnAa9Ya/VJoHRJEvvjFmCDMWZsfNORQK9LmiW9W7L6I7FlG9ONMf74NY8ktm5apNO62h+NMcOIBcDOt9Z+1uz494BiY8zIeBLgs+LXEOm0ZPXHvjSmUfUN6TeMMTOBN4Dl7Fx3fw2xtVP/BwwDvgDOsNaWG2MGAkuAzPjxNcB4YEKi61hr5/fQrUg/kaw+2XyqnTFmNvBjq+ob0kXJ7I/GmEnEPpHxAOuAi5ol2RLpUJL74/XAmUAY+AC41Frb2JP3I31bN/rj7cBp8W0AYWvt1Pi1jieWB8oJ/Mda+7seuxHpF5LVH9u6Tm8c0ygoISIiIiIiIiIpoeUbIiIiIiIiIpISCkqIiIiIiIiISEooKCEiIiIiIiIiKaGghIiIiIiIiIikhIISIiIiIiIiIpISCkqIiIiIiIiISEooKCEiIiJJYYyZbYyxzf5FjDHbjTErjDF3G2PmGGPMblx/kjHmOmPMiOS1WkRERFLJleoGiIiISL/zADAfMEAGMBY4BbgAeMkYc7q1tqIb150E/Ap4DViflJaKiIhISikoISIiIsn2vrX2v803GGN+BPwR+BGxoMVxqWiYiIiI9C5aviEiIiJ7nLU2Yq29EngTmGOMmQlgjBlsjPmTMWZZfKlHgzHmE2PMVcYY547zjTHXAXfGf3y12RKRu5odk2aMucYY83H8OhXGmKeNMZN77k5FRESkKzRTQkRERHrSHcBM4ARiAYoJwKnA48BawA3MAf4AjAIuj5/3GDAI+BZwA/BpfPtaAGOMG3gemAHcC/wNyAIuAxYZY2ZZa5fs4XsTERGRLlJQQkRERHrSR/Gv+8S/LgRGWWtts2NuNsbcC1xqjLnOWrvZWvuRMeZtYkGJF621r+1y3f8BZgNzrLULdmw0xvwDWAHMi+8XERGRXkTLN0RERKQnVcW/ZgJYa+t3BCSMMR5jTK4xJh9YQOz/KVM7ed3zgJXAUmNM/o5/gAd4EZhpjPEl80ZERERk92mmhIiIiPSkzPjXKgBjjAu4mlhljjHEKnY0l9PJ6+4L+IDSdo7JBzZ0uqUiIiKyxykoISIiIj1pQvzrqvjXPwPfBx4CfgdsBULAgcCNdH5WpwGWE6vu0Zb2AhYiIiKSAgpKiIiISE+6JP712fjX84HXrbVnNT/IGDMmwbk2wbYdVgMDgFestdHdbqWIiIj0COWUEBERkT3OGOM0xswjVnljvrV2UXxXhF2WbBhj0oEfJrhMTfxrboJ99wADaWOmhDGmsDvtFhERkT1LMyVEREQk2Q40xpwX/z4DGAucAgwHXgDOaXbsI8DlxpiHgJeAQuBioCzBdd8DosDPjTE5QC3wubV2MfBX4GjgJmPMEcArxPJWDAOOBBqAw5N5kyIiIrL7TMsKXCIiIiLdY4yZDbzabFOU2OyGjcAS4AFr7fO7nOMHrgfOIBaQ2ADcQSwA8RJwkbX2rmbHXwhcRSwpphu421r7zfg+F/BdYktCxsdP2QS8Gz/uhaTdrIiIiCSFghIiIiIiIiIikhLKKSEiIiIiIiIiKaGghIiIiIiIiIikhIISIiIiIiIiIpISCkqIiIiIiIiISEooKCEiIiIiIiIiKaGghIiIiIiIiIikhIISIiIiIiIiIpISCkqIiIiIiIiISEooKCEiIiIiIiIiKaGghIiIiIiIiIikxP8HH0suMptzV38AAAAASUVORK5CYII=","text/plain":["
"]},"metadata":{"needs_background":"light"},"output_type":"display_data"}],"source":["plt.figure(figsize = (16,6))\n","plt.plot(data['Date'],data[prop])\n","plt.title( prop + \" history \")\n","plt.xlabel('Date', fontsize = 18)\n","plt.ylabel(f'{prop}', fontsize = 18)\n","plt.show()"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"-1BAgBWhpZ74"},"outputs":[],"source":["data_end = int(np.floor(0.8*(data.shape[0])))\n","# lấy cái mốc là data_end theo tử lệ 2:8\n","train = data[0:data_end][prop] \n","# lấy 80% là giá mỏ cho tập train\n","test = data[data_end:][prop]\n","# lấy 20% data là giá mở cho tập test\n","date_test = data[data_end:]['Date']\n","# lấy 20% là ngày trùng vs tập test "]},{"cell_type":"code","execution_count":null,"metadata":{"id":"-61e7HOhq2-G"},"outputs":[],"source":["train = train.values.reshape(-1)\n","test = test.values.reshape(-1)\n","date_test = date_test.values.reshape(-1)\n","# chuyển ma trận sao cho phù hợp với đầu vào của keras"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"285cdcb9-6b26-49d2-a7d0-14f3c7c3d57a"},"outputs":[],"source":["def get_data(train,test,time_step,num_predict,date):\n"," x_train= list()\n"," y_train = list()\n"," x_test = list()\n"," y_test = list()\n"," date_test= list()\n","# khởi tọa các list trổng để lưu data test, train\n","# time_step = 30 số lượng ngày đưa vào, num_predict = 1 số lượng đầu ra\n"," for i in range(0,len(train) - time_step - num_predict):\n"," x_train.append(train[i:i+time_step])\n"," y_train.append(train[i+time_step:i+time_step+num_predict])\n","# y(dự đoán của 30 đầu vào) = f(x(giá open 30 ngày)w(giá trị cần cải thiện trong model) + bias(giá trị cần cải thiện trong model))\n","# đưa vào giá của 30 ngày tương ứng với 1 state và đầu ra y mũ cho 1 node tưởng tự n data còn lại\n","# đưa giá trị vào mảng x_train(giá mở của 80% tập data ngày trước để đưa vào cho máy học), y_train(giá mở của ngày thứ 31) \n"," for i in range(0, len(test) - time_step - num_predict):\n"," x_test.append(test[i:i+time_step])\n"," y_test.append(test[i+time_step:i+time_step+num_predict])\n"," date_test.append(date[i+time_step:i+time_step+num_predict])\n","# Xử lý đưa data vào list tương tự như tập train\n"," return np.asarray(x_train), np.asarray(y_train), np.asarray(x_test), np.asarray(y_test), np.asarray(date_test)\n"," # chuyển dữ liệu thành dạng mảng"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"d61f3b95-96c9-4f08-a547-5d8e51548241"},"outputs":[],"source":["# gọi hàm dựa data vào mảng train test time_step num_predict, date_test\n","x_train, y_train, x_test, y_test, date_test = get_data(train,test,30,1, date_test)\n","\n","# chuyển về dạng ma trận đưa vào minmaxscaler()\n","x_train = x_train.reshape(-1,30)\n","x_test = x_test.reshape(-1,30)\n","\n","# dua ve 0->1 cho tap train\n","scaler = MinMaxScaler()\n","\n","# gọi hàm scaler để nén hoặc giải nén data về khoảng (0,1) để máy hiểu góp phần tăng tốc độ máy học\n","# fit_transform nén data lại cho model cho 4 ma trận x, y_train x,y test\n","x_train = scaler.fit_transform(x_train)\n","y_train = scaler.fit_transform(y_train)\n","\n","x_test = scaler.fit_transform(x_test)\n","y_test = scaler.fit_transform(y_test)"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"b418eea0-588f-4904-b9bc-b506d144ee56"},"outputs":[],"source":["# chuyển về dạng ma trận đưa vào keras() thêm một chiều thứ 3 để có bias => để thành ma trận 3D cho phù hợp với bài toán\n","\n","# Reshape lai cho x_train\n","x_train = x_train.reshape(-1,30,1)\n","y_train = y_train.reshape(-1,1)\n","\n","#reshape lai cho test\n","x_test = x_test.reshape(-1,30,1)\n","y_test = y_test.reshape(-1,1)\n","date_test = date_test.reshape(-1,1)"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"1ffc429b-436e-4cd9-b7b7-0cd70cc100b3"},"outputs":[],"source":["# 1 lớp là giá của 30 ngày (n_input)\n","# n_feature số lượng cột ở đây là giá mở\n","# return_sequences trả về chuỗi \n","\n","n_input = 30\n","n_features = 1\n","\n","# Khởi tạo mạng neurol\n","model = Sequential()\n","model.add(LSTM(units = 50, input_shape=(n_input, n_features), return_sequences=True))\n","# trả về dạng chuỗi để đưa vào layer tiếp theo\n","# true thì nó trả về chuỗi các hidden state false thì trả về output\n","model.add(Dropout(0.3))\n","# lớp thứ hai\n","model.add(LSTM(units = 50, return_sequences=True))\n","model.add(Dropout(0.3))\n","# lớp thứ ba\n","model.add(LSTM(units = 50))\n","model.add(Dropout(0.3))\n","# đưa về lớp cuối cùng 1 node\n","model.add(Dense(1))\n","# đưa vào xác định hàm lỗi(loss function) 'mse' và hàm tối ưu(vd gradient) 'adam' \n","model.compile(optimizer ='adam', loss ='mse')"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":397},"executionInfo":{"elapsed":4029,"status":"error","timestamp":1640876859077,"user":{"displayName":"0542_Võ Thương Trường Nhơn","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"10797139682346268390"},"user_tz":-420},"id":"8404f748-abdd-4283-9a6b-3f119e0b5ac4","outputId":"5c34debd-98f2-4641-e178-9feb54d20c35"},"outputs":[],"source":["%cd /content/drive/MyDrive/co phieu\n","# fit đưa tất cả vào model\n","model.fit(x_train, y_train, epochs=200, validation_split=0.2, verbose=1, batch_size=30)\n","model.save(f'{Macophieu}_{prop}.h5')"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":3649,"status":"ok","timestamp":1640876867445,"user":{"displayName":"0542_Võ Thương Trường Nhơn","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"10797139682346268390"},"user_tz":-420},"id":"1ca20d70-5a2d-4fa8-bbfa-81680f601034","outputId":"6b0d99dc-e1f6-43f0-b770-62a9949be942"},"outputs":[{"name":"stdout","output_type":"stream","text":["/content/drive/MyDrive/co phieu\n"]}],"source":["%cd /content/drive/MyDrive/co phieu\n","# Test model vừa train\n","model = keras.models.load_model(f'{Macophieu}_{prop}.h5')\n","# load model\n","test_output = model.predict(x_test)\n","# lấy tập x_test cho vào model ra test_output là data dự đoán\n","\n","# giải nén dữ liệu từ (0,1) ra giá thực tế\n","test_1 = scaler.inverse_transform(test_output)\n","test_2 =scaler.inverse_transform(y_test)\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":441},"executionInfo":{"elapsed":5,"status":"ok","timestamp":1640876867446,"user":{"displayName":"0542_Võ Thương Trường Nhơn","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"10797139682346268390"},"user_tz":-420},"id":"bkxTHheVwNZW","outputId":"4e414846-6278-4623-85dc-39c6f7bc3eba"},"outputs":[{"data":{"image/png":"iVBORw0KGgoAAAANSUhEUgAABDEAAAGoCAYAAABfW36hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdd3RUxd/H8ffupgdSBBIIJGAQkKaI/ChKlV4UkN6LgiKIBVGRJogiYEEpgiJKFZBiwAIoAoI0pUtHihQpAgnp2ezu80eebFh2EwIEUvi8zskxd+7M3Ll3OMcz30wxREZG2hARERERERERyeGM2d0AEREREREREZHMUBBDRERERERERHIFBTFEREREREREJFdQEENEREREREREcgUFMUREREREREQkV1AQQ0RERERERERyBQUxREREJFeoWLEiFStWzO5miIiISDZSEENERPI8q9XK7NmzadGiBffffz8FCxakZMmS1KhRg379+rFkyRIATp48SUBAwE39bNiwweFZ58+fZ/To0dSqVYuwsDCCg4OpUKECzzzzDL/99tsN23rmzBlGjx5NvXr1KFGiBAULFiQ8PJwWLVowadIkLl++7JC/YsWKBAQEcPLkSae6Ll++TMOGDQkICKB79+4kJCTc1Hfr0qULAQEBlChR4qbL5mZWq5WIiAi6d+9OhQoVKFy4MCEhIVSpUoX+/fun248Wi4X58+fTtm1bSpcuTaFChQgPD6dZs2Z89tlnxMfHuyw3duxY+7+n5557Lt12bdmyxZ6vdOnSDvdc/dstUKAAJUuWpFWrVixdujTdeocMGWLP/++//6abb968efa6hwwZ4jLP4cOHCQgIoHnz5gBERkZSvnx5ChUqxK5du9Kte8aMGQQEBNChQ4d084iIiAC4ZXcDRERE7iSr1UqnTp1YtWoVfn5+NGnShJCQEMxmM4cOHWL58uX8+eeftGnTBn9/f9544w2nOj777DOuXr3K888/j7+/v8O9sLAw++/ff/89zz//PDExMVSsWJFOnTrh7e3NkSNH+OGHH1iyZAmdO3dm4sSJeHh4OD1n9uzZDB48mMTERMqVK8fTTz9NYGAgV65cYdu2bQwfPpwJEyZw4MABfH19M3zvU6dO0aZNGw4fPsyzzz7L+PHjMRoz/7eLf//9l1WrVmEwGIiMjOS7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JOSW2/DJJ59gtVr56quvePTRR2+5ntQNPcPCwuyD8nz58tGyZUuuXLlCREREumU7dOjAww8/7JD21ltv4evry6JFi1zu5fH8888TGhpqvzaZTIwaNQqDwZCp/RamTp2KyWRi0qRJTgPhV199lQIFCmRqkJ3aB/fddx9eXl43zO+qXGYG4q76/1ohISE0aNCApUuXEhMTA6TMwjAajZmaWRMVFcXYsWMZO3Yso0ePpkuXLrRr1w6bzUb//v3t3zp1Q09fX19atWoFpMyw6Ny5M8nJyZn69qNGjcLDw4N33nkn3ZNXrtenTx8aNmzI2rVrOXXqFMOGDXP6NyMiIpIRBTFERCTPa926NX/99RdLly5l8ODBNG7cGIPBwOrVq3nmmWdo164dSUlJ2d3M25K6zGDgwIEuj1vNrDlz5mCxWOjUqRMGg8GenpmlBo8//rhTWmBgIOXKlSMuLo4jR45kqkypUqUICgri2LFjGS4FiYuLY8+ePfj7+zNt2jT74D31Z/z48Xh4eHDx4sV0l7PkRD169CAmJobFixcTExPDkiVLaNCgAcWKFbth2atXrzJu3DjGjRvHxIkT2bx5MzVr1uTLL790WLLx3XffERkZyVNPPeWwh0dqv8+ePfuGs5VKlChB3759OX36NFOnTs30+6UuRQkODmbAgAGZLiciIgI6nURERO4R7u7uPPHEEzzxxBMAWCwWli9fzoABA1izZg1ffvml/WjKmxUUFATAmTNnbpg3NU/hwoXtacHBwQCcPXv2lp4P8OGHHzJlyhS++OILmjVrRkREBA888MBN1WG1Wpk9ezYGg4FOnTo53Hvssce4//772bRpE0eOHKFUqVJO5VO/w/VST5xwtclmRmXOnz9PdHQ0+fPnd5knMjISm83G5cuXGTduXIbvFhMTw3333Zfu/dQ+uHz5MgkJCZmejZHa/suXLxMfH3/D2Riu+v96jRs3pkiRIvYZGNHR0XTv3j1T7QkNDWXv3r03zJcajOrcubNDevHixalVqxa//fYbv/766w334HjttdeYP38+EydOpFu3bplqY+q39fDwuKXlMSIicm/T/zlEROSeZDKZaN26tT1wsX79+luuq3r16gBs2LCB5OTkDPOuW7fOocy1v99OGwwGAxMmTOCll17izJkzNGvWjP37999UHT///DOnT5/GZrNRqVIlAgIC7D+BgYEcP34cSH82hqtTSAAuXrwI4PJUlRuVSS+AcW195cqVIzIyMsOfa48VdaVYsWIUK1aM5ORkfv/99wzzXis0NNRebsOGDRnmPXjwIOfOncPLy4tHHnkk3Xwmk4kuXbqwc+dOxo0bR+HChWnSpEmm23QjBw4csO/D8uSTTzr0c0BAAL/99htw4w0+IWXj3DfeeIPo6Gjee++9LGujiIhIehTEEBGRe1rqIPl2NvqsVasWJUuW5Ny5c8yePTvdfOfOnbNv2NirVy97esuWLQkMDOSPP/644fGWycnJGe7hMWrUKIYMGcKFCxdo0aIFu3btyvR7pA5aGzZsSLdu3Vz+mEymdDf4dDX4j4yMZP/+/fj4+LicveGqzJEjR7hw4QLh4eEZBjHy5ctHuXLlOHLkCJcuXcr0e6Yn9WSZCRMmYLFYMsx77funzpL48MMPM+yb1NkiHTt2vOFMj27dumEwGDhz5gxdunS54YaxNyO1n2vUqJFuP/v5+bFy5cp0g0zX6t27Nw888ABz5szhwIEDWdZOERERVxTEEBGRPG3x4sWsXbvW5eDy/Pnz9qCCq70ZMstoNPLRRx9hMpl46623WLZsmVOeU6dO0aFDB6KioujevTtVq1a138ufP799gPvMM8+wevVql8/ZtWsXTZs2dbks41pvvPEGY8aM4fLlyzz11FNs3br1hu9w9uxZVq9ejZ+fH19//TWTJk1y+dOgQQMuXbrEihUrnOpYuHAhu3fvdkh79913iY2NpV27dri7uzuVmTZtGqdOnbJfWywWRo4cic1ms+/DkZH+/ftjNpt54YUXuHLlitP96Oho/vzzzxvWA/DCCy9QoUIFtmzZQt++fYmMjHTKEx8fzyeffMLYsWMd2lC2bFm2bt1Kv379iI2NdShjNpsZNWoUy5YtIyQkhLfeeuuGbSlevDjLli1j7ty5t7zMyZWEhAQWLlyI0Whk+vTp6fZzhw4dMJvNmdrg093dnVGjRmGxWNI9hUZERCSraE8MERHJ0/7880+mTZtGcHAw1atXp3jx4gCcPHmS1atXEx8fT9WqVenTp89tPadOnTrMnDmTfv360atXLyZOnEiNGjXw9vbm6NGj/PLLL8THx9OpUyc++OADp/Lt27cnISGBwYMH0759e8qXL0+NGjUICAjgypUr/Pnnn+zevRt/f3+XwYDrDRgwAB8fHwYNGsTTTz/N/PnzqVOnTrr5Uzf0bNu2Lb6+vunm6969O6tWreLrr7+mbdu2Dvfq169PkyZNaN26NcHBwWzatImtW7dSokQJRowY4bK+qlWrUqtWLVq3bo2fnx8///wz+/fvp3Llypna9LFLly7s3r2bzz//nEqVKlG/fn3CwsKIiorin3/+YdOmTdSrV4/58+ffsC4fHx+WLFlCz549WbJkCatXr6Zu3bqEh4djs9k4ceIEv/32G5GRkQwfPtxeztfXl8WLF9O5c2cWLlzImjVraNiwISEhIVy6dIk1a9Zw6tQpSpQowcKFC9PdB+R6t3PkbnqWLVtGZGQkDRo0yHCJTffu3fniiy+YPXs2r7zyisMmr640b96cmjVrsnHjxqxusoiIiAMFMUREJE978cUXKVWqFGvXrmX//v2sXbuWuLg4AgMDqVq1Kq1ataJr166ZCgzcSMuWLalatSrTp0/nl19+Yd68eSQmJhIUFESzZs3o3r17hoGE7t27U79+fWbMmMHatWv59ttviY2NJX/+/Dz44IOMHj2abt26ZRhkuFbv3r3x8fGhf//+dOjQgdmzZ9OoUSOnfFarlTlz5tjbkJHGjRtTuHBhNm7cyN9//03JkiXt9/r370/z5s2ZNm0af//9N/ny5aNr166MGDGCAgUKuKzv/fffZ/ny5cyePZt//vmHggUL8sILLzBkyBA8PT0z9Z7jx4+nUaNGfPnll2zcuJErV67g7+9PSEgIzz77rFOwJSPBwcH88MMPrFixgsWLF7Nz505Wr16NwWAgJCSEpk2b0qlTJ2rXru1QrmjRoqxZs4YFCxawdOlSfv75ZyIjI+1998ILL9CzZ89MHcN6J6UuJblRP1esWJHKlSuzY8cO1q1bR7169W5Y95gxY6hXr95tLc0SERG5EUNkZKT+TyMiIiK3rF+/fnzzzTesWLGCWrVqZapM8+bN+f3339m9e7d9doyIiIjIjWhPDBERERERERHJFRTEEBEREREREZFcQUEMEREREREREckVtCeGiIiIiIiIiOQKmokhIiIiIiIiIrmCghgiIiIiIiIikisoiJHLHTlyJLubIFlI/Zl3qC/zFvVn3qM+zf3Uh3mL+jNvUX/mLTmtPxXEEBEREREREZFcQUEMEREREREREckVFMQQERERERERkVxBQQwRERERERERyRXcsrsBIiIiIiIi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MCGrmyciIiIiIiLZJCqDsWJu4uvr63BttVrp3r07L7zwglPeIkWKcPToUad0mw2nPTFSmc0Gh+trN//MKtcGaVKe4e50724tJ8mxe2KIiIiIiIiI5HTbt293GMD/8ccfFClSBD8/P5f5H374YQ4cOEB4eLjTj7e3N/fffz/u7u788ccf9jJRUbEcP34g3TY88EBFrFYru3b9hru7czAh9XQSi8WSbh33338/Hh4ebNmyxZ5msVj4888/KVOmTPof4C5TEENERERERETkFp07d44333yTI0eOEBERwaeffupylkWql156iR07dvDKK6/Yl5asXLmSl19+GUhZOtKtWzfefvtt1q5dy4EDB3jxxQFYrekHIEJDS1G37tNMmDCA1asjOHHiBJs2bWLBggX/fz8Ug8HAqlWr+O+//4iJiXGqw9fXl969e/P222+zevVqDh06xKuvvsrFixd59tlnb/MrZZ1sXU4iIiIiIiIikpu1a9cOq9VK/fr1MRgMdOvWLcMgRoUKFfjxxx8ZM2YMLVq0wGKxUKJECZo3b27P88477xAbG0vXrl3x9vamR4++XLwYZ79vNDrPthgy5HNmznyHESPe5PLlS4SEhNjbERISwpAhQxgzZgwDBw6kY8eOfPbZZ051pB6i0b9/f6KionjooYf45ptv7Pte5ASGyMjIu7NwRe6II0eOUKpUqexuhmQR9Wfeob7MW9SfeY/6NPdTH+Yt6s+85Vb6MyoqCn9//zvUojunefPmlCtX7o7u0WizwdGjRmJi0valCAy0Eh1tIDnZ4JT/4YctGLNwzUVCQgJeXl63VUdW9q+Wk4iIiIiIiIjkUP/8Y3AIYEDK5p0FCjjPR3Bzs2VpACMnyuOvJyIiIiIiIpI72Wxw5YrzbAt3dwgMdA5iGJyz5jnaE0NERERERETkFvzwww93tP6kJLDZXAUxbHh7O+e//rjVvEgzMURERERERERyoKQk5zSDwYavb8rvQUFWh3sFC1qdC+QxCmKIiIiIiIiI5EBJSc4zK0qUsOLhkfJ7cLAND4+UZSUGg83lPhl5jZaTiIiIiIiIiORA18/ECA62EhCQdu3mBmXKWImJAR8f7MGNvExBDBEREREREZEc6PoghqsghZsbDoGNvE7LSURERERERERyoOuXk6QuHbmXKYghIiIiIiIikgNlZibGvUZBDBEREREREZEcpGLFinzyySR7EKNjx/IsXPiJghgoiCEiIiIiIiKS41itACnLSaZNW0fbts9i/P8RfEBAABEREdnWtuykIIaIiIiIiIhIFki6fv3HbUhOTvs9IKAQfn4+WVZ3bqYghoiIiIiIiOQ4AQH+d/XnVjRv3pxXX32VYcOGUbJkSRo3bszBgwdp3749xYoV44EHHuCZZ57h/Pnz9jI7duygdevWhIeHExoaSpMmTdi2bZtT3SkzMVJ07Fie+fM/BVKWmgD06NGDgIAAKlasyMmTJwkMDGTnzp0OdcyaNYvw8PAsDa5kNwUxRERERERERP5ztDwAACAASURBVG7RokWLsNls/PTTT4wbN45mzZpRtmxZ1qxZw3fffUdMTAydO3fG+v9RiejoaDp06MBPP/3EmjVrqFixIu3atePy5csO9V4bxAAwGlNOJlm7di0An376KYcOHWLt2rUUL16cevXqMXfuXIcyc+fOpUOHDnjkoc00FMQQERERERERuUVhYWG8++67lC5dmp9//pkKFSowatQoypQpQ4UKFZg+fTrbt2+3z5KoU6cOHTt2pEyZMpQuXZrx48fj5eXFzz//7FCvcxAj5b8FCxYEwN/fn+DgYPt1jx49WLx4MQkJCQAcOnSIP/74g27dut3Bt7/7FMQQERERERERuUWVKlWy/7579242bdpE0aJF7T/ly5cH4Pjx4wBcvHiRl19+mUcffZSwsDCKFSvGxYsXOX36tEO91wcxTKaM29GsWTM8PDxYsWIFkDIL49FHH6VcuXK3+YY5i1t2N0BERERERETkepGRUdndhEzx9fW1/261WmnUqBFjxoxxyleoUCEA+vXrx4ULF3jvvfcICwvD09OTp556ymnfCqvV4HBtvMEUBHd3dzp27MjcuXNp3bo1Cxcu5K233rrFt8q5FMQQERERERERyQIPP/wwy5YtIzQ0FHd3d5d5tmzZwvvvv0/jxo0BuHDhgsPGn6ksFsfra4MY7u7uWK7PAHTv3p1q1aoxY8YMYmJiePrpp2/9ZXIoLScRERERERERyQLPPvssV69epVevXvz555+cOHGCdevW8dJLLxEdHQ1AyZIlWbRoEQcPHmTHjh307t3b5cabGS0nCQsLY/369Zw/f57IyEh7eqlSpahevTojRozgqaeews/P7468Z3ZSEENEREREREQkCxQpUoRVq1Zh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VOSvRUSksJ05A3feGcqWLT74+hrM//IsbW7K/TGJidlPJzF8fXHWqFFYpYqIiIiIFIpiDTFuvPFGEhIScjxvsVgYO3YsY8eOzbFPWFgYs2fPLozyRESKhdMJs2b5s2mjD33aHqRjv1IY/gGMGhXEli0+ANjtFib03MbN78Zh79o1x2vlNJ3EWbs2+PkV3osQERERESkEHrsmhojIleq55wIZNy6I+V/7c/eoaOLq9uPDV07z9df+pn6/OK9n5GALR3ecyfFayck5hBhaD0NERERESiCFGCIiHmTFCl9eey3AdezAl/sTJvPkhErZ9n/Pfi+3tjQwlv4v2/NJSebjc9NJHNqZRERERERKIIUYIiIe5NlnA93aNnMdac6AbHpnOkA0m/u+hs+vv7qdy3E6iRb1FBEREZESSCGGiEgxSkvL2kHk77+tbNvmc0nXOUA1/L77zq09pxBD26uKiIiISEmkEENEpBisXetDt65BVK5UiipVynBTzVOMuS3uoo/rz/u8T3+39oNUxbJ/v1t7QoL77iSG1Zq5sKeIiIiISAlTrLuTiIhciebM8Wf06EAcjqyA4fdTNYDctzytw05m8gChJHOYSoxhouvcQapi3bfE1D85GZYuNf+Yr8RhnNWrQ6D7tBUREREREU+nEENEpAj99psPTzwRiGFYLtp3J3VYcstEVhxuSJnEeCY5nyD0UObck9r+B8CW1fcgVbH+OxLjzBnYssWH337zISEha8BdOU5yC//DWbddgb4mEREREZGiohBDRKQIffqpX54CjDb8SEzAAe5742oGRVQAKgArOHv8ONbduymXWA/uyup/kKpYT58mflsinftVZv9+99mC9/M2waSS1rRpwb0gEREREZEipDUxRESK0Lp15ux4DLEc8Ytidu9v6db8AJVCz9A44E9eL/8MqTNmYEREmPob4eE4WrakSsOypvZ4onBi4YGRIdkGGFYcPMBMAGy9ehXwqxIRERERKRoaiSEiUkQSE+HPP80Bw2O8SqmBPej9yg30drVWBWMBGZacR2yEhxv4+RlkZGT2OU05XuEJfvytbLb9m7OeqsRjv/56jOjoAng1IiIiIiJFTyMxRESKwLp1PlStWganMyuYqMsOKnASe/v27g/IJcAAsFqhUiXD1Hb+Qp8X6sgyAGz9+uWjahERERERz6IQQ0SkkO3YYaVXrxC3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iIhIiaAQQ0RERERERERKBIUYIiIiIiIiIlIiKMQQERERERERkRJBIYaIiIiIiIiIlAgKMURERERERESkRFCIISIiIiIiIiIlgkIMERERERERESkRFGKIiIiIiIiISIlgSUhIMIq7CBERERERERGRi9FIDBEREREREREpERRiiIiIiIiIiEiJoBBDREREREREREoEhRgiIiIiIiIiUiIoxBARERERERGREkEhhoiIiIiIiIiUCAoxCtiUKVO46aabqFq1KrVq1aJPnz5s27bN1McwDGJjY6lXrx6RkZF07tyZ7du3u87v37+fkSNH0qhRIyIjI2nUqBHPP/88qamppuscPHiQPn36ULlyZWrWrMmTTz6JzWa7aI0LFiygRYsWVKxYkRYtWrBo0SLT+YULF9KjRw9q1apFWFgYP//882W8IyWbN9zP840aNYqwsDBmzJiRz3ei5POGexkWFpbtn8cff/wy3pmSydPv5/bt2+nfvz+NGjUiLCyM2NjYbPvNmTOHhg0bEhERQdu2bfnll18u8R0p+Yryno4ePZp27doRERFBgwYN8lzj6tWradu2LRERETRq1Ih33nnHdH7NmjX07duXq666irCwMD7++ONLeCdKLm+4hxe+nrCwMJ544ok8X9+beMP9bNCgQbb/bvbu3fsS3pGSzdPv55EjRxgyZAjNmjWjXLlyDB8+PNt++fl/rzcrqvu5detWBg8ezNVXX01kZCRNmzZl+vTpOJ3Oi9ZYmP9mKsQoYKtXr2bw4MEsW7aMhQsX4uvrS7du3Th9+rSrz/Tp05k5cyYTJ05k5cqVhIeH0717dxITEwGIi4vD4XAwZcoUfv31VyZNmsRnn33GmDFjXNdwOBz06dOHpKQklixZwty5c1m4cCHjxo3Ltb7169dz3333cdddd/Hzzz9z1113MXDgQDZu3Ojqk5KSQvPmzXnppZcK+N0pebzhfp6zYMECNm3aRKVKlQro3SlZvOFe7ty50/Tns88+A6Bbt24F+VaVCJ5+P1NTU6lWrRr//e9/iY6OzrbP/PnzGTNmDI899hg//fQTzZs356677uLgwYMF8A6VPEV1TwGcTif9+vWjb9++ea5v37599O7dm+bNm/PTTz/x6KOP8uT/t3e3QVGV/xvAL4R4SEHlUVQeLURIQ0lSETV8QSTCjILIMANpZhMMaoU/FzNh0gQE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","text/plain":["
"]},"metadata":{},"output_type":"display_data"}],"source":["plt.figure(figsize=(16,6))\n","# đưa lên biểu đồ \n","plt.plot(date_test[30:], test_1[30:], color='r')\n","plt.plot(date_test[30:], test_2[30:], color='b')\n","plt.title(f\"STOCK {companyName} COMPANY\")\n","plt.xlabel(\"Date\")\n","plt.ylabel(\"Price\")\n","plt.legend(('prediction', 'reality'),loc='upper right')\n","plt.show()"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":1104,"status":"ok","timestamp":1640876869050,"user":{"displayName":"0542_Võ Thương Trường Nhơn","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"10797139682346268390"},"user_tz":-420},"id":"Mj5xyw6Xq1ps","outputId":"e72b70e4-1243-4157-bce9-d619baaa8068"},"outputs":[{"name":"stdout","output_type":"stream","text":["Evaluate on test data\n","5/5 [==============================] - 1s 11ms/step - loss: 7.4576e-04\n","\n","\n","test loss, test acc: 0.0007457574247382581 0.9992542425752617\n","Giá dư doán của ngày hôm qua: [[162.3875]]\n"]}],"source":["test_output = model.predict(x_test) \n","print(\"Evaluate on test data\") \n","results = model.evaluate(x_test, y_test, batch_size=128) \n","print('\\n')\n","print(\"test loss, test acc:\", results,1-results)\n","print('Giá dư doán của ngày hôm qua: '+str(test_1[-1:]))"]}],"metadata":{"accelerator":"GPU","colab":{"collapsed_sections":[],"name":"code_stock_lstm_train_final.ipynb","provenance":[{"file_id":"1f60XZJdcxpZFHYP8RjFd8DQv5HlCne6A","timestamp":1640246501386},{"file_id":"14eJaC70ghBQ3UEPE4CuqennlyPhHvrgX","timestamp":1640187837537},{"file_id":"1s4IeiKxNLrTp9Tx_yQWtFQMYtr1kKURB","timestamp":1640181985808}]},"kernelspec":{"display_name":"Python 3","name":"python3"},"language_info":{"name":"python"}},"nbformat":4,"nbformat_minor":0} 2 | --------------------------------------------------------------------------------