{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\n# import alphalens\n# from factor_analyzer import FactorAnalyzer\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom sklearn.model_selection import cross_val_score\nimport os\nfrom sklearn.base import BaseEstimator, TransformerMixin, RegressorMixin, clone\nfrom sklearn.linear_model import LinearRegression, Ridge, Lasso, ElasticNet, SGDRegressor, BayesianRidge\nfrom sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor, \\\n    ExtraTreesRegressor, AdaBoostRegressor, VotingRegressor\nfrom sklearn.tree import DecisionTreeRegressor\nfrom sklearn.neighbors import KNeighborsRegressor\nfrom sklearn.svm import SVR, LinearSVR\nfrom sklearn.preprocessing import PolynomialFeatures\nfrom xgboost import XGBRegressor\nfrom lightgbm import LGBMRegressor\nfrom catboost import CatBoostRegressor\nimport xgboost as xgb\nfrom tqdm import tqdm\nimport warnings\nwarnings.filterwarnings(\"ignore\")","metadata":{"execution":{"iopub.status.busy":"2021-12-19T20:23:06.050823Z","iopub.status.idle":"2021-12-19T20:23:06.051226Z","shell.execute_reply.started":"2021-12-19T20:23:06.051009Z","shell.execute_reply":"2021-12-19T20:23:06.051031Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class data_pre(object):\n    \n    def __init__(self):\n        self.data = pd.DataFrame()\n    \n    def read(self, path):\n        self.data = pd.read_csv(path).iloc[-200000:]\n    \n    def clean(self):\n        self.data['timestamp'] = pd.to_datetime(self.data['timestamp'], unit='s')\n        self.data.Asset_ID = self.data.Asset_ID.astype('str')\n        self.data = self.data.set_index(['timestamp','Asset_ID']).sort_values(by=['timestamp','Asset_ID'])\n        self.data = self.data.replace([np.inf,-np.inf],np.nan).groupby(by='Asset_ID').fillna(method='ffill').dropna()\n        \n    def empty(self):\n        self.data = pd.DataFrame() \n\n        \n    \nread = data_pre()\nread.read(r'/kaggle/input/g-research-crypto-forecasting/train.csv')\nread.clean()\ndata_for_ind = read.data.copy()\nori_names = list(data_for_ind.columns)\nori_names.remove('Target')\nread.empty()\ntotal_for_test = []","metadata":{"execution":{"iopub.status.busy":"2021-12-19T20:23:06.054346Z","iopub.status.idle":"2021-12-19T20:23:06.054765Z","shell.execute_reply.started":"2021-12-19T20:23:06.054531Z","shell.execute_reply":"2021-12-19T20:23:06.054553Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_for_ind.head(14)","metadata":{"execution":{"iopub.status.busy":"2021-12-19T20:23:06.05679Z","iopub.status.idle":"2021-12-19T20:23:06.057191Z","shell.execute_reply.started":"2021-12-19T20:23:06.056975Z","shell.execute_reply":"2021-12-19T20:23:06.056997Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"我们需要建立一个自动化筛选的流程，因为我们有13个组要去搭建模型\n因子：\n1.对于平均或中位数的偏差值 14个\n2.拟合的残差 不同的x个模型 7*6*x=42x个 \n3.标准化或norm 14个\n\n模型选择：CNN就好，因为测试的原因没办法用时间序列的数据","metadata":{}},{"cell_type":"markdown","source":"因子建立","metadata":{}},{"cell_type":"code","source":"# 常规因子\ntemp = []\ndef per_relate(data):\n    temp.append(data.iloc[0])\n    data = data/data.iloc[0]\n    return data\ntotal_for_test.append(temp)\ndata_for_ind['High_percent'] = (data_for_ind.High - data_for_ind.Open)/data_for_ind.Open\ndata_for_ind['Low_percent'] = (data_for_ind.Low - data_for_ind.Open)/data_for_ind.Open\ndata_for_ind['Close_percent'] = (data_for_ind.Close - data_for_ind.Open)/data_for_ind.Open\ndata_for_ind['VWAP_percent'] = (data_for_ind.VWAP - data_for_ind.Open)/data_for_ind.Open\ndata_for_ind['Open_percent'] = data_for_ind.Open.groupby(by='Asset_ID').apply(per_relate)\ndata_for_ind['Count_percent'] = data_for_ind.Count.groupby(by='Asset_ID').apply(per_relate)\ndata_for_ind['Volume_percent'] = data_for_ind.Volume.groupby(by='Asset_ID').apply(per_relate)\ndata_for_ind.drop(ori_names,axis=1,inplace=True)\ndata_for_ind = data_for_ind.astype('float32')","metadata":{"execution":{"iopub.status.busy":"2021-12-19T20:23:06.059663Z","iopub.status.idle":"2021-12-19T20:23:06.060153Z","shell.execute_reply.started":"2021-12-19T20:23:06.059893Z","shell.execute_reply":"2021-12-19T20:23:06.059919Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_for_ind.head(14)","metadata":{"execution":{"iopub.status.busy":"2021-12-19T20:23:06.063236Z","iopub.status.idle":"2021-12-19T20:23:06.063644Z","shell.execute_reply.started":"2021-12-19T20:23:06.063427Z","shell.execute_reply":"2021-12-19T20:23:06.063448Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 分为训练，测试和验证 7:1.5:1.5\nlen_data = data_for_ind.shape[0]\ntrain_spot = round(len_data*0.7)\ntest_spot = round(len_data*0.85)\ndata_for_ind['train'] = 'train'\ndata_for_ind.train.iloc[train_spot:test_spot] = 'test'\ndata_for_ind.train.iloc[test_spot:] = 'valid'","metadata":{"execution":{"iopub.status.busy":"2021-12-19T20:23:06.06582Z","iopub.status.idle":"2021-12-19T20:23:06.066219Z","shell.execute_reply.started":"2021-12-19T20:23:06.066002Z","shell.execute_reply":"2021-12-19T20:23:06.066024Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_for_ind.head(14)","metadata":{"execution":{"iopub.status.busy":"2021-12-19T20:23:06.06829Z","iopub.status.idle":"2021-12-19T20:23:06.068697Z","shell.execute_reply.started":"2021-12-19T20:23:06.068481Z","shell.execute_reply":"2021-12-19T20:23:06.068503Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 构建平均数因子\n\nnames = list(data_for_ind.columns[1:])\nnames.remove('train')\nmean_names = [row + '_mean' for row in names]\ntemp = []\ndef mean_features_create(data):\n    temp.append(data[data.train=='train'][names].mean())\n    data[mean_names] = data[names] - data[data.train=='train'][names].mean()\n    return data\n\ndata_for_ind = data_for_ind.groupby(by='Asset_ID').apply(mean_features_create)\ntotal_for_test.append(temp)","metadata":{"execution":{"iopub.status.busy":"2021-12-19T20:23:06.071953Z","iopub.status.idle":"2021-12-19T20:23:06.072365Z","shell.execute_reply.started":"2021-12-19T20:23:06.072134Z","shell.execute_reply":"2021-12-19T20:23:06.072156Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_for_ind.head(14)","metadata":{"execution":{"iopub.status.busy":"2021-12-19T20:23:06.07454Z","iopub.status.idle":"2021-12-19T20:23:06.074947Z","shell.execute_reply.started":"2021-12-19T20:23:06.07472Z","shell.execute_reply":"2021-12-19T20:23:06.074755Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n# 构建回归因子\ntemp = []\ndef train_test(data):\n    for i in tqdm(range(len(model_set))):\n        for pre_name in names:\n            temp_names = names.copy()\n            temp_names.remove(pre_name)\n            for aft_name in temp_names:\n                new_col_name = pre_name + '_to_' + aft_name + '_' + model_name[i]\n                model = model_set[i]\n                X = data[data.train == 'train'][pre_name].values.reshape(-1,1)\n                y = data[data.train == 'train'][aft_name].values.reshape(-1,1)\n                model.fit(X,y)\n                temp.append(model)\n                pre_y = model.predict(data[pre_name].values.reshape(-1,1))\n                data[new_col_name] = data[aft_name].values - pre_y\n    return data\nmodel_set = [RandomForestRegressor(n_jobs=-1),  CatBoostRegressor(silent=True)]\nmodel_name = ['random', 'cat']\n\ndata_for_ind = data_for_ind.groupby(by='Asset_ID').apply(train_test)\ntotal_for_test.append(temp)","metadata":{"execution":{"iopub.status.busy":"2021-12-19T20:23:06.077046Z","iopub.status.idle":"2021-12-19T20:23:06.077454Z","shell.execute_reply.started":"2021-12-19T20:23:06.077227Z","shell.execute_reply":"2021-12-19T20:23:06.077249Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_for_ind.head()","metadata":{"execution":{"iopub.status.busy":"2021-12-19T20:23:06.079719Z","iopub.status.idle":"2021-12-19T20:23:06.080199Z","shell.execute_reply.started":"2021-12-19T20:23:06.079946Z","shell.execute_reply":"2021-12-19T20:23:06.079971Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# feature selection\nclass features_finding(object):\n    def __init__(self, X, y):\n        self.model_set = [LinearRegression(n_jobs=-1), Lasso(), ElasticNet(), SGDRegressor(), BayesianRidge(),\n             RandomForestRegressor(n_jobs=-1), GradientBoostingRegressor(),\n             ExtraTreesRegressor(n_jobs=-1), AdaBoostRegressor(), DecisionTreeRegressor(), SVR(), LinearSVR(),\n             XGBRegressor(nthread=-1, verbosity=0), CatBoostRegressor()]\n        self.X = X  # 进来是一个dataframe \n        self.y = y\n        self.name = X.columns\n        self.final_dict = dict()\n        \n    def cross_test(self, x):\n        acc_list = []\n        for model in self.model_set:\n            score = cross_val_score(model, x.values.reshape(-1,1), self.y.values.reshape(-1,1), scoring=\"neg_mean_squared_error\", cv=5, n_jobs=3)\n            acc_list.append(score.mean())  # 惩罚相差太多的\n        acc_list.sort()\n        acc_list[-3:] = acc_list[-3:]*2\n        acc_list[:3] = acc_list[:3]*2\n        \n        final_score = sum(acc_list)/len(acc_list)\n        return final_score\n\n    def feature_final(self):\n        score_list = [] \n        for i in tqdm(range(self.X.shape[1])):\n            score_list.append(self.cross_test(self.X.iloc[:,i]))\n        self.final_dict = dict(zip(self.name, score_list))","metadata":{"execution":{"iopub.status.busy":"2021-12-19T20:23:06.082348Z","iopub.status.idle":"2021-12-19T20:23:06.08279Z","shell.execute_reply.started":"2021-12-19T20:23:06.08253Z","shell.execute_reply":"2021-12-19T20:23:06.082552Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 构建pca lad ica因子\nfrom sklearn.decomposition import FastICA, PCA\nfrom sklearn.discriminant_analysis import LinearDiscriminantAnalysis\n\ntemp = []\ndef convert_value(data):\n    if data > 0.02:\n        data = 2\n    elif data > 0.01:\n        data = 1\n    elif data > 0:\n        data = 0\n    elif data > -0.01:\n        data = -1\n    else:\n        data = -2\n    return data\n\ndef create_reduction_features(data):\n    n_comp = round(data.shape[1]/3)\n    \n    ori_names = list(data.columns)\n    ori_names.remove('Target')\n    ori_names.remove('train')\n    \n    pca_names = [str(i) + '_pca' for i in range(n_comp)]\n    ica_names = [str(i) + '_ica' for i in range(n_comp)]\n    lda_names = [str(i) + '_lda' for i in range(3)]\n    \n    pca = PCA(n_components=n_comp)\n    ica = FastICA(n_components=n_comp,random_state=0)\n    lda = LinearDiscriminantAnalysis(n_components=3)\n    \n    train_data = data[data.train=='train'][ori_names]\n    \n    y = data[data.train=='train']['Target'].copy()\n    y = y.apply(convert_value) \n    pca.fit(train_data)\n    ica.fit(train_data)\n    lda.fit(train_data, y)\n    \n    temp.append([pca,ica,lda])\n    data[pca_names] = pca.transform(data[ori_names])\n    data[ica_names] = ica.transform(data[ori_names])\n    data[lda_names] = lda.transform(data[ori_names])\n    return data\n","metadata":{"execution":{"iopub.status.busy":"2021-12-19T20:23:06.086212Z","iopub.status.idle":"2021-12-19T20:23:06.086627Z","shell.execute_reply.started":"2021-12-19T20:23:06.086407Z","shell.execute_reply":"2021-12-19T20:23:06.08643Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_for_ind = data_for_ind.groupby(by='Asset_ID').apply(create_reduction_features)\ntotal_for_test.append(temp)","metadata":{"execution":{"iopub.status.busy":"2021-12-19T20:23:06.088841Z","iopub.status.idle":"2021-12-19T20:23:06.089238Z","shell.execute_reply.started":"2021-12-19T20:23:06.08902Z","shell.execute_reply":"2021-12-19T20:23:06.089041Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_for_ind.head(14)","metadata":{"execution":{"iopub.status.busy":"2021-12-19T20:23:06.091416Z","iopub.status.idle":"2021-12-19T20:23:06.091834Z","shell.execute_reply.started":"2021-12-19T20:23:06.0916Z","shell.execute_reply":"2021-12-19T20:23:06.091622Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras import regularizers, initializers\nfrom tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping\nfrom tensorflow.keras.layers import Dense, Dropout, Activation, Flatten, Conv2D, MaxPool2D, AveragePooling2D, \\\n    GlobalAveragePooling2D, Conv1D\nfrom hyperopt import hp, STATUS_OK\nfrom tensorflow.keras.layers import BatchNormalization\nfrom tensorflow import keras\nfrom hyperopt import fmin, Trials, tpe\nimport os\n\n# from ranger21 import Ranger21\n# 定义参数空间\n\nspace = {'ll_float': hp.uniform('ll_float', 10 ** -10, 10 ** -1),\n         'lr': hp.uniform('lr', 10 ** -10, 10 ** -1),\n         'beta_1_float': hp.uniform('beta_1_float', 0.8, 1 - (10 ** -10)),\n         'beta_2_float': hp.uniform('beta_2_float', 0.8, 1 - (10 ** -10)),\n         'epsilon_float': hp.uniform('epsilon_float', 10 ** -10, 10 ** -5),\n         'batch_size': hp.uniformint('batch_size', 1000, 2000),\n         'epochs': hp.uniformint('epochs', 200, 2000),\n         'first_num': hp.uniformint('first_dense', 10, 50),\n         'first_dense': hp.uniformint('first_num', 1, 10),\n         'first_drop': hp.uniform('first_drop', 0.01, 0.9),\n         'second_num': hp.uniformint('second_dense', 10, 50),\n         \n         'second_dense': hp.uniformint('second_num', 1, 10),\n         'second_drop': hp.uniform('second_drop', 0.01, 0.9)\n         # 'conv_num': hp.uniformint('conv_num', 64, 128)\n         }\n\nmax_eval = 15  # 参数最大调整次数\nPath = r''  # 模型存储的位置\nsilent = 0\n\n\ndef CNN_2_FNN(x_train, y_train, x_via, y_via, x_test, y_test):\n    def f_NN1(params):\n        # device = cuda.get_current_device()\n        # device.reset()\n        # cuda.select_device(0)\n\n        if silent <= 0:\n            print(params)\n        if silent <= -1:\n            print('是否含有nan值:', (True in np.isnan(x_train)), (True in np.isnan(x_via)), (True in np.isnan(x_test)))\n            print('是否含有inf值:', (True in np.isinf(x_train)), (True in np.isinf(x_via)), (True in np.isinf(x_test)))\n        keras.backend.set_image_data_format('channels_first')\n        # define params\n        ll_float = params[\"ll_float\"]  # 学习率其\n        learn_rate_float = params[\"lr\"]\n        beta_1_float = params[\"beta_1_float\"]\n        beta_2_float = params[\"beta_2_float\"]\n        epsilon_float = params[\"epsilon_float\"]\n        batch_size_num = params['batch_size']\n        epochs_num = params['epochs']\n\n        model = Sequential()\n        # init_conv_1 = initializers.he_normal(seed=100)\n        \n        model.add(Conv1D(20, 5, padding='same',  # 20 个filter (5,5) 的size 都可以加入上面的space进行调整\n                         input_shape=x_train.shape[1:], kernel_regularizer=regularizers.l2(ll_float),\n                         kernel_initializer=initializers.GlorotNormal(),\n                  data_format=\"channels_last\"))  # , init=init_conv_1)\n        model.add(BatchNormalization())\n        model.add(Activation('LeakyReLU'))  # 可使用LeakyReLU\n\n        model.add(Conv1D(20, 5, padding='same',  # 20 个filter (5,5) 的size 都可以加入上面的space进行调整\n                         kernel_regularizer=regularizers.l2(ll_float),\n                         kernel_initializer=initializers.GlorotNormal(),\n                         data_format=\"channels_last\"))  # , init=init_conv_1)\n        model.add(BatchNormalization())\n        model.add(Activation('LeakyReLU'))  # 可使用LeakyReLU\n\n        # init_conv_2 = initializers.he_normal(seed=101)\n        # model.add(Conv2D(10, (5, 5), padding='same',  # 20 个filter (5,5) 的size 都可以加入上面的space进行调整\n        #                  kernel_regularizer=regularizers.l2(ll_float),\n        #                  data_format=\"channels_last\"))  # , init=init_conv_2)\n        # model.add(Activation('relu'))  # 可使用LeakyReLU\n\n        # model.add(AveragePooling2D(20, (5, 5), padding='same'))  # 20 个filter (5,5) 的size 都可以加入上面的space进行调整\n        # model.add(Activation('relu'))  # 可使用LeakyReLU\n        # # init_layer_1 = initializers.he_normal(seed=102)\n\n        # model.add(Flatten())\n\n        for i in range(params['first_num']):\n            model.add(\n                Dense(params['first_dense'], activation='relu'))  # , kernel_initializer=init_layer_1)  # 可使用LeakyReLU\n            model.add(Conv1D(params['first_dense'], 5, padding='same',  # 20 个filter (5,5) 的size 都可以加入上面的space进行调整\n                             kernel_regularizer=regularizers.l2(ll_float),\n                             kernel_initializer=initializers.GlorotNormal(),\n                             data_format=\"channels_last\"))  # , init=init_conv_1)\n            model.add(Activation('LeakyReLU'))\n            model.add(Dropout(params['first_drop']))\n\n        # init_layer_2 = initializers.he_normal(seed=103)\n        for i in range(params['second_num']):\n            model.add( Dense(params['second_dense'], activation='relu'))  # , kernel_initializer=init_layer_2)\n            # 可使用LeakyReLU\n\n            model.add(Conv1D(params['second_dense'], 5, padding='same',  # 20 个filter (5,5) 的size 都可以加入上面的space进行调整\n                             kernel_regularizer=regularizers.l2(ll_float),\n                             kernel_initializer=initializers.GlorotNormal(),\n                             data_format=\"channels_last\"))  # , init=init_conv_1)\n            model.add(Activation('LeakyReLU'))\n            model.add(Dropout(params['second_drop']))\n\n        model.add(Dense(1))\n\n        # initiate Adam optimizer\n        adam = Adam(learning_rate=learn_rate_float, beta_1=beta_1_float, beta_2=beta_2_float, epsilon=epsilon_float)\n\n\n        model.compile(loss='mse', optimizer=adam)\n\n        # callback fun\n        # 防止过拟合\n        early_stopping = EarlyStopping(monitor='val_loss', min_delta=0.0001, patience=10, verbose=0,\n                                       mode='min')  # patience 指的是最多几个没有改变然后进行改变\n        # monitor: 需要监视的量;patience:  当 early stop 被激活(如发现loss相比上一个epoch训练没有下降)，则经过patience个epoch后停止训练\n\n        filepath = \"model.hdf5\"\n        model_filepath = os.path.join(Path, filepath)\n        checkpoint = ModelCheckpoint(model_filepath, save_weights_only=False, monitor='val_loss', mode='min',\n                                     save_best_only='True')\n        callback_lists = [early_stopping, checkpoint]\n        # checkpoint 路径可以唯一\n\n        history = model.fit(x_train, y_train,\n                            batch_size=int(batch_size_num),\n                            epochs=int(epochs_num),\n                            verbose=0,\n                            validation_data=(x_via, y_via),\n                            shuffle=True,\n                            callbacks=callback_lists,\n                            workers=-1,\n                            use_multiprocessing=True)\n\n        # Save model and weights\n        # model_path = os.path.join(Path, model_name)\n        # print(model_path)\n        # model.save(model_path)\n        # get the best model\n\n        # best_model = load_model(model_path)\n        # 验证集\n        # Y_via_pre = model.predict(x_via, verbose=0)\n        train_score = model.evaluate(x_train, y_train, verbose=0)\n        if silent <= 0:\n            print('train accuracy:', train_score)\n\n        via_score = model.evaluate(x_via, y_via, verbose=0)\n        if silent <= 0:\n            print('Validation accuracy:', via_score)\n        if silent <= -1:\n            print(model.predict(x_via))\n        model.save('model.h5')\n\n        # 测试集\n        test_score = model.evaluate(x_test, y_test, verbose=0)\n        Y_test_pre = model.predict(x_test)\n        if silent <= 0:\n            print('Test accuracy:', test_score)\n\n        if silent <= -1:\n            print(Y_test_pre)\n\n        loss = (via_score + train_score) / (2 * (1 + abs(via_score - train_score)))  # 让训练集和测试集更加接近，远离要么是过度拟合要么是欠拟合\n\n        return {\"loss\": loss, \"status\": STATUS_OK,\n                \"model\": model, 'test_score': test_score,\n                'test_pred': Y_test_pre}\n\n    trials = Trials()\n    best = fmin(f_NN1, space, algo=tpe.suggest, max_evals=max_eval, trials=trials)  # 指定需要最小化的函数，搜索的空间，最大迭代次数。\n    return best, trials\n","metadata":{"execution":{"iopub.status.busy":"2021-12-19T20:23:06.094231Z","iopub.status.idle":"2021-12-19T20:23:06.094642Z","shell.execute_reply.started":"2021-12-19T20:23:06.094421Z","shell.execute_reply":"2021-12-19T20:23:06.094444Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def hyper_train(train_X, via_X, test_X, train_Y, via_Y, test_Y):\n    best, trials = CNN_2_FNN(train_X.reshape(train_X.shape[0], train_X.shape[1], 1), train_Y, \n                             via_X.reshape(via_X.shape[0], via_X.shape[1], 1), via_Y, \n                             test_X.reshape(test_X.shape[0], test_X.shape[1], 1), test_Y)\n    loss_list = np.array(trials.losses())\n    key = np.where(loss_list == loss_list.min())[0][0]\n#     pred_Y = trials.results[key]['test_pred']\n#     score = trials.results[key]['test_score']\n#     params = trials.results[key]['params']\n    model = trials.results[key]['model']\n    model.save('model.h5')\n    return model","metadata":{"execution":{"iopub.status.busy":"2021-12-19T20:23:06.096856Z","iopub.status.idle":"2021-12-19T20:23:06.09726Z","shell.execute_reply.started":"2021-12-19T20:23:06.09704Z","shell.execute_reply":"2021-12-19T20:23:06.097062Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ori_names = list(data_for_ind.columns)\nori_names.remove('Target')\nori_names.remove('train')\n\nmodel = hyper_train(data_for_ind[data_for_ind.train=='train'][ori_names].values,data_for_ind[data_for_ind.train=='test'][ori_names].values,\n            data_for_ind[data_for_ind.train=='valid'][ori_names].values,data_for_ind[data_for_ind.train=='train']['Target'].values,\n            data_for_ind[data_for_ind.train=='test']['Target'].values,data_for_ind[data_for_ind.train=='valid']['Target'].values)\n","metadata":{"execution":{"iopub.status.busy":"2021-12-19T20:23:06.100201Z","iopub.status.idle":"2021-12-19T20:23:06.100614Z","shell.execute_reply.started":"2021-12-19T20:23:06.100393Z","shell.execute_reply":"2021-12-19T20:23:06.100415Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def change_for_test(test_df,model):\n    read.data = test_df\n    read.clean()\n    test_df = read.data.copy()\n    ori_names = list(test_df.columns)\n    temp = total_for_test[0].copy()\n    def per_relate_for_test(data):\n        global temp\n        try:\n            data = data/hhh[0]\n            hhh = hhh[1:]\n        except:\n            data = pd.DataFrame()\n        return data\n\n    test_df['High_percent'] = (test_df.High - test_df.Open)/test_df.Open\n    test_df['Low_percent'] = (test_df.Low - test_df.Open)/test_df.Open\n    test_df['Close_percent'] = (test_df.Close - test_df.Open)/test_df.Open\n    test_df['VWAP_percent'] = (test_df.VWAP - test_df.Open)/test_df.Open\n    test_df['Open_percent'] = test_df.Open.groupby(by='Asset_ID').apply(per_relate_for_test)\n    test_df['Count_percent'] = test_df.Count.groupby(by='Asset_ID').apply(per_relate_for_test)\n    test_df['Volume_percent'] = test_df.Volume.groupby(by='Asset_ID').apply(per_relate_for_test)\n    test_df.drop(ori_names,axis=1,inplace=True)\n    names = list(test_df.columns[1:])\n    mean_names = [row + '_mean' for row in names]\n    temp = total_for_test[1].copy()\n    def mean_features_create_for_test(data):\n        global temp\n        data[mean_names] = data[names] - temp[0]\n        temp = temp[1:]\n        return data\n\n    test_df = test_df.groupby(by='Asset_ID').apply(mean_features_create_for_test)\n    \n    temp = total_for_test[2].copy()\n    def train_test_for_test(data):\n        global temp\n        for i in tqdm(range(len(model_set))):\n            for pre_name in names:\n                temp_names = names.copy()\n                temp_names.remove(pre_name)\n                for aft_name in temp_names:\n                    new_col_name = pre_name + '_to_' + aft_name + '_' + model_name[i]\n                    model = temp[0]\n                    temp = temp[1:]\n                    pre_y = model.predict(data[pre_name].values.reshape(-1,1))\n                    data[new_col_name] = data[aft_name].values - pre_y\n        return data\n\n    test_df = test_df.groupby(by='Asset_ID').apply(train_test_for_test)\n    \n    temp = total_for_test[3].copy()\n    def create_reduction_features_for_test(data):\n        global temp\n        n_comp = round(data.shape[1]/3)\n\n        ori_names = list(data.columns)[1:]\n\n        pca_names = [str(i) + '_pca' for i in range(n_comp)]\n        ica_names = [str(i) + '_ica' for i in range(n_comp)]\n        lda_names = [str(i) + '_lda' for i in range(3)]\n\n        pca = temp[0][0]\n        ica = temp[0][1]\n        lda = temp[0][2]\n\n        temp = temp[1:]\n\n        data[pca_names] = pca.transform(data[ori_names])\n        data[ica_names] = ica.transform(data[ori_names])\n        data[lda_names] = lda.transform(data[ori_names])\n        return data\n    test_df = test_df.groupby(by='Asset_ID').apply(create_reduction_features_for_test)\n    \n    ori_names = list(test_df.columns)\n    ori_names.remove('row_id')\n    def model_predict(data):\n        data['Target'] = model_dict[data.index[0][1]].predict(data[ori_names].values)\n        return final\n    \n    test_df['Target'] = model.predict(data[ori_names].values.reshape(data[ori_names].values.shape[0],data[ori_names].values.shape[1],1))\n    test_df = test_df[['row_id','Target']].sort_values(by='row_id')\n    return test_df","metadata":{"execution":{"iopub.status.busy":"2021-12-19T20:23:06.10313Z","iopub.status.idle":"2021-12-19T20:23:06.103547Z","shell.execute_reply.started":"2021-12-19T20:23:06.103315Z","shell.execute_reply":"2021-12-19T20:23:06.103346Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import gresearch_crypto\nenv = gresearch_crypto.make_env()   # initialize the environment\niter_test = env.iter_test()    # an iterator which loops over the test set and sample submission\nfor (test_df, sample_prediction_df) in iter_test:\n    data = change_for_test(test_df)\n    test_df['Target'] = data.Target  # make your predictions here\n    env.predict(data)   # register your predictions","metadata":{"execution":{"iopub.status.busy":"2021-12-19T20:23:06.106827Z","iopub.status.idle":"2021-12-19T20:23:06.107232Z","shell.execute_reply.started":"2021-12-19T20:23:06.107014Z","shell.execute_reply":"2021-12-19T20:23:06.107036Z"},"trusted":true},"execution_count":null,"outputs":[]}]}