Ֆոնդային շուկան բորսաների բազմազանություն է, որտեղ վաճառվող ընկերությունների բաժնետոմսերը կարելի է գնել և վաճառել: Նման ֆինանսական գործարքներն իրականացվում են ինստիտուցիոնալացված պաշտոնական փոխանակումների միջոցով [1]:

Փորձելով կատարելագործել իմ հմտությունները ոլորտում՝ կատարելով անձնական նախագծեր, ես աշխատեցի ժամանակային շարքերի տվյալների կանխատեսման խնդրի վրա՝ օգտագործելով Tesla ֆոնդային շուկայի արժեքները:

Ընդհանուր առմամբ LSTM և այլ պարբերական նեյրոնային ցանցեր օգտագործվում են ժամանակային շարքերի տվյալների համար: Բայց ես ուզում էի պատասխանել կոնկրետ այս հարցին. Կարո՞ղ են ավելի պարզ մոդելները լավ արդյունքներ ապահովել: Արդյո՞ք անհրաժեշտ է կիրառել խորը ուսուցման ճարտարապետություններ:

Եթե ​​դուք տվյալների գիտության սկսնակ եք, ինչպիսին ես եմ, ապա սա նախագիծ է ձեզ համար: Եթե ​​ձեր նպատակն է կեղտոտել ձեր ձեռքերը, լուծեք իրական խնդիրները: Աշխատեք ձեր սեփական նախագծերի վրա, ապա դա ձեզ օգտակար կլինի:

Այս նախագծի ավելի լավ հասկանալու հիմնական նախադրյալներն են.

  • Տվյալների գիտության և մեքենայական ուսուցման տեսությունների հիմնական գիտելիքներ:
  • Ծանոթություն python-ին և նրա EDA (հետախուզական տվյալների վերլուծություն) գրադարաններին, ինչպիսիք են Pandas, Numpy և Matplotlib:
  • Տվյալների մոդելավորման համար Scikit-Learn-ի էական գործառույթների ըմբռնում

Այս մոտեցման նպատակն է կանխատեսել բաժնետոմսի ապագա փակման արժեքը ապագայում որոշակի ժամանակահատվածում: Այս նախագծի համար ես օգտագործեցի մի շարք ML մոդելներ՝ որոշելու համար, թե որն է ամենաշատը սովորել տվյալներից:

Սրանք այն քայլերն են, որոնք նկարագրում են կանխատեսման խողովակաշարը.

Տվյալների հավաքածուի ներմուծում և ամսաթվի սյունակի փոխարկում

Առաջին հերթին ներմուծեք անհրաժեշտ python գրադարանները տվյալների վիճաբանության համար։ Դրանից հետո օգտագործեք նրանց գործառույթների մեծ ցանկը՝ գործընթացն ավելի արագ և արդյունավետ դարձնելու համար:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import sklearn
import seaborn as sn

Օգտագործված Տվյալների հավաքածուն ընկերության՝ Tesla-ի ֆոնդային շուկան է 2010 թվականից մինչև 2019 թվականը: Տվյալները շահարկելու լավագույն միջոցը CSV ֆայլը պանդաների տվյալների շրջանակում վերբեռնելն է: Dataframes-ը տվյալների վերլուծության հզոր գործիք է: Նրանք տրամադրում են տվյալների ներկայացման չափազանց պարզեցված ձև՝ առաջարկելու բազմաթիվ հնարավորություններով: Ամսաթիվ սյունակը փոխարկվել է DateTime ձևաչափի՝ կանխատեսումները հեշտությամբ կատարելու համար:

df = pd.read_csv("data/tesla.csv", low_memory = False, parse_dates=["Date"], infer_datetime_format=True)

Հետախուզական տվյալների վերլուծություն (EDA)

ML մոդելներին անհրաժեշտ է տվյալների աղբյուր, որը չունի բացակայող կամ թվային արժեքներ: Դասընթացի փուլից առաջ կարևոր է ստուգել որևէ բացակայող կամ կատեգորիկ արժեք:

# Checking for missing data
df.isna().sum()
# Checking for non-numerical data
df.dtypes

Հիմնական տվյալների վիզուալիզացիայի գծապատկերներ

Հազարավոր տողեր պարունակող տվյալների շրջանակի ընթերցումը կարող է բավականին դժվար լինել: Էլ ուր մնաց դրանից պատկերացումներ կորզելը: Տվյալների վիզուալիզացիան կարևոր է տվյալների միտումները բացահայտելու և տվյալների վերաբերյալ պատկերացում կազմելու համար:

Այս նոթատետրում ստեղծվել են երկու տարբեր սյուժեներ։ Առաջին գծապատկերում դուք կարող եք համեմատել ամենաբարձր, ամենացածր, բացման և փակման արժեքների տարբեր արժեքները՝ արտաքին եզրեր փնտրելու համար: Երկրորդ գծապատկերը մոմակալ է, որը ցույց է տալիս յուրաքանչյուր սյունակի գծայինության արժեքները:

# Data visualization
sns.set_theme(style= "whitegrid")
fig, ax = plt.subplots(figsize = (20,10))
ax.plot(df.Date, df.Close, color = 'green', label = "Closing Value");
ax.plot(df.Date, df.Open,  color='red', label = "Opening Value");
ax.plot(df.Date, df.High, color='blue', label="Highest Value");
ax.plot(df.Date, df.Low, color='yellow', label="Lowest Value");
ax.legend(loc='upper left' ,frameon=False);

# Candlestick plot 
df[["Open","Close","High","Adj Close"]].plot(kind="box",color ="red");

Տվյալների հարմարեցում

Ամսաթիվ ժամի պարամետրերի ավելացում

DateTime հատկանիշների արդյունահանումը կարևոր է ժամանակային շարքերի նախագծերում: Մտածեք դրա մասին, դրանք արժեքավոր տեղեկատվության հարուստ աղբյուր են և կարող են ձեզ որոշակի խորը պատկերացումներ տալ ձեռքի տակ եղած տվյալների վերաբերյալ: Դրանք կարևոր են, քանի որ դրանք ճկունություն են հաղորդում հատկանիշի ինժեներական քայլերին: Ավելացված հատկանիշներն են՝ տարին, ամիսը, օրը, տարվա օրը, շաբաթվա օրը և տարվա շաբաթը:

# Sorting the data frame by Date 
df2.sort_values(by=["Date"],inplace=True,ascending=True)
df2.head()
#Creating a function to add Datetime parameters for a better prediction
def add_date_params(df,Date):
    """
    Adding different Date time parameters for the time series DataFrame
    """
    df["Year"] = df.Date.dt.year
    df["Month"] = df.Date.dt.month
    df["Day"] = df.Date.dt.day
    df["Day_Of_Year"] = df.Date.dt.dayofyear
    df["Week_Of_Year"] = df.Date.dt.isocalendar().week.astype(np.int64)
    # The day of the week with Monday=0 to Sunday=6
    df["Day_Of_Week"] = df.Date.dt.dayofweek
    df.drop("Date",axis=1,inplace=True)
    return df
  • Կրկնօրինակների որոնում

Սա գործառույթ է, որը կարող եք օգտագործել կրկնօրինակները հեռացնելու համար: Այսպիսով, ավելորդ և ավելորդ սյունակներ և արժեքներ: Նրանք կարող են շփոթել մոդելը, և այն կհամապատասխանի վերապատրաստման տվյալների վրա:

# A function to search for duplicates in any pandas DataFrame
def getDuplicateColumns(df):
    '''
    Get a list of duplicate columns 
    '''
    duplicateColumnNames = set()
    # Iterate over all the columns in dataframe
    for x in range(df.shape[1]):
        # Select column at index 'x'.
        col = df.iloc[:, x]
        # Iterate over all the columns in DataFrame from index (x+1) till the last column
        for y in range(x + 1, df.shape[1]):
            otherCol = df.iloc[:, y]
            # test if the two selected columns are equal
            if col.equals(otherCol):
                duplicateColumnNames.add(df.columns.values[y])
    return list(duplicateColumnNames)
  • Ստացված DataFrame-ը

Պատկերացրեք տվյալների շրջանակը՝ ստուգելու, թե արդյոք ճիշտ եք կատարել նախորդ քայլերը:

Կոռելացիոն մատրիցա

Հարաբերակցության մատրիցը ցույց է տալիս տվյալների շրջանակի հատկանիշների հարաբերակցությունը: Այն ձեզ տալիս է հարաբերակցություն մատրիցայի բոլոր հնարավոր զույգ արժեքների միջև: Այն կարող է օգնել ձեզ բացահայտել օրինաչափությունները և դրանց համաձայն որոշում կայացնել:

Այնուհետև պատկերացրեք այն Seaborn ջերմային քարտեզում: Ջերմային քարտեզները ապահովում են ստացված արժեքների ավելի հստակ և լավ պատկերացում:

# Creating a correlation matrix of the DataFrame
correlation_matrix = df2.corr()
correlation_matrix
# Visualizing the Correlation Matrix in a Seaborn heatmap
plt.style.use('fivethirtyeight')
fig,ax = plt.subplots(figsize = (15,10))
ax = sns.heatmap(correlation_matrix,annot=True,cmap="YlGnBu",vmin=-1, vmax=1)
ax.set_title("Correlation HeatMap", fontsize=20);

Մոդելավորում

Այս բաժնում նպատակն է կանխատեսել 2019 թվականի ֆոնդային շուկայի արժեքները: Կանխատեսումը հիմնված է Տվյալների հավաքածուի նախորդ տարիների արժեքների վրա՝ օգտագործելով առաջարկվող մոդելները:

Տվյալների բաժանում

Նպատակը 2019 թվականի փակման արժեքները կանխատեսելն է: Դրա համար անհրաժեշտ է դրանք առանձնացնել տվյալների հավաքածուի մնացած մասից: Այսպիսով, անհրաժեշտ է տվյալների բաժանման փուլ, տվյալները բաժանեք ուսուցման հավաքածուի, որը պարունակում է բոլոր տվյալները՝ հանած 2019 թվականը, և թեստային հավաքածու՝ 2019 թվականի արժեքներով: Գնացքներից և թեստային հավաքածուներից յուրաքանչյուրը բաժանված էր հատկանիշների (մուտքագրումների) և պիտակներ (ելքեր):

# Splitting the Data into training and test sets
test_set = df2[df2.Year == 2019]
train_set = df2[df2.Year !=2019]
# Split data into X (features) and y (labels) 
X_train, y_train = train_set.drop("Close",axis=1), train_set.Close
X_test, y_test = test_set.drop("Close",axis=1), test_set.Close

X_train.shape, y_train.shape, X_test.shape, y_test.shape

Մոդելների ուսուցում

Մի քանի ML մոդելների համեմատության նախընտրելի պրակտիկան դրանք python բառարանում տեղադրելն է: Սա օգնում է ձեզ խուսափել նույն կոդը կրկնելուց: Դուք կարող եք օգտագործել baseline_models ֆունկցիան: Որպես պարամետրեր այն վերցնում է համապատասխան գնացքները և թեստային հավաքածուները և մոդելները: Այնուհետև դրանք կիրառեք ընտրված մոդելների վրա՝ մարզվելու և դրանցից յուրաքանչյուրը գնահատելու ֆոնդային շուկայի արժեքներով:

models = {
           'RF': RandomForestRegressor(),
           'KNN': KNeighborsRegressor(),
           'Linear regression': LinearRegression(),
           'SVM Regressor': SVR(),
           'ADABOOST Regressor': AdaBoostRegressor(),
           'XGB': XGBRegressor(),
           'CatBoost': CatBoostRegressor(),
           'BayesianRidge': linear_model.BayesianRidge()
    }
# Creating a function to test several baseline methods at the same time
def baseline_models (models,X_train,y_train,X_test,y_test):
   
    results = {}
    for modelname, model in models.items():
        model.fit(X_train, y_train)
        # The metric used is r^2 
        results[modelname] = model.score(X_test, y_test) 
    
    return results

Մոդելների արդյունքների պատկերացում

Նախորդ գործառույթով ստացված արդյունքները ավելի լավ հասկանալու համար: Դուք կարող եք օգտագործել գծապատկեր, որպեսզի պատկերացնեք ստացված միավորները յուրաքանչյուր մոդելի համար առանձին:

Հաջորդ հատվածի համար ընտրեք լավագույն 2 մոդելները՝ հիմնվելով բազային ուսուցման արդյունքների վրա՝ ավելի շատ թյունինգի համար:

Հիպերպարամետրի կարգավորում (RandomizedSearchCV-ով)

Մոդելի լռելյայն պարամետրերը չեն տրամադրի լավագույն ուսուցման և կանխատեսման տեմպերը: Այսպիսով, հիպերպարամետրային թյունինգը շատ կարևոր քայլ է ցանկացած մոդելի արդյունքները բարելավելու համար: Ընդհանուր պրակտիկա է պատահական որոնումը յուրաքանչյուր պարամետրի համար ֆիքսված արժեքների շարքից: Այնուհետև այն համատեղեք խաչաձև վավերացման հետ՝ ավելի ճիշտ արդյունքների համար:

Յուրաքանչյուր մոդելի համար առաջարկվող արժեքները վերախմբավորելու համար օգտագործեք python բառարան: Ստեղծեք նոր մոդելը նրանց հետ՝ օգտագործելով RandomizedSearchCV (param_distributions պարամետրը):

  • Hyperparameter թյունինգ CatBoost մոդելի համար
CatB_grid = {"depth": np.arange(4,12,2),
             "learning_rate": np.arange(0.01,1,0.01),
             "iterations" : np.arange(20,100,10)
            }
# Instantiate The CatBoost model with RandomizedSearchCV
CatB_model = RandomizedSearchCV(CatBoostRegressor(),
                                random_state=19,
                                n_jobs = -1,
                                param_distributions = CatB_grid,
                                n_iter = 100,
                                cv=5,
                                verbose = True)
# Fit the RandomizedSearchCV model
CatB_model.fit(X_train,y_train)
  • Հիպերպարամետրի կարգավորում RandomForestRegressor-ի համար
random_forest_grid ={ "n_estimators" : np.arange(10,100,10),
          "max_depth" : [None,3,5,10],
          "min_samples_split" : np.arange(2,20,2),
          "min_samples_leaf" : np.arange(1,20,2),
          "max_features" : [0.5,1, "sqrt" , "auto"],
          }
Random_forest_model = RandomizedSearchCV(RandomForestRegressor(),
                                random_state=19,
                                n_jobs = -1,
                                param_distributions = random_forest_grid,
                                n_iter = 100,
                                cv=5,
                                verbose = True)
# Fit the RandomizedSearchCV model
Random_forest_model.fit(X_train,y_train)

Մոդելների կատարողականի գնահատում

Նախորդ քայլից արդյունահանված լավագույն պարամետրերը կրկին օգտագործվում են տվյալների ուսուցման և փորձարկման համար: Այս անգամ ավելի շատ գնահատման չափումներ կգործեն:

RMSLE-ը նախապես սահմանված ֆունկցիա չէ scikit-learn գրադարանում: Դուք կարող եք ստեղծել ձեր համապատասխան python ֆունկցիան, որը կոչվում է այն հաշվարկելու համար, երբ անհրաժեշտ լինի: Այնուհետև կարող եք օգտագործել RMSLE-ը, ի լրումն այլ չափումների, ինչպիսիք են MAE, MSE, R², RMSE և MSLE գնահատման համար: Evaluating_reg_models ֆունկցիան թույլ է տալիս օգտագործել դրանք բոլորը միասին:

# Creating an evaluation function for RMSLE
def RMSLE(y_test,y_predicted):
    """
    Calculates the RMSLE (Root Mean Squared Log Error) between model predictions and true values.
    """
    return np.sqrt(mean_squared_log_error(y_test,y_predicted))
# Creating a function with several evaluation metrics
def evaluating_reg_models(model):
    test_preds = model.predict(X_test)
    scores = {"MAE" : mean_absolute_error(y_test,test_preds),
             "RMSLE" : RMSLE(y_test,test_preds),
             "MSE" : mean_squared_error(y_test,test_preds),
             "R^2" : r2_score(y_test,test_preds),
             "RMSE": mean_squared_error(y_test,test_preds,squared=False),
             "MSLE": mean_squared_log_error(y_test,test_preds)}
    return scores
evaluating_reg_models(CatBoost_best_model)
evaluating_reg_models(Random_forest_best_model)

Հետևյալ աղյուսակը ցույց է տալիս 2 մոդելների արդյունքները՝ հիմնված մի քանի չափումների վրա: Արդյունքները ցույց են տալիս, որ RandomForestRegressor մոդելն ավելի լավ է գործել Tesla-ի պաշարների տվյալների վրա:

Առաջարկվող մոտեցման ավելի լավ հասկանալու համար կարող եք գտնել ամբողջական կոդը իմ Github ռեպո-ում: Դուք կգտնեք այլ առաջարկվող քայլեր, ինչպիսիք են հատկանիշի կարևորությունը:

Ի՞նչ է հաջորդը:

Հաջորդ քայլերը, որոնք դուք կարող եք դիտարկել, հետևյալն են.

  • Կիրառելով GridsearchCV մոդելներին՝ ավելի լավ թյունինգի համար:
  • Համեմատելով մեր մոդելներից ստացված արդյունքները խորը ուսուցման մոդելների հետ, ինչպիսիք են LSTM-ը կամ այլ RNN մոդելները:
  • Ոչ այնքան կարևոր հատկությունների հեռացումը և մոդելների վերապատրաստումը կարող է շատ լավ փորձ լինել:

Գրողի մասին

Սանա Զորգուին տվյալների ձգտող գիտնական է: Միշտ անհամբեր սպասում եմ ոլորտում սովորելու և ավելին աճելուն: Խնդրում եմ կապվեք ինձ հետ LinkedIn-ում, եթե ցանկանում եք ավելին իմանալ իմ մասին կամ զրուցել:

Հաղորդագրություն InsiderFinance-ից

Շնորհակալություն մեր համայնքի մի մասը լինելու համար: Նախքան գնալը.