Task: study a relationship between market sentiment and intraday/overnight/first30m/last30m returns
Market sentiment is defined as the bearishness and bullishness of SPY and can be calculated based on daily and weekly stochastic oscillator and MACD.
For a new task i check if a market sentiment (in terms of macd and stochastic of SPY) can explain stock returns (OV-return / IR / first 30m / last 30m). So i analyse mean / gmean / std / Count / % of successful trades
#importing
import numpy as np
import pandas as pd
import scipy as sc
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
import talib
from datetime import datetime, timedelta, date
from scipy.stats.mstats import gmean
from quantopian.pipeline import Pipeline
from quantopian.pipeline.data.builtin import USEquityPricing
from quantopian.pipeline.filters import Q500US
from quantopian.research import run_pipeline
from quantopian.pipeline.data import Fundamentals
spyprices = get_pricing("spy", start_date='2006-1-2', end_date='2018-11-1')
spyprices['ticker'] = "SPY"
spyprices.head(5)
earnings = pd.DataFrame(local_csv(path='bespoke_4Jun_2018.csv', thousands=','))
#: Data cleaning
earnings.columns = (['symbol', 'date', 'time', 'prior_close', 'eps_act', \
'eps_est', 'eps_actvsest', 'rev_act', 'rev_est', 'rev_actvsest',\
'guidance', 'gap%', 'gap_pt', 'open_to_close%', 'open_to_close_pt',\
'day_chng%', 'day_chng_pt'])
earnings['date']=pd.to_datetime(earnings['date'])
def remove_earnings(data, earnings_df=earnings):
ticker = data['ticker'].unique()
earnings_stock_dates = earnings_df.loc[earnings_df.symbol==ticker[0], 'date']
dates = data[~data.date.isin(earnings_stock_dates)].copy()
del dates['ticker']
return dates
def get_stochastic(data, high='high', low='low', close='close_price'):
data['slowk'], data['slowd'] = talib.STOCH(data[high].values,
data[low].values,
data[close].values,
fastk_period=14,
slowk_period=3,
slowk_matype=0,
slowd_period=3,
slowd_matype=0)
data['stoch_mode'] = np.where(data['slowk'] > data['slowd'], True , np.NaN)
data['stoch_mode'] = np.where(data['slowk'] < data['slowd'], False, data['stoch_mode'],)
data['stoch_mode']= data['stoch_mode'].shift(periods=1)
return data
def get_MACD(data):
data['ema12'] = data['close_price'].ewm(ignore_na=False,span=12,min_periods=0,adjust=True).mean()
data['ema26'] = data['close_price'].ewm(ignore_na=False,span=26,min_periods=0,adjust=True).mean()
data['macd'] = data['ema12']-data['ema26']
data['signal'] = data['macd'].ewm(ignore_na=False,span=9,min_periods=0,adjust=True).mean()
data['macd_mode'] = np.where((data['macd']>data['signal']), True, np.NaN)
data['macd_mode'] = np.where((data['macd']<data['signal']), False, data['macd_mode'],)
data['macd_mode']= data['macd_mode'].shift(periods=1)
return data
stock_prices_d = get_pricing('SPY', start_date='2006-1-2', end_date='2018-11-1')
stock_prices_d = stock_prices_d.reset_index()
stock_prices_d['ticker'] = 'SPY'
stock_prices_d.head()
stock_prices_d = stock_prices_d.groupby('ticker').apply(get_stochastic)
stock_prices_d = stock_prices_d.groupby('ticker').apply(get_MACD)
stock_prices_d.head()
stock_prices_d["or"] = ((stock_prices_d.open_price/stock_prices_d.close_price[1:])-1)
stock_prices_d["ir"] = ((stock_prices_d.close_price/stock_prices_d.open_price)-1)
stock_prices_d.head()
stock_prices_d.rename(columns={'index': 'major'}, inplace=True)
def get_success_rate(data):
return(data>0).apply(sum)/len(data)
def resample_data(data):
ohlc_dict = {
'open_price':'first',
'close_price': 'last',
'high':'max',
'low':'min',
'volume': 'sum'}
data_w = data.resample('7D').agg(ohlc_dict).dropna()
return data_w
stock_prices_d.index = stock_prices_d.major.values
stock_prices_w = stock_prices_d.groupby('ticker').apply(resample_data)
stock_prices_w.head()
stock_prices_w = stock_prices_w.reset_index()
stock_prices_w = stock_prices_w.groupby('ticker').apply(get_MACD)
stock_prices_w = stock_prices_w.groupby('ticker').apply(get_stochastic)
stock_prices_w
del stock_prices_w['high']
del stock_prices_w['close_price']
del stock_prices_w['open_price']
del stock_prices_w['low']
del stock_prices_w['volume']
del stock_prices_w['ema12']
del stock_prices_w['ema26']
del stock_prices_w['macd']
del stock_prices_w['signal']
del stock_prices_w['slowk']
del stock_prices_w['slowd']
stock_prices_w.rename(columns={'level_1': 'date'}, inplace=True)
stock_prices_w.head()
stock_prices_w = stock_prices_w[['date','ticker','macd_mode','stoch_mode']]
spyprices.index.name = 'date'
spyprices.reset_index(level=0, inplace=True)
spyprices.index = spyprices.date.values
spyprices.index = spyprices.date.values
del spyprices['date']
spyprices.index.name = 'date'
spyprices = spyprices.reset_index().sort(['ticker', 'date'], ascending=True).set_index('date')
spyprices.reset_index(level=0, inplace=True)
spyprices.head()
spyprices = spyprices[['date','ticker','open_price','high', 'low','close_price', 'volume', 'price']]
x = pd.DataFrame.merge(spyprices,stock_prices_w, how = 'left', on=['date','ticker'])
x.head(20)
x = pd.DataFrame.merge(spyprices,stock_prices_w, how='left')
x.macd_mode.fillna(method='ffill',inplace=True)
x.stoch_mode.fillna(method='ffill',inplace=True)
x.head()
x = Daily IR and Weekly MACD / OS
xx = x.copy()
xx.rename(columns={'macd_mode': 'macd_mode_weekly'}, inplace=True)
xx.rename(columns={'stoch_mode': 'stoch_mode_weekly'}, inplace=True)
xx.sort_values('date')
xx.index = xx.date.values
xx.head()
del xx['date']
xx.index.name = 'date'
xx.reset_index(level=0, inplace=True)
xx.head()
yy = get_pricing('SPY', start_date='2006-1-2', end_date='2018-11-1')
yy = yy.reset_index()
yy['ticker'] = 'SPY'
yy.rename(columns={'index':'date'}, inplace=True)
yy = yy.groupby('ticker').apply(get_stochastic)
yy = yy.groupby('ticker').apply(get_MACD)
yy.head()
merge daily ( stock_prices_d) mit weekly data (x)
del yy['open_price']
del yy['high']
del yy['low']
del yy['close_price']
del yy['volume']
del yy['price']
del yy['ema12']
del yy['ema26']
del yy['macd']
del yy['signal']
del yy['slowk']
del yy['slowd']
yy = yy[['ticker', 'date','stoch_mode', 'macd_mode']]
yy.index = yy.date.values
del yy['date']
yy.index.name = 'date'
yy = yy.reset_index().sort(['ticker', 'date'], ascending=True).set_index('date')
yy.head()
yy.reset_index(level=0, inplace=True)
yy.head()
newdata1 = pd.DataFrame.merge(xx,yy, how = 'left', on=['ticker','date'])
newdata1.rename(columns={'ir':'open_to_close'}, inplace=True)
newdata1
del newdata1["open_price"]
del newdata1["high"]
del newdata1["low"]
del newdata1["close_price"]
del newdata1["volume"]
del newdata1["price"]
del newdata1['ticker']
pipe = Pipeline(
# market_cap = Fundamentals.market_cap.latest
columns={'symbol': Fundamentals.symbol.latest},
screen=Q500US()
)
my = run_pipeline(pipe, '2006-1-2', '2006-1-2')
shortlist = my.index.get_level_values(1)
tickers = pd.Series(shortlist).apply(lambda x: x.symbol)
close_prices = get_pricing(shortlist, start_date='2006-1-2', end_date='2018-11-1', fields="close_price")
open_prices = get_pricing(shortlist, start_date='2006-1-2', end_date='2018-11-1', fields="open_price")
overnight = ((open_prices/close_prices[1:])-1)
overnight.columns = tickers
overnight.head(3)
overnight = overnight.reset_index()
overnight.rename(columns={'index':'date'}, inplace=True)
overnight = pd.melt(overnight, id_vars = 'date', var_name='ticker', value_name='ov_return')
overnight = overnight.groupby('ticker').apply(remove_earnings)
overnight.reset_index(inplace=True)
overnight.head(3)
overnight = overnight[['date','ticker','level_1','ov_return']]
overnight.head(3)
newdata = pd.DataFrame.merge(overnight,newdata1, how = 'left', on=['date'])
newdata.rename(columns={'ov_return': 'or'}, inplace=True)
newdata.head()
# 1. Heatmap
groupby1 = pd.DataFrame(newdata.groupby(['stoch_mode','macd_mode'])['or'].mean())
data11 = groupby1.dropna()
data1 = pd.DataFrame.unstack(data11)
data1
sns.heatmap(data1, linewidths=1, cmap='RdYlGn', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = '.2%')
plt.xlabel('MACD Mode')
plt.ylabel('Stoch Mode')
plt.title ('Heatmap 1: Daily Stochastic Oscillator / MACD Signals of SPY to Average Overnight Market Return');
# 2. Heatmap
groupby2 = pd.DataFrame(newdata.groupby(['stoch_mode','macd_mode'])['or'].std())
data22 = groupby2.dropna()
data2 = pd.DataFrame.unstack(data22)
sns.heatmap(data2, linewidths=1, cmap='RdYlGn', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = '.2%')
plt.xlabel('MACD Mode')
plt.ylabel('Stoch Mode')
plt.title ('Heatmap 2: Daily Stochastic Oscillator / MACD - Signals of SPY to Standard Deviation Overnight Market Return');
# 3. Heatmap
y = newdata.copy()
y['or'] = y['or'] + 1
y = y[np.isfinite(y['or'])]
dd = pd.DataFrame(y.groupby(['stoch_mode','macd_mode']) ['or'].apply(gmean))
data100 = dd.dropna()
data100['or'] = data100['or'] -1
data5 = data100.unstack()
sns.heatmap(data5, linewidths=1, cmap='RdYlGn', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = '.2%')
plt.xlabel('MACD Mode')
plt.ylabel('Stoch Mode')
plt.title ('Heatmap 3: Daily Stochastic Oscillator / MACD- Signals of SPY to Geometric Mean of Overnight Market Return');
# 4. Heatmap
groupby31 = pd.DataFrame(newdata.groupby(['stoch_mode','macd_mode'])['or'].count())
data31 = groupby31.dropna()
data311 = pd.DataFrame.unstack(data31)
sns.heatmap(data311, linewidths=1, cmap='Blues', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = "d")
plt.xlabel('MACD Mode')
plt.ylabel('Stoch Mode')
plt.title ('Heatmap 4: Daily Stochastic Oscillator / MACD Signals of SPY to observed numbers Overnight Market Return');
# 5. Heatmap
kk = newdata.copy()
kk.dropna()
kk2 = pd.DataFrame(kk.groupby(['stoch_mode','macd_mode']) [['or']].apply(get_success_rate))
data111 = kk2.dropna()
data10 = pd.DataFrame.unstack(data111)
sns.heatmap(data10, linewidths=1, cmap='RdYlGn', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = '.2%')
plt.xlabel('MACD Mode')
plt.ylabel('Stoch Mode')
plt.title ('Heatmap 5: Daily Stochastic Oscillator / MACD Signals of SPY - Number of Successfull trades Overnight Market Return');
# 6. Heatmap
groupby3 = pd.DataFrame(newdata.groupby(['stoch_mode_weekly','macd_mode_weekly'])['or'].mean())
data33 = groupby3.dropna()
data3 = pd.DataFrame.unstack(data33)
sns.heatmap(data3, linewidths=1, cmap='RdYlGn', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = '.2%')
plt.xlabel('MACD Mode')
plt.ylabel('Stoch Mode')
plt.title ('Heatmap 6: Weekly Stochastic Oscillator / MACD- Signal of SPY s to Average Overnight Market Return');
# 7. Heatmap
groupby4 = pd.DataFrame(newdata.groupby(['stoch_mode_weekly','macd_mode_weekly'])['or'].std())
data44 = groupby4.dropna()
data4 = pd.DataFrame.unstack(data44)
sns.heatmap(data4, linewidths=1, cmap='RdYlGn', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = '.2%')
plt.xlabel('MACD Mode')
plt.ylabel('Stoch Mode')
plt.title ('Heatmap 7: Weekly Stochastic Oscillator / MACD- Signals of SPY to Standart Deviation of Overnight Market Return');
# 8. Heatmap
y2 = newdata.copy()
y2['or'] = y2['or']+1
y2 = y2[np.isfinite(y2['or'])]
dd6 = pd.DataFrame(y2.groupby(['stoch_mode','macd_mode']) ['or'].apply(gmean))
data600 = dd6.dropna()
data600['or'] = data600['or'] -1
data66 = data600.unstack()
sns.heatmap(data66, linewidths=1, cmap='RdYlGn', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = '.2%')
plt.xlabel('MACD Mode')
plt.ylabel('Stoch Mode')
plt.title ('Heatmap 8: Weekly Stochastic Oscillator / MACD - Signals of SPY to Geometric Mean of Overnight Market Return');
# 9. Heatmap
groupby66 = pd.DataFrame(newdata.groupby(['stoch_mode_weekly','macd_mode_weekly'])['or'].count())
data666 = groupby66.dropna()
data4213 = pd.DataFrame.unstack(data666)
sns.heatmap(data4213, linewidths=1, cmap='Blues', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = 'd')
plt.xlabel('MACD Mode')
plt.ylabel('Stoch Mode')
plt.title ('Heatmap 9: Weekly Stochastic Oscillator / MACD Signals of SPY to number of observations Overnight Market Return');
# 10. Heatmap
ww = x.copy()
kk3 = pd.DataFrame(newdata.groupby(['stoch_mode_weekly','macd_mode_weekly']) [['or']].apply(get_success_rate))
data222 = kk3.dropna()
data11 = pd.DataFrame.unstack(data222)
sns.heatmap(data11, linewidths=1, cmap='RdYlGn', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = '.2%')
plt.xlabel('MACD Mode')
plt.ylabel('Stoch Mode')
plt.title ('Heatmap 10: Weekly Stochastic Oscillator / MACD Signals of SPY to Number of Successfull trades Overnight Market Return');
# 11. Heatmap
groupby111 = pd.DataFrame(newdata.groupby(['stoch_mode_weekly','macd_mode'])['or'].mean())
dataweda1 = groupby111.dropna()
dataweda1 = pd.DataFrame.unstack(dataweda1)
dataweda1
sns.heatmap(dataweda1, linewidths=1, cmap='RdYlGn', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = '.2%')
plt.xlabel('MACD Mode Daily')
plt.ylabel('Stoch Mode Weekly')
plt.title ('Heatmap 11: Weekly Stochastic Oscillator / Daily MACD- Signals of SPY to Average Overnight Market Return');
# 12. Heatmap
groupby12 = pd.DataFrame(newdata.groupby(['stoch_mode_weekly','macd_mode'])['or'].std())
dataweda12 = groupby12.dropna()
dataweda12 = pd.DataFrame.unstack(dataweda12)
dataweda12
sns.heatmap(dataweda12, linewidths=1, cmap='RdYlGn', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = '.2%')
plt.xlabel('MACD Mode Daily')
plt.ylabel('Stoch Mode Weekly')
plt.title ('Heatmap 12: Weekly Stochastic Oscillator / Daily MACD - Signals of SPY to Average Overnight Market Return');
# 13. Heatmap
nd13 = newdata.copy()
nd13['or'] = nd13['or'] + 1
nd13 = nd13[np.isfinite(nd13['or'])]
nd13
ndd13= pd.DataFrame(nd13.groupby(['stoch_mode_weekly','macd_mode']) ['or'].apply(gmean))
ndd13 = ndd13.dropna()
ndd13['or'] = ndd13['or'] -1
ndd13 = ndd13.unstack()
sns.heatmap(ndd13, linewidths=1, cmap='RdYlGn', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = '.2%')
plt.xlabel('MACD Mode Daily')
plt.ylabel('Stoch Mode Weekly')
plt.title ('Heatmap 13: Weekly Stochastic Oscillator / Daily MACD- Signals of SPY to Geometric Mean of Overnight Market Return');
# 14. Heatmap
groupby14 = pd.DataFrame(newdata.groupby(['stoch_mode_weekly','macd_mode'])['or'].count())
data14 = groupby14.dropna()
data14 = pd.DataFrame.unstack(data14)
sns.heatmap(data14, linewidths=1, cmap='Blues', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = "d")
plt.xlabel('MACD Mode Daily')
plt.ylabel('Stoch Mode Weekly')
plt.title ('Heatmap 14: Weekly Stochastic Oscillator / DAily MACD Signals of SPY - to observed numbers of Overnight Market Return');
# 15. Heatmap
kk15 = pd.DataFrame(newdata.groupby(['stoch_mode_weekly','macd_mode']) [['or']].apply(get_success_rate))
dataweda15 = kk15.dropna()
dataweda15 = pd.DataFrame.unstack(dataweda15)
sns.heatmap(dataweda15, linewidths=1, cmap='RdYlGn', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = '.2%')
plt.xlabel('MACD Mode Daily')
plt.ylabel('Stoch Mode Weekly')
plt.title ('Heatmap 15: Weekly Stochastic Oscillator / MACD -Signals of SPY to Number of Successfull trades of Overnight Market Return');
# 16. Heatmap
groupby16 = pd.DataFrame(newdata.groupby(['stoch_mode','macd_mode_weekly'])['or'].mean())
dataweda16 = groupby16.dropna()
dataweda16 = pd.DataFrame.unstack(dataweda16)
sns.heatmap(dataweda16, linewidths=1, cmap='RdYlGn', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = '.2%')
plt.xlabel('MACD Mode Weekly')
plt.ylabel('Stoch Mode Daily')
plt.title ('Heatmap 16: Daily Stochastic Oscillator / Weekly MACD - Signals of SPY to Average of Overnight Market Return');
# 17. Heatmap
groupby17 = pd.DataFrame(newdata.groupby(['stoch_mode','macd_mode_weekly'])['or'].std())
dataweda17 = groupby17.dropna()
dataweda17 = pd.DataFrame.unstack(dataweda17)
sns.heatmap(dataweda17, linewidths=1, cmap='RdYlGn', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = '.2%')
plt.xlabel('MACD Mode Weekly')
plt.ylabel('Stoch Mode Daily')
plt.title ('Heatmap 17: Daily Stochastic Oscillator / Weekly MACD - Signals of SPY to std of Overnight Market Return ');
# 18. Heatmap
nd18 = newdata.copy()
nd18['or'] = nd18['or'] + 1
nd18 = nd13[np.isfinite(nd18['or'])]
nd18
ndd18= pd.DataFrame(nd18.groupby(['stoch_mode','macd_mode_weekly']) ['or'].apply(gmean))
ndd18 = ndd18.dropna()
ndd18['or'] = ndd18['or'] -1
ndd18 = ndd18.unstack()
sns.heatmap(ndd18, linewidths=1, cmap='RdYlGn', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = '.2%')
plt.xlabel('MACD Mode Weekly')
plt.ylabel('Stoch Mode Daily')
plt.title ('Heatmap 18: Daily Stochastic Oscillator / Weekly MACD - Signals of SPY to Geometric Mean of Overnight Market Return');
# 19. Heatmap
groupby19 = pd.DataFrame(newdata.groupby(['stoch_mode','macd_mode_weekly'])['or'].count())
data19 = groupby19.dropna()
data19 = pd.DataFrame.unstack(data19)
sns.heatmap(data19, linewidths=1, cmap='Blues', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = "d")
plt.xlabel('MACD Mode Weekly')
plt.ylabel('Stoch Mode Daily')
plt.title ('Heatmap 19: Daily Stochastic Oscillator / Weekly MACD Signals of SPY to observed numbers of Overnight Market Return');
# 20. Heatmap
kk20 = pd.DataFrame(newdata.groupby(['stoch_mode','macd_mode_weekly']) [['or']].apply(get_success_rate))
dataweda20 = kk20.dropna()
dataweda20 = pd.DataFrame.unstack(dataweda20)
sns.heatmap(dataweda15, linewidths=1, cmap='RdYlGn', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = '.2%')
plt.xlabel('MACD Mode Weekly')
plt.ylabel('Stoch Mode Daily')
plt.title ('Heatmap 20: Daily Stochastic Oscillator / Weekly MACD Signals of SPY to Number of Successfull trades of Overnight Market Return');
# 21. Heatmap
groupby21 = pd.DataFrame(newdata.groupby(['macd_mode','macd_mode_weekly'])['or'].mean())
dataweda21 = groupby21.dropna()
dataweda21 = pd.DataFrame.unstack(dataweda21)
sns.heatmap(dataweda21, linewidths=1, cmap='RdYlGn', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = '.2%')
plt.xlabel('MACD Mode Weekly')
plt.ylabel('MACD Mode Daily')
plt.title ('Heatmap 21: Daily MACD / Weekly MACD - Signals of SPY to Average of Overnight Market Return');
# 22. Heatmap
groupby22 = pd.DataFrame(newdata.groupby(['macd_mode','macd_mode_weekly'])['or'].std())
dataweda22 = groupby22.dropna()
dataweda22 = pd.DataFrame.unstack(dataweda22)
sns.heatmap(dataweda22, linewidths=1, cmap='RdYlGn', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = '.2%')
plt.xlabel('MACD Mode Weekly')
plt.ylabel('MACD Mode Daily')
plt.title ('Heatmap 22: Daily MACD / Weekly MACD - Signals of SPY to Standard Deviation of Overnight Market Return');
# 23. Heatmap
nd23 = newdata.copy()
nd23['or'] = nd23['or'] + 1
nd23 = nd23[np.isfinite(nd23['or'])]
nd23
ndd23= pd.DataFrame(nd23.groupby(['macd_mode','macd_mode_weekly']) ['or'].apply(gmean))
ndd23 = ndd23.dropna()
ndd23['or'] = ndd23['or'] -1
ndd23 = ndd23.unstack()
sns.heatmap(ndd23, linewidths=1, cmap='RdYlGn', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = '.2%')
plt.xlabel('MACD Mode Weekly')
plt.ylabel('MACD Mode Daily')
plt.title ('Heatmap 23: Daily MACD / Weekly MACD - Signals of SPY to Geometric Mean of Overnight Market Return');
# 24. Heatmap
groupby24 = pd.DataFrame(newdata.groupby(['macd_mode','macd_mode_weekly'])['or'].count())
data24 = groupby24.dropna()
data24 = pd.DataFrame.unstack(data24)
sns.heatmap(data24, linewidths=1, cmap='Blues', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = "d")
plt.xlabel('MACD Mode Weekly')
plt.ylabel('MACD Mode Daily')
plt.title ('Heatmap 24: Daily MACD / Weekly MACD Signals of SPY - to observed numbers of Overnight Market Return');
# 25.Heatmap:
kk25 = pd.DataFrame(newdata.groupby(['macd_mode','macd_mode_weekly']) [['or']].apply(get_success_rate))
dataweda25 = kk25.dropna()
dataweda25 = pd.DataFrame.unstack(dataweda25)
sns.heatmap(dataweda25, linewidths=1, cmap='RdYlGn', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = '.2%')
plt.xlabel('MACD Mode Weekly')
plt.ylabel('MACD Mode Daily')
plt.title ('Heatmap 25: Daily MACD / Weekly MACD Signals of SPY - Number of Successfull trades of Overnight Market Return');
# 26. Heatmap
groupby26 = pd.DataFrame(newdata.groupby(['stoch_mode','stoch_mode_weekly'])['or'].mean())
dataweda26 = groupby26.dropna()
dataweda26 = pd.DataFrame.unstack(dataweda26)
sns.heatmap(dataweda26, linewidths=1, cmap='RdYlGn', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = '.2%')
plt.xlabel('Stoch Mode Weekly')
plt.ylabel('Stoch Mode Daily')
plt.title ('Heatmap 26: Daily S O / Weekly S O - Signals of SPY to Average of Overnight Market Return');
# 27. Heatmap
groupby27 = pd.DataFrame(newdata.groupby(['stoch_mode','stoch_mode_weekly'])['or'].std())
dataweda27 = groupby27.dropna()
dataweda27 = pd.DataFrame.unstack(dataweda27)
sns.heatmap(dataweda27, linewidths=1, cmap='RdYlGn', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = '.2%')
plt.xlabel('Stoch Mode Weekly')
plt.ylabel('Stoch Mode Daily')
plt.title ('Heatmap 27: Daily SO / Weekly SO - Signals of SPY to Standard Deviation of Overnight Market Return');
# 28. Heatmap
nd28 = newdata.copy()
nd28['or'] = nd28['or'] + 1
nd28 = nd28[np.isfinite(nd28['or'])]
nd28
ndd28= pd.DataFrame(nd28.groupby(['stoch_mode','stoch_mode_weekly']) ['or'].apply(gmean))
ndd28 = ndd28.dropna()
ndd28['or'] = ndd28['or'] -1
ndd28 = ndd28.unstack()
sns.heatmap(ndd28, linewidths=1, cmap='RdYlGn', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = '.2%')
plt.xlabel('Stoch Mode Weekly')
plt.ylabel('Stoch Mode Daily')
plt.title ('Heatmap 28: Daily SO / Weekly SO - Signals of SPY to Geometric Mean of Overnight Market Return');
# 29. Heatmap
groupby29 = pd.DataFrame(newdata.groupby(['stoch_mode','stoch_mode_weekly'])['or'].count())
data29 = groupby29.dropna()
data29 = pd.DataFrame.unstack(data29)
sns.heatmap(data29, linewidths=1, cmap='Blues', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = "d")
plt.xlabel('Stoch Mode Weekly')
plt.ylabel('Stoch Mode Daily')
plt.title ('Heatmap 29: Daily SO / Weekly SO Signals of SPY - to observed numbers of Overnight Market Return');
# 30.Heatmap:
kk30 = pd.DataFrame(newdata.groupby(['stoch_mode','stoch_mode_weekly']) [['or']].apply(get_success_rate))
dataweda30 = kk30.dropna()
dataweda30 = pd.DataFrame.unstack(dataweda30)
sns.heatmap(dataweda30, linewidths=1, cmap='RdYlGn', xticklabels=['bear','bull'], yticklabels=['bear','bull'], robust=True, annot=True, fmt = '.2%')
plt.xlabel('Stoch Mode Weekly')
plt.ylabel('Stoch Mode Daily')
plt.title ('Heatmap 30: Daily SO / Weekly SO Signals of SPY to Number of Successfull trades of Overnight Market Return');