informer_model/notebooks/sensitivity_analysis.ipynb

536 lines
21 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"import plotly.figure_factory as ff\n",
"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"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"\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:0.9\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.7\n",
"\u001b[34m\u001b[1mwandb\u001b[0m: Downloading large artifact btc-usdt-30m:latest, 124.19MB. 12 files... \n",
"\u001b[34m\u001b[1mwandb\u001b[0m: 12 of 12 files downloaded. \n",
"Done. 0:0:0.6\n"
]
}
],
"source": [
"data_windows_5min = get_data_windows(\n",
" 'wne-masters-thesis-testing',\n",
" 'btc-usdt-5m:latest',\n",
" min_window=0, \n",
" max_window=5\n",
")\n",
"\n",
"data_windows_15min = get_data_windows(\n",
" 'wne-masters-thesis-testing',\n",
" 'btc-usdt-15m:latest',\n",
" min_window=0, \n",
" max_window=5\n",
")\n",
"\n",
"data_windows_30min = get_data_windows(\n",
" 'wne-masters-thesis-testing',\n",
" 'btc-usdt-30m:latest',\n",
" min_window=0, \n",
" max_window=5\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [],
"source": [
"with open('cache/5min-best-strategies.pkl', 'rb') as inpt:\n",
" best_strategies_5min = pickle.load(inpt)\n",
"\n",
"with open('cache/15min-best-strategies.pkl', 'rb') as inpt:\n",
" best_strategies_15min = pickle.load(inpt)\n",
"\n",
"with open('cache/30min-best-strategies.pkl', 'rb') as inpt:\n",
" best_strategies_30min = pickle.load(inpt)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Best 5 strategies evaluation"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"def results_plot(buy_and_hold_concat, gmadl_5min_model_concat, rsi_5_min_concat, gmadl_15min_model_concat, rsi_30min_concat, macd_30min_concat, width=850, height=500, notitle=False):\n",
"\n",
" fig = go.Figure([\n",
" go.Scatter(y=buy_and_hold_concat['portfolio_value'], x=buy_and_hold_concat['time'], name=\"Buy and Hold\"),\n",
" go.Scatter(y=gmadl_5min_model_concat['portfolio_value'], x=gmadl_5min_model_concat['time'], name=\"GMADL Informer Strategy (5min)\"),\n",
" go.Scatter(y=rsi_5_min_concat['portfolio_value'], x=rsi_5_min_concat['time'], name=\"RSI Strategy (5min)\"),\n",
" go.Scatter(y=gmadl_15min_model_concat['portfolio_value'], x=gmadl_15min_model_concat['time'], name='GNADL Informer Strategy (15min)'),\n",
" go.Scatter(y=rsi_30min_concat['portfolio_value'], x=rsi_30min_concat['time'], name='RSI Strategy (30min)'),\n",
" go.Scatter(y=macd_30min_concat['portfolio_value'], x=macd_30min_concat['time'], name='MACD Strategy (30min)')\n",
" ])\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, 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(buy_and_hold_concat, gmadl_5min_model_concat, rsi_5_min_concat, gmadl_15min_model_concat, rsi_30min_concat, macd_30min_concat):\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', buy_and_hold_concat),\n",
" ('GMADL Informer (5min)', gmadl_5min_model_concat),\n",
" ('RSI Strategy (5min)', rsi_5_min_concat),\n",
" ('GMADL Informer (15min)', gmadl_15min_model_concat),\n",
" ('RSI Strategy (30min)', rsi_30min_concat),\n",
" ('MACD Strategy (30min)', macd_30min_concat)\n",
" ]\n",
" for strategy_name, result in strategy_name_result:\n",
" table_eval_windows.add_row([\n",
" strategy_name,\n",
" result['value'],\n",
" result['arc'],\n",
" result['asd'],\n",
" result['ir'],\n",
" result['md'],\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))"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"# test_data_5min = pd.concat([data_windows_5min[0][0][-PADDING:]] + [data_window[1] for data_window in data_windows_5min])\n",
"# test_data_15min = pd.concat([data_windows_15min[0][0][-PADDING:]] + [data_window[1] for data_window in data_windows_15min])\n",
"# test_data_30min = pd.concat([data_windows_30min[0][0][-PADDING:]] + [data_window[1] for data_window in data_windows_30min])\n",
"\n",
"# buy_and_hold_concat = evaluate_strategy(test_data_5min, BuyAndHoldStrategy(), padding=PADDING, interval='5min')\n",
"# gmadl_5min_model_concat = evaluate_strategy(test_data_5min, ConcatenatedStrategies(len(data_windows_5min[0][1]), [s[0] for s in best_strategies_5min['gmadl_model']], padding=PADDING), padding=PADDING, interval='5min')\n",
"# gmadl_15min_model_concat = evaluate_strategy(test_data_15min, ConcatenatedStrategies(len(data_windows_15min[0][1]), [s[0] for s in best_strategies_15min['gmadl_model']], padding=PADDING), padding=PADDING, interval='15min')\n",
"# rsi_5_min_concat = evaluate_strategy(test_data_5min, ConcatenatedStrategies(len(data_windows_5min[0][1]), [s[0] for s in best_strategies_5min['rsi_strategies']], padding=PADDING), padding=PADDING, interval='5min')\n",
"# rsi_30min_concat = evaluate_strategy(test_data_30min, ConcatenatedStrategies(len(data_windows_30min[0][1]), [s[0] for s in best_strategies_30min['rsi_strategies']], padding=PADDING), padding=PADDING, interval='30min')\n",
"# macd_30min_concat = evaluate_strategy(test_data_30min, ConcatenatedStrategies(len(data_windows_30min[0][1]), [s[0] for s in best_strategies_30min['macd_strategies']], padding=PADDING), padding=PADDING, interval='30min')\n",
"\n",
"# results_table(buy_and_hold_concat, gmadl_5min_model_concat, rsi_5_min_concat, gmadl_15min_model_concat, rsi_30min_concat, macd_30min_concat)\n",
"# results_plot(buy_and_hold_concat, gmadl_5min_model_concat, gmadl_15min_model_concat, rsi_5_min_concat, rsi_30min_concat, macd_30min_concat, width=1200, notitle=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## TOP N Strategies Sensistivity Analisys"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"def results_for_strats(data_windows, best_strategies, interval='5min', top_n=10):\n",
" test_data = pd.concat([data_windows[0][0][-PADDING:]] + [data_window[1] for data_window in data_windows])\n",
"\n",
" buy_and_hold_concat = evaluate_strategy(test_data, BuyAndHoldStrategy(), padding=PADDING)\n",
" \n",
" macd_concat = [evaluate_strategy(test_data, ConcatenatedStrategies(len(data_windows[0][1]), [s[x] for s in best_strategies['macd_strategies']], padding=PADDING), padding=PADDING, interval=interval) for x in range(top_n)]\n",
" rsi_concat = [evaluate_strategy(test_data, ConcatenatedStrategies(len(data_windows[0][1]), [s[x] for s in best_strategies['rsi_strategies']], padding=PADDING), padding=PADDING, interval=interval) for x in range(top_n)]\n",
" quantile_model_concat = [evaluate_strategy(test_data, ConcatenatedStrategies(len(data_windows[0][1]), [s[x] for s in best_strategies['quantile_model']], padding=PADDING), padding=PADDING, interval=interval) for x in range(top_n)]\n",
" gmadl_model_concat = [evaluate_strategy(test_data, ConcatenatedStrategies(len(data_windows[0][1]), [s[x] for s in best_strategies['gmadl_model']], padding=PADDING), padding=PADDING, interval=interval) for x in range(top_n)]\n",
"\n",
" z = list(reversed([\n",
" list(reversed([round(buy_and_hold_concat['mod_ir'], 3)]*top_n)),\n",
" list(reversed([round(x['mod_ir'], 3) for x in macd_concat])),\n",
" list(reversed([round(x['mod_ir'], 3) for x in rsi_concat])),\n",
" list(reversed([round(x['mod_ir'], 3) for x in quantile_model_concat])),\n",
" list(reversed([round(x['mod_ir'], 3) for x in gmadl_model_concat])),\n",
" ]))\n",
" x = list(reversed(range(1, top_n+1)))\n",
" y = list(reversed([\n",
" \"Buy and Hold\",\n",
" \"MACD Strategy\",\n",
" \"RSI Strategy\",\n",
" \"Quantile Informer\",\n",
" \"Gmadl Informer\"\n",
" ]))\n",
" # 'Portland'\n",
" fig = ff.create_annotated_heatmap(z, x=x, y=y, colorscale='thermal', zmid=buy_and_hold_concat['mod_ir'])\n",
" fig.update_layout(\n",
" margin=dict(l=20, r=20, b=20, t=20),\n",
" width=1100,\n",
" height=450,\n",
" font=dict(\n",
" # family=\"Courier New, monospace\",\n",
" size=18, # Set the font size here\n",
" # color=\"RebeccaPurple\"\n",
" )\n",
" )\n",
" fig.show()\n",
"\n",
"# results_for_strats(data_windows_5min, best_strategies_5min, interval='5min', top_n=10) \n",
"# results_for_strats(data_windows_15min, best_strategies_15min, interval='15min', top_n=10) \n",
"# results_for_strats(data_windows_30min, best_strategies_30min, interval='30min', top_n=10) \n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Validation size for: GMADL Informer (5min)"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
"with open('cache/5min-best-strategies-01.pkl', 'rb') as inpt:\n",
" best_strategies_5min_01 = pickle.load(inpt)\n",
"\n",
"with open('cache/5min-best-strategies.pkl', 'rb') as inpt:\n",
" best_strategies_5min_02 = pickle.load(inpt)\n",
"\n",
"with open('cache/5min-best-strategies-03.pkl', 'rb') as inpt:\n",
" best_strategies_5min_03 = pickle.load(inpt)\n",
"\n",
"with open('cache/5min-best-strategies-04.pkl', 'rb') as inpt:\n",
" best_strategies_5min_04 = pickle.load(inpt)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'strategy_name': 'Unknown model', 'future': 1, 'target': 'close_price', 'enter_long': 0.004, 'exit_long': None, 'enter_short': -0.005, 'exit_short': None}\n",
"{'strategy_name': 'Unknown model', 'future': 1, 'target': 'close_price', 'enter_long': 0.007, 'exit_long': -0.003, 'enter_short': None, 'exit_short': None}\n"
]
}
],
"source": [
"# print(best_strategies_5min_02['gmadl_model'][0][0].info())\n",
"# print(best_strategies_5min_03['gmadl_model'][0][0].info())"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [],
"source": [
"def results_plot2(result_buyandhold, results, names, width=850, height=500):\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['portfolio_value'], x=result['time'], name=name) for name, result in zip(names, results)\n",
" ])\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_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",
" fig.update_layout(\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, 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.show()\n",
" \n",
"def results_table2(result_buyandhold, results, names):\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)] + list(zip(names, results))\n",
" for strategy_name, result in strategy_name_result:\n",
" table_eval_windows.add_row([\n",
" strategy_name,\n",
" result['value'],\n",
" result['arc'],\n",
" result['asd'],\n",
" result['ir'],\n",
" result['md'],\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))"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [],
"source": [
"def results_for_strats(data_windows, best_strategies, names, interval='5min', strat_name='gmadl_model'):\n",
" test_data = pd.concat([data_windows[0][0][-PADDING:]] + [data_window[1] for data_window in data_windows])\n",
"\n",
" buy_and_hold_concat = evaluate_strategy(test_data, BuyAndHoldStrategy(), padding=PADDING, interval=interval)\n",
" \n",
" evaluation_results = []\n",
" for best_strat in best_strategies:\n",
" evaluation_results.append(\n",
" evaluate_strategy(test_data, ConcatenatedStrategies(len(data_windows[0][1]), [s[0] for s in best_strat[strat_name]], padding=PADDING), padding=PADDING, interval=interval)\n",
" )\n",
" results_plot(buy_and_hold_concat, evaluation_results, names, width=1200)\n",
" results_table2(buy_and_hold_concat, evaluation_results, names)\n",
"\n",
"\n",
"# results_for_strats(data_windows_5min, [\n",
"# best_strategies_5min_01,\n",
"# best_strategies_5min_02,\n",
"# best_strategies_5min_03,\n",
"# best_strategies_5min_04\n",
"# ], [\n",
"# \"3 months\",\n",
"# \"6 months\",\n",
"# \"9 months\",\n",
"# \"12 months\",\n",
"# ])\n"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [],
"source": [
"with open('cache/30min-best-strategies-01.pkl', 'rb') as inpt:\n",
" best_strategies_30min_01 = pickle.load(inpt)\n",
"\n",
"with open('cache/30min-best-strategies.pkl', 'rb') as inpt:\n",
" best_strategies_30min_02 = pickle.load(inpt)\n",
"\n",
"with open('cache/30min-best-strategies-03.pkl', 'rb') as inpt:\n",
" best_strategies_30min_03 = pickle.load(inpt)\n",
"\n",
"with open('cache/30min-best-strategies-04.pkl', 'rb') as inpt:\n",
" best_strategies_30min_04 = pickle.load(inpt)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# results_for_strats(data_windows_30min, [\n",
"# best_strategies_30min_01,\n",
"# best_strategies_30min_02,\n",
"# best_strategies_30min_03,\n",
"# best_strategies_30min_04\n",
"# ], [\n",
"# \"3 months\",\n",
"# \"6 months\",\n",
"# \"9 months\",\n",
"# \"12 months\",\n",
"# ], strat_name='rsi_strategies', interval='30min')"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# test_data = pd.concat([data_window[0] for data_window in data_windows_5min[:1]])\n",
"# buy_and_hold_concat = evaluate_strategy(test_data, BuyAndHoldStrategy(), padding=PADDING)\n",
"\n",
"# res = evaluate_strategy(test_data, ConcatenatedStrategies(1, [s[0] for s in best_strategies_5min_02['gmadl_model'][:1]], padding=PADDING), padding=PADDING, interval='5min')\n",
"# results_plot(buy_and_hold_concat, [res], width=1200)"
]
},
{
"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
}