如何使用我的日期时间进行预测(随机森林模型)

Posted

技术标签:

【中文标题】如何使用我的日期时间进行预测(随机森林模型)【英文标题】:how to make predictions using my date time (Random forest model) 【发布时间】:2020-08-27 15:38:22 【问题描述】:

我制作了这个随机森林模型来预测股票市场日是上涨日还是下跌日。 我的目标是通过传递这样的日期时间来获得 1 代表上升天数和 0 代表下降天数

2020-05-12 00:00:00-04:00 我在想它可以与这行代码一起使用,但显然我不理解某些东西,因为它不起作用 rf_random.predict(2020-05-12 00:00:00-04:00)


这是我的数据框


time                         close  high   low    open   volume    c_in_p   down_days up_days RSI

2016-06-27 00:00:00-04:00    57.61  58.76  57.05  58.76  31954614  -1.97    1.97      0.00    19.832891
2016-06-28 00:00:00-04:00    59.50  59.55  58.26  59.19  24884353   1.89    0.00      1.89    35.990316
2016-06-29 00:00:00-04:00    61.20  61.21  60.00  60.33  18107419   1.70    0.00      1.70    47.063366

这是我的模型的代码


# New Random Forest Classifier to house optimal parameters
rf = RandomForestClassifier()

# Specfiy the details of our Randomized Search
rf_random = RandomizedSearchCV(estimator = rf, param_distributions = random_grid, n_iter = 100, cv = 5, verbose=5, random_state=42, n_jobs = -1)

# Fit the random search model
rf_random.fit(X_train, y_train)


Fitting 5 folds for each of 100 candidates, totalling 500 fits
[Parallel(n_jobs=-1)]: Using backend LokyBackend with 2 concurrent workers.
[Parallel(n_jobs=-1)]: Done  14 tasks      | elapsed:   25.4s
[Parallel(n_jobs=-1)]: Done  68 tasks      | elapsed:  1.5min
[Parallel(n_jobs=-1)]: Done 158 tasks      | elapsed:  3.7min
[Parallel(n_jobs=-1)]: Done 284 tasks      | elapsed:  8.2min
[Parallel(n_jobs=-1)]: Done 446 tasks      | elapsed: 12.6min
[Parallel(n_jobs=-1)]: Done 500 out of 500 | elapsed: 14.3min finished
RandomizedSearchCV(cv=5, error_score=nan,
                   estimator=RandomForestClassifier(bootstrap=True,
                                                    ccp_alpha=0.0,
                                                    class_weight=None,
                                                    criterion='gini',
                                                    max_depth=None,
                                                    max_features='auto',
                                                    max_leaf_nodes=None,
                                                    max_samples=None,
                                                    min_impurity_decrease=0.0,
                                                    min_impurity_split=None,
                                                    min_samples_leaf=1,
                                                    min_samples_split=2,
                                                    min_weight_fraction_leaf=0.0,
                                                    n_estimators=100,
                                                    n_jobs...
                   param_distributions='bootstrap': [True, False],
                                        'max_depth': [10, 20, 30, 40, 50, 60,
                                                      70, 80, 90, 100, None],
                                        'max_features': ['auto', 'sqrt', None,
                                                         'log2'],
                                        'min_samples_leaf': [1, 2, 7, 12, 14,
                                                             16, 20],
                                        'min_samples_split': [2, 5, 10, 20, 30,
                                                              40],
                                        'n_estimators': [200, 400, 600, 800,
                                                         1000, 1200, 1400, 1600,
                                                         1800],
                   pre_dispatch='2*n_jobs', random_state=42, refit=True,
                   return_train_score=False, scoring=None, verbose=5)

'''
    ACCURACY
'''
# Once the predictions have been made, then grab the accuracy score.
print('Correct Prediction (%): ', accuracy_score(y_test, rf_random.predict(X_test), normalize = True) * 100.0)


'''
    CLASSIFICATION REPORT
'''
# Define the traget names
target_names = ['Down Day', 'Up Day']

# Build a classifcation report
report = classification_report(y_true = y_test, y_pred = y_pred, target_names = target_names, output_dict = True)

# Add it to a data frame, transpose it for readability.
report_df = pd.DataFrame(report).transpose()
display(report_df)
print('\n')

'''
    FEATURE IMPORTANCE
'''
# Calculate feature importance and store in pandas series
feature_imp = pd.Series(rand_frst_clf.feature_importances_, index=X_Cols.columns).sort_values(ascending=False)
display(feature_imp)


Correct Prediction (%):  66.80327868852459
               precision    recall      f1-score    support

Down Day       0.623932     0.629310    0.626609    116.000000
Up Day         0.661417     0.656250    0.658824    128.000000
accuracy       0.643443     0.643443    0.643443    0.643443
macro avg      0.642674     0.642780    0.642716    244.000000
weighted avg    0.643596    0.643443    0.643509    244.000000


MACD                    0.213449
k_percent               0.183975
r_percent               0.181395
Price_Rate_Of_Change    0.156800
RSI                     0.150577
On Balance Volume       0.113804
dtype: float64

rf_random.best_estimator_

RandomForestClassifier(bootstrap=True, ccp_alpha=0.0, class_weight=None,
                       criterion='gini', max_depth=20, max_features=None,
                       max_leaf_nodes=None, max_samples=None,
                       min_impurity_decrease=0.0, min_impurity_split=None,
                       min_samples_leaf=12, min_samples_split=2,
                       min_weight_fraction_leaf=0.0, n_estimators=800,
                       n_jobs=None, oob_score=False, random_state=None,
                       verbose=0, warm_start=False)

在这里我想询问我的预测,但它不起作用

rf_random.predict(2020-05-12 00:00:00-04:00)

  File "<ipython-input-51-788cba99b288>", line 1
    rf_random.predict(2020-05-12 00:00:00-04:00)
                            ^
SyntaxError: invalid token

【问题讨论】:

你需要在引号之间加上日期rf_random.predict('2020-05-12 00:00:00-04:00') 您的 X_train 和 y_train 数据集是什么?列的形状和数量? 【参考方案1】:

那么为什么rf_random.predict("2020-05-12 00:00:00-04:00") 不工作呢?该模型实际上并没有从日期中学习。您的模型需要收盘价、最高价、最低价、开盘价、成交量、c_in_p、down_days、up_days 和 RSI 值来进行预测。格式必须与X_train 相同。

我知道消极总是很容易,但记录一下几个大问题:

    您正在使用未来通过随机 CV 分区来预测过去 一个有用的模型必须评估它在未来的表现 数据集是等距序列,因此您可以使用时间序列方法来使用基于日历的事件来改进预测。这解决了您需要知道明天的收盘价/最高价/最低价/成交量才能预测明天上涨还是下跌的问题。 您正在预测具有很多难以解释的波动性的事物,因此对于任何机器学习模型来说,它都是一个糟糕的学习用例。如果我制作的模型能够真正准确地预测明天市场的涨跌,我会成为亿万富翁!

【讨论】:

比你非常想研究时间序列以希望解决这个问题,我知道这是一个巨大的问题,但我很享受挑战,并从中学到更多东西

以上是关于如何使用我的日期时间进行预测(随机森林模型)的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 Android 上使用随机森林模型进行预测?

保存的随机森林模型在同一数据集上产生不同的结果

如何使用随机森林训练和预测模型?

使用交叉验证时如何使用测试数据集进行预测?

从随机森林模型中提取树的子集进行预测

随机森林预测