You are on page 1of 1

In [1]: import quandl

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import datetime as datetime
from scipy.signal import savgol_filter
import pywt
import math
import pyfolio as pf
from pyfolio import timeseries

C:\Users\abhid\anaconda3\lib\site-packages\pyfolio\pos.py:26: UserWarning: Module "zip


line.assets" not found; mutltipliers will not be applied to position notionals.
warnings.warn(

In [2]: df_data_NBA = pd.read_csv('output/data_NBA_output_Ver2.csv')


df_data_NBA.index = pd.to_datetime(df_data_NBA['Date'])
df_data_NBA.drop(['Date'], axis=1, inplace=True)
Max_Net_DDThresh = df_data_NBA.loc[df_data_NBA.index[0],'Max_Net_DDThresh']
NBA_Week_len = df_data_NBA.loc[df_data_NBA.index[0],'NBA_Week_len']

#############################################
### Daily Returns Stats
df_data = pd.read_csv('output/data_output_Ver2.csv')
df_data.index = pd.to_datetime(df_data['Date'])
df_data.drop(['Date'], axis=1, inplace=True)

Net Balance Algorithm - Cumulative Gross Returns with Different filters vs S&P Index
returns
In [3]: plt.figure(figsize =(15, 5))

plt.plot(df_data_NBA['Index_GRetCum_pct'], 'k', label = 'Benchmark - S&P Index returns


plt.plot(df_data_NBA['GRetCum_pct'], 'b--', label = 'Raw signal returns - w/o. filteri
plt.plot(df_data_NBA['GRetCum_pct2'], 'g--', label = 'New returns - Exp. filtered sign
plt.plot(df_data_NBA['GRetCum_pct3'], 'm--', label = 'New returns - Sav-Golay filtered
plt.plot(df_data_NBA['GRetCum_pct4'], 'r--', label = 'New returns - DWT filtered signa
plt.plot(df_data_NBA['Alarm'], 'r', label = f'Trade Alarm with Drawdown Threshold = {M

plt.title(f"Unscaled NBA Cum. Gross Returns with S&P Index Data: NBA Length - {NBA_Wee
#plt.ylim([-20000, 20000])
#plt.xlim([datetime.date(2018, 1, 1), datetime.date(2019, 1, 1)])
plt.grid()
plt.legend()
plt.show()

In [ ]:

Benchmark stats - S&P Index Returns


In [4]: Benchmark_NRet = pd.Series(df_data['Index_NRet_pct'], name="S&P Index Returns")
pf.show_perf_stats(returns=Benchmark_NRet)
#pf.create_simple_tear_sheet(returns=Benchmark_NRet)

Start date 2013-04-03

End date 2021-04-30

Total months 96

Backtest

Annual return 12.9%

Cumulative returns 166.3%

Annual volatility 17.2%

Sharpe ratio 0.79

Calmar ratio 0.38

Stability 0.94

Max drawdown -33.9%

Omega ratio 1.17

Sortino ratio 1.10

Skew -0.68

Kurtosis 20.39

Tail ratio 0.92

Daily value at risk -2.1%

In [ ]:

Backtest stats (NBA with DWT Filter output)


In [5]: #### Converting NBA returns to equivalent daily returns for tearsheet generation
temp_Daily_NRet = np.zeros(len(df_data))
temp_NBA_Return = np.array(df_data_NBA['NRet_pct4'])

for i in range(0, len(df_data_NBA)):


temp_Daily_NRet[i*NBA_Week_len*5] = temp_NBA_Return[i]

df_data['Analogous_Daily_NRet'] = temp_Daily_NRet

In [6]: Backtest_NRet = df_data['Analogous_Daily_NRet']

pf.create_returns_tear_sheet(returns=Backtest_NRet, benchmark_rets=Benchmark_NRet)

C:\Users\abhid\anaconda3\lib\site-packages\empyrical\stats.py:1527: RuntimeWarning: di
vide by zero encountered in double_scalars
return np.abs(np.percentile(returns, 95)) / \
Start date 2013-04-03

End date 2021-04-30

Total months 96

Backtest

Annual return 45.8%

Cumulative returns 2001.9%

Annual volatility 12.2%

Sharpe ratio 3.15

Calmar ratio 4.83

Stability 0.99

Max drawdown -9.5%

Omega ratio 6.17

Sortino ratio 9.30

Skew 5.60

Kurtosis 69.54

Tail ratio inf

Daily value at risk -1.4%

Alpha 0.46

Beta 0.05

Worst drawdown periods Net drawdown in % Peak date Valley date Recovery date Duration

0 9.49 2020-08-26 2020-09-03 2020-10-23 43

1 5.53 2019-04-30 2019-05-22 2019-06-27 43

2 4.79 2021-01-20 2021-02-11 2021-04-12 59

3 3.85 2018-01-26 2018-01-29 2018-02-05 7

4 2.57 2020-06-09 2020-06-10 2020-07-09 23

You might also like