{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":96164,"databundleVersionId":11418275,"sourceType":"competition"}],"dockerImageVersionId":31040,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# import packages\nimport random\nimport numpy as np\nimport pandas as pd\nimport polars as pl\nimport matplotlib.pyplot as plt\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import StandardScaler\nfrom tqdm import tqdm\n\nimport warnings\nwarnings.filterwarnings(\"ignore\", category=RuntimeWarning)\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-11T14:17:14.460066Z","iopub.execute_input":"2025-07-11T14:17:14.460351Z","iopub.status.idle":"2025-07-11T14:17:14.466020Z","shell.execute_reply.started":"2025-07-11T14:17:14.460329Z","shell.execute_reply":"2025-07-11T14:17:14.465128Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Data loading and Preprocessing","metadata":{}},{"cell_type":"code","source":"train = pd.read_parquet(\"/kaggle/input/drw-crypto-market-prediction/train.parquet\")\ntest = pd.read_parquet(\"/kaggle/input/drw-crypto-market-prediction/test.parquet\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-11T14:17:14.467609Z","iopub.execute_input":"2025-07-11T14:17:14.467927Z","iopub.status.idle":"2025-07-11T14:17:27.134902Z","shell.execute_reply.started":"2025-07-11T14:17:14.467899Z","shell.execute_reply":"2025-07-11T14:17:27.133805Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.info()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-11T14:17:27.135944Z","iopub.execute_input":"2025-07-11T14:17:27.136222Z","iopub.status.idle":"2025-07-11T14:17:27.211023Z","shell.execute_reply.started":"2025-07-11T14:17:27.136198Z","shell.execute_reply":"2025-07-11T14:17:27.210008Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test.info()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-11T14:17:27.212780Z","iopub.execute_input":"2025-07-11T14:17:27.213093Z","iopub.status.idle":"2025-07-11T14:17:27.243974Z","shell.execute_reply.started":"2025-07-11T14:17:27.213069Z","shell.execute_reply":"2025-07-11T14:17:27.242819Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#train = train.reset_index(drop=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-11T14:17:27.244858Z","iopub.execute_input":"2025-07-11T14:17:27.245190Z","iopub.status.idle":"2025-07-11T14:17:27.249852Z","shell.execute_reply.started":"2025-07-11T14:17:27.245162Z","shell.execute_reply":"2025-07-11T14:17:27.248843Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-11T14:17:27.250849Z","iopub.execute_input":"2025-07-11T14:17:27.251181Z","iopub.status.idle":"2025-07-11T14:17:27.307045Z","shell.execute_reply.started":"2025-07-11T14:17:27.251149Z","shell.execute_reply":"2025-07-11T14:17:27.305796Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Drop columns have exactly 1 value\nNUNIQUE1=[c for c in train.columns if train[c].nunique()==1]\ntrain.drop(NUNIQUE1,axis=1,inplace=True)\ntest.drop(NUNIQUE1+['label'],axis=1,inplace=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-11T14:17:27.308084Z","iopub.execute_input":"2025-07-11T14:17:27.308469Z","iopub.status.idle":"2025-07-11T14:17:58.431910Z","shell.execute_reply.started":"2025-07-11T14:17:27.308415Z","shell.execute_reply":"2025-07-11T14:17:58.430827Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Feature Importance by Xgboost","metadata":{}},{"cell_type":"code","source":"top_features = [\n    \"X344\", \"X598\", \"X137\", \"X174\", \"X425\", \"X612\", \"X167\",\n    \"X168\", \"X27\", \"X422\", \"X342\", \"X427\", \"X532\", \"X178\", \"X539\",\n    \"X421\", \"X341\", \"X465\", \"X97\", \"X603\", \"X138\", \"X572\",\n    \"X338\", \"X95\", \"X161\", \"X533\", \"X271\", \"X279\", \"X424\",\n    \"X169\", \"X283\", \"X332\", \"X574\", \"X28\", \"X281\", \"X757\",\n    \"X754\", \"X445\", \"X180\", \"X94\", \"X88\", \"X525\", \"X285\",\n    \"X181\", \"X429\", \"X343\", \"X688\", \"X692\", \"X680\", \"X755\",\n    \"X695\", \"X345\", \"X611\", \"X689\", \"X387\", \"X588\", \"X686\",\n    \"X140\", \"X530\", \"X753\", \"X98\", \"X24\", \"X756\", \"X540\",\n    \"X531\", \"X340\", \"X383\", \"X331\", \"X385\", \"X277\", \"X602\",\n    \"X136\", \"X586\", \"X300\", \"X284\", \"X91\", \"X379\", \"X685\", \"X177\",\n    'bid_qty', 'ask_qty', 'buy_qty', 'sell_qty', 'volume'\n]\n\n\n\ntrain= train[top_features + [\"label\"]]\ntest= test[top_features]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-11T14:21:40.364412Z","iopub.execute_input":"2025-07-11T14:21:40.364960Z","iopub.status.idle":"2025-07-11T14:21:42.766402Z","shell.execute_reply.started":"2025-07-11T14:21:40.364934Z","shell.execute_reply":"2025-07-11T14:21:42.765488Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# def reduce_memory_usage(df: pd.DataFrame) -> pd.DataFrame:\n#     start_mem = df.memory_usage(deep=True).sum() / 1024**2\n#     print(f\"Memory usage before: {start_mem:.2f} MB\")\n\n#     for col in df.columns:\n#         col_type = df[col].dtype\n\n#         if col_type == 'float64':\n#             try:\n#                 df[col] = df[col].astype('float16')\n#             except ValueError:\n#                 pass  \n\n#         elif col_type == 'int64':\n#             min_val = df[col].min()\n#             max_val = df[col].max()\n#             if min_val >= -128 and max_val <= 127:\n#                 df[col] = df[col].astype('int8')\n#             else:\n#                 # optionally handle other int downcasts (int16, int32)\n#                 df[col] = pd.to_numeric(df[col], downcast='integer')\n\n#     end_mem = df.memory_usage(deep=True).sum() / 1024**2\n#     print(f\"Memory usage after: {end_mem:.2f} MB\")\n#     print(f\"Reduced by {(start_mem - end_mem) / start_mem * 100:.1f}%\")\n\n#     return df\n\n\n# train = reduce_memory_usage(train)\n# test = reduce_memory_usage(test)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-11T14:21:45.403250Z","iopub.execute_input":"2025-07-11T14:21:45.403613Z","iopub.status.idle":"2025-07-11T14:21:45.408364Z","shell.execute_reply.started":"2025-07-11T14:21:45.403585Z","shell.execute_reply":"2025-07-11T14:21:45.407491Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# def add_interaction_features(df):\n#     eps = 1e-6\n\n#     df['bid_ask_spread_ratio'] = df['bid_qty'] / (df['ask_qty'] + eps)\n#     df['buy_sell_ratio'] = df['buy_qty'] / (df['sell_qty'] + eps)\n#     df['net_qty'] = df['buy_qty'] - df['sell_qty']\n#     df['total_liquidity'] = df['bid_qty'] + df['ask_qty']\n#     df['liquidity_per_volume'] = df['total_liquidity'] / (df['volume'] + eps)\n#     df['trade_density'] = (df['buy_qty'] + df['sell_qty']) / (df['volume'] + eps)\n#     df['volume_per_order'] = df['volume'] / (df['buy_qty'] + df['sell_qty'] + eps)\n\n#     return df\n\n\n# train = add_interaction_features(train)\n# test = add_interaction_features(test)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-11T14:21:45.663076Z","iopub.execute_input":"2025-07-11T14:21:45.663422Z","iopub.status.idle":"2025-07-11T14:21:45.668648Z","shell.execute_reply.started":"2025-07-11T14:21:45.663396Z","shell.execute_reply":"2025-07-11T14:21:45.667516Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-11T14:21:45.873106Z","iopub.execute_input":"2025-07-11T14:21:45.873434Z","iopub.status.idle":"2025-07-11T14:21:45.898245Z","shell.execute_reply.started":"2025-07-11T14:21:45.873407Z","shell.execute_reply":"2025-07-11T14:21:45.897347Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Model evaluation","metadata":{}},{"cell_type":"code","source":"import lightgbm as lgb\nimport xgboost as xgb\nfrom sklearn.model_selection import KFold\nfrom sklearn.metrics import mean_squared_error\nfrom sklearn.model_selection import TimeSeriesSplit\nimport numpy as np\nimport gc\n\n# Prepare data\nX = train.drop('label', axis=1)\ny = train['label']\n\n#Params\nxgb_params = {\n    \"colsample_bylevel\": 0.477,\n    \"colsample_bynode\": 0.362,\n    \"colsample_bytree\": 0.710,\n    \"gamma\": 1.709,\n    \"learning_rate\": 0.022,\n    \"max_depth\": 20,\n    \"max_leaves\": 12,\n    \"min_child_weight\": 16,\n    \"n_estimators\": 1600,\n    \"n_jobs\": -1,\n    \"random_state\": 42,\n    \"reg_alpha\": 39.354,\n    \"reg_lambda\": 65.44,\n    \"subsample\": 0.065, \n    \"verbosity\": 0\n}\n\n\n# K-Fold setup\nsplit = TimeSeriesSplit(n_splits=14).split(X, y)\nxgb_oof_preds = np.zeros(len(X)) \nxgb_scores = []\nfold = 1\n\nfor train_idx, val_idx in split:\n    print(f\"Fold {fold}:\")\n\n    X_train, X_val = X.iloc[train_idx], X.iloc[val_idx]\n    y_train, y_val = y.iloc[train_idx], y.iloc[val_idx]\n\n    model = xgb.XGBRegressor(**xgb_params)\n    model.fit(X_train, y_train)\n\n    preds = model.predict(X_val)\n    xgb_oof_preds[val_idx] = preds  # Store OOF predictions\n\n    pearson_corr = np.corrcoef(y_val, preds)[0, 1]\n    print(f\"Pearson Correlation: {pearson_corr:.5f}\")\n    xgb_scores.append(pearson_corr)\n\n    del X_train, X_val, y_train, y_val, preds\n    gc.collect()\n\n    fold += 1\n\nprint(f\"\\nAverage Pearson Correlation: {np.mean(xgb_scores):.5f}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-11T14:21:49.793779Z","iopub.execute_input":"2025-07-11T14:21:49.794465Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"final_preds = model.predict(test)\nsubmission = pd.read_csv(\"/kaggle/input/drw-crypto-market-prediction/sample_submission.csv\")\nsubmission[\"prediction\"] = final_preds\nsubmission.to_csv(\"submission.csv\", index=False)\nsubmission.head()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}