1098 lines
50 KiB
Plaintext
1098 lines
50 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import pandas as pd\n",
|
|
"import pickle\n",
|
|
"import plotly.graph_objs as go\n",
|
|
"import latextable\n",
|
|
"from texttable import Texttable\n",
|
|
"from strategy.strategy import (\n",
|
|
" BuyAndHoldStrategy,\n",
|
|
" MACDStrategy,\n",
|
|
" RSIStrategy,\n",
|
|
" ModelQuantilePredictionsStrategy,\n",
|
|
" ModelGmadlPredictionsStrategy,\n",
|
|
" ConcatenatedStrategies\n",
|
|
")\n",
|
|
"from strategy.util import (\n",
|
|
" get_data_windows,\n",
|
|
" get_sweep_window_predictions,\n",
|
|
" get_predictions_dataframe\n",
|
|
")\n",
|
|
"from strategy.evaluation import (\n",
|
|
" parameter_sweep,\n",
|
|
" evaluate_strategy\n",
|
|
")\n",
|
|
"from strategy.plotting import (\n",
|
|
" plot_sweep_results\n",
|
|
")\n",
|
|
"\n",
|
|
"PADDING=5000\n",
|
|
"VALID_PART=0.2\n",
|
|
"INTERVAL='5min'\n",
|
|
"METRIC='mod_ir'\n",
|
|
"TOP_N=10"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Failed to detect the name of this notebook, you can set it manually with the WANDB_NOTEBOOK_NAME environment variable to enable code saving.\n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: Downloading large artifact btc-usdt-5m:latest, 745.12MB. 12 files... \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 12 of 12 files downloaded. \n",
|
|
"Done. 0:0:1.3\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"data_windows = get_data_windows(\n",
|
|
" 'wne-masters-thesis-testing',\n",
|
|
" 'btc-usdt-5m:latest',\n",
|
|
" min_window=0, \n",
|
|
" max_window=5\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def sweeps_on_all_windows(data_windows, strategy_class, params, **kwargs):\n",
|
|
" result = []\n",
|
|
" for in_sample, _ in data_windows:\n",
|
|
" data_part = int((1 - VALID_PART) * len(in_sample))\n",
|
|
" result.append(parameter_sweep(in_sample[data_part-PADDING:], strategy_class, params, padding=PADDING, interval=INTERVAL, **kwargs))\n",
|
|
" return result"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"buyandhold_best_strategies = [BuyAndHoldStrategy() for _ in data_windows] "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"100%|██████████| 3840/3840 [00:18<00:00, 206.53it/s]\n",
|
|
"100%|██████████| 3840/3840 [00:18<00:00, 205.12it/s]\n",
|
|
"100%|██████████| 3840/3840 [00:18<00:00, 205.54it/s]\n",
|
|
"100%|██████████| 3840/3840 [00:18<00:00, 204.08it/s]\n",
|
|
"100%|██████████| 3840/3840 [00:18<00:00, 202.37it/s]\n",
|
|
"100%|██████████| 3840/3840 [00:18<00:00, 202.96it/s]\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"MACD_PARAMS = {\n",
|
|
" 'fast_window_size': [2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584],\n",
|
|
" 'slow_window_size': [2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584],\n",
|
|
" 'signal_window_size': [2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584],\n",
|
|
" 'short_sell': [True, False]\n",
|
|
"}\n",
|
|
"MACD_PARAMS_FILTER = lambda p: (\n",
|
|
" p['slow_window_size'] > p['fast_window_size']\n",
|
|
")\n",
|
|
"macd_sweep_results = sweeps_on_all_windows(\n",
|
|
" data_windows,\n",
|
|
" MACDStrategy,\n",
|
|
" MACD_PARAMS,\n",
|
|
" params_filter=MACD_PARAMS_FILTER,\n",
|
|
" sort_by=METRIC)\n",
|
|
"macd_best_strategies = [[strat for _, strat in results[:TOP_N]] for results in macd_sweep_results]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 98,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# plot_sweep_results(pd.DataFrame([result for result, _ in macd_sweep_results[0]]), parameters=MACD_PARAMS.keys(), objective=METRIC)\n",
|
|
"# macd_sweep_results[0][:3]\n",
|
|
"# macd_best_strategies"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"100%|██████████| 11088/11088 [00:51<00:00, 216.64it/s]\n",
|
|
"100%|██████████| 11088/11088 [00:52<00:00, 210.53it/s]\n",
|
|
"100%|██████████| 11088/11088 [00:52<00:00, 210.59it/s]\n",
|
|
"100%|██████████| 11088/11088 [00:52<00:00, 210.06it/s]\n",
|
|
"100%|██████████| 11088/11088 [00:52<00:00, 209.24it/s]\n",
|
|
"100%|██████████| 11088/11088 [00:52<00:00, 209.32it/s]\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"RSI_FILTER = lambda p: (\n",
|
|
" ((p['enter_long'] is not None and (p['enter_short'] is not None or p['exit_long'] is not None))\n",
|
|
" or (p['enter_short'] is not None and (p['exit_short'] is not None or p['enter_long'] is not None)))\n",
|
|
" and (p['enter_short'] is None or p['exit_long'] is None or (p['exit_long'] > p['enter_short']))\n",
|
|
" and (p['enter_long'] is None or p['exit_short'] is None or (p['exit_short'] < p['enter_long'])))\n",
|
|
"\n",
|
|
"RSI_PARAMS = {\n",
|
|
" 'window_size': [2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584],\n",
|
|
" 'enter_long': [None, 70, 75, 80, 85, 90, 95],\n",
|
|
" 'exit_long': [None, 5, 10, 15, 20, 25, 30],\n",
|
|
" 'enter_short': [None, 5, 10, 15, 20, 25, 30],\n",
|
|
" 'exit_short': [None, 70, 75, 80, 85, 90, 95],\n",
|
|
"}\n",
|
|
"rsi_sweep_results = sweeps_on_all_windows(data_windows, RSIStrategy, RSI_PARAMS, params_filter=RSI_FILTER, sort_by=METRIC)\n",
|
|
"rsi_best_strategies = [[strat for _, strat in results[:TOP_N]] for results in rsi_sweep_results]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 100,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# plot_sweep_results(pd.DataFrame([result for result, _ in rsi_sweep_results[0]]), parameters=RSI_PARAMS.keys(), objective=METRIC)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# Model with rmse loss\n",
|
|
"SWEEP_ID = 'filipstefaniuk/wne-masters-thesis-testing/9afp99kz'\n",
|
|
"train_pred_windows = get_sweep_window_predictions(SWEEP_ID, 'train')\n",
|
|
"valid_pred_windows = get_sweep_window_predictions(SWEEP_ID, 'valid')\n",
|
|
"test_pred_windows = get_sweep_window_predictions(SWEEP_ID, 'test')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 9,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"100%|██████████| 1176/1176 [02:10<00:00, 9.04it/s]\n",
|
|
"100%|██████████| 1176/1176 [02:07<00:00, 9.19it/s]\n",
|
|
"100%|██████████| 1176/1176 [02:10<00:00, 9.02it/s]\n",
|
|
"100%|██████████| 1176/1176 [02:16<00:00, 8.59it/s]\n",
|
|
"100%|██████████| 1176/1176 [02:13<00:00, 8.82it/s]\n",
|
|
"100%|██████████| 1176/1176 [02:12<00:00, 8.85it/s]\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"MODEL_RMSE_LOSS_FILTER = lambda p: (\n",
|
|
" ((p['enter_long'] is not None and (p['enter_short'] is not None or p['exit_long'] is not None))\n",
|
|
" or (p['enter_short'] is not None and (p['exit_short'] is not None or p['enter_long'] is not None)))\n",
|
|
" and (p['enter_short'] is None or p['exit_long'] is None or (p['exit_long'] > p['enter_short']))\n",
|
|
" and (p['enter_long'] is None or p['exit_short'] is None or (p['exit_short'] < p['enter_long'])))\n",
|
|
"\n",
|
|
"rmse_model_sweep_results = []\n",
|
|
"for (in_sample, _), train_preds, valid_preds, test_preds in zip(data_windows, train_pred_windows, valid_pred_windows, test_pred_windows):\n",
|
|
" data_part = int((1 - VALID_PART) * len(in_sample))\n",
|
|
" params={\n",
|
|
" 'predictions': [get_predictions_dataframe(train_preds, valid_preds, test_preds)],\n",
|
|
" 'enter_long': [None, 0.001, 0.002, 0.003, 0.004, 0.005, 0.006, 0.007],\n",
|
|
" 'exit_long': [None, -0.001, -0.002, -0.003, -0.004, -0.005, -0.006, -0.007],\n",
|
|
" 'enter_short': [None, -0.001, -0.002, -0.003, -0.004, -0.005, -0.006, -0.007],\n",
|
|
" 'exit_short': [None, 0.001, 0.002, 0.003, 0.004, 0.005, 0.006, 0.007],\n",
|
|
" # 'enter_short': [None],\n",
|
|
" # 'exit_short': [None],\n",
|
|
" }\n",
|
|
" \n",
|
|
" rmse_model_sweep_results.append(parameter_sweep(\n",
|
|
" in_sample[data_part-PADDING:],\n",
|
|
" ModelGmadlPredictionsStrategy,\n",
|
|
" params,\n",
|
|
" params_filter=MODEL_RMSE_LOSS_FILTER,\n",
|
|
" padding=PADDING,\n",
|
|
" interval=INTERVAL,\n",
|
|
" sort_by=METRIC))\n",
|
|
" \n",
|
|
"\n",
|
|
"rmse_model_best_strategies = [[strat for _, strat in results[:TOP_N]] for results in rmse_model_sweep_results]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 10,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# Model with quantile loss\n",
|
|
"SWEEP_ID = 'filipstefaniuk/wne-masters-thesis-testing/8m3hwwmx'\n",
|
|
"train_pred_windows = get_sweep_window_predictions(SWEEP_ID, 'train')\n",
|
|
"valid_pred_windows = get_sweep_window_predictions(SWEEP_ID, 'valid')\n",
|
|
"test_pred_windows = get_sweep_window_predictions(SWEEP_ID, 'test')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 11,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"100%|██████████| 1125/1125 [02:35<00:00, 7.23it/s]\n",
|
|
"100%|██████████| 1125/1125 [02:28<00:00, 7.56it/s]\n",
|
|
"100%|██████████| 1125/1125 [02:35<00:00, 7.22it/s]\n",
|
|
"100%|██████████| 1125/1125 [02:47<00:00, 6.71it/s]\n",
|
|
"100%|██████████| 1125/1125 [02:39<00:00, 7.06it/s]\n",
|
|
"100%|██████████| 1125/1125 [02:35<00:00, 7.25it/s]\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"MODEL_QUANTILE_LOSS_FILTER = lambda p: (\n",
|
|
" ((p['quantile_enter_long'] is not None and (p['quantile_enter_short'] is not None or p['quantile_exit_long'] is not None))\n",
|
|
" or (p['quantile_enter_short'] is not None and (p['quantile_exit_short'] is not None or p['quantile_enter_long'] is not None)))\n",
|
|
" and (p['quantile_enter_short'] is None or p['quantile_exit_long'] is None or (p['quantile_exit_long'] < p['quantile_enter_short']))\n",
|
|
" and (p['quantile_enter_long'] is None or p['quantile_exit_short'] is None or (p['quantile_exit_short'] < p['quantile_enter_long'])))\n",
|
|
"\n",
|
|
"quantile_model_sweep_results = []\n",
|
|
"for (in_sample, _), train_preds, valid_preds, test_preds in zip(data_windows, train_pred_windows, valid_pred_windows, test_pred_windows):\n",
|
|
" data_part = int((1 - VALID_PART) * len(in_sample))\n",
|
|
" params={\n",
|
|
" 'predictions': [get_predictions_dataframe(train_preds, valid_preds, test_preds)],\n",
|
|
" 'quantiles': [[0.01, 0.02, 0.03, 0.05, 0.1, 0.25, 0.5, 0.75, 0.9, 0.95, 0.97, 0.98, 0.99]],\n",
|
|
" 'quantile_enter_long': [None, 0.9, 0.95, 0.97, 0.98, 0.99],\n",
|
|
" 'quantile_exit_long': [None, 0.9, 0.95, 0.97, 0.98, 0.99],\n",
|
|
" 'quantile_enter_short': [None, 0.9, 0.95, 0.97, 0.98, 0.99],\n",
|
|
" 'quantile_exit_short': [None, 0.9, 0.95, 0.97, 0.98, 0.99],\n",
|
|
" 'exchange_fee': [0.001, 0.002, 0.003],\n",
|
|
" 'future': [1]\n",
|
|
" }\n",
|
|
" \n",
|
|
" quantile_model_sweep_results.append(parameter_sweep(\n",
|
|
" in_sample[data_part-PADDING:],\n",
|
|
" ModelQuantilePredictionsStrategy,\n",
|
|
" params,\n",
|
|
" params_filter=MODEL_QUANTILE_LOSS_FILTER,\n",
|
|
" padding=PADDING,\n",
|
|
" interval=INTERVAL,\n",
|
|
" sort_by=METRIC))\n",
|
|
"\n",
|
|
"quantile_model_best_strategies = [[strat for _, strat in results[:TOP_N]] for results in quantile_model_sweep_results]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 103,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# plot_sweep_results(pd.DataFrame([result for result, _ in quantile_model_sweep_results[0]]), parameters=['quantile_enter_long', 'quantile_exit_long', 'quantile_enter_short', 'quantile_exit_short', 'future'], objective=METRIC)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Failed to detect the name of this notebook, you can set it manually with the WANDB_NOTEBOOK_NAME environment variable to enable code saving.\n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n",
|
|
"\u001b[34m\u001b[1mwandb\u001b[0m: 2 of 2 files downloaded. \n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# Model with gmadl loss\n",
|
|
"SWEEP_ID = 'filipstefaniuk/wne-masters-thesis-testing/0pro3i5i'\n",
|
|
"# SWEEP_ID = 'filipstefaniuk/wne-masters-thesis-testing/v3epl3qk'\n",
|
|
"# train_gmadl_pred_windows = get_sweep_window_predictions(SWEEP_ID, 'train')\n",
|
|
"valid_gmadl_pred_windows = get_sweep_window_predictions(SWEEP_ID, 'valid')\n",
|
|
"test_gmadl_pred_windows = get_sweep_window_predictions(SWEEP_ID, 'test')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 13,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"100%|██████████| 1176/1176 [00:58<00:00, 20.16it/s]\n",
|
|
"100%|██████████| 1176/1176 [00:55<00:00, 21.38it/s]\n",
|
|
"100%|██████████| 1176/1176 [00:54<00:00, 21.43it/s]\n",
|
|
"100%|██████████| 1176/1176 [00:54<00:00, 21.38it/s]\n",
|
|
"100%|██████████| 1176/1176 [00:55<00:00, 21.29it/s]\n",
|
|
"100%|██████████| 1176/1176 [00:55<00:00, 21.03it/s]\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"MODEL_GMADL_LOSS_FILTER = lambda p: (\n",
|
|
" ((p['enter_long'] is not None and (p['enter_short'] is not None or p['exit_long'] is not None))\n",
|
|
" or (p['enter_short'] is not None and (p['exit_short'] is not None or p['enter_long'] is not None)))\n",
|
|
" and (p['enter_short'] is None or p['exit_long'] is None or (p['exit_long'] > p['enter_short']))\n",
|
|
" and (p['enter_long'] is None or p['exit_short'] is None or (p['exit_short'] < p['enter_long'])))\n",
|
|
"\n",
|
|
"gmadl_model_sweep_results = []\n",
|
|
"for (in_sample, _), valid_preds, test_preds in zip(data_windows, valid_gmadl_pred_windows, test_gmadl_pred_windows):\n",
|
|
" data_part = int((1 - VALID_PART) * len(in_sample))\n",
|
|
" params={\n",
|
|
" 'predictions': [get_predictions_dataframe(valid_preds, test_preds)],\n",
|
|
" 'enter_long': [None, 0.001, 0.002, 0.003, 0.004, 0.005, 0.006, 0.007],\n",
|
|
" 'exit_long': [None, -0.001, -0.002, -0.003, -0.004, -0.005, -0.006, -0.007],\n",
|
|
" 'enter_short': [None, -0.001, -0.002, -0.003, -0.004, -0.005, -0.006, -0.007],\n",
|
|
" 'exit_short': [None, 0.001, 0.002, 0.003, 0.004, 0.005, 0.006, 0.007],\n",
|
|
" }\n",
|
|
" \n",
|
|
" gmadl_model_sweep_results.append(parameter_sweep(\n",
|
|
" in_sample[data_part-PADDING:],\n",
|
|
" ModelGmadlPredictionsStrategy,\n",
|
|
" params,\n",
|
|
" params_filter=MODEL_GMADL_LOSS_FILTER,\n",
|
|
" padding=PADDING,\n",
|
|
" interval=INTERVAL,\n",
|
|
" sort_by=METRIC))\n",
|
|
" \n",
|
|
"\n",
|
|
"gmadl_model_best_strategies = [[strat for _, strat in results[:TOP_N]] for results in gmadl_model_sweep_results]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 15,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Persist best strategies, so that they don't have to be recomputed every time\n",
|
|
"best_strategies = {\n",
|
|
" 'buy_and_hold': buyandhold_best_strategies,\n",
|
|
" 'macd_strategies': macd_best_strategies,\n",
|
|
" 'rsi_strategies': rsi_best_strategies,\n",
|
|
" 'rmse_model': rmse_model_best_strategies,\n",
|
|
" 'quantile_model': quantile_model_best_strategies,\n",
|
|
" 'gmadl_model': gmadl_model_best_strategies\n",
|
|
"}\n",
|
|
"\n",
|
|
"with open('cache/5min-best-strategies-v2.pkl', 'wb') as outp:\n",
|
|
" pickle.dump(best_strategies, outp, pickle.HIGHEST_PROTOCOL)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Visualizations & Tables"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"with open('cache/5min-best-strategies-v2.pkl', 'rb') as inpt:\n",
|
|
" best_strategies = pickle.load(inpt)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"#### Tables with parameters"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 53,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\\begin{table}\n",
|
|
"\t\\begin{center}\n",
|
|
"\t\t\\begin{tabular}{lcccc}\n",
|
|
"\t\t\t\\textbf{Window} & \\textbf{Fast Window Size} & \\textbf{Slow Window Size} & \\textbf{Signal Window Size} & \\textbf{Short sell} \\\\\n",
|
|
"\t\t\t\\hline\n",
|
|
"\t\t\tWindow 1 & 8 & 2584 & 987 & True \\\\\n",
|
|
"\t\t\tWindow 2 & 377 & 610 & 610 & True \\\\\n",
|
|
"\t\t\tWindow 3 & 987 & 2584 & 987 & True \\\\\n",
|
|
"\t\t\tWindow 4 & 610 & 2584 & 987 & True \\\\\n",
|
|
"\t\t\tWindow 5 & 987 & 1597 & 987 & False \\\\\n",
|
|
"\t\t\tWindow 6 & 1597 & 2584 & 377 & False \\\\\n",
|
|
"\t\t\\end{tabular}\n",
|
|
"\t\\end{center}\n",
|
|
"\\end{table}\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# Best hparams for MACD strategy\n",
|
|
"table_macd_params = Texttable()\n",
|
|
"table_macd_params.set_deco(Texttable.HEADER)\n",
|
|
"table_macd_params.set_cols_align([\"l\", \"c\", \"c\", \"c\", \"c\"])\n",
|
|
"table_macd_params.header([\n",
|
|
" \"\\\\textbf{Window}\",\n",
|
|
" \"\\\\textbf{Fast Window Size}\",\n",
|
|
" \"\\\\textbf{Slow Window Size}\",\n",
|
|
" \"\\\\textbf{Signal Window Size}\",\n",
|
|
" \"\\\\textbf{Short sell}\"\n",
|
|
"])\n",
|
|
"\n",
|
|
"for i, macd_strategy in enumerate(best_strategies['macd_strategies']):\n",
|
|
" macd_strategy_info = macd_strategy[0].info()\n",
|
|
" table_macd_params.add_row([\n",
|
|
" f\"Window {i+1}\",\n",
|
|
" macd_strategy_info['fast_window_size'],\n",
|
|
" macd_strategy_info['slow_window_size'],\n",
|
|
" macd_strategy_info['signal_window_size'],\n",
|
|
" macd_strategy_info['short_sell']\n",
|
|
" ])\n",
|
|
"print(latextable.draw_latex(table_macd_params))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 55,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\\begin{table}\n",
|
|
"\t\\begin{center}\n",
|
|
"\t\t\\begin{tabular}{lccccc}\n",
|
|
"\t\t\t\\textbf{Window} & \\textbf{\\textit{window}} & \\textbf{\\textit{enter long}} & \\textbf{\\textit{exit long}} & \\textbf{\\textit{enter short}} & \\textbf{\\textit{exit short}} \\\\\n",
|
|
"\t\t\t\\hline\n",
|
|
"\t\t\tW1-5min & 21 & 80 & - & 25 & - \\\\\n",
|
|
"\t\t\tW2-5min & 34 & 75 & - & 25 & - \\\\\n",
|
|
"\t\t\tW3-5min & 5 & 95 & - & 15 & - \\\\\n",
|
|
"\t\t\tW4-5min & 8 & 90 & 5 & - & 85 \\\\\n",
|
|
"\t\t\tW5-5min & 13 & 90 & 20 & - & 85 \\\\\n",
|
|
"\t\t\tW6-5min & 21 & 85 & 15 & - & - \\\\\n",
|
|
"\t\t\\end{tabular}\n",
|
|
"\t\\end{center}\n",
|
|
"\\end{table}\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"table_rsi_params = Texttable()\n",
|
|
"table_rsi_params.set_deco(Texttable.HEADER)\n",
|
|
"table_rsi_params.set_cols_align([\"l\", \"c\",\"c\", \"c\", \"c\", \"c\"])\n",
|
|
"table_rsi_params.header([\n",
|
|
" \"\\\\textbf{Window}\",\n",
|
|
" \"\\\\textbf{\\\\textit{window}}\",\n",
|
|
" \"\\\\textbf{\\\\textit{enter long}}\",\n",
|
|
" \"\\\\textbf{\\\\textit{exit long}}\",\n",
|
|
" \"\\\\textbf{\\\\textit{enter short}}\",\n",
|
|
" \"\\\\textbf{\\\\textit{exit short}}\"\n",
|
|
"])\n",
|
|
"\n",
|
|
"for i, rsi_strategy in enumerate(best_strategies['rsi_strategies']):\n",
|
|
" rsi_strategy_info = rsi_strategy[0].info()\n",
|
|
" table_rsi_params.add_row([\n",
|
|
" f\"W{i+1}-5min\",\n",
|
|
" rsi_strategy_info['window_size'] or '-',\n",
|
|
" rsi_strategy_info['enter_long'] or '-',\n",
|
|
" rsi_strategy_info['exit_long'] or '-',\n",
|
|
" rsi_strategy_info['enter_short'] or '-',\n",
|
|
" rsi_strategy_info['exit_short'] or '-'\n",
|
|
" ])\n",
|
|
"print(latextable.draw_latex(table_rsi_params))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\\begin{table}\n",
|
|
"\t\\begin{center}\n",
|
|
"\t\t\\begin{tabular}{lcccc}\n",
|
|
"\t\t\t\\textbf{Window} & \\textbf{\\textit{enter long}} & \\textbf{\\textit{exit Long}} & \\textbf{\\textit{enter Short}} & \\textbf{\\textit{exit Short}} \\\\\n",
|
|
"\t\t\t\\hline\n",
|
|
"\t\t\tW1-5min & 0.002 & - & -0.001 & 0.001 \\\\\n",
|
|
"\t\t\tW2-5min & - & - & -0.001 & 0.001 \\\\\n",
|
|
"\t\t\tW3-5min & - & - & -0.001 & 0.001 \\\\\n",
|
|
"\t\t\tW4-5min & - & - & -0.001 & 0.001 \\\\\n",
|
|
"\t\t\tW5-5min & - & - & -0.001 & 0.001 \\\\\n",
|
|
"\t\t\tW6-5min & - & - & -0.001 & 0.001 \\\\\n",
|
|
"\t\t\\end{tabular}\n",
|
|
"\t\\end{center}\n",
|
|
"\\end{table}\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"table_rmse_params = Texttable()\n",
|
|
"table_rmse_params.set_deco(Texttable.HEADER)\n",
|
|
"table_rmse_params.set_cols_align([\"l\", \"c\",\"c\", \"c\", \"c\"])\n",
|
|
"table_rmse_params.header([\n",
|
|
" \"\\\\textbf{Window}\",\n",
|
|
" \"\\\\textbf{\\\\textit{enter long}}\",\n",
|
|
" \"\\\\textbf{\\\\textit{exit Long}}\",\n",
|
|
" \"\\\\textbf{\\\\textit{enter Short}}\",\n",
|
|
" \"\\\\textbf{\\\\textit{exit Short}}\",\n",
|
|
"])\n",
|
|
"\n",
|
|
"for i, rmse_strategy in enumerate(best_strategies['rmse_model']):\n",
|
|
" rmse_strategy_info = rmse_strategy[0].info()\n",
|
|
" table_rmse_params.add_row([\n",
|
|
" f\"W{i+1}-{INTERVAL}\",\n",
|
|
" rmse_strategy_info['enter_long'] or '-',\n",
|
|
" rmse_strategy_info['exit_long'] or '-',\n",
|
|
" rmse_strategy_info['enter_short'] or '-',\n",
|
|
" rmse_strategy_info['exit_short'] or '-'\n",
|
|
" ])\n",
|
|
"print(latextable.draw_latex(table_rmse_params))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 56,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\\begin{table}\n",
|
|
"\t\\begin{center}\n",
|
|
"\t\t\\begin{tabular}{lccccc}\n",
|
|
"\t\t\t\\textbf{Window} & \\textbf{\\textit{enter long}} & \\textbf{\\textit{exit Long}} & \\textbf{\\textit{enter Short}} & \\textbf{\\textit{exit Short}} & \\textbf{\\textit{threshold}} \\\\\n",
|
|
"\t\t\t\\hline\n",
|
|
"\t\t\tW1-5min & - & 0.970 & 0.980 & 0.970 & 0.003 \\\\\n",
|
|
"\t\t\tW2-5min & 0.970 & - & 0.950 & - & 0.003 \\\\\n",
|
|
"\t\t\tW3-5min & 0.990 & - & 0.950 & - & 0.002 \\\\\n",
|
|
"\t\t\tW4-5min & 0.970 & 0.990 & - & 0.900 & 0.003 \\\\\n",
|
|
"\t\t\tW5-5min & 0.900 & 0.900 & - & - & 0.002 \\\\\n",
|
|
"\t\t\tW6-5min & 0.950 & 0.950 & - & - & 0.003 \\\\\n",
|
|
"\t\t\\end{tabular}\n",
|
|
"\t\\end{center}\n",
|
|
"\\end{table}\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"table_quantile_params = Texttable()\n",
|
|
"table_quantile_params.set_deco(Texttable.HEADER)\n",
|
|
"table_quantile_params.set_cols_align([\"l\", \"c\",\"c\", \"c\", \"c\", \"c\"])\n",
|
|
"table_quantile_params.header([\n",
|
|
" \"\\\\textbf{Window}\",\n",
|
|
" \"\\\\textbf{\\\\textit{enter long}}\",\n",
|
|
" \"\\\\textbf{\\\\textit{exit Long}}\",\n",
|
|
" \"\\\\textbf{\\\\textit{enter Short}}\",\n",
|
|
" \"\\\\textbf{\\\\textit{exit Short}}\",\n",
|
|
" \"\\\\textbf{\\\\textit{threshold}}\"\n",
|
|
"])\n",
|
|
"\n",
|
|
"for i, quantile_strategy in enumerate(best_strategies['quantile_model']):\n",
|
|
" quantile_strategy_info = quantile_strategy[0].info()\n",
|
|
" table_quantile_params.add_row([\n",
|
|
" f\"W{i+1}-{INTERVAL}\",\n",
|
|
" quantile_strategy_info['quantile_enter_long'] or '-',\n",
|
|
" quantile_strategy_info['quantile_exit_long'] or '-',\n",
|
|
" quantile_strategy_info['quantile_enter_short'] or '-',\n",
|
|
" quantile_strategy_info['quantile_exit_short'] or '-',\n",
|
|
" quantile_strategy_info['exchange_fee']\n",
|
|
" ])\n",
|
|
"print(latextable.draw_latex(table_quantile_params))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 57,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\\begin{table}\n",
|
|
"\t\\begin{center}\n",
|
|
"\t\t\\begin{tabular}{lcccc}\n",
|
|
"\t\t\t\\textbf{Window} & \\textbf{\\textit{enter long}} & \\textbf{\\textit{exit Long}} & \\textbf{\\textit{enter Short}} & \\textbf{\\textit{exit Short}} \\\\\n",
|
|
"\t\t\t\\hline\n",
|
|
"\t\t\tW1-5min & 0.004 & - & -0.005 & - \\\\\n",
|
|
"\t\t\tW2-5min & 0.002 & - & -0.001 & - \\\\\n",
|
|
"\t\t\tW3-5min & - & - & -0.006 & 0.003 \\\\\n",
|
|
"\t\t\tW4-5min & 0.002 & - & -0.005 & - \\\\\n",
|
|
"\t\t\tW5-5min & 0.002 & - & -0.003 & - \\\\\n",
|
|
"\t\t\tW6-5min & 0.001 & - & -0.007 & - \\\\\n",
|
|
"\t\t\\end{tabular}\n",
|
|
"\t\\end{center}\n",
|
|
"\\end{table}\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"table_gmadl_params = Texttable()\n",
|
|
"table_gmadl_params.set_deco(Texttable.HEADER)\n",
|
|
"table_gmadl_params.set_cols_align([\"l\", \"c\",\"c\", \"c\", \"c\"])\n",
|
|
"table_gmadl_params.header([\n",
|
|
" \"\\\\textbf{Window}\",\n",
|
|
" \"\\\\textbf{\\\\textit{enter long}}\",\n",
|
|
" \"\\\\textbf{\\\\textit{exit Long}}\",\n",
|
|
" \"\\\\textbf{\\\\textit{enter Short}}\",\n",
|
|
" \"\\\\textbf{\\\\textit{exit Short}}\",\n",
|
|
"])\n",
|
|
"\n",
|
|
"for i, gmadl_strategy in enumerate(best_strategies['gmadl_model']):\n",
|
|
" gmadl_strategy_info = gmadl_strategy[0].info()\n",
|
|
" table_gmadl_params.add_row([\n",
|
|
" f\"W{i+1}-{INTERVAL}\",\n",
|
|
" gmadl_strategy_info['enter_long'] or '-',\n",
|
|
" gmadl_strategy_info['exit_long'] or '-',\n",
|
|
" gmadl_strategy_info['enter_short'] or '-',\n",
|
|
" gmadl_strategy_info['exit_short'] or '-'\n",
|
|
" ])\n",
|
|
"print(latextable.draw_latex(table_gmadl_params))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"#### Evaluation on the windows"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def results_plot(idx, result_buyandhold, result_macd, result_rsi, result_rmse_model, result_quantile_model, result_gmadl_model, width=850, height=500, notitle=False, v_lines=None):\n",
|
|
"\n",
|
|
" fig = go.Figure([\n",
|
|
" go.Scatter(y=result_buyandhold['portfolio_value'], x=result_buyandhold['time'], name=\"Buy and Hold\"),\n",
|
|
" go.Scatter(y=result_macd['portfolio_value'], x=result_macd['time'], name=\"MACD Strategy\"),\n",
|
|
" go.Scatter(y=result_rsi['portfolio_value'], x=result_rsi['time'], name=\"RSI Strategy\"),\n",
|
|
" go.Scatter(y=result_rmse_model['portfolio_value'], x=result_rmse_model['time'], name='RMSE Informer Strategy'),\n",
|
|
" go.Scatter(y=result_quantile_model['portfolio_value'], x=result_quantile_model['time'], name='Quantile Informer Strategy'),\n",
|
|
" go.Scatter(y=result_gmadl_model['portfolio_value'], x=result_gmadl_model['time'], name='GMADL Informer Strategy')\n",
|
|
" ])\n",
|
|
" \n",
|
|
" if v_lines:\n",
|
|
" for v_line in v_lines:\n",
|
|
" fig.add_shape(\n",
|
|
" go.layout.Shape(type=\"line\",\n",
|
|
" yref=\"paper\",\n",
|
|
" xref=\"x\",\n",
|
|
" x0=v_line,\n",
|
|
" x1=v_line,\n",
|
|
" y0=0,\n",
|
|
" y1=1,\n",
|
|
" line=dict(dash='dash', color='rgb(140,140,140)')))\n",
|
|
" fig.update_layout(\n",
|
|
" title={\n",
|
|
" 'text': f\"W{idx}-{INTERVAL}\",\n",
|
|
" 'y':0.97,\n",
|
|
" 'x':0.5,\n",
|
|
" 'xanchor': 'center',\n",
|
|
" 'yanchor': 'top'} if not notitle else None,\n",
|
|
" yaxis_title=\"Portfolio Value\",\n",
|
|
" xaxis_title=\"Date\",\n",
|
|
" font=dict(\n",
|
|
" # family=\"Courier New, monospace\",\n",
|
|
" size=14,\n",
|
|
" ),\n",
|
|
" autosize=False,\n",
|
|
" width=width,\n",
|
|
" height=height,\n",
|
|
" margin=dict(l=20, r=20, t=20 if notitle else 110, b=20),\n",
|
|
" plot_bgcolor='white',\n",
|
|
" legend=dict(\n",
|
|
" orientation=\"h\",\n",
|
|
" yanchor=\"bottom\",\n",
|
|
" y=1.02,\n",
|
|
" xanchor=\"left\",\n",
|
|
" x=0.02\n",
|
|
" )\n",
|
|
" )\n",
|
|
" fig.update_xaxes(\n",
|
|
" mirror=True,\n",
|
|
" ticks='outside',\n",
|
|
" showline=True,\n",
|
|
" linecolor='black',\n",
|
|
" gridcolor='lightgrey'\n",
|
|
" )\n",
|
|
" fig.update_yaxes(\n",
|
|
" mirror=True,\n",
|
|
" ticks='outside',\n",
|
|
" showline=True,\n",
|
|
" linecolor='black',\n",
|
|
" gridcolor='lightgrey'\n",
|
|
" )\n",
|
|
" fig.write_image(f\"images/eval-w{idx}-{INTERVAL}.png\")\n",
|
|
" fig.show()\n",
|
|
" \n",
|
|
"def results_table(result_buyandhold, result_macd, result_rsi, result_rmse_model, result_quantile_model, result_gmadl_model):\n",
|
|
" table_eval_windows = Texttable()\n",
|
|
" table_eval_windows.set_deco(Texttable.HEADER)\n",
|
|
" table_eval_windows.set_cols_align([\"l\", \"c\",\"c\", \"c\", \"c\", \"c\", \"c\", \"c\", \"c\", \"c\"])\n",
|
|
" table_eval_windows.set_precision(3)\n",
|
|
"\n",
|
|
" table_eval_windows.header([\n",
|
|
" \"\\\\textbf{Strategy}\",\n",
|
|
" \"\\\\textbf{VAL}\",\n",
|
|
" \"\\\\textbf{ARC}\",\n",
|
|
" \"\\\\textbf{ASD}\",\n",
|
|
" \"\\\\textbf{IR*}\",\n",
|
|
" \"\\\\textbf{MD}\",\n",
|
|
" \"\\\\textbf{IR**}\",\n",
|
|
" \"\\\\textbf{N}\",\n",
|
|
" \"\\\\textbf{LONG}\",\n",
|
|
" \"\\\\textbf{SHORT}\",\n",
|
|
" ])\n",
|
|
"\n",
|
|
" strategy_name_result = [\n",
|
|
" ('Buy and Hold', result_buyandhold),\n",
|
|
" ('MACD Strategy', result_macd),\n",
|
|
" ('RSI Strategy', result_rsi),\n",
|
|
" ('RMSE Informer', result_rmse_model),\n",
|
|
" ('Quantile Informer', result_quantile_model),\n",
|
|
" ('GMADL Informer', result_gmadl_model)\n",
|
|
" ]\n",
|
|
" for strategy_name, result in strategy_name_result:\n",
|
|
" table_eval_windows.add_row([\n",
|
|
" strategy_name,\n",
|
|
" result['value'],\n",
|
|
" f\"{result['arc']*100:.2f}\\%\",\n",
|
|
" f\"{result['asd']*100:.2f}\\%\",\n",
|
|
" result['ir'],\n",
|
|
" f\"{result['md']*100:.2f}\\%\",\n",
|
|
" result['mod_ir'],\n",
|
|
" result['n_trades'],\n",
|
|
" f\"{result['long_pos']*100:.2f}\\%\",\n",
|
|
" f\"{result['short_pos']*100:.2f}\\%\",\n",
|
|
" ])\n",
|
|
" print(latextable.draw_latex(table_eval_windows))\n",
|
|
"\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 11,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\\begin{table}\n",
|
|
"\t\\begin{center}\n",
|
|
"\t\t\\begin{tabular}{lccccccccc}\n",
|
|
"\t\t\t\\textbf{Strategy} & \\textbf{VAL} & \\textbf{ARC} & \\textbf{ASD} & \\textbf{IR*} & \\textbf{MD} & \\textbf{IR**} & \\textbf{N} & \\textbf{LONG} & \\textbf{SHORT} \\\\\n",
|
|
"\t\t\t\\hline\n",
|
|
"\t\t\tBuy and Hold & 0.930 & -13.76\\% & 70.24\\% & -0.196 & 51.87\\% & -0.052 & 2 & 100.00\\% & 0.00\\% \\\\\n",
|
|
"\t\t\tMACD Strategy & 0.375 & -86.35\\% & 70.71\\% & -1.221 & 71.90\\% & -1.467 & 1542 & 52.05\\% & 47.95\\% \\\\\n",
|
|
"\t\t\tRSI Strategy & 1.428 & 106.05\\% & 70.55\\% & 1.503 & 26.24\\% & 6.074 & 114 & 26.31\\% & 73.69\\% \\\\\n",
|
|
"\t\t\tRMSE Informer & 0.965 & -6.93\\% & 3.11\\% & -2.227 & 3.54\\% & -4.361 & 12 & 0.02\\% & 0.00\\% \\\\\n",
|
|
"\t\t\tQuantile Informer & 1.117 & 25.15\\% & 43.69\\% & 0.576 & 16.27\\% & 0.889 & 365 & 0.00\\% & 45.14\\% \\\\\n",
|
|
"\t\t\tGMADL Informer & 1.502 & 128.10\\% & 70.54\\% & 1.816 & 30.70\\% & 7.576 & 82 & 41.54\\% & 58.46\\% \\\\\n",
|
|
"\t\t\\end{tabular}\n",
|
|
"\t\\end{center}\n",
|
|
"\\end{table}\n",
|
|
"\\begin{table}\n",
|
|
"\t\\begin{center}\n",
|
|
"\t\t\\begin{tabular}{lccccccccc}\n",
|
|
"\t\t\t\\textbf{Strategy} & \\textbf{VAL} & \\textbf{ARC} & \\textbf{ASD} & \\textbf{IR*} & \\textbf{MD} & \\textbf{IR**} & \\textbf{N} & \\textbf{LONG} & \\textbf{SHORT} \\\\\n",
|
|
"\t\t\t\\hline\n",
|
|
"\t\t\tBuy and Hold & 0.549 & -70.37\\% & 74.61\\% & -0.943 & 63.35\\% & -1.048 & 2 & 100.00\\% & 0.00\\% \\\\\n",
|
|
"\t\t\tMACD Strategy & 0.498 & -75.63\\% & 74.63\\% & -1.013 & 62.97\\% & -1.217 & 446 & 50.72\\% & 49.28\\% \\\\\n",
|
|
"\t\t\tRSI Strategy & 1.368 & 88.76\\% & 74.58\\% & 1.190 & 27.34\\% & 3.864 & 78 & 61.40\\% & 38.60\\% \\\\\n",
|
|
"\t\t\tRMSE Informer & 1 & 0.00\\% & 0.00\\% & 0 & 0.00\\% & 0 & 0 & 0.00\\% & 0.00\\% \\\\\n",
|
|
"\t\t\tQuantile Informer & 0.941 & -11.54\\% & 74.69\\% & -0.154 & 44.84\\% & -0.040 & 990 & 50.50\\% & 49.50\\% \\\\\n",
|
|
"\t\t\tGMADL Informer & 1.635 & 170.94\\% & 74.67\\% & 2.289 & 30.47\\% & 12.844 & 522 & 20.20\\% & 79.80\\% \\\\\n",
|
|
"\t\t\\end{tabular}\n",
|
|
"\t\\end{center}\n",
|
|
"\\end{table}\n",
|
|
"\\begin{table}\n",
|
|
"\t\\begin{center}\n",
|
|
"\t\t\\begin{tabular}{lccccccccc}\n",
|
|
"\t\t\t\\textbf{Strategy} & \\textbf{VAL} & \\textbf{ARC} & \\textbf{ASD} & \\textbf{IR*} & \\textbf{MD} & \\textbf{IR**} & \\textbf{N} & \\textbf{LONG} & \\textbf{SHORT} \\\\\n",
|
|
"\t\t\t\\hline\n",
|
|
"\t\t\tBuy and Hold & 1.016 & 3.23\\% & 51.77\\% & 0.062 & 37.98\\% & 0.005 & 2 & 100.00\\% & 0.00\\% \\\\\n",
|
|
"\t\t\tMACD Strategy & 1.081 & 17.10\\% & 51.79\\% & 0.330 & 20.87\\% & 0.270 & 154 & 58.24\\% & 41.76\\% \\\\\n",
|
|
"\t\t\tRSI Strategy & 1.127 & 27.41\\% & 51.92\\% & 0.528 & 22.30\\% & 0.649 & 398 & 11.48\\% & 88.52\\% \\\\\n",
|
|
"\t\t\tRMSE Informer & 1 & 0.00\\% & 0.00\\% & 0 & 0.00\\% & 0 & 0 & 0.00\\% & 0.00\\% \\\\\n",
|
|
"\t\t\tQuantile Informer & 1.057 & 11.93\\% & 51.90\\% & 0.230 & 30.10\\% & 0.091 & 894 & 27.62\\% & 72.38\\% \\\\\n",
|
|
"\t\t\tGMADL Informer & 1.198 & 44.15\\% & 19.18\\% & 2.302 & 7.68\\% & 13.227 & 16 & 0.00\\% & 17.86\\% \\\\\n",
|
|
"\t\t\\end{tabular}\n",
|
|
"\t\\end{center}\n",
|
|
"\\end{table}\n",
|
|
"\\begin{table}\n",
|
|
"\t\\begin{center}\n",
|
|
"\t\t\\begin{tabular}{lccccccccc}\n",
|
|
"\t\t\t\\textbf{Strategy} & \\textbf{VAL} & \\textbf{ARC} & \\textbf{ASD} & \\textbf{IR*} & \\textbf{MD} & \\textbf{IR**} & \\textbf{N} & \\textbf{LONG} & \\textbf{SHORT} \\\\\n",
|
|
"\t\t\t\\hline\n",
|
|
"\t\t\tBuy and Hold & 1.231 & 52.35\\% & 45.25\\% & 1.157 & 22.29\\% & 2.718 & 2 & 100.00\\% & 0.00\\% \\\\\n",
|
|
"\t\t\tMACD Strategy & 1.612 & 163.18\\% & 45.34\\% & 3.599 & 21.23\\% & 27.660 & 190 & 44.69\\% & 55.31\\% \\\\\n",
|
|
"\t\t\tRSI Strategy & 0.866 & -25.30\\% & 19.03\\% & -1.330 & 15.65\\% & -2.150 & 205 & 23.63\\% & 0.00\\% \\\\\n",
|
|
"\t\t\tRMSE Informer & 1 & 0.00\\% & 0.00\\% & 0 & 0.00\\% & 0 & 0 & 0.00\\% & 0.00\\% \\\\\n",
|
|
"\t\t\tQuantile Informer & 0.825 & -32.24\\% & 27.88\\% & -1.156 & 22.72\\% & -1.641 & 290 & 44.45\\% & 0.00\\% \\\\\n",
|
|
"\t\t\tGMADL Informer & 1.673 & 183.80\\% & 45.26\\% & 4.061 & 24.78\\% & 30.125 & 62 & 65.14\\% & 34.86\\% \\\\\n",
|
|
"\t\t\\end{tabular}\n",
|
|
"\t\\end{center}\n",
|
|
"\\end{table}\n",
|
|
"\\begin{table}\n",
|
|
"\t\\begin{center}\n",
|
|
"\t\t\\begin{tabular}{lccccccccc}\n",
|
|
"\t\t\t\\textbf{Strategy} & \\textbf{VAL} & \\textbf{ARC} & \\textbf{ASD} & \\textbf{IR*} & \\textbf{MD} & \\textbf{IR**} & \\textbf{N} & \\textbf{LONG} & \\textbf{SHORT} \\\\\n",
|
|
"\t\t\t\\hline\n",
|
|
"\t\t\tBuy and Hold & 1.439 & 109.23\\% & 44.72\\% & 2.443 & 21.07\\% & 12.664 & 2 & 100.00\\% & 0.00\\% \\\\\n",
|
|
"\t\t\tMACD Strategy & 1.346 & 82.57\\% & 32.85\\% & 2.514 & 15.44\\% & 13.447 & 94 & 49.06\\% & 0.00\\% \\\\\n",
|
|
"\t\t\tRSI Strategy & 1.169 & 37.33\\% & 13.86\\% & 2.692 & 4.73\\% & 21.237 & 42 & 5.67\\% & 0.00\\% \\\\\n",
|
|
"\t\t\tRMSE Informer & 0.667 & -56.06\\% & 36.94\\% & -1.518 & 42.77\\% & -1.989 & 3 & 0.00\\% & 57.45\\% \\\\\n",
|
|
"\t\t\tQuantile Informer & 0.984 & -3.12\\% & 33.97\\% & -0.092 & 20.63\\% & -0.014 & 578 & 59.26\\% & 0.00\\% \\\\\n",
|
|
"\t\t\tGMADL Informer & 1.582 & 153.60\\% & 45.11\\% & 3.405 & 14.37\\% & 36.394 & 130 & 44.70\\% & 55.30\\% \\\\\n",
|
|
"\t\t\\end{tabular}\n",
|
|
"\t\\end{center}\n",
|
|
"\\end{table}\n",
|
|
"\\begin{table}\n",
|
|
"\t\\begin{center}\n",
|
|
"\t\t\\begin{tabular}{lccccccccc}\n",
|
|
"\t\t\t\\textbf{Strategy} & \\textbf{VAL} & \\textbf{ARC} & \\textbf{ASD} & \\textbf{IR*} & \\textbf{MD} & \\textbf{IR**} & \\textbf{N} & \\textbf{LONG} & \\textbf{SHORT} \\\\\n",
|
|
"\t\t\t\\hline\n",
|
|
"\t\t\tBuy and Hold & 1.560 & 146.27\\% & 52.72\\% & 2.775 & 26.96\\% & 15.054 & 2 & 100.00\\% & 0.00\\% \\\\\n",
|
|
"\t\t\tMACD Strategy & 1.179 & 39.63\\% & 34.65\\% & 1.144 & 28.87\\% & 1.570 & 111 & 47.58\\% & 0.00\\% \\\\\n",
|
|
"\t\t\tRSI Strategy & 1.507 & 129.58\\% & 38.15\\% & 3.396 & 17.97\\% & 24.493 & 7 & 41.29\\% & 0.00\\% \\\\\n",
|
|
"\t\t\tRMSE Informer & 1 & 0.00\\% & 0.00\\% & 0 & 0.00\\% & 0 & 0 & 0.00\\% & 0.00\\% \\\\\n",
|
|
"\t\t\tQuantile Informer & 1.056 & 11.76\\% & 40.73\\% & 0.289 & 30.60\\% & 0.111 & 280 & 59.60\\% & 0.00\\% \\\\\n",
|
|
"\t\t\tGMADL Informer & 1.253 & 57.92\\% & 52.71\\% & 1.099 & 32.66\\% & 1.949 & 34 & 97.21\\% & 2.79\\% \\\\\n",
|
|
"\t\t\\end{tabular}\n",
|
|
"\t\\end{center}\n",
|
|
"\\end{table}\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"for i, (in_sample, out_of_sample) in enumerate(data_windows):\n",
|
|
" padded_window = pd.concat([in_sample.iloc[-PADDING:], out_of_sample])\n",
|
|
" result_buyandhold = evaluate_strategy(padded_window, best_strategies['buy_and_hold'][i], padding=PADDING, interval=INTERVAL)\n",
|
|
" result_macd = evaluate_strategy(padded_window, [s[0] for s in best_strategies['macd_strategies']][i], padding=PADDING, interval=INTERVAL)\n",
|
|
" result_rsi = evaluate_strategy(padded_window, [s[0] for s in best_strategies['rsi_strategies']][i], padding=PADDING, interval=INTERVAL)\n",
|
|
" result_rmse_model = evaluate_strategy(padded_window, [s[0] for s in best_strategies['rmse_model']][i], padding=PADDING, interval=INTERVAL)\n",
|
|
" result_quantile_model = evaluate_strategy(padded_window, [s[0] for s in best_strategies['quantile_model']][i], padding=PADDING, interval=INTERVAL)\n",
|
|
" result_gmadl_model = evaluate_strategy(padded_window, [s[0] for s in best_strategies['gmadl_model']][i], padding=PADDING, interval=INTERVAL)\n",
|
|
"\n",
|
|
" results_table(result_buyandhold, result_macd, result_rsi, result_rmse_model, result_quantile_model, result_gmadl_model)\n",
|
|
" # results_plot(i+1, result_buyandhold, result_macd, result_rsi, result_rmse_model, result_quantile_model, result_gmadl_model)\n",
|
|
" \n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\\begin{table}\n",
|
|
"\t\\begin{center}\n",
|
|
"\t\t\\begin{tabular}{lccccccccc}\n",
|
|
"\t\t\t\\textbf{Strategy} & \\textbf{VAL} & \\textbf{ARC} & \\textbf{ASD} & \\textbf{IR*} & \\textbf{MD} & \\textbf{IR**} & \\textbf{N} & \\textbf{LONG} & \\textbf{SHORT} \\\\\n",
|
|
"\t\t\t\\hline\n",
|
|
"\t\t\tBuy and Hold & 1.441 & 13.14\\% & 57.74\\% & 0.228 & 77.31\\% & 0.039 & 2 & 100.00\\% & 0.00\\% \\\\\n",
|
|
"\t\t\tMACD Strategy & 0.516 & -20.04\\% & 54.14\\% & -0.370 & 85.77\\% & -0.087 & 2535 & 50.39\\% & 32.38\\% \\\\\n",
|
|
"\t\t\tRSI Strategy & 3.341 & 50.34\\% & 50.41\\% & 0.999 & 29.99\\% & 1.676 & 846 & 28.29\\% & 33.47\\% \\\\\n",
|
|
"\t\t\tRMSE Informer & 0.643 & -13.88\\% & 15.13\\% & -0.917 & 44.61\\% & -0.285 & 16 & 0.00\\% & 9.58\\% \\\\\n",
|
|
"\t\t\tQuantile Informer & 0.956 & -1.52\\% & 47.91\\% & -0.032 & 53.96\\% & -0.001 & 3395 & 40.24\\% & 27.84\\% \\\\\n",
|
|
"\t\t\tGMADL Informer & 9.747 & 115.88\\% & 54.44\\% & 2.129 & 32.66\\% & 7.552 & 846 & 44.80\\% & 41.51\\% \\\\\n",
|
|
"\t\t\\end{tabular}\n",
|
|
"\t\\end{center}\n",
|
|
"\\end{table}\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"test_data = pd.concat([data_windows[0][0][-PADDING:]] + [data_window[1] for data_window in data_windows])\n",
|
|
"buy_and_hold_concat = evaluate_strategy(test_data, BuyAndHoldStrategy(), padding=PADDING)\n",
|
|
"macd_concat = evaluate_strategy(test_data, ConcatenatedStrategies(len(data_windows[0][1]), [s[0] for s in best_strategies['macd_strategies']], padding=PADDING), padding=PADDING, interval=INTERVAL)\n",
|
|
"rsi_concat = evaluate_strategy(test_data, ConcatenatedStrategies(len(data_windows[0][1]), [s[0] for s in best_strategies['rsi_strategies']], padding=PADDING), padding=PADDING, interval=INTERVAL)\n",
|
|
"rmse_model_concat = evaluate_strategy(test_data, ConcatenatedStrategies(len(data_windows[0][1]), [s[0] for s in best_strategies['rmse_model']], padding=PADDING), padding=PADDING, interval=INTERVAL)\n",
|
|
"quantile_model_concat = evaluate_strategy(test_data, ConcatenatedStrategies(len(data_windows[0][1]), [s[0] for s in best_strategies['quantile_model']], padding=PADDING), padding=PADDING, interval=INTERVAL)\n",
|
|
"gmadl_model_concat = evaluate_strategy(test_data, ConcatenatedStrategies(len(data_windows[0][1]), [s[0] for s in best_strategies['gmadl_model']], padding=PADDING), padding=PADDING, interval=INTERVAL)\n",
|
|
"\n",
|
|
"v_lines=[data_window[1]['close_time'].iloc[-1] for data_window in data_windows][:-1]\n",
|
|
"results_table(buy_and_hold_concat, macd_concat, rsi_concat, rmse_model_concat, quantile_model_concat, gmadl_model_concat)\n",
|
|
"# results_plot(0, buy_and_hold_concat, macd_concat, rsi_concat, rmse_model_concat, quantile_model_concat, gmadl_model_concat, width=1300, height=500, notitle=True)\n",
|
|
"\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\\begin{table}\n",
|
|
"\t\\begin{center}\n",
|
|
"\t\t\\begin{tabular}{lccccccccc}\n",
|
|
"\t\t\t\\textbf{Strategy} & \\textbf{VAL} & \\textbf{ARC} & \\textbf{ASD} & \\textbf{IR*} & \\textbf{MD} & \\textbf{IR**} & \\textbf{N} & \\textbf{LONG} & \\textbf{SHORT} \\\\\n",
|
|
"\t\t\t\\hline\n",
|
|
"\t\t\tBuy and Hold & 1.441 & 13.14\\% & 57.74\\% & 0.228 & 77.31\\% & 0.039 & 2 & 100.00\\% & 0.00\\% \\\\\n",
|
|
"\t\t\tMACD Strategy & 1.918 & 24.63\\% & 54.07\\% & 0.456 & 67.19\\% & 0.167 & 2535 & 50.39\\% & 32.38\\% \\\\\n",
|
|
"\t\t\tRSI Strategy & 5.154 & 74.05\\% & 50.37\\% & 1.470 & 26.46\\% & 4.113 & 846 & 28.29\\% & 33.47\\% \\\\\n",
|
|
"\t\t\tRMSE Informer & 0.650 & -13.53\\% & 15.13\\% & -0.894 & 44.05\\% & -0.275 & 16 & 0.00\\% & 9.58\\% \\\\\n",
|
|
"\t\t\tQuantile Informer & 5.404 & 76.86\\% & 47.83\\% & 1.607 & 37.34\\% & 3.307 & 3395 & 40.24\\% & 27.84\\% \\\\\n",
|
|
"\t\t\tGMADL Informer & 14.946 & 149.43\\% & 54.42\\% & 2.746 & 31.57\\% & 12.994 & 846 & 44.80\\% & 41.51\\% \\\\\n",
|
|
"\t\t\\end{tabular}\n",
|
|
"\t\\end{center}\n",
|
|
"\\end{table}\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# No transaction fees\n",
|
|
"test_data = pd.concat([data_windows[0][0][-PADDING:]] + [data_window[1] for data_window in data_windows])\n",
|
|
"buy_and_hold_concat = evaluate_strategy(test_data, BuyAndHoldStrategy(), padding=PADDING)\n",
|
|
"macd_concat = evaluate_strategy(test_data, ConcatenatedStrategies(len(data_windows[0][1]), [s[0] for s in best_strategies['macd_strategies']], padding=PADDING), padding=PADDING, interval=INTERVAL, exchange_fee=0)\n",
|
|
"rsi_concat = evaluate_strategy(test_data, ConcatenatedStrategies(len(data_windows[0][1]), [s[0] for s in best_strategies['rsi_strategies']], padding=PADDING), padding=PADDING, interval=INTERVAL, exchange_fee=0)\n",
|
|
"rmse_model_concat = evaluate_strategy(test_data, ConcatenatedStrategies(len(data_windows[0][1]), [s[0] for s in best_strategies['rmse_model']], padding=PADDING), padding=PADDING, interval=INTERVAL, exchange_fee=0)\n",
|
|
"quantile_model_concat = evaluate_strategy(test_data, ConcatenatedStrategies(len(data_windows[0][1]), [s[0] for s in best_strategies['quantile_model']], padding=PADDING), padding=PADDING, interval=INTERVAL, exchange_fee=0)\n",
|
|
"gmadl_model_concat = evaluate_strategy(test_data, ConcatenatedStrategies(len(data_windows[0][1]), [s[0] for s in best_strategies['gmadl_model']], padding=PADDING), padding=PADDING, interval=INTERVAL, exchange_fee=0)\n",
|
|
"\n",
|
|
"v_lines=[data_window[1]['close_time'].iloc[-1] for data_window in data_windows][:-1]\n",
|
|
"results_table(buy_and_hold_concat, macd_concat, rsi_concat, rmse_model_concat, quantile_model_concat, gmadl_model_concat)\n",
|
|
"# results_plot(0, buy_and_hold_concat, macd_concat, rsi_concat, rmse_model_concat, quantile_model_concat, gmadl_model_concat, width=1300, height=500, notitle=True)\n",
|
|
"\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": []
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "wnemsc",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3",
|
|
"version": "3.9.19"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2
|
|
}
|