示例#1
0
def run_prediction(params: PredictParams):
    try:
        date_range = pd.date_range(parser.parse(params.end_date) +
                                   datetime.timedelta(days=1),
                                   params.forecast_date,
                                   freq=params.offset.value)

        model = getattr(source.back.models,
                        params.model.value).Model(params.params)
        model.load(params)

        res_y = model.train_and_predict(len(date_range))
        res_index = list(date_range)

        if params.upload:
            real_df = make_df(params.uploaded_data, params.start_date,
                              params.forecast_date)
        else:
            real_df = DataProcess.load_data_from_moex(params.ticker,
                                                      params.start_date,
                                                      params.forecast_date,
                                                      params.offset.value)
    except:
        print(traceback.format_exc())
        return PredictionData(status=cfg.Status.fail,
                              data=cfg.PREDICTION_FAILED)

    return PredictionData(data={
        "X": list(dates_from_array(real_df.index)),
        "Y": list(real_df[params.ticker]),
        "PredictedX": list(dates_from_array(res_index)),
        "PredictedY": list(res_y)
    },
                          status=cfg.Status.ready)
示例#2
0
 def load(self, params: PredictParams):
     if params.upload:
         loaded_df = make_df(params.uploaded_data, params.start_date, params.end_date)
     else:
         loaded_df = DataProcess.load_data_from_moex(params.ticker, params.start_date, params.end_date,
                                                     params.offset.value, self.exogenous_variables)
     self.df = DataProcess.get_prepared_data_frame(loaded_df, predict_day=0)
示例#3
0
 def load(self, params: PredictParams):
     if params.upload:
         loaded_df = make_df(params.uploaded_data, params.start_date,
                             params.end_date)
     else:
         loaded_df = DataProcess.load_data_from_moex(
             params.ticker, params.start_date, params.end_date,
             params.offset.value)
     self.df = loaded_df[loaded_df.columns[0]].reset_index(drop=True)
示例#4
0
def run_cross_validation(params: PredictParams):
    avg_mse = 0
    avg_mape = 0

    try:
        if params.upload:
            loaded_df = make_df(params.uploaded_data, params.start_date,
                                params.end_date)
        else:
            loaded_df = DataProcess.load_data_from_moex(
                params.ticker, params.start_date, params.end_date,
                params.offset.value,
                params.params.get('exogenous_variables', []))

        mse = []
        mape = []
        for i in tqdm(
                range(
                    0, loaded_df.shape[0] - params.cv_period -
                    params.cv_predict_days, params.cv_shift)):
            model = getattr(source.back.models,
                            params.model.value).Model(params.params)
            local_params = copy.deepcopy(params)
            local_params.start_date, local_params.end_date = loaded_df.index[
                i], loaded_df.index[i + params.cv_period - 1]
            local_params.upload, local_params.uploaded_data = params.upload, params.uploaded_data
            model.load(local_params)

            res = [[], []]
            res[0] = model.train_and_predict(params.cv_predict_days)
            res[1] = list(
                loaded_df.iloc[i + params.cv_period:i + params.cv_period +
                               params.cv_predict_days, 0])

            mse.append(metrics.mean_squared_error(res[1], res[0]))
            mape.append(metrics.mean_absolute_percentage_error(res[1], res[0]))

            if mse[-1] > 18000:
                print(
                    mse[-1], loaded_df.index[i],
                    loaded_df.index[i + params.cv_period - 1],
                    loaded_df.index[i + params.cv_period +
                                    params.cv_predict_days - 1])

            avg_mse = sum(mse) / len(mse)
            avg_mape = sum(mape) / len(mape)
    except:
        print(traceback.format_exc())
        return PredictionData(status=cfg.Status.fail,
                              data=cfg.CROSS_VALIDATION_FAILED)

    return PredictionData(data={
        "mse": avg_mse,
        "mape": avg_mape
    },
                          status=cfg.Status.ready)