diff --git a/config.py b/config.py index b9dd9eb..df5f02f 100644 --- a/config.py +++ b/config.py @@ -7,10 +7,13 @@ from models.model_map import model_names_classification, model_names_regression def get_default_level_1_config() -> tuple[dict, dict, dict]: training_config = dict( - dimensionality_reduction = False, + dimensionality_reduction = True, feature_selection = True, - expanding_window = False, - sliding_window_size = 380, + n_features_to_select = 30, + expanding_window_level1 = False, + expanding_window_level2 = False, + sliding_window_size_level1 = 380, + sliding_window_size_level2 = 1, retrain_every = 20, scaler = 'minmax', # 'normalize' 'minmax' 'standardize' 'none' include_original_data_in_ensemble = False, @@ -46,8 +49,11 @@ def get_default_level_2_config() -> tuple[dict, dict, dict]: training_config = dict( dimensionality_reduction = True, feature_selection = True, - expanding_window = True, - sliding_window_size = 380, + n_features_to_select = 30, + expanding_window_level1 = True, + expanding_window_level2 = False, + sliding_window_size_level1 = 380, + sliding_window_size_level2 = 1, retrain_every = 20, scaler = 'minmax', # 'normalize' 'minmax' 'standardize' 'none' include_original_data_in_ensemble = False, @@ -59,8 +65,8 @@ def get_default_level_2_config() -> tuple[dict, dict, dict]: load_other_assets= True, log_returns= True, forecasting_horizon = 1, - own_features = ['level_2', 'date_days', 'lags_up_to_5'], - other_features = ['level_2', 'lags_up_to_5'], + own_features = ['level_2', 'date_days', 'fracdiff'], + other_features = ['level_2', 'fracdiff'], index_column= 'int', method= 'classification', no_of_classes= 'three-balanced' diff --git a/environment.yml b/environment.yml index f751771..3949f62 100644 --- a/environment.yml +++ b/environment.yml @@ -21,4 +21,8 @@ dependencies: - wandb - python-dotenv - tscv + - pip + - pip: + - fracdiff + - ray prefix: /usr/local/anaconda3/envs/quant diff --git a/exploration.ipynb b/exploration.ipynb index 8151a62..ad91c90 100644 --- a/exploration.ipynb +++ b/exploration.ipynb @@ -2,43 +2,24 @@ "cells": [ { "cell_type": "code", - "execution_count": 2, + "execution_count": 7, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Index: 1500 entries, 2017-10-03 to 2021-11-10\n", - "Data columns (total 9 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 BTC_returns 1500 non-null float64\n", - " 1 BTC_vol_10 1500 non-null float64\n", - " 2 BTC_vol_20 1500 non-null float64\n", - " 3 BTC_vol_30 1500 non-null float64\n", - " 4 BTC_mom_10 1500 non-null float64\n", - " 5 BTC_mom_20 1500 non-null float64\n", - " 6 BTC_mom_30 1500 non-null float64\n", - " 7 BTC_mom_60 1500 non-null float64\n", - " 8 BTC_mom_90 1500 non-null float64\n", - "dtypes: float64(9)\n", - "memory usage: 117.2+ KB\n" - ] - } - ], + "outputs": [], "source": [ - "from load_data import load_files\n", + "from utils.load_data import load_data\n", "import pandas as pd\n", "from pandas.plotting import lag_plot\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from feature_extractors.feature_extractor_presets import presets\n", "\n", - "data = load_files('data', True)\n", - "data = data[[column for column in data.columns if not column.endswith('volume')]]\n", - "data = data[[column for column in data.columns if column.startswith('BTC')]]\n", - "data.info()" + "X, y, target_returns = load_data(path = './data', target_asset = 'BTC_USD', load_other_assets = True, log_returns=False, forecasting_horizon= 1, own_features= presets[\"level_2\"],\n", + " other_features= presets[\"level_2\"],\n", + " index_column= 'int',\n", + " method= 'classification',\n", + " no_of_classes= 'three-balanced',\n", + " narrow_format=False)" ] }, { @@ -67,96 +48,379 @@ " \n", " \n", " \n", - " BTC_returns\n", - " BTC_vol_10\n", - " BTC_vol_20\n", - " BTC_vol_30\n", - " BTC_mom_10\n", - " BTC_mom_20\n", - " BTC_mom_30\n", - " BTC_mom_60\n", - " BTC_mom_90\n", + " BTC_USD_returns\n", + " BTC_USD_fracdiff_10\n", + " BTC_USD_fracdiff_30\n", + " BTC_USD_mom_10\n", + " BTC_USD_mom_20\n", + " BTC_USD_mom_30\n", + " BTC_USD_mom_60\n", + " BTC_USD_mom_90\n", + " BTC_USD_vol_10\n", + " BTC_USD_vol_20\n", + " ...\n", + " DOT_USD_roc_30\n", + " DOT_USD_rsi_10\n", + " DOT_USD_rsi_30\n", + " DOT_USD_rsi_100\n", + " DOT_USD_stod_10\n", + " DOT_USD_stod_30\n", + " DOT_USD_stod_200\n", + " DOT_USD_stok_10\n", + " DOT_USD_stok_30\n", + " DOT_USD_stok_200\n", " \n", " \n", " \n", " \n", - " 2017-10-03\n", - " -0.019799\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", + " 0\n", + " 0.000000\n", + " 7444.360000\n", + " 7444.360000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " ...\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", " \n", " \n", - " 2017-10-04\n", - " -0.022141\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", + " 1\n", + " -0.042283\n", + " 1139.206563\n", + " 2535.024063\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " ...\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", " \n", " \n", - " 2017-10-05\n", - " 0.024363\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", + " 2\n", + " -0.079077\n", + " 243.709664\n", + " 1286.077535\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " ...\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", " \n", " \n", - " 2017-10-06\n", - " 0.011686\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", + " 3\n", + " -0.034412\n", + " 263.094633\n", + " 1039.924935\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " ...\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", " \n", " \n", - " 2017-10-07\n", - " 0.014609\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", + " 4\n", + " -0.072830\n", + " -90.588311\n", + " 559.909509\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " ...\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", + " \n", + " \n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " \n", + " \n", + " 1495\n", + " 0.014405\n", + " 2660.331638\n", + " 3144.986598\n", + " -0.113455\n", + " -0.109995\n", + " -0.218939\n", + " -0.126532\n", + " 0.114582\n", + " 0.634974\n", + " 0.602183\n", + " ...\n", + " 152.766095\n", + " -210.230629\n", + " 152.766095\n", + " -278.744575\n", + " 24.902512\n", + " 13.176162\n", + " 39.267874\n", + " 39.282736\n", + " 20.531822\n", + " 42.965779\n", + " \n", + " \n", + " 1496\n", + " -0.067431\n", + " -1392.796403\n", + " -763.198378\n", + " -0.129180\n", + " -0.188227\n", + " -0.274471\n", + " -0.185292\n", + " -0.008444\n", + " 0.668922\n", + " 0.631444\n", + " ...\n", + " 713.812241\n", + " -3.209040\n", + " 713.812241\n", + " -293.769154\n", + " 25.221030\n", + " 12.656205\n", + " 38.924924\n", + " 12.026726\n", + " 4.707934\n", + " 34.846790\n", + " \n", + " \n", + " 1497\n", + " 0.035451\n", + " 2891.701218\n", + " 2900.158370\n", + " -0.017377\n", + " -0.153693\n", + " -0.261359\n", + " -0.215567\n", + " 0.004969\n", + " 0.582283\n", + " 0.651423\n", + " ...\n", + " -127.240548\n", + " -126.233379\n", + " -127.240548\n", + " -514.459746\n", + " 23.810163\n", + " 10.375772\n", + " 37.739506\n", + " 20.121029\n", + " 5.887561\n", + " 35.405949\n", + " \n", + " \n", + " 1498\n", + " 0.010279\n", + " 2284.616961\n", + " 2760.190939\n", + " -0.011734\n", + " -0.170976\n", + " -0.231537\n", + " -0.196997\n", + " 0.023461\n", + " 0.584564\n", + " 0.638944\n", + " ...\n", + " -141.804006\n", + " -833.716684\n", + " -141.804006\n", + " -119.302947\n", + " 24.030759\n", + " 8.219332\n", + " 35.927831\n", + " 39.944521\n", + " 14.062500\n", + " 37.530754\n", + " \n", + " \n", + " 1499\n", + " -0.025552\n", + " 594.386779\n", + " 1195.664451\n", + " -0.057700\n", + " -0.114380\n", + " -0.207506\n", + " -0.225691\n", + " 0.007145\n", + " 0.581942\n", + " 0.571090\n", + " ...\n", + " -189.814479\n", + " -150.800533\n", + " -189.814479\n", + " 631.912739\n", + " 28.066233\n", + " 9.647436\n", + " 35.972564\n", + " 24.133148\n", + " 8.992248\n", + " 34.980989\n", " \n", " \n", "\n", + "

1500 rows × 483 columns

\n", "" ], "text/plain": [ - " BTC_returns BTC_vol_10 BTC_vol_20 BTC_vol_30 BTC_mom_10 \\\n", - "2017-10-03 -0.019799 0.0 0.0 0.0 0.0 \n", - "2017-10-04 -0.022141 0.0 0.0 0.0 0.0 \n", - "2017-10-05 0.024363 0.0 0.0 0.0 0.0 \n", - "2017-10-06 0.011686 0.0 0.0 0.0 0.0 \n", - "2017-10-07 0.014609 0.0 0.0 0.0 0.0 \n", + " BTC_USD_returns BTC_USD_fracdiff_10 BTC_USD_fracdiff_30 \\\n", + "0 0.000000 7444.360000 7444.360000 \n", + "1 -0.042283 1139.206563 2535.024063 \n", + "2 -0.079077 243.709664 1286.077535 \n", + "3 -0.034412 263.094633 1039.924935 \n", + "4 -0.072830 -90.588311 559.909509 \n", + "... ... ... ... \n", + "1495 0.014405 2660.331638 3144.986598 \n", + "1496 -0.067431 -1392.796403 -763.198378 \n", + "1497 0.035451 2891.701218 2900.158370 \n", + "1498 0.010279 2284.616961 2760.190939 \n", + "1499 -0.025552 594.386779 1195.664451 \n", "\n", - " BTC_mom_20 BTC_mom_30 BTC_mom_60 BTC_mom_90 \n", - "2017-10-03 0.0 0.0 0.0 0.0 \n", - "2017-10-04 0.0 0.0 0.0 0.0 \n", - "2017-10-05 0.0 0.0 0.0 0.0 \n", - "2017-10-06 0.0 0.0 0.0 0.0 \n", - "2017-10-07 0.0 0.0 0.0 0.0 " + " BTC_USD_mom_10 BTC_USD_mom_20 BTC_USD_mom_30 BTC_USD_mom_60 \\\n", + "0 0.000000 0.000000 0.000000 0.000000 \n", + "1 0.000000 0.000000 0.000000 0.000000 \n", + "2 0.000000 0.000000 0.000000 0.000000 \n", + "3 0.000000 0.000000 0.000000 0.000000 \n", + "4 0.000000 0.000000 0.000000 0.000000 \n", + "... ... ... ... ... \n", + "1495 -0.113455 -0.109995 -0.218939 -0.126532 \n", + "1496 -0.129180 -0.188227 -0.274471 -0.185292 \n", + "1497 -0.017377 -0.153693 -0.261359 -0.215567 \n", + "1498 -0.011734 -0.170976 -0.231537 -0.196997 \n", + "1499 -0.057700 -0.114380 -0.207506 -0.225691 \n", + "\n", + " BTC_USD_mom_90 BTC_USD_vol_10 BTC_USD_vol_20 ... DOT_USD_roc_30 \\\n", + "0 0.000000 0.000000 0.000000 ... 0.000000 \n", + "1 0.000000 0.000000 0.000000 ... 0.000000 \n", + "2 0.000000 0.000000 0.000000 ... 0.000000 \n", + "3 0.000000 0.000000 0.000000 ... 0.000000 \n", + "4 0.000000 0.000000 0.000000 ... 0.000000 \n", + "... ... ... ... ... ... \n", + "1495 0.114582 0.634974 0.602183 ... 152.766095 \n", + "1496 -0.008444 0.668922 0.631444 ... 713.812241 \n", + "1497 0.004969 0.582283 0.651423 ... -127.240548 \n", + "1498 0.023461 0.584564 0.638944 ... -141.804006 \n", + "1499 0.007145 0.581942 0.571090 ... -189.814479 \n", + "\n", + " DOT_USD_rsi_10 DOT_USD_rsi_30 DOT_USD_rsi_100 DOT_USD_stod_10 \\\n", + "0 0.000000 0.000000 0.000000 0.000000 \n", + "1 0.000000 0.000000 0.000000 0.000000 \n", + "2 0.000000 0.000000 0.000000 0.000000 \n", + "3 0.000000 0.000000 0.000000 0.000000 \n", + "4 0.000000 0.000000 0.000000 0.000000 \n", + "... ... ... ... ... \n", + "1495 -210.230629 152.766095 -278.744575 24.902512 \n", + "1496 -3.209040 713.812241 -293.769154 25.221030 \n", + "1497 -126.233379 -127.240548 -514.459746 23.810163 \n", + "1498 -833.716684 -141.804006 -119.302947 24.030759 \n", + "1499 -150.800533 -189.814479 631.912739 28.066233 \n", + "\n", + " DOT_USD_stod_30 DOT_USD_stod_200 DOT_USD_stok_10 DOT_USD_stok_30 \\\n", + "0 0.000000 0.000000 0.000000 0.000000 \n", + "1 0.000000 0.000000 0.000000 0.000000 \n", + "2 0.000000 0.000000 0.000000 0.000000 \n", + "3 0.000000 0.000000 0.000000 0.000000 \n", + "4 0.000000 0.000000 0.000000 0.000000 \n", + "... ... ... ... ... \n", + "1495 13.176162 39.267874 39.282736 20.531822 \n", + "1496 12.656205 38.924924 12.026726 4.707934 \n", + "1497 10.375772 37.739506 20.121029 5.887561 \n", + "1498 8.219332 35.927831 39.944521 14.062500 \n", + "1499 9.647436 35.972564 24.133148 8.992248 \n", + "\n", + " DOT_USD_stok_200 \n", + "0 0.000000 \n", + "1 0.000000 \n", + "2 0.000000 \n", + "3 0.000000 \n", + "4 0.000000 \n", + "... ... \n", + "1495 42.965779 \n", + "1496 34.846790 \n", + "1497 35.405949 \n", + "1498 37.530754 \n", + "1499 34.980989 \n", + "\n", + "[1500 rows x 483 columns]" ] }, "execution_count": 3, @@ -165,27 +429,27 @@ } ], "source": [ - "data.head(5)" + "X" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 3, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "
" ] @@ -197,45 +461,178 @@ } ], "source": [ - "lag_plot(data['SPY_returns'])" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "lag_plot(data['BTC_returns'])" + "X['BTC_USD_fracdiff_10'].plot()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/anaconda3/envs/quant/lib/python3.9/site-packages/pandas/core/arraylike.py:364: RuntimeWarning: invalid value encountered in log\n", + " result = getattr(ufunc, method)(*inputs, **kwargs)\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "np.log(X['BTC_USD_fracdiff_10']).plot()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "X['BTC_USD_fracdiff_10'].hist()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/anaconda3/envs/quant/lib/python3.9/site-packages/pandas/core/arraylike.py:364: RuntimeWarning: invalid value encountered in log\n", + " result = getattr(ufunc, method)(*inputs, **kwargs)\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "np.log(X['BTC_USD_fracdiff_10']).hist()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "X['BTC_USD_returns'].plot()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'data' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/var/folders/tf/6j1p9w152qscfmn1hcd_06qh0000gn/T/ipykernel_43797/1283503941.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mlag_plot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'BTC_returns'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNameError\u001b[0m: name 'data' is not defined" + ] + } + ], + "source": [ + "lag_plot(X['BTC_returns'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, "outputs": [ { "data": { @@ -256,7 +653,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [ { diff --git a/feature_extractors/feature_extractor_presets.py b/feature_extractors/feature_extractor_presets.py index c23c9a5..ddb3ba1 100644 --- a/feature_extractors/feature_extractor_presets.py +++ b/feature_extractors/feature_extractor_presets.py @@ -1,6 +1,7 @@ from feature_extractors.feature_extractors import feature_lag, feature_mom, feature_ROC, feature_RSI, feature_STOD, feature_STOK, feature_vol, feature_day_of_month, feature_day_of_week, feature_month, feature_debug_future_lookahead from utils.typing import FeatureExtractorConfig from utils.helpers import flatten +from feature_extractors.fractional_differentiation import feature_fractional_differentiation __presets = dict( debug_future_lookahead = [('debug_future', feature_debug_future_lookahead, [1])], @@ -22,6 +23,7 @@ __presets = dict( rsi = [('rsi', feature_ROC, [10, 30, 100])], stod = [('stod', feature_STOD, [10, 30, 200])], stok = [('stok', feature_STOK, [10, 30, 200])], + fracdiff = [('fracdiff', feature_fractional_differentiation, [10, 30])], ) presets = __presets | dict( diff --git a/feature_extractors/fractional_differentiation.py b/feature_extractors/fractional_differentiation.py new file mode 100644 index 0000000..4e8cbad --- /dev/null +++ b/feature_extractors/fractional_differentiation.py @@ -0,0 +1,10 @@ +from fracdiff.sklearn import FracdiffStat +import pandas as pd +import numpy as np + +def feature_fractional_differentiation(df: pd.DataFrame, period: int, is_log_return: bool) -> pd.Series: + feature_selector = FracdiffStat(window = period) + input_series = df["close"].to_numpy().reshape(-1, 1) + feature_selector.fit(input_series) + result = feature_selector.transform(input_series) + return pd.Series(np.log(result.squeeze()), index = df.index) \ No newline at end of file diff --git a/feature_extractors/utils/fracdiff.py b/feature_extractors/utils/fracdiff.py deleted file mode 100644 index a9303cb..0000000 --- a/feature_extractors/utils/fracdiff.py +++ /dev/null @@ -1,240 +0,0 @@ -""" -Fractional differentiation is a technique to make a time series stationary but also -retain as much memory as possible. This is done by differencing by a positive real -number. Fractionally differenced series can be used as a feature in machine learning -process. -""" - -import numpy as np -import pandas as pd - - -class FractionalDifferentiation: - """ - FractionalDifferentiation class encapsulates the functions that can - be used to compute fractionally differentiated series. - """ - - @staticmethod - def get_weights(diff_amt, size): - """ - Advances in Financial Machine Learning, Chapter 5, section 5.4.2, page 79. - - The helper function generates weights that are used to compute fractionally - differentiated series. It computes the weights that get used in the computation - of fractionally differentiated series. This generates a non-terminating series - that approaches zero asymptotically. The side effect of this function is that - it leads to negative drift "caused by an expanding window's added weights" - (see page 83 AFML) - - When diff_amt is real (non-integer) positive number then it preserves memory. - - The book does not discuss what should be expected if d is a negative real - number. Conceptually (from set theory) negative d leads to set of negative - number of elements. And that translates into a set whose elements can be - selected more than once or as many times as one chooses (multisets with - unbounded multiplicity) - see http://faculty.uml.edu/jpropp/msri-up12.pdf. - - :param diff_amt: (float) Differencing amount - :param size: (int) Length of the series - :return: (np.ndarray) Weight vector - """ - - # The algorithm below executes the iterative estimation (section 5.4.2, page 78) - weights = [1.] # create an empty list and initialize the first element with 1. - for k in range(1, size): - weights_ = -weights[-1] * (diff_amt - k + 1) / k # compute the next weight - weights.append(weights_) - - # Now, reverse the list, convert into a numpy column vector - weights = np.array(weights[::-1]).reshape(-1, 1) - return weights - - @staticmethod - def frac_diff(series, diff_amt, thresh=0.01): - """ - Advances in Financial Machine Learning, Chapter 5, section 5.5, page 82. - - References: - https://www.wiley.com/en-us/Advances+in+Financial+Machine+Learning-p-9781119482086 - https://wwwf.imperial.ac.uk/~ejm/M3S8/Problems/hosking81.pdf - https://en.wikipedia.org/wiki/Fractional_calculus - - The steps are as follows: - - Compute weights (this is a one-time exercise) - - Iteratively apply the weights to the price series and generate output points - - This is the expanding window variant of the fracDiff algorithm - Note 1: For thresh-1, nothing is skipped - Note 2: diff_amt can be any positive fractional, not necessarility bounded [0, 1] - - :param series: (pd.Series) A time series that needs to be differenced - :param diff_amt: (float) Differencing amount - :param thresh: (float) Threshold or epsilon - :return: (pd.DataFrame) Differenced series - """ - - # 1. Compute weights for the longest series - weights = get_weights(diff_amt, series.shape[0]) - - # 2. Determine initial calculations to be skipped based on weight-loss threshold - weights_ = np.cumsum(abs(weights)) - weights_ /= weights_[-1] - skip = weights_[weights_ > thresh].shape[0] - - # 3. Apply weights to values - output_df = {} - for name in series.columns: - series_f = series[[name]].fillna(method='ffill').dropna() - output_df_ = pd.Series(index=series.index, dtype='float64') - - for iloc in range(skip, series_f.shape[0]): - loc = series_f.index[iloc] - - # At this point all entries are non-NAs so no need for the following check - # if np.isfinite(series.loc[loc, name]): - output_df_[loc] = np.dot(weights[-(iloc + 1):, :].T, series_f.loc[:loc])[0, 0] - - output_df[name] = output_df_.copy(deep=True) - output_df = pd.concat(output_df, axis=1) - return output_df - - @staticmethod - def get_weights_ffd(diff_amt, thresh, lim): - """ - Advances in Financial Machine Learning, Chapter 5, section 5.4.2, page 83. - - The helper function generates weights that are used to compute fractionally - differentiate dseries. It computes the weights that get used in the computation - of fractionally differentiated series. The series is of fixed width and same - weights (generated by this function) can be used when creating fractional - differentiated series. - This makes the process more efficient. But the side-effect is that the - fractionally differentiated series is skewed and has excess kurtosis. In - other words, it is not Gaussian any more. - - The discussion of positive and negative d is similar to that in get_weights - (see the function get_weights) - - :param diff_amt: (float) Differencing amount - :param thresh: (float) Threshold for minimum weight - :param lim: (int) Maximum length of the weight vector - :return: (np.ndarray) Weight vector - """ - - weights = [1.] - k = 1 - - # The algorithm below executes the iterativetive estimation (section 5.4.2, page 78) - # The output weights array is of the indicated length (specified by lim) - ctr = 0 - while True: - # compute the next weight - weights_ = -weights[-1] * (diff_amt - k + 1) / k - - if abs(weights_) < thresh: - break - - weights.append(weights_) - k += 1 - ctr += 1 - if ctr == lim - 1: # if we have reached the size limit, exit the loop - break - - # Now, reverse the list, convert into a numpy column vector - weights = np.array(weights[::-1]).reshape(-1, 1) - return weights - - @staticmethod - def frac_diff_ffd(series, diff_amt, thresh=1e-5): - """ - Advances in Financial Machine Learning, Chapter 5, section 5.5, page 83. - - References: - - * https://www.wiley.com/en-us/Advances+in+Financial+Machine+Learning-p-9781119482086 - * https://wwwf.imperial.ac.uk/~ejm/M3S8/Problems/hosking81.pdf - * https://en.wikipedia.org/wiki/Fractional_calculus - - The steps are as follows: - - - Compute weights (this is a one-time exercise) - - Iteratively apply the weights to the price series and generate output points - - Constant width window (new solution) - Note 1: thresh determines the cut-off weight for the window - Note 2: diff_amt can be any positive fractional, not necessarity bounded [0, 1]. - - :param series: (pd.Series) A time series that needs to be differenced - :param diff_amt: (float) Differencing amount - :param thresh: (float) Threshold for minimum weight - :return: (pd.DataFrame) A data frame of differenced series - """ - - # 1) Compute weights for the longest series - weights = get_weights_ffd(diff_amt, thresh, series.shape[0]) - width = len(weights) - 1 - - # 2) Apply weights to values - # 2.1) Start by creating a dictionary to hold all the fractionally differenced series - output_df = {} - - # 2.2) compute fractionally differenced series for each stock - for name in series.columns: - series_f = series[[name]].fillna(method='ffill').dropna() - temp_df_ = pd.Series(index=series.index, dtype='float64') - for iloc1 in range(width, series_f.shape[0]): - loc0 = series_f.index[iloc1 - width] - loc1 = series.index[iloc1] - - # At this point all entries are non-NAs, hence no need for the following check - # if np.isfinite(series.loc[loc1, name]): - temp_df_[loc1] = np.dot(weights.T, series_f.loc[loc0:loc1])[0, 0] - - output_df[name] = temp_df_.copy(deep=True) - - # transform the dictionary into a data frame - output_df = pd.concat(output_df, axis=1) - return output_df - - -def get_weights(diff_amt, size): - """ This is a pass-through function """ - return FractionalDifferentiation.get_weights(diff_amt, size) - - -def frac_diff(series, diff_amt, thresh=0.01): - """ This is a pass-through function """ - return FractionalDifferentiation.frac_diff(series, diff_amt, thresh) - - -def get_weights_ffd(diff_amt, thresh, lim): - """ This is a pass-through function """ - return FractionalDifferentiation.get_weights_ffd(diff_amt, thresh, lim) - - -def frac_diff_ffd(series, diff_amt, thresh=1e-5): - """ - Advances in Financial Machine Learning, Chapter 5, section 5.5, page 83. - - References: - - * https://www.wiley.com/en-us/Advances+in+Financial+Machine+Learning-p-9781119482086 - * https://wwwf.imperial.ac.uk/~ejm/M3S8/Problems/hosking81.pdf - * https://en.wikipedia.org/wiki/Fractional_calculus - - The steps are as follows: - - - Compute weights (this is a one-time exercise) - - Iteratively apply the weights to the price series and generate output points - - Constant width window (new solution) - Note 1: thresh determines the cut-off weight for the window - Note 2: diff_amt can be any positive fractional, not necessarity bounded [0, 1]. - - :param series: (pd.Series) A time series that needs to be differenced - :param diff_amt: (float) Differencing amount - :param thresh: (float) Threshold for minimum weight - :return: (pd.DataFrame) A data frame of differenced series - """ - return FractionalDifferentiation.frac_diff_ffd(series, diff_amt, thresh) \ No newline at end of file diff --git a/feature_selection/feature_selection.py b/feature_selection/feature_selection.py index 57d7052..de1ca4a 100644 --- a/feature_selection/feature_selection.py +++ b/feature_selection/feature_selection.py @@ -4,7 +4,7 @@ import pandas as pd from models.base import Model, SKLearnModel from sklearn.decomposition import PCA -def select_features(X: pd.DataFrame, y: pd.Series, model: Model, min_features_to_select: int, backup_model: SKLearnModel) -> pd.DataFrame: +def select_features(X: pd.DataFrame, y: pd.Series, model: Model, n_features_to_select: int, backup_model: SKLearnModel) -> pd.DataFrame: ''' Select features using RFECV, returns a pd.DataFrame (X) with only the selected features.''' if model.model_type != 'ml': return X @@ -16,7 +16,7 @@ def select_features(X: pd.DataFrame, y: pd.Series, model: Model, min_features_to feat_selector_model = backup_model.model # selector = RFECV(feat_selector_model, cv = cv, step=5, min_features_to_select=min_features_to_select) - selector = RFE(feat_selector_model, n_features_to_select=10) + selector = RFE(feat_selector_model, n_features_to_select= n_features_to_select) selector = selector.fit(X, y) print("Kept %d features out of %d" % (selector.n_features_, X.shape[1])) diff --git a/models/average.py b/models/average.py index ce962da..243d049 100644 --- a/models/average.py +++ b/models/average.py @@ -18,7 +18,7 @@ class StaticAverageModel(Model): def predict(self, X): # Make sure there's data to average assert X.shape[1] > 0 - prediction = np.average(X[0]) + prediction = np.average(X[-1]) return np.array([prediction]) def clone(self): diff --git a/run_pipeline.py b/run_pipeline.py index 8fe136d..6d12164 100644 --- a/run_pipeline.py +++ b/run_pipeline.py @@ -8,6 +8,8 @@ from utils.helpers import get_first_valid_return_index, weighted_average from config import get_default_level_1_config, get_default_level_2_config, validate_config, get_model_name from feature_selection.feature_selection import select_features from feature_selection.dim_reduction import reduce_dimensionality +import ray +ray.init() def setup_pipeline(project_name:str, with_wandb: bool, sweep: bool): model_config, training_config, data_config = get_default_level_2_config() @@ -39,7 +41,7 @@ def pipeline(project_name:str, wandb, sweep:bool, model_config:dict, training_co original_X = X.copy() first_valid_index = get_first_valid_return_index(X.iloc[:,0]) samples_to_train = len(y) - first_valid_index - if samples_to_train < training_config['sliding_window_size'] * 3: + if samples_to_train < training_config['sliding_window_size_level1'] * 3: print("Not enough samples to train") continue @@ -52,10 +54,9 @@ def pipeline(project_name:str, wandb, sweep:bool, model_config:dict, training_co print("Feature Selection started") # TODO: this needs to be done per model! backup_model = default_feature_selector_regression if data_config['method'] == 'regression' else default_feature_selector_classification - X = select_features(X, y, model_config['level_1_models'][0][1], min_features_to_select = 10, backup_model = backup_model) + X = select_features(X, y, model_config['level_1_models'][0][1], n_features_to_select = training_config['n_features_to_select'], backup_model = backup_model) print("Feature Selection ended") - # 3. Train Level-1 models current_result, current_predictions = run_single_asset_trainig( ticker_to_predict = asset, @@ -65,8 +66,8 @@ def pipeline(project_name:str, wandb, sweep:bool, model_config:dict, training_co target_returns = target_returns, models = model_config['level_1_models'], method = data_config['method'], - expanding_window = training_config['expanding_window'], - sliding_window_size = training_config['sliding_window_size'], + expanding_window = training_config['expanding_window_level1'], + sliding_window_size = training_config['sliding_window_size_level1'], retrain_every = training_config['retrain_every'], scaler = training_config['scaler'], no_of_classes = data_config['no_of_classes'], @@ -90,8 +91,8 @@ def pipeline(project_name:str, wandb, sweep:bool, model_config:dict, training_co target_returns = target_returns, models = [model_config['level_2_model']], method = data_config['method'], - expanding_window = training_config['expanding_window'], - sliding_window_size = training_config['sliding_window_size'], + expanding_window = training_config['expanding_window_level2'], + sliding_window_size = training_config['sliding_window_size_level2'], retrain_every = training_config['retrain_every'], scaler = training_config['scaler'], no_of_classes = data_config['no_of_classes'], diff --git a/sweep_selection.yaml b/sweep_fracdiff.yaml similarity index 62% rename from sweep_selection.yaml rename to sweep_fracdiff.yaml index 92676c6..e3dd336 100644 --- a/sweep_selection.yaml +++ b/sweep_fracdiff.yaml @@ -1,23 +1,28 @@ program: run_sweep.py -method: bayes +method: grid project: price-forecasting -name: Feature selection +name: Fractional differentiation / number of features metric: goal: maximize name: sharpe parameters: path : value: 'data/' - expanding_window: + expanding_window_level1: value: True - sliding_window_size: + expanding_window_level2: + value: False + sliding_window_size_level1: value: 380 + sliding_window_size_level2: + value: 1 feature_selection: - values: [True, False] + value: True + n_features_to_select: + values: [10, 20, 30] distribution: categorical dimensionality_reduction: - values: [True, False] - distribution: categorical + value: True retrain_every: value: 20 scaler: @@ -27,8 +32,7 @@ parameters: method: value: 'classification' no_of_classes: - values: ['two', 'three-balanced', 'three-imbalanced'] - distribution: categorical + value: 'three-balanced' forecasting_horizon: value: 1 load_other_assets: @@ -42,6 +46,8 @@ parameters: level_2_model: value: "Ensemble_Average" own_features: - value: ['date_days', 'level_2', 'lags_up_to_5'] + values: [['date_days', 'level_2', 'lags_up_to_5'], ['date_days', 'level_2', 'fracdiff']] + distribution: categorical other_features: - value: ['level_2', 'lags_up_to_5'] + values: [['level_2', 'lags_up_to_5'], ['level_2', 'fracdiff']] + distribution: categorical diff --git a/sweep_level_1.yaml b/sweep_level_1.yaml index a767353..db715d2 100644 --- a/sweep_level_1.yaml +++ b/sweep_level_1.yaml @@ -8,12 +8,23 @@ metric: parameters: path : value: 'data/' - expanding_window: + expanding_window_level1: values: [True, False] distribution: categorical - sliding_window_size: + expanding_window_level2: + value: False + feature_selection: + value: True + n_features_to_select: + values: [10, 20, 30] + distribution: categorical + dimensionality_reduction: + value: True + sliding_window_size_level1: values: [180, 280, 380, 480, 580] distribution: categorical + sliding_window_size_level2: + value: 1 retrain_every: values: [10, 20, 30] distribution: categorical diff --git a/sweep_level_2.yaml b/sweep_level_2.yaml index bef58bc..4f1f1ce 100644 --- a/sweep_level_2.yaml +++ b/sweep_level_2.yaml @@ -8,10 +8,23 @@ metric: parameters: path : value: 'data/' - expanding_window: + expanding_window_level1: values: [True, False] distribution: categorical - sliding_window_size: + expanding_window_level2: + values: [True, False] + distribution: categorical + feature_selection: + value: True + n_features_to_select: + values: [10, 20, 30] + distribution: categorical + dimensionality_reduction: + value: True + sliding_window_size_level1: + values: [180, 280, 380] + distribution: categorical + sliding_window_size_level2: values: [180, 280, 380] distribution: categorical retrain_every: diff --git a/utils/load_data.py b/utils/load_data.py index 52ab5e1..b6fe366 100644 --- a/utils/load_data.py +++ b/utils/load_data.py @@ -1,11 +1,9 @@ -#%% import pandas as pd import os import numpy as np from utils.typing import FeatureExtractor from typing import Literal - -#%% +import ray def get_crypto_assets(path: str) -> list[str]: return sorted([f.split('.')[0] for f in os.listdir(path) if os.path.isfile(os.path.join(path,f)) and 'USD' in f and not f.startswith('.')]) @@ -40,13 +38,14 @@ def load_data(path: str, other_files = [f for f in files if load_other_assets == True and f.startswith(target_asset) == False] files = target_file + other_files def is_target_asset(target_asset: str, file: str): return file.split('.')[0].startswith(target_asset) - dfs = [__load_df( + futures = [__load_df.remote( path=os.path.join(path,f), prefix=f.split('.')[0], returns='log_returns' if log_returns else 'returns', feature_extractors=own_features if is_target_asset(target_asset, f) else other_features, narrow_format=narrow_format, ) for f in files] + dfs = ray.get(futures) if narrow_format: dfs = pd.concat(dfs, axis=0).fillna(0.) else: @@ -78,6 +77,7 @@ def load_data(path: str, return X, y, forward_returns +@ray.remote def __load_df(path: str, prefix: str, returns: Literal['price', 'returns', 'log_returns'], @@ -123,7 +123,6 @@ def __apply_feature_extractors(df: pd.DataFrame, return df -# %% def __create_target_cum_forward_returns(df: pd.DataFrame, source_column: str, period: int) -> pd.Series: assert period > 0 return df[source_column].shift(-period)