{ "cells": [ { "cell_type": "code", "execution_count": 1, "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", "import plotly.graph_objs as go\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='15min'\n", "METRIC='mod_ir'\n", "TOP_N=10" ] }, { "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: Downloading large artifact btc-usdt-15m:latest, 248.65MB. 12 files... \n", "\u001b[34m\u001b[1mwandb\u001b[0m: 12 of 12 files downloaded. \n", "Done. 0:0:0.8\n" ] } ], "source": [ "data_windows = get_data_windows(\n", " 'wne-masters-thesis-testing',\n", " 'btc-usdt-15m: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:06<00:00, 639.58it/s]\n", "100%|██████████| 3840/3840 [00:05<00:00, 658.38it/s]\n", "100%|██████████| 3840/3840 [00:06<00:00, 624.58it/s]\n", "100%|██████████| 3840/3840 [00:05<00:00, 649.63it/s]\n", "100%|██████████| 3840/3840 [00:06<00:00, 627.23it/s]\n", "100%|██████████| 3840/3840 [00:06<00:00, 633.46it/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": 41, "metadata": {}, "outputs": [], "source": [ "# plot_sweep_results(pd.DataFrame([result for result, _ in macd_sweep_results[0]]), parameters=MACD_PARAMS.keys())" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 11088/11088 [00:19<00:00, 560.36it/s]\n", "100%|██████████| 11088/11088 [00:22<00:00, 495.98it/s]\n", "100%|██████████| 11088/11088 [00:19<00:00, 556.67it/s]\n", "100%|██████████| 11088/11088 [00:19<00:00, 554.79it/s]\n", "100%|██████████| 11088/11088 [00:18<00:00, 590.13it/s]\n", "100%|██████████| 11088/11088 [00:17<00:00, 650.44it/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": 43, "metadata": {}, "outputs": [], "source": [ "# plot_sweep_results(pd.DataFrame([result for result, _ in rsi_sweep_results[0]]), parameters=RSI_PARAMS.keys())" ] }, { "cell_type": "code", "execution_count": 7, "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/inpvjdsp'\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": 8, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 1176/1176 [00:39<00:00, 29.69it/s]\n", "100%|██████████| 1176/1176 [00:41<00:00, 28.17it/s]\n", "100%|██████████| 1176/1176 [00:40<00:00, 29.34it/s]\n", "100%|██████████| 1176/1176 [00:40<00:00, 29.28it/s]\n", "100%|██████████| 1176/1176 [00:40<00:00, 29.11it/s]\n", "100%|██████████| 1176/1176 [00:40<00:00, 29.39it/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": "markdown", "metadata": {}, "source": [] }, { "cell_type": "code", "execution_count": 9, "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/btu0mf6u'\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": 10, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 1125/1125 [00:25<00:00, 44.03it/s]\n", "100%|██████████| 1125/1125 [00:20<00:00, 53.68it/s]\n", "100%|██████████| 1125/1125 [00:20<00:00, 54.38it/s]\n", "100%|██████████| 1125/1125 [00:20<00:00, 54.70it/s]\n", "100%|██████████| 1125/1125 [00:20<00:00, 54.23it/s]\n", "100%|██████████| 1125/1125 [00:21<00:00, 53.31it/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(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": 46, "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'])" ] }, { "cell_type": "code", "execution_count": 11, "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/a6q8zv10'\n", "SWEEP_ID = 'filipstefaniuk/wne-masters-thesis-testing/7n3w718v'\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": 12, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 1176/1176 [00:22<00:00, 53.42it/s]\n", "100%|██████████| 1176/1176 [00:19<00:00, 59.87it/s]\n", "100%|██████████| 1176/1176 [00:17<00:00, 66.89it/s]\n", "100%|██████████| 1176/1176 [00:17<00:00, 65.52it/s]\n", "100%|██████████| 1176/1176 [00:17<00:00, 67.44it/s]\n", "100%|██████████| 1176/1176 [00:17<00:00, 67.15it/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, _), train_preds, valid_preds, test_preds in zip(data_windows, train_gmadl_pred_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": 13, "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/15min-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": 3, "metadata": {}, "outputs": [], "source": [ "with open('cache/15min-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": 16, "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 & 377 & 1597 & True \\\\\n", "\t\t\tWindow 2 & 144 & 987 & 2584 & True \\\\\n", "\t\t\tWindow 3 & 377 & 2584 & 2584 & True \\\\\n", "\t\t\tWindow 4 & 377 & 2584 & 610 & True \\\\\n", "\t\t\tWindow 5 & 233 & 610 & 233 & False \\\\\n", "\t\t\tWindow 6 & 144 & 377 & 2584 & 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": 17, "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-15min & 5 & 80 & - & 15 & - \\\\\n", "\t\t\tW2-15min & 34 & 75 & - & 30 & - \\\\\n", "\t\t\tW3-15min & 5 & 95 & - & 10 & - \\\\\n", "\t\t\tW4-15min & 34 & 75 & - & 30 & - \\\\\n", "\t\t\tW5-15min & 13 & 70 & - & 5 & - \\\\\n", "\t\t\tW6-15min & 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}-15min\",\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": 4, "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-15min & 0.002 & - & -0.001 & - \\\\\n", "\t\t\tW2-15min & - & - & -0.002 & 0.002 \\\\\n", "\t\t\tW3-15min & - & - & -0.001 & 0.002 \\\\\n", "\t\t\tW4-15min & 0.001 & - & -0.002 & - \\\\\n", "\t\t\tW5-15min & - & - & -0.001 & 0.001 \\\\\n", "\t\t\tW6-15min & - & - & -0.002 & 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": 18, "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-15min & 0.980 & - & 0.990 & - & 0.003 \\\\\n", "\t\t\tW2-15min & 0.990 & 0.950 & - & 0.900 & 0.003 \\\\\n", "\t\t\tW3-15min & - & - & 0.990 & 0.990 & 0.003 \\\\\n", "\t\t\tW4-15min & 0.990 & 0.970 & - & 0.980 & 0.003 \\\\\n", "\t\t\tW5-15min & 0.950 & 0.990 & - & - & 0.001 \\\\\n", "\t\t\tW6-15min & 0.990 & 0.950 & - & 0.950 & 0.002 \\\\\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": 19, "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-15min & 0.005 & - & -0.002 & - \\\\\n", "\t\t\tW2-15min & 0.006 & - & -0.002 & - \\\\\n", "\t\t\tW3-15min & - & - & -0.001 & 0.005 \\\\\n", "\t\t\tW4-15min & 0.007 & - & -0.005 & - \\\\\n", "\t\t\tW5-15min & 0.001 & - & -0.004 & - \\\\\n", "\t\t\tW6-15min & 0.002 & -0.002 & - & - \\\\\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": 5, "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.933 & -13.15\\% & 66.69\\% & -0.197 & 51.81\\% & -0.050 & 2 & 100.00\\% & 0.00\\% \\\\\n", "\t\t\tMACD Strategy & 0.357 & -87.59\\% & 66.96\\% & -1.308 & 73.46\\% & -1.559 & 852 & 52.49\\% & 47.51\\% \\\\\n", "\t\t\tRSI Strategy & 0.621 & -61.93\\% & 66.94\\% & -0.925 & 48.44\\% & -1.183 & 882 & 58.61\\% & 41.39\\% \\\\\n", "\t\t\tRMSE Informer & 1.498 & 127.03\\% & 52.56\\% & 2.417 & 22.20\\% & 13.827 & 3 & 0.00\\% & 61.05\\% \\\\\n", "\t\t\tQuantile Informer & 0.715 & -49.34\\% & 66.74\\% & -0.739 & 40.17\\% & -0.908 & 182 & 52.75\\% & 47.25\\% \\\\\n", "\t\t\tGMADL Informer & 2.173 & 382.27\\% & 66.83\\% & 5.720 & 29.76\\% & 73.474 & 146 & 36.88\\% & 63.12\\% \\\\\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.548 & -70.48\\% & 72.12\\% & -0.977 & 63.18\\% & -1.090 & 2 & 100.00\\% & 0.00\\% \\\\\n", "\t\t\tMACD Strategy & 0.714 & -49.48\\% & 72.07\\% & -0.687 & 50.67\\% & -0.670 & 118 & 57.61\\% & 42.39\\% \\\\\n", "\t\t\tRSI Strategy & 1.141 & 30.61\\% & 72.05\\% & 0.425 & 49.51\\% & 0.263 & 58 & 19.64\\% & 80.36\\% \\\\\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.903 & -18.73\\% & 15.66\\% & -1.196 & 14.91\\% & -1.503 & 202 & 4.74\\% & 0.00\\% \\\\\n", "\t\t\tGMADL Informer & 0.885 & -21.88\\% & 72.10\\% & -0.303 & 43.48\\% & -0.153 & 54 & 35.85\\% & 64.15\\% \\\\\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.26\\% & 50.58\\% & 0.065 & 37.76\\% & 0.006 & 2 & 100.00\\% & 0.00\\% \\\\\n", "\t\t\tMACD Strategy & 1.060 & 12.62\\% & 50.57\\% & 0.250 & 38.35\\% & 0.082 & 55 & 66.38\\% & 32.66\\% \\\\\n", "\t\t\tRSI Strategy & 0.898 & -19.62\\% & 50.65\\% & -0.387 & 25.20\\% & -0.302 & 174 & 23.30\\% & 76.70\\% \\\\\n", "\t\t\tRMSE Informer & 0.982 & -3.55\\% & 50.69\\% & -0.070 & 34.60\\% & -0.007 & 2 & 0.00\\% & 100.00\\% \\\\\n", "\t\t\tQuantile Informer & 1.081 & 17.17\\% & 40.53\\% & 0.424 & 31.82\\% & 0.229 & 103 & 0.00\\% & 53.36\\% \\\\\n", "\t\t\tGMADL Informer & 1.158 & 34.60\\% & 31.80\\% & 1.088 & 18.06\\% & 2.085 & 32 & 0.00\\% & 59.07\\% \\\\\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.34\\% & 44.11\\% & 1.186 & 22.01\\% & 2.822 & 2 & 100.00\\% & 0.00\\% \\\\\n", "\t\t\tMACD Strategy & 1.020 & 4.03\\% & 44.11\\% & 0.091 & 25.36\\% & 0.015 & 74 & 34.59\\% & 65.41\\% \\\\\n", "\t\t\tRSI Strategy & 0.794 & -37.41\\% & 44.15\\% & -0.848 & 43.03\\% & -0.737 & 86 & 39.98\\% & 60.02\\% \\\\\n", "\t\t\tRMSE Informer & 1.232 & 52.63\\% & 42.30\\% & 1.244 & 22.01\\% & 2.975 & 3 & 91.43\\% & 0.00\\% \\\\\n", "\t\t\tQuantile Informer & 1.122 & 26.21\\% & 21.18\\% & 1.238 & 9.32\\% & 3.481 & 106 & 24.72\\% & 0.00\\% \\\\\n", "\t\t\tGMADL Informer & 0.718 & -48.86\\% & 44.08\\% & -1.108 & 41.58\\% & -1.302 & 10 & 60.34\\% & 39.66\\% \\\\\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.440 & 109.38\\% & 44.60\\% & 2.452 & 20.31\\% & 13.204 & 2 & 100.00\\% & 0.00\\% \\\\\n", "\t\t\tMACD Strategy & 1.218 & 49.24\\% & 33.63\\% & 1.464 & 13.88\\% & 5.195 & 118 & 50.76\\% & 0.00\\% \\\\\n", "\t\t\tRSI Strategy & 1.440 & 109.38\\% & 44.60\\% & 2.452 & 20.31\\% & 13.204 & 2 & 100.00\\% & 0.00\\% \\\\\n", "\t\t\tRMSE Informer & 0.832 & -31.06\\% & 13.66\\% & -2.274 & 19.29\\% & -3.662 & 4 & 0.00\\% & 4.56\\% \\\\\n", "\t\t\tQuantile Informer & 1.206 & 46.21\\% & 37.95\\% & 1.218 & 19.49\\% & 2.887 & 147 & 78.97\\% & 0.00\\% \\\\\n", "\t\t\tGMADL Informer & 1.398 & 97.31\\% & 44.61\\% & 2.181 & 22.22\\% & 9.554 & 26 & 99.64\\% & 0.36\\% \\\\\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.558 & 145.73\\% & 51.90\\% & 2.808 & 26.76\\% & 15.290 & 2 & 100.00\\% & 0.00\\% \\\\\n", "\t\t\tMACD Strategy & 1.402 & 98.29\\% & 34.32\\% & 2.864 & 20.22\\% & 13.925 & 93 & 48.96\\% & 0.00\\% \\\\\n", "\t\t\tRSI Strategy & 1.104 & 22.18\\% & 49.12\\% & 0.452 & 26.76\\% & 0.374 & 3 & 82.57\\% & 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.000 & 0.04\\% & 18.06\\% & 0.002 & 9.32\\% & 0.000 & 81 & 9.73\\% & 0.00\\% \\\\\n", "\t\t\tGMADL Informer & 1.463 & 116.41\\% & 45.31\\% & 2.569 & 21.45\\% & 13.942 & 94 & 63.52\\% & 0.00\\% \\\\\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", " " ] }, { "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.440 & 13.10\\% & 56.03\\% & 0.234 & 77.23\\% & 0.040 & 2 & 100.00\\% & 0.00\\% \\\\\n", "\t\t\tMACD Strategy & 0.468 & -22.64\\% & 52.43\\% & -0.432 & 83.18\\% & -0.118 & 1311 & 51.80\\% & 31.33\\% \\\\\n", "\t\t\tRSI Strategy & 0.800 & -7.28\\% & 55.66\\% & -0.131 & 66.67\\% & -0.014 & 1206 & 54.02\\% & 43.08\\% \\\\\n", "\t\t\tRMSE Informer & 1.509 & 14.93\\% & 34.90\\% & 0.428 & 45.54\\% & 0.140 & 16 & 15.24\\% & 27.60\\% \\\\\n", "\t\t\tQuantile Informer & 0.945 & -1.91\\% & 37.77\\% & -0.051 & 48.30\\% & -0.002 & 824 & 28.48\\% & 16.77\\% \\\\\n", "\t\t\tGMADL Informer & 3.296 & 49.65\\% & 52.70\\% & 0.942 & 47.39\\% & 0.987 & 362 & 49.37\\% & 37.72\\% \\\\\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, interval=INTERVAL)\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", "\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" ] }, { "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 }