{
"cells": [
{
"cell_type": "markdown",
"id": "405cbcdb",
"metadata": {},
"source": [
"# Time-of-Day and Day-of-Week Effects\n",
"Given that the crypto markets are open 24/7, it's possible that there are different patterns at different times of day or days of the week."
]
},
{
"cell_type": "markdown",
"id": "454889cf",
"metadata": {},
"source": [
"# Data\n",
"We use the historical price data over the last 3 years from 10 cryptocurrencies: Bitcoin (BTC), Ethereum (ETH), BinanceCoin (BNB), Cardano (ADA), XRP (XRP), Solana (SOL), Polkadot (DOT), LiteCoin (LTC), Avalanche (AVAX), Polygon (MATIC). All to in reference to Tether (USDT)."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9171d8ac",
"metadata": {},
"outputs": [],
"source": [
"from binance.client import Client as bnb_client\n",
"from datetime import datetime\n",
"import pandas as pd \n",
"import numpy as np \n",
"from pytz import timezone\n",
"\n",
"client = bnb_client(tld='US')\n",
"\n",
"def get_binance_px(symbol,freq,start_ts = '2020-01-01',end_ts='2022-06-30'):\n",
" data = client.get_historical_klines(symbol,freq,start_ts,end_ts)\n",
" columns = ['open_time','open','high','low','close','volume','close_time','quote_volume',\n",
" 'num_trades','taker_base_volume','taker_quote_volume','ignore']\n",
" \n",
" \n",
" data = pd.DataFrame(data,columns = columns)\n",
" \n",
" # Convert from POSIX timestamp\n",
" data['open_time'] = data['open_time'].map(lambda x: datetime.utcfromtimestamp(x/1000))\n",
" data['close_time'] = data['close_time'].map(lambda x: datetime.utcfromtimestamp(x/1000))\n",
" \n",
" return data \n",
"\n",
"univ = ['BTCUSDT','ETHUSDT','ADAUSDT','BNBUSDT','XRPUSDT','DOTUSDT','MATICUSDT', 'SOLUSDT', 'LTCUSDT', 'AVAXUSDT']"
]
},
{
"cell_type": "markdown",
"id": "bd831d62",
"metadata": {},
"source": [
"# Strategy\n",
"We first compute hourly returns for each cryptocurrencies over the last 3 to 1 years."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f96229ee",
"metadata": {},
"outputs": [],
"source": [
"#hourly returns\n",
"freqH = '1h'\n",
"pxH = {}\n",
"for x in univ:\n",
" data = get_binance_px(x,freqH)\n",
" pxH[x] = data.set_index('open_time')['close']\n",
"\n",
"pxH = pd.DataFrame(pxH).astype(float)\n",
"pxH = pxH.reindex(pd.date_range(pxH.index[0],pxH.index[-1],freq=freqH))\n",
"retH = pxH.pct_change()"
]
},
{
"cell_type": "markdown",
"id": "65f98db5",
"metadata": {},
"source": [
"We now create a function that will take the hourly returns and a lookback window and calculate a momentum-based trading strategy for each hour, independent of the day, by computing rank-demean-normalized signal over the specified lookback window in order to identify patterns at different time-horizons."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "141bc5c3",
"metadata": {},
"outputs": [],
"source": [
"def compute_strategy_expanded(df, lookback_days):\n",
" df['hours'] = df.index.hour\n",
"\n",
" hours = df.index.hour.unique().sort_values()\n",
"\n",
" columns = pd.MultiIndex.from_product([hours], names=['hour'])\n",
" strats = pd.DataFrame(index=df.index, columns=columns)\n",
"\n",
" for hour in hours:\n",
" comb = df[df['hours'] == hour].drop(columns=['hours'])\n",
" avg_ret = comb.rolling(lookback_days, min_periods=1).mean()\n",
" avg_ret_rank = avg_ret.rank(axis=1)\n",
" avg_ret_rank = avg_ret_rank.subtract(avg_ret_rank.mean(axis=1), axis=0)\n",
" avg_ret_rank = avg_ret_rank.divide(avg_ret_rank.abs().sum(axis=1), axis=0)\n",
" strats[hour] = (avg_ret_rank.shift() * comb).sum(axis=1)\n",
"\n",
" # Sum across all the strategies (hour combinations)\n",
" strat_total = strats.sum(axis=1)\n",
"\n",
" return strat_total"
]
},
{
"cell_type": "markdown",
"id": "16c568c8",
"metadata": {},
"source": [
"Using this function we want to investigates if the same hour has momentum, regardless of its day. "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "12f1ea8b",
"metadata": {},
"outputs": [],
"source": [
"lookback_range = range(1, 31) # This tests lookback periods from 1 to 30 days.\n",
"\n",
"\n",
"results = {}\n",
"strat_total_2 = {}\n",
"\n",
"for lookback_days in lookback_range:\n",
" # Compute the strategy for this lookback period.\n",
" strat_total = compute_strategy_expanded(retH, lookback_days)\n",
" strat_total_2[lookback_days] = strat_total \n",
" \n",
" # Compute performance metrics for this strategy.\n",
" sharpe_ratio = strat_total.mean() / strat_total.std() * np.sqrt(365*24)\n",
" cumulative_return = strat_total.cumsum().iloc[-1]\n",
" results[lookback_days] = {'sharpe_ratio': sharpe_ratio, 'cumulative_return': cumulative_return}\n",
"\n",
"strat_total_2 = pd.DataFrame(strat_total_2)\n",
"results_df = pd.DataFrame(results).T"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6aac565d",
"metadata": {},
"outputs": [],
"source": [
"#results_df.plot(subplots=True)\n",
"results_df.sort_values('sharpe_ratio', ascending=False)"
]
},
{
"cell_type": "markdown",
"id": "a51dd3bc",
"metadata": {},
"source": [
"We find very positive results indicating that a same hour shows reversal untill time-horizon of 9 days and momentum after. "
]
},
{
"cell_type": "markdown",
"id": "c456964e",
"metadata": {},
"source": [
"In an attempt to idenfity the most impactful times of days and days of weeks to thes result, we seperate between regular hours/ after hours and weekday/weekends"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "fab62dcb",
"metadata": {},
"outputs": [],
"source": [
"strat_total_2['hours'] = strat_total_2.index.hour\n",
"strat_total_2['weekday'] = strat_total_2.index.weekday\n",
"\n",
"regular_hours = ['14:00', '21:00'] #US time zone \n",
"after_hours = ['00:00', '13:00', '22:00', '23:00'] #because between_time inclusive on both bounds and US time zone \n",
"weekdays = [0, 1, 2, 3, 4] \n",
"weekend = [5, 6] \n",
"\n",
"# Create separate dataframes for regular hours and after hours\n",
"reg_hours_df = strat_total_2.between_time(regular_hours[0], regular_hours[1]).copy()\n",
"after_hours_df = pd.concat([strat_total_2.between_time(after_hours[0], after_hours[1]), strat_total_2.between_time(after_hours[2], after_hours[3])]).copy()\n",
"\n",
"# Create separate dataframes for weekdays and weekends\n",
"weekdays_df = strat_total_2[strat_total_2.index.weekday.isin(weekdays)].copy()\n",
"weekend_df = strat_total_2[strat_total_2.index.weekday.isin(weekend)].copy()\n",
"\n",
"frames = [reg_hours_df, after_hours_df, weekdays_df, weekend_df]\n",
"sr_strats = {}\n",
"sr_strats['reg_hours'] = frames[0].mean() / frames[0].std() * np.sqrt(365*6)\n",
"sr_strats['after_hours'] = frames[1].mean() / frames[1].std() * np.sqrt(365*18)\n",
"sr_strats['weekdays'] = frames[2].mean() / frames[2].std() * np.sqrt(252*24)\n",
"sr_strats['weekend'] = frames[3].mean() / frames[3].std() * np.sqrt(113*24)\n",
"sr_strats = pd.DataFrame(sr_strats)"
]
},
{
"cell_type": "markdown",
"id": "3caec587",
"metadata": {},
"source": [
"Although the results show potential, we try to get more precise. "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "211c0a45",
"metadata": {},
"outputs": [],
"source": [
"#test weekdays and weekends crossed with reg and after \n",
"after_hours_weekdays_df = after_hours_df[after_hours_df.index.weekday.isin(weekdays)].copy()\n",
"after_hours_weekend_df = after_hours_df[after_hours_df.index.weekday.isin(weekend)].copy()\n",
"\n",
"reg_hours_weekdays_df = reg_hours_df[reg_hours_df.index.weekday.isin(weekdays)].copy()\n",
"reg_hours_weekend_df = reg_hours_df[reg_hours_df.index.weekday.isin(weekend)].copy()\n",
"\n",
"\n",
"\n",
"opt_frames = [after_hours_weekdays_df, after_hours_weekend_df, reg_hours_weekdays_df, reg_hours_weekend_df]\n",
"sr_opt_strats = {}\n",
"sr_opt_strats['after_hours_weekdays'] = opt_frames[0].mean() / opt_frames[0].std() * np.sqrt(252*18)\n",
"sr_opt_strats['after_hours_weekend'] = opt_frames[1].mean() / opt_frames[1].std() * np.sqrt(113*18)\n",
"sr_opt_strats['reg_hours_weekdays'] = opt_frames[2].mean() / opt_frames[2].std() * np.sqrt(252*18)\n",
"sr_opt_strats['reg_hours_weekend'] = opt_frames[3].mean() / opt_frames[3].std() * np.sqrt(113*18)\n",
"sr_opt_strats = pd.DataFrame(sr_opt_strats)\n",
"sr_opt_strats = sr_opt_strats.drop(['hours', 'weekday'])\n",
"sr_opt_strats"
]
},
{
"cell_type": "markdown",
"id": "f314648b",
"metadata": {},
"source": [
"# Hypothesis\n",
"- H1 : For after-hours on weekdays we find very strong reversal at time-horizon 1 to 2 days.\n",
"- H2 : For regular-hours on weekends we find very strong reversal at time-horizon 1 to 8 days.\n",
"- H3 : For regular-hours on weekdays we find very strong momentum at time-horizon 9 to 21 days.\n",
"\n",
"We therefore want to trade at these hours on our signal"
]
},
{
"cell_type": "markdown",
"id": "9801fa8f",
"metadata": {},
"source": [
"# Backtest\n",
"We now create signal that trades reversal at times and lookback said and same for the momentum\n",
"then backtest it against the most recent years."
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "7791067f",
"metadata": {},
"outputs": [],
"source": [
"from binance.client import Client as bnb_client\n",
"from datetime import datetime\n",
"import pandas as pd \n",
"import numpy as np \n",
"from pytz import timezone\n",
"\n",
"client = bnb_client(tld='US')\n",
"\n",
"def get_binance_px_backtest(symbol,freq,start_ts = '2022-06-30',end_ts='2023-07-15'):\n",
" data = client.get_historical_klines(symbol,freq,start_ts,end_ts)\n",
" columns = ['open_time','open','high','low','close','volume','close_time','quote_volume',\n",
" 'num_trades','taker_base_volume','taker_quote_volume','ignore']\n",
" \n",
" \n",
" data = pd.DataFrame(data,columns = columns)\n",
" \n",
" # Convert from POSIX timestamp\n",
" data['open_time'] = data['open_time'].map(lambda x: datetime.utcfromtimestamp(x/1000))\n",
" data['close_time'] = data['close_time'].map(lambda x: datetime.utcfromtimestamp(x/1000))\n",
" \n",
" return data \n",
"\n",
"univ = ['BTCUSDT','ETHUSDT','ADAUSDT','BNBUSDT','XRPUSDT','DOTUSDT','MATICUSDT', 'SOLUSDT', 'LTCUSDT', 'AVAXUSDT']"
]
},
{
"cell_type": "code",
"execution_count": 37,
"id": "4cc9945c",
"metadata": {},
"outputs": [],
"source": [
"def compute_strategy_backtest(df, lookback_days, momentum):\n",
" df['hours'] = df.index.hour\n",
"\n",
" hours = df.index.hour.unique().sort_values()\n",
"\n",
" columns = pd.MultiIndex.from_product([hours], names=['hour'])\n",
" strats = pd.DataFrame(index=df.index, columns=columns)\n",
"\n",
" for hour in hours:\n",
" comb = df[df['hours'] == hour].drop(columns=['hours'])\n",
" avg_ret = comb.rolling(lookback_days, min_periods=1).mean()\n",
" avg_ret_rank = avg_ret.rank(axis=1, ascending=momentum)\n",
" avg_ret_rank = avg_ret_rank.subtract(avg_ret_rank.mean(axis=1), axis=0)\n",
" avg_ret_rank = avg_ret_rank.divide(avg_ret_rank.abs().sum(axis=1), axis=0)\n",
" strats[hour] = (avg_ret_rank.shift() * comb).sum(axis=1)\n",
"\n",
" # Sum across all the strategies (hour combinations)\n",
" strat_total = strats.sum(axis=1)\n",
"\n",
" return strat_total"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "c211b762",
"metadata": {},
"outputs": [],
"source": [
"#strat prep\n",
"def stratPrep(returns, start, end, momentum):\n",
" lookback_range = range(start, end + 1) \n",
"\n",
"\n",
" results = {}\n",
" strat_total_2 = {}\n",
"\n",
" for lookback_days in lookback_range:\n",
" # Compute the strategy for this lookback period.\n",
" strat_total = compute_strategy_backtest(returns, lookback_days, momentum)\n",
" strat_total_2[lookback_days] = strat_total \n",
"\n",
" # Compute performance metrics for this strategy.\n",
" sharpe_ratio = strat_total.mean() / strat_total.std() * np.sqrt(365*24)\n",
" cumulative_return = strat_total.cumsum().iloc[-1]\n",
" results[lookback_days] = {'sharpe_ratio': sharpe_ratio, 'cumulative_return': cumulative_return}\n",
"\n",
" strat_total_2 = pd.DataFrame(strat_total_2)\n",
" results_df = pd.DataFrame(results).T\n",
" return strat_total_2, results_df"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "7c2111d0",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" BTCUSDT \n",
" ETHUSDT \n",
" ADAUSDT \n",
" BNBUSDT \n",
" XRPUSDT \n",
" DOTUSDT \n",
" MATICUSDT \n",
" SOLUSDT \n",
" LTCUSDT \n",
" AVAXUSDT \n",
" \n",
" \n",
" \n",
" \n",
" 2022-06-30 00:00:00 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" 2022-06-30 01:00:00 \n",
" -0.000923 \n",
" -0.006191 \n",
" -0.005784 \n",
" -0.002625 \n",
" NaN \n",
" 0.001445 \n",
" -0.018480 \n",
" -0.024007 \n",
" -0.001699 \n",
" -0.016166 \n",
" \n",
" \n",
" 2022-06-30 02:00:00 \n",
" 0.003159 \n",
" 0.005411 \n",
" 0.008803 \n",
" 0.006399 \n",
" NaN \n",
" 0.007215 \n",
" 0.014644 \n",
" 0.012058 \n",
" 0.005674 \n",
" 0.018192 \n",
" \n",
" \n",
" 2022-06-30 03:00:00 \n",
" -0.000013 \n",
" 0.001208 \n",
" -0.001555 \n",
" 0.000917 \n",
" NaN \n",
" -0.011461 \n",
" 0.002062 \n",
" -0.001056 \n",
" -0.002445 \n",
" -0.001729 \n",
" \n",
" \n",
" 2022-06-30 04:00:00 \n",
" -0.001491 \n",
" -0.002486 \n",
" -0.000692 \n",
" -0.003752 \n",
" NaN \n",
" 0.000000 \n",
" -0.018519 \n",
" -0.011043 \n",
" -0.000754 \n",
" -0.005774 \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 2023-07-14 20:00:00 \n",
" 0.003809 \n",
" 0.002108 \n",
" 0.006864 \n",
" 0.010704 \n",
" 0.020836 \n",
" 0.008068 \n",
" 0.003064 \n",
" 0.003837 \n",
" 0.006538 \n",
" 0.011921 \n",
" \n",
" \n",
" 2023-07-14 21:00:00 \n",
" 0.000497 \n",
" 0.006399 \n",
" 0.007127 \n",
" 0.000407 \n",
" 0.014640 \n",
" 0.005770 \n",
" 0.014382 \n",
" 0.014908 \n",
" 0.006070 \n",
" 0.007623 \n",
" \n",
" \n",
" 2023-07-14 22:00:00 \n",
" 0.000213 \n",
" -0.000135 \n",
" -0.000923 \n",
" 0.000407 \n",
" 0.000416 \n",
" -0.000925 \n",
" 0.005019 \n",
" -0.006026 \n",
" -0.003387 \n",
" -0.004127 \n",
" \n",
" \n",
" 2023-07-14 23:00:00 \n",
" 0.002698 \n",
" 0.004030 \n",
" 0.010779 \n",
" 0.003256 \n",
" -0.001525 \n",
" 0.007964 \n",
" 0.009363 \n",
" 0.011368 \n",
" 0.009877 \n",
" 0.011050 \n",
" \n",
" \n",
" 2023-07-15 00:00:00 \n",
" 0.000099 \n",
" -0.001880 \n",
" -0.005180 \n",
" 0.005274 \n",
" -0.020694 \n",
" -0.002756 \n",
" -0.005195 \n",
" 0.035219 \n",
" -0.003681 \n",
" -0.003415 \n",
" \n",
" \n",
"
\n",
"
9121 rows × 10 columns
\n",
"
"
],
"text/plain": [
" BTCUSDT ETHUSDT ADAUSDT BNBUSDT XRPUSDT \\\n",
"2022-06-30 00:00:00 NaN NaN NaN NaN NaN \n",
"2022-06-30 01:00:00 -0.000923 -0.006191 -0.005784 -0.002625 NaN \n",
"2022-06-30 02:00:00 0.003159 0.005411 0.008803 0.006399 NaN \n",
"2022-06-30 03:00:00 -0.000013 0.001208 -0.001555 0.000917 NaN \n",
"2022-06-30 04:00:00 -0.001491 -0.002486 -0.000692 -0.003752 NaN \n",
"... ... ... ... ... ... \n",
"2023-07-14 20:00:00 0.003809 0.002108 0.006864 0.010704 0.020836 \n",
"2023-07-14 21:00:00 0.000497 0.006399 0.007127 0.000407 0.014640 \n",
"2023-07-14 22:00:00 0.000213 -0.000135 -0.000923 0.000407 0.000416 \n",
"2023-07-14 23:00:00 0.002698 0.004030 0.010779 0.003256 -0.001525 \n",
"2023-07-15 00:00:00 0.000099 -0.001880 -0.005180 0.005274 -0.020694 \n",
"\n",
" DOTUSDT MATICUSDT SOLUSDT LTCUSDT AVAXUSDT \n",
"2022-06-30 00:00:00 NaN NaN NaN NaN NaN \n",
"2022-06-30 01:00:00 0.001445 -0.018480 -0.024007 -0.001699 -0.016166 \n",
"2022-06-30 02:00:00 0.007215 0.014644 0.012058 0.005674 0.018192 \n",
"2022-06-30 03:00:00 -0.011461 0.002062 -0.001056 -0.002445 -0.001729 \n",
"2022-06-30 04:00:00 0.000000 -0.018519 -0.011043 -0.000754 -0.005774 \n",
"... ... ... ... ... ... \n",
"2023-07-14 20:00:00 0.008068 0.003064 0.003837 0.006538 0.011921 \n",
"2023-07-14 21:00:00 0.005770 0.014382 0.014908 0.006070 0.007623 \n",
"2023-07-14 22:00:00 -0.000925 0.005019 -0.006026 -0.003387 -0.004127 \n",
"2023-07-14 23:00:00 0.007964 0.009363 0.011368 0.009877 0.011050 \n",
"2023-07-15 00:00:00 -0.002756 -0.005195 0.035219 -0.003681 -0.003415 \n",
"\n",
"[9121 rows x 10 columns]"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#hourly returns\n",
"freqH = '1h'\n",
"pxHB = {}\n",
"for x in univ:\n",
" data = get_binance_px_backtest(x,freqH)\n",
" pxHB[x] = data.set_index('open_time')['close']\n",
"\n",
"pxHB = pd.DataFrame(pxHB).astype(float)\n",
"pxHB = pxHB.reindex(pd.date_range(pxHB.index[0],pxHB.index[-1],freq=freqH))\n",
"retHB = pxHB.pct_change()\n",
"retHB"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "6246a984",
"metadata": {},
"outputs": [],
"source": [
"retHB['hours'] = retHB.index.hour\n",
"retHB['weekday'] = retHB.index.weekday\n",
"\n",
"regular_hours = ['14:00', '21:00'] #US time zone \n",
"after_hours = ['00:00', '13:00', '22:00', '23:00'] #because between_time inclusive on both bounds and US time zone \n",
"weekdays = [0, 1, 2, 3, 4] \n",
"weekend = [5, 6] \n",
"\n",
"# Create separate dataframes for regular hours and after hours\n",
"reg_hours_dfB = retHB.between_time(regular_hours[0], regular_hours[1]).copy()\n",
"after_hours_dfB = pd.concat([retHB.between_time(after_hours[0], after_hours[1]), retHB.between_time(after_hours[2], after_hours[3])]).copy()\n",
"\n",
"# Create separate dataframes for weekdays and weekends\n",
"weekdays_dfB = retHB[retHB.index.weekday.isin(weekdays)].copy()\n",
"weekend_dfB = retHB[retHB.index.weekday.isin(weekend)].copy()\n",
"\n",
"#test weekdays and weekends crossed with reg and after \n",
"after_hours_weekdays_dfB = after_hours_dfB[after_hours_dfB.index.weekday.isin(weekdays)].copy()\n",
"after_hours_weekend_dfB = after_hours_dfB[after_hours_dfB.index.weekday.isin(weekend)].copy()\n",
"\n",
"reg_hours_weekdays_dfB = reg_hours_dfB[reg_hours_dfB.index.weekday.isin(weekdays)].copy()\n",
"reg_hours_weekend_dfB = reg_hours_dfB[reg_hours_dfB.index.weekday.isin(weekend)].copy()"
]
},
{
"cell_type": "code",
"execution_count": 264,
"id": "357ef54e",
"metadata": {},
"outputs": [],
"source": [
"'''strats[2] = stratPrep(reg_hours_weekend_df, 1, 8, False)\n",
"strats[3] = stratPrep(reg_hours_weekdays_df, 9, 21, True)\n",
"strats = pd.DataFrame(strats)\n",
"strats'''\n",
"\n",
"H1 = stratPrep(after_hours_weekdays_dfB.drop(columns=['hours', 'weekday']), 1, 2, False)\n",
"H2 = stratPrep(reg_hours_weekend_dfB.drop(columns=['hours', 'weekday']), 1, 8, False)\n",
"H3 = stratPrep(reg_hours_weekdays_dfB.drop(columns=['hours', 'weekday']), 9, 21, True)"
]
},
{
"cell_type": "markdown",
"id": "15fb8225",
"metadata": {},
"source": [
"# Results\n",
"H1 and H3 are verified. However H2 is incoherent and is therefore dropped from our research.\n",
"\n",
"# Tcosts\n",
"We know modify the compute_strategy_function to incroporate t_costs"
]
},
{
"cell_type": "code",
"execution_count": 72,
"id": "fb47b3bd",
"metadata": {},
"outputs": [],
"source": [
"def compute_strategy_backtest_tcosts(df, lookback_days, momentum, tcost):\n",
" df['hours'] = df.index.hour\n",
"\n",
" hours = df.index.hour.unique().sort_values()\n",
"\n",
" columns = pd.MultiIndex.from_product([hours], names=['hour'])\n",
" strats = pd.DataFrame(index=df.index, columns=columns)\n",
"\n",
" for hour in hours:\n",
" comb = df[df['hours'] == hour].drop(columns=['hours'])\n",
" avg_ret = comb.rolling(lookback_days, min_periods=1).mean()\n",
" avg_ret_rank = avg_ret.rank(axis=1, ascending=momentum)\n",
" avg_ret_rank = avg_ret_rank.subtract(avg_ret_rank.mean(axis=1), axis=0)\n",
" avg_ret_rank = avg_ret_rank.divide(avg_ret_rank.abs().sum(axis=1), axis=0)\n",
" strats[hour] = (avg_ret_rank.shift() * comb).sum(axis=1) * (1 - tcost) \n",
" \n",
" strat_total = strats.sum(axis=1)\n",
" return strat_total"
]
},
{
"cell_type": "code",
"execution_count": 85,
"id": "14218141",
"metadata": {},
"outputs": [],
"source": [
"def stratPrep_tcost(returns, start, end, momentum):\n",
" lookback_range = range(start, end + 1) \n",
"\n",
"\n",
" results = {}\n",
" strat_total_2 = {}\n",
"\n",
" for lookback_days in lookback_range:\n",
" # Compute the strategy for this lookback period.\n",
" strat_total = compute_strategy_backtest_tcosts(returns, lookback_days, momentum, 0.002)\n",
" strat_total_2[lookback_days] = strat_total \n",
"\n",
" # Compute performance metrics for this strategy.\n",
" sharpe_ratio = strat_total.mean() / strat_total.std() * np.sqrt(365*24)\n",
" cumulative_return = strat_total.cumsum().iloc[-1]\n",
" results[lookback_days] = {'sharpe_ratio': sharpe_ratio, 'cumulative_return': cumulative_return}\n",
"\n",
" strat_total_2 = pd.DataFrame(strat_total_2)\n",
" results_df = pd.DataFrame(results).T\n",
" return strat_total_2, results_df\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 265,
"id": "79d3566d",
"metadata": {},
"outputs": [],
"source": [
"H1 = stratPrep_tcost(after_hours_weekdays_dfB.drop(columns = ['hours', 'weekday']), 1, 2, False)\n",
"H3 = stratPrep_tcost(reg_hours_weekdays_dfB.drop(columns = ['hours', 'weekday']), 9, 21, True)"
]
},
{
"cell_type": "markdown",
"id": "8507cfcb",
"metadata": {},
"source": [
"Per project guidelines, we have incroporated the 20bps tcosts which does not make our strategy obsolete"
]
},
{
"cell_type": "markdown",
"id": "c560cff9",
"metadata": {},
"source": [
"# Weighting\n",
"We have found one reversal and one momentum strategies to trade on. We now want to define our portfolio weights for the strategies. However we need to first define weighting for each time horizons."
]
},
{
"cell_type": "code",
"execution_count": 138,
"id": "60c63e25",
"metadata": {},
"outputs": [],
"source": [
"def optimal_weights(sigma,mu):\n",
" wgt = np.linalg.inv(sigma) @ mu \n",
" wgt = wgt / np.abs(wgt).sum()\n",
" return wgt"
]
},
{
"cell_type": "code",
"execution_count": 121,
"id": "ec862901",
"metadata": {},
"outputs": [],
"source": [
"def sr_weights(sigma,mu):\n",
" wgt = mu / np.diag(sigma) \n",
" wgt = wgt / np.abs(wgt).sum()\n",
" return wgt"
]
},
{
"cell_type": "code",
"execution_count": 149,
"id": "d1af4739",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" 0 \n",
" \n",
" \n",
" \n",
" \n",
" 1 \n",
" 0.456 \n",
" \n",
" \n",
" 2 \n",
" 0.544 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" 0\n",
"1 0.456\n",
"2 0.544"
]
},
"execution_count": 149,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#S1 weighting\n",
"sigma = H1[0].cov()\n",
"mu = H1[0].mean()\n",
"\n",
"S1W = pd.DataFrame(sr_weights(sigma,mu)).round(3)\n",
"\n",
"\n",
"#S2 weighting\n",
"sigma2 = H3[0].cov()\n",
"mu2 = H3[0].mean()\n",
"\n",
"S2W = pd.DataFrame(sr_weights(sigma2,mu2)).round(3)"
]
},
{
"cell_type": "code",
"execution_count": 159,
"id": "e7c97fa3",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" 1 \n",
" 2 \n",
" \n",
" \n",
" \n",
" \n",
" 2022-06-30 00:00:00 \n",
" 0.000000 \n",
" NaN \n",
" \n",
" \n",
" 2022-06-30 01:00:00 \n",
" 0.000000 \n",
" NaN \n",
" \n",
" \n",
" 2022-06-30 02:00:00 \n",
" 0.000000 \n",
" NaN \n",
" \n",
" \n",
" 2022-06-30 03:00:00 \n",
" 0.000000 \n",
" NaN \n",
" \n",
" \n",
" 2022-06-30 04:00:00 \n",
" 0.000000 \n",
" NaN \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 2023-07-14 19:00:00 \n",
" NaN \n",
" 0.002320 \n",
" \n",
" \n",
" 2023-07-14 20:00:00 \n",
" NaN \n",
" 0.000301 \n",
" \n",
" \n",
" 2023-07-14 21:00:00 \n",
" NaN \n",
" 0.000464 \n",
" \n",
" \n",
" 2023-07-14 22:00:00 \n",
" -0.001131 \n",
" NaN \n",
" \n",
" \n",
" 2023-07-14 23:00:00 \n",
" -0.002992 \n",
" NaN \n",
" \n",
" \n",
"
\n",
"
6528 rows × 2 columns
\n",
"
"
],
"text/plain": [
" 1 2\n",
"2022-06-30 00:00:00 0.000000 NaN\n",
"2022-06-30 01:00:00 0.000000 NaN\n",
"2022-06-30 02:00:00 0.000000 NaN\n",
"2022-06-30 03:00:00 0.000000 NaN\n",
"2022-06-30 04:00:00 0.000000 NaN\n",
"... ... ...\n",
"2023-07-14 19:00:00 NaN 0.002320\n",
"2023-07-14 20:00:00 NaN 0.000301\n",
"2023-07-14 21:00:00 NaN 0.000464\n",
"2023-07-14 22:00:00 -0.001131 NaN\n",
"2023-07-14 23:00:00 -0.002992 NaN\n",
"\n",
"[6528 rows x 2 columns]"
]
},
"execution_count": 159,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#S1 returns\n",
"S1R = (H1[0] * S1W[0]).sum(1)\n",
"S1R\n",
"\n",
"#S2R returns\n",
"S2R = (H3[0] * S2W[0]).sum(1)\n",
"S2R\n",
"\n",
"Strat_Rets = {}\n",
"Strat_Rets[1] = S1R\n",
"Strat_Rets[2] = S2R\n",
"Strat_Rets = pd.DataFrame(Strat_Rets)\n",
"Strat_Rets"
]
},
{
"cell_type": "code",
"execution_count": 169,
"id": "8c932358",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" 0 \n",
" \n",
" \n",
" \n",
" \n",
" 1 \n",
" 0.533 \n",
" \n",
" \n",
" 2 \n",
" 0.467 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" 0\n",
"1 0.533\n",
"2 0.467"
]
},
"execution_count": 169,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# overall weighting\n",
"sigmaOS = Strat_Rets.cov()\n",
"muOS = Strat_Rets.mean()\n",
"OSW = pd.DataFrame(sr_weights(sigmaOS,muOS)).round(3)\n",
"OSW"
]
},
{
"cell_type": "code",
"execution_count": 167,
"id": "252c1822",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" 0 \n",
" \n",
" \n",
" \n",
" \n",
" 2022-06-30 00:00:00 \n",
" 0.000000 \n",
" \n",
" \n",
" 2022-06-30 01:00:00 \n",
" 0.000000 \n",
" \n",
" \n",
" 2022-06-30 02:00:00 \n",
" 0.000000 \n",
" \n",
" \n",
" 2022-06-30 03:00:00 \n",
" 0.000000 \n",
" \n",
" \n",
" 2022-06-30 04:00:00 \n",
" 0.000000 \n",
" \n",
" \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 2023-07-14 19:00:00 \n",
" 0.001083 \n",
" \n",
" \n",
" 2023-07-14 20:00:00 \n",
" 0.000141 \n",
" \n",
" \n",
" 2023-07-14 21:00:00 \n",
" 0.000217 \n",
" \n",
" \n",
" 2023-07-14 22:00:00 \n",
" -0.000603 \n",
" \n",
" \n",
" 2023-07-14 23:00:00 \n",
" -0.001595 \n",
" \n",
" \n",
"
\n",
"
6528 rows × 1 columns
\n",
"
"
],
"text/plain": [
" 0\n",
"2022-06-30 00:00:00 0.000000\n",
"2022-06-30 01:00:00 0.000000\n",
"2022-06-30 02:00:00 0.000000\n",
"2022-06-30 03:00:00 0.000000\n",
"2022-06-30 04:00:00 0.000000\n",
"... ...\n",
"2023-07-14 19:00:00 0.001083\n",
"2023-07-14 20:00:00 0.000141\n",
"2023-07-14 21:00:00 0.000217\n",
"2023-07-14 22:00:00 -0.000603\n",
"2023-07-14 23:00:00 -0.001595\n",
"\n",
"[6528 rows x 1 columns]"
]
},
"execution_count": 167,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"FinalRets = (Strat_Rets * OSW[0]).sum(1)\n",
"FinalRets = pd.DataFrame(FinalRets)\n",
"FinalRets"
]
},
{
"cell_type": "markdown",
"id": "4717bc5e",
"metadata": {},
"source": [
"# Performance Evaluation"
]
},
{
"cell_type": "code",
"execution_count": 173,
"id": "7b38e5f4",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Returns \n",
" Volatility \n",
" Sharpe Ratio \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 0.166983 \n",
" 0.082068 \n",
" 2.034699 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Returns Volatility Sharpe Ratio\n",
"0 0.166983 0.082068 2.034699"
]
},
"execution_count": 173,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#all anualized and since strategy trades on every hour of weekdays we do 252 * 24\n",
"stats = {}\n",
"stats['Returns'] = FinalRets.mean() * 252 * 24\n",
"stats['Volatility'] = FinalRets.std() * np.sqrt(252 * 24)\n",
"stats['Sharpe Ratio'] = FinalRets.mean() / FinalRets.std() * np.sqrt(252 * 24)\n",
"stats = pd.DataFrame(stats)\n",
"stats"
]
},
{
"cell_type": "code",
"execution_count": 179,
"id": "264f1b53",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 -8.668895\n",
"dtype: float64"
]
},
"execution_count": 179,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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+PBhHTx4UFLVOZvgiPp49tNPP+nVV1/Vl19+qaNHj0a7OTFn586d6tevnx566KFoNyVmNaTPsXodTIwxuummm9SjRw9ZLBalpaUpJSUl2s2KOXfeead69+6tJ598UsOHD9evf/1r7dixQxaLhXBSbfbs2erdu7cWLFggSV5PQNUQUR/3jDG67bbblJWVpQULFuj888/XHXfcoX379kW7aTHBGKPp06erZ8+e6tmzp2699dZoNynmNMTPsXr77rFo0SI1adJEa9eu1cqVK7Vo0SL16dNH77//viR6A2r84x//0MqVK7V06VItWbJEzz33nDZu3Kjrr79ekkJ6BueT0dGjRzVlyhR98MEH6tixo7766iutXr1aEq8hifp4s2vXLp177rlau3atli1bpqVLl+rPf/6zVq9ere+//z7azYu6bdu2qWXLlvr888+1atUqvfnmm0pPT492s2JKQ/0cq1fBpPZ/0oEDB/Tyyy/r66+/1uDBg1VcXKxu3brp8OHDKioqarAfuDU1qvn3rbfeUrdu3TR8+HDFx8fr8ssvV//+/fXpp5/queeec9i3IUpOTlanTp00a9Ys/elPf9LevXv19ttvq7y8vMH2KNV+ztTHUe3nW1FRoYsvvljPP/+8hgwZosTERF188cWKi4tTjx49otjK6Kldn4SEBLVr107Dhw/XgAEDtHLlSs2cOVMPPfSQlixZosLCwii2NHr4HJNk6omioiJTUlJiv1xZWWn/vaKiwhhjzO2332769u3rcn1D4VyjI0eOmHHjxpnf/va3DvW46667TK9evUx6eropLy+PRlOjxmazGWNOvGaMMebo0aP232fOnGmGDRtm3n33XYf9Gwrn15DNZqM+1ZxrU1xcbI4cOWK/nJuba0aPHm2ysrLMlClTzKJFi6LQyuhx9x791ltvGYvFYsaOHWs6depkLr30UtOvXz/Tvn17c+2110axtdHB51iVetFjMmvWLA0fPlwTJkzQU089pcLCQlmtVvsEvJpUOXr0aO3atUt79uxpcGPgzjU6evSomjVrpj59+mjZsmV68MEHdejQId1999164YUXNGfOHCUkJNh7TRqCxx9/3D75Li4uzr49LS3N/lq69dZbZYzRokWLdPDgwQbVK+D8GiooKJDFYlFqamqDr4+72iQlJalZs2aSpK1bt6pz586Kj4/X3XffrSNHjujuu+9uMJM93dXHarVq1KhRuuaaa3Ts2DG98847euWVV7Ru3TrNmTNHX3/9tebPnx/tpkcMn2O1RDcXBae0tNRcdtllJisry/zrX/8y1157rcnKyjLjx493u/9///tf06VLF/P5559HuKXR46lGY8eONcYYU1hYaG677TbTvXt306JFC3Pqqaear7/+2hhjzPDhw83jjz8ezeZHxKpVq8zIkSONxWIxp59+ulm5cqUxxvXbSM23/yeeeMIMHDjQLFy40OW6+sjfv7OaejWk+tTlPWjdunX23ysqKszMmTPN0KFDTVFRUSSbHFGe6jNu3Dj7Pj/88INZvXq1sdls9tfQoUOHzIQJE8wNN9zg0HtZH/E55uqkDibff/+96dGjh1m2bJl92+eff26Sk5PNI488Yn8zrP1ib9SokVm8eLHD9vrMW43mzZtn35adnW02bNhgv1xSUmIyMjLMX//614i2NxoeeOABc9lll5mFCxeaMWPGmKlTp9qvq/2BWvN7SUmJGTdunLniiivMhg0bzMsvv2wefPDBiLc7Uur6d9aQ6uNvbdyZOHGiGT9+vCkrK6u3wc1XfdypqUX37t3NjBkzItLOaOJzzNVJHUzWrl1rLBaLOXTokDHmxAt63rx5pnnz5ubHH3902P/o0aNmxIgRZubMmRFva7T4qtGWLVsc9q+5/qWXXjKDBw82OTk5kW1wBNU81927d9t7SebNm2cGDx5s3njjDWOM6x99zeVFixaZrl27mpYtW5pGjRqZxx57LIItj6y6/J01tPrU9T2oxpdffmlGjBhhXn311Yi1NRoCrc/7779vzjjjDPPFF19ErK3RwueYq5N6gMpqtSorK0uvvvqqw/aZM2eqWbNmevbZZyVVzY6XpJSUFO3bt0/Hjx9XeXl5xNsbDb5qVLPuRGVlpQ4dOqRFixbpxhtv1IwZMzR+/Hi1adOm3s4RqBmz7dixo4YOHSpJuuKKK9S2bVu9+uqrOnLkiMMYr1RVz+3bt+s///mPdu7cqSuuuEKHDx/WzJkzo/IcIsHfv7PKysoGVx9/a2Oz2fT999/rk08+0YwZMzRmzBidfvrpuuyyy6LR7IipS302btyojz76SNOnT9ekSZN03nnnafDgwdFodkTxOeZGtJORN766Nw8fPmwuvvhic+WVV9q/2dccRfKnP/3JtGvXzv4Nrmac8qWXXnLpJTiZhbJGeXl55s477zSjR492GA8/2fnbTV6z3/PPP28GDx7scX7NXXfdZTp06OAw9FWf1eU1ZEzDqk9davPaa6+Z8ePHmzFjxpj169dHrc2RVJf6vPjii2bUqFFm1KhR9er9xxc+x1zFbI9Jfn6+fWl0yXGJ65rk2Lx5c1100UXavHmzfYne+Ph4SVVHUjRv3lzZ2dmSThxlcc0116hnz54ReQ7hFqoa7dmzR5KUkZGh3//+91q+fLn69esXqacRVv7UqEbNfpdddpmysrK0ePFibd26VZL0zTff2Pd7+OGHlZ2drdNOOy2cTY+IvLw8HThwQGVlZZLkUKu6/p3V1La+1CdUtdm9e7ckaeLEifrLX/6ipUuXqm/fvpF8KmER6vpceuml+vvf/64VK1bUm/efUP59SfXzc8ydmAsm5eXluvnmmzVu3DiNGzdODzzwgGw2m6xWq/0/Mj4+XiUlJfrXv/6l66+/Xv3799frr7+ujz76yH4/P/30kzIyMtSpU6doPZWwCXWNOnfubN/WtGnTSD+dsPC3RuXl5XrxxRftl202m1JTU3X55ZfLZrPpvvvu03nnnadBgwbpyJEjkurHcuvl5eWaPn26RowYoYsuukg/+9nPVFpaqri4OHv3cF3/zmrqcrLXJ9S16dKli6Sqxehq/62drMJVnyZNmqhbt25ReU6hFo6/rwYl2l02tS1btsx0797dnHPOOebtt982119/venVq5eZPXu2w35PPvmkadGihZk4caIxxpj169ebq666yjRq1MjMmDHD3HDDDaZp06Zm/vz5xpj6dagiNfKtrjW69NJLzeHDhx2u2717t+nWrZuxWCxm0qRJJjc3N5JPIazefPNN061bN3POOeeYFStWmAULFpiuXbuam266yWG/hvgaojbeUR/fqFHwYiaY5Ofnm6lTp5qbb77ZlJWVGWOqju+eM2eOGTt2rDl+/LgxxphnnnnGdOnSxbzyyisO49o2m8089NBDZtq0aWbcuHH1cjY3NfItkBo5/8F/+OGHJiUlxfTv39+sWbMm4s8h3G6++WZz7733Oqzqe91115k77rjDfvnpp582nTt3bnCvIWrjHfXxjRoFz2JMbBxyceTIEb3zzjvq16+f+vfvL2OMLBaL7rnnHn355Zf65JNPJFWNy5WWlqpJkyb229bsW99RI9+CqVGNQ4cOadmyZfrFL34R6eaHVc1QVm5ursrLy5WZmSlJ2r17ty655BL98pe/1NChQ3XWWWc1uNcQtfGO+vhGjUInasFkwYIFslgs6tmzp8455xxJjv8xlZWViouL00033aTi4mItXLiwwf3HUSPfQl2j+lY/X/V5+umnddttt2nYsGGKi4vThg0b9Otf/1qzZs1SUlJSNJsedtTGO+rjGzUKk8h1zlR59dVXTatWrczQoUNN//79TUZGhn1VyNpLD9d0rw8ePNg899xzDtvqO2rkGzXyzt/6vPDCC+bTTz+11+SVV14xycnJZteuXVFpdyRQG++oj2/UKLwiGkxeeeUV069fP/O3v/3NGGPM3r17zdNPP22aNGliCgoKXPbfsWOHycjIMJs3b7Zv2759uzHG1NvzJ1Aj36iRd/7Ux9Pz/uGHH0xcXJzD8tj1CbXxjvr4Ro3CLyLH9Znq0aLy8nINHjxY1157rSSpXbt2GjBggNq3b68ffvjB5XZLly5VZmamevXqpW+//VaDBw/WkCFDVFFR4XD21/qAGvlGjbyrS308Pe9FixbpvPPO0/DhwyPT6AihNt5RH9+oUQSFM/WsXbvWHDlyxH756NGjLkly3bp1pk2bNg6Ha9Z0e/361782l112mfnNb35jrFarmTJliikpKQlnkyOOGvlGjbwLtD41du/ebbZt22amTp1q2rVrZ1544QVjTP0Y8qI23lEf36hR5IUlmPz73/82HTp0MN26dTMdO3Y09957r8M6ELUPj3r88cfNsGHDjDFVh3XW3qdTp07GYrGYkSNHmk2bNoWjqVFDjXyjRt4FWp+aw6iNMebHH380M2fONB06dDCjRo2qN8tcUxvvqI9v1Ch6Qh5MVq9ebXr37m2eeOIJs379evPMM8+YjIwMM2PGDPvZEysrK+3HeP/85z83N998s8v9HD161MybN88sXbo01E2MOmrkGzXyLlT1KSoqMh9//HG9Wi+B2nhHfXyjRtEVsmBS0y01f/5806FDB5Ofn2+/7i9/+YsZMmSIeeCBB+zbKisrjc1mM926dTOLFy82xhizZcsWM2nSJLNnz55QNSumUCPfqJF31MczauMd9fGNGsWGkE1+rTlue+fOnerZs6f9JESSNHnyZA0cOFDvv/++Nm3aJKnqfBqrV69W48aNdfrpp+v2229X3759dejQIWVkZISqWTGFGvlGjbwLZX1atWoVlecQLtTGO+rjGzWKDQEHk+XLl+vWW2/Vk08+qVWrVtm3Dxs2TCtXrlRubq6kqgWumjRpookTJ8pisWjZsmX2fd977z1t3LhRvXr10vLly/XFF19o2bJl9WbhGWrkGzXyLpz1SUxMjPjzCSVq4x318Y0axai6drHk5OSYCRMmmFatWpmrrrrKnHbaaSYtLc18/fXXxhhjiouLTe/evc0NN9xgjHGcIHT22Wc7nMjowQcfNBkZGeatt94KtucnplAj36iRd9THM2rjHfXxjRrFtjoFk+PHj5vrrrvOXHnllWbHjh327WeccYaZPHmyMaZqYZmXXnrJWK1Wlwk/V111lRk5cqT9cl5eXjBtj0nUyDdq5B318YzaeEd9fKNGsa9OQzmNGzdWYmKiJk+erC5duqiiokKSNGHCBIeFZa644gpNnDhRU6dO1SeffCJjjHJzc7V161ZdffXV9vurj3MAqJFv1Mg76uMZtfGO+vhGjU4CdU0ytY/RrpnBfPXVV5tp06Y5bCsuLjYjR440rVq1MmPGjDHt2rUzQ4YMaRAzlamRb9TIO+rjGbXxjvr4Ro1iW0jOLjxixAhdf/31mjx5sowxstlsiouL0/79+7VhwwatXr1anTt31i9/+ctQZKmTEjXyjRp5R308ozbeUR/fqFEMCTbZbN++3bRu3dqsWbPGvq32ypugRv6gRt5RH8+ojXfUxzdqFFsCPlzYVHe0fP7550pJSdHAgQMlSffdd59uu+025eXlhSY5ncSokW/UyDvq4xm18Y76+EaNYlO8713cq1mIZtWqVbr00ku1fPly3XDDDSoqKtI///lPFpcRNfIHNfKO+nhGbbyjPr5RoxgVTHdLcXGx6d69u7FYLCYxMdE8/PDDQXfh1DfUyDdq5B318YzaeEd9fKNGsSfoya/nn3++evTooccff7xerLQZDtTIN2rkHfXxjNp4R318o0axJehgUllZqbi4uFC1p16iRr5RI++oj2fUxjvq4xs1ii0hOVwYAAAgFEJ2dmEAAIBgEUwAAEDMIJgAAICYQTABAAAxg2ACAABiBsEEAADEDIIJAACIGQQTAAAQMwgmAAAgZhBMAABAzPh/SoCj4QsKInsAAAAASUVORK5CYII=\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#drawdowns\n",
"finalCumRet = FinalRets.cumsum()\n",
"\n",
"def drawdown(cumRets):\n",
" return (cumRets / cumRets.expanding(min_periods=1).max() -1)\n",
"\n",
"stratDD = drawdown(finalCumRet)\n",
"stratDD.plot()\n",
"stratDD.min() #worse point of drawdowns"
]
},
{
"cell_type": "code",
"execution_count": 183,
"id": "9dc0037e",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 73.416667\n",
"dtype: object"
]
},
"execution_count": 183,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#drawdown duration\n",
"def duration(finalCumRet):\n",
" \n",
" peak = finalCumRet.expanding(min_periods=1).max()\n",
" res = pd.DataFrame(index=finalCumRet.index,columns=finalCumRet.columns)\n",
" \n",
" for col in finalCumRet.columns:\n",
" for dt in finalCumRet.index:\n",
" \n",
" if finalCumRet.loc[dt,col] >= peak.loc[dt,col]:\n",
" res.loc[dt,col] = 0\n",
" \n",
" else: \n",
" res.loc[dt,col] = res.loc[:dt,col].iloc[-2] + 1/24\n",
"\n",
" return res\n",
"\n",
"stratDDD = duration(finalCumRet)\n",
"stratDDD.plot()\n",
"stratDDD.max() #longest drawdown throughout the year"
]
},
{
"cell_type": "markdown",
"id": "35683ea3",
"metadata": {},
"source": [
"Looking at these 2 graphs seperatly could be a bit scary however as we see on the first graph we have a very low drawdown at some point which is also over a short period of time. On the other hand we see a a fex long drawdowns throughout the year but they never go very low making it not too uncomfortable."
]
},
{
"cell_type": "markdown",
"id": "49b75a1d",
"metadata": {},
"source": [
"# Regression Using StatsModels\n",
"- Run a regression to find beta and alpha of our strat to BTC\n",
"- Stratt ~ $\\beta$ * BTCt + $\\alpha$ + et "
]
},
{
"cell_type": "code",
"execution_count": 223,
"id": "ea48809f",
"metadata": {},
"outputs": [],
"source": [
"#alpha/beta using bitcoin as benchmark\n",
"benchMark = get_binance_px_backtest('BTCUSDT','1h')\n",
"retBM = benchMark.set_index('open_time')['close']\n",
"retBM = pd.DataFrame(retBM).astype(float)\n",
"retBM = retBM.reindex(pd.date_range(retBM.index[0],retBM.index[-1],freq=freqH))\n",
"retBM = retBM.pct_change()"
]
},
{
"cell_type": "code",
"execution_count": 224,
"id": "3e16c84a",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" strat \n",
" BM \n",
" \n",
" \n",
" \n",
" \n",
" 2022-06-30 00:00:00 \n",
" 0.000000 \n",
" NaN \n",
" \n",
" \n",
" 2022-06-30 01:00:00 \n",
" 0.000000 \n",
" -0.000923 \n",
" \n",
" \n",
" 2022-06-30 02:00:00 \n",
" 0.000000 \n",
" 0.003159 \n",
" \n",
" \n",
" 2022-06-30 03:00:00 \n",
" 0.000000 \n",
" -0.000013 \n",
" \n",
" \n",
" 2022-06-30 04:00:00 \n",
" 0.000000 \n",
" -0.001491 \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 2023-07-14 19:00:00 \n",
" 0.001083 \n",
" 0.000271 \n",
" \n",
" \n",
" 2023-07-14 20:00:00 \n",
" 0.000141 \n",
" 0.003809 \n",
" \n",
" \n",
" 2023-07-14 21:00:00 \n",
" 0.000217 \n",
" 0.000497 \n",
" \n",
" \n",
" 2023-07-14 22:00:00 \n",
" -0.000603 \n",
" 0.000213 \n",
" \n",
" \n",
" 2023-07-14 23:00:00 \n",
" -0.001595 \n",
" 0.002698 \n",
" \n",
" \n",
"
\n",
"
6528 rows × 2 columns
\n",
"
"
],
"text/plain": [
" strat BM\n",
"2022-06-30 00:00:00 0.000000 NaN\n",
"2022-06-30 01:00:00 0.000000 -0.000923\n",
"2022-06-30 02:00:00 0.000000 0.003159\n",
"2022-06-30 03:00:00 0.000000 -0.000013\n",
"2022-06-30 04:00:00 0.000000 -0.001491\n",
"... ... ...\n",
"2023-07-14 19:00:00 0.001083 0.000271\n",
"2023-07-14 20:00:00 0.000141 0.003809\n",
"2023-07-14 21:00:00 0.000217 0.000497\n",
"2023-07-14 22:00:00 -0.000603 0.000213\n",
"2023-07-14 23:00:00 -0.001595 0.002698\n",
"\n",
"[6528 rows x 2 columns]"
]
},
"execution_count": 224,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"retBM['days'] = retBM.index.weekday\n",
"retBM = retBM[~retBM['days'].isin([5,6])]\n",
"rets = pd.DataFrame()\n",
"rets['strat'] = FinalRets\n",
"rets['BM'] = retBM.drop(columns='days')\n",
"rets"
]
},
{
"cell_type": "code",
"execution_count": 246,
"id": "21318f7d",
"metadata": {},
"outputs": [],
"source": [
"import statsmodels.api as sm\n",
"X = rets[['BM']]\n",
"X = sm.add_constant(X)\n",
"\n",
"Y = rets['strat']"
]
},
{
"cell_type": "code",
"execution_count": 245,
"id": "b54f537d",
"metadata": {},
"outputs": [],
"source": [
"X = X.drop(X.iloc[0].name)\n",
"Y = Y.drop(Y.index[0])\n",
"results = sm.OLS(Y, X).fit()"
]
},
{
"cell_type": "code",
"execution_count": 248,
"id": "b5081a5d",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"const 2.053700\n",
"BM 4.937233\n",
"dtype: float64"
]
},
"execution_count": 248,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"results.summary()\n",
"results.tvalues"
]
},
{
"cell_type": "markdown",
"id": "1e74514a",
"metadata": {},
"source": [
"Reconstruct our strat\n",
"- FBt ~ $\\beta$ * SPYt + $\\alpha$ + et "
]
},
{
"cell_type": "code",
"execution_count": 250,
"id": "e5fbbffb",
"metadata": {},
"outputs": [],
"source": [
"strat = results.params['BM']*X['BM'] + results.params['const'] + results.resid"
]
},
{
"cell_type": "code",
"execution_count": 252,
"id": "21f2c966",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"3.4102350476013533e-17"
]
},
"execution_count": 252,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(strat-Y).abs().sum()"
]
},
{
"cell_type": "code",
"execution_count": 254,
"id": "0c877bfb",
"metadata": {},
"outputs": [],
"source": [
"r = results.params['BM']*X['BM']\n",
"prediction = results.params['BM']*X['BM'] + results.params['const']\n",
"alpha_contr = results.params['const'] + results.resid"
]
},
{
"cell_type": "code",
"execution_count": 255,
"id": "b559f249",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"2022-06-30 01:00:00 9.909775e-06\n",
"2022-06-30 02:00:00 -3.390667e-05\n",
"2022-06-30 03:00:00 1.443069e-07\n",
"2022-06-30 04:00:00 1.600760e-05\n",
"2022-06-30 05:00:00 1.995508e-05\n",
" ... \n",
"2023-07-14 19:00:00 1.080328e-03\n",
"2023-07-14 20:00:00 9.985892e-05\n",
"2023-07-14 21:00:00 2.113945e-04\n",
"2023-07-14 22:00:00 -6.052181e-04\n",
"2023-07-14 23:00:00 -1.623841e-03\n",
"Length: 6527, dtype: float64"
]
},
"execution_count": 255,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"alpha_contr"
]
},
{
"cell_type": "code",
"execution_count": 256,
"id": "f87d0876",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 256,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"alpha_contr.cumsum().plot()"
]
},
{
"cell_type": "code",
"execution_count": 257,
"id": "ce8086e1",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"6.540094399242437e-17"
]
},
"execution_count": 257,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# corr is almost 0 to BM\n",
"alpha_contr.corr(X['BM'])"
]
},
{
"cell_type": "code",
"execution_count": 258,
"id": "2d6e2d3e",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"2.678180880492585e-05"
]
},
"execution_count": 258,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#\"alpha\"\n",
"alpha_contr.mean()"
]
},
{
"cell_type": "code",
"execution_count": 259,
"id": "318bf426",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1.977223289957915"
]
},
"execution_count": 259,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# information ratio\n",
"alpha_contr.mean()/alpha_contr.std()*np.sqrt(252 * 24)"
]
},
{
"cell_type": "code",
"execution_count": 260,
"id": "d5ac3210",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"2.0537003986836893"
]
},
"execution_count": 260,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# alpha t-stat\n",
"results.tvalues['const']"
]
},
{
"cell_type": "markdown",
"id": "c777025e",
"metadata": {},
"source": [
"Our regression shows that our strategy is not correlated to the 'tide' of cryptos (chose BTC as the tide) and that the information ratio was very close to the sharpe."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.13"
}
},
"nbformat": 4,
"nbformat_minor": 5
}