Notebook

Topics Course Homework 2 - Overnight Returns

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

In [ ]:
#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
In [ ]:
spyprices = get_pricing("spy", start_date='2006-1-2', end_date='2018-11-1')
spyprices['ticker'] = "SPY"
spyprices.head(5)

Function to Exclude earnings dates

In [ ]:
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'])
In [ ]:
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

Technical indicators: Stochastic, MACD

In [ ]:
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
In [ ]:
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

Making daily Data and getting rid of bias

In [ ]:
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()
In [ ]:
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()
In [ ]:
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()
In [ ]:
stock_prices_d.rename(columns={'index': 'major'}, inplace=True)

Defining Success Rate Function

In [ ]:
def get_success_rate(data):
    return(data>0).apply(sum)/len(data)

Resample data for weekly and calculate MCAD / SO and get rid of bias

In [ ]:
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
In [ ]:
stock_prices_d.index = stock_prices_d.major.values
stock_prices_w = stock_prices_d.groupby('ticker').apply(resample_data)
In [ ]:
stock_prices_w.head()
In [ ]:
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)
In [ ]:
stock_prices_w
In [ ]:
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']
In [ ]:
stock_prices_w.rename(columns={'level_1': 'date'}, inplace=True)
In [ ]:
stock_prices_w.head()
In [ ]:
stock_prices_w = stock_prices_w[['date','ticker','macd_mode','stoch_mode']]
In [ ]:
spyprices.index.name = 'date'
spyprices.reset_index(level=0, inplace=True)
spyprices.index = spyprices.date.values
In [ ]:
spyprices.index = spyprices.date.values
del spyprices['date']
spyprices.index.name = 'date'
spyprices = spyprices.reset_index().sort(['ticker', 'date'], ascending=True).set_index('date')
In [ ]:
spyprices.reset_index(level=0, inplace=True)
spyprices.head()
In [ ]:
spyprices = spyprices[['date','ticker','open_price','high', 'low','close_price', 'volume', 'price']]
In [ ]:
x = pd.DataFrame.merge(spyprices,stock_prices_w, how = 'left', on=['date','ticker'])
x.head(20)
In [ ]:
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

Daily and weekly MACD / OS

In [ ]:
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()
In [ ]:
del xx['date']
In [ ]:
xx.index.name = 'date'
xx.reset_index(level=0, inplace=True)
In [ ]:
xx.head()
In [ ]:
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)

In [ ]:
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']
In [ ]:
yy = yy[['ticker', 'date','stoch_mode', 'macd_mode']]
In [ ]:
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()
In [ ]:
yy.reset_index(level=0, inplace=True)
yy.head()
In [ ]:
newdata1 = pd.DataFrame.merge(xx,yy, how = 'left', on=['ticker','date'])
In [ ]:
newdata1.rename(columns={'ir':'open_to_close'}, inplace=True)
newdata1
In [ ]:
del newdata1["open_price"]
del newdata1["high"]
del newdata1["low"]
del newdata1["close_price"]
del newdata1["volume"]
del newdata1["price"]
del newdata1['ticker']

Market Data generation

In [ ]:
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')
In [ ]:
shortlist = my.index.get_level_values(1)
tickers = pd.Series(shortlist).apply(lambda x: x.symbol)
In [ ]:
close_prices = get_pricing(shortlist, start_date='2006-1-2', end_date='2018-11-1', fields="close_price")
In [ ]:
open_prices = get_pricing(shortlist, start_date='2006-1-2', end_date='2018-11-1', fields="open_price")
In [ ]:
overnight = ((open_prices/close_prices[1:])-1)
overnight.columns = tickers
In [ ]:
overnight.head(3)
In [ ]:
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')
In [ ]:
overnight = overnight.groupby('ticker').apply(remove_earnings)
overnight.reset_index(inplace=True)
In [ ]:
overnight.head(3)
In [ ]:
overnight = overnight[['date','ticker','level_1','ov_return']]
overnight.head(3)

Merging Market data with SPY Indicators

In [ ]:
newdata = pd.DataFrame.merge(overnight,newdata1, how = 'left', on=['date'])
In [56]:
newdata.rename(columns={'ov_return': 'or'}, inplace=True)
newdata.head()
Out[56]:
date ticker level_1 or macd_mode_weekly stoch_mode_weekly stoch_mode macd_mode
0 2006-01-03 A 1496416 NaN NaN NaN NaN NaN
1 2006-01-04 A 1496417 -0.001181 NaN NaN NaN NaN
2 2006-01-05 A 1496418 -0.029019 NaN NaN NaN 1.0
3 2006-01-06 A 1496419 -0.005216 NaN NaN NaN 1.0
4 2006-01-09 A 1496420 0.002893 NaN NaN NaN 1.0
5 2006-01-10 A 1496421 -0.021400 NaN NaN NaN 1.0
6 2006-01-11 A 1496422 0.000000 NaN NaN NaN 1.0
7 2006-01-12 A 1496423 0.015771 NaN NaN NaN 1.0
8 2006-01-13 A 1496424 0.005282 NaN NaN NaN 1.0
9 2006-01-17 A 1496425 -0.000895 0.0 NaN NaN 1.0
10 2006-01-18 A 1496426 -0.020906 0.0 NaN NaN 0.0
11 2006-01-19 A 1496427 -0.013477 0.0 NaN NaN 0.0
12 2006-01-20 A 1496428 0.020492 0.0 NaN NaN 0.0
13 2006-01-23 A 1496429 -0.001760 0.0 NaN NaN 0.0
14 2006-01-24 A 1496430 -0.002311 0.0 NaN NaN 0.0
15 2006-01-25 A 1496431 0.001435 0.0 NaN NaN 0.0
16 2006-01-26 A 1496432 0.009676 0.0 NaN NaN 0.0
17 2006-01-27 A 1496433 -0.000605 0.0 NaN NaN 0.0
18 2006-01-30 A 1496434 -0.008719 0.0 NaN 1.0 0.0
19 2006-01-31 A 1496435 0.009731 1.0 NaN 1.0 1.0
20 2006-02-01 A 1496436 -0.032627 1.0 NaN 1.0 1.0
21 2006-02-02 A 1496437 0.006109 1.0 NaN 1.0 1.0
22 2006-02-03 A 1496438 -0.005821 1.0 NaN 0.0 1.0
23 2006-02-06 A 1496439 -0.014106 1.0 NaN 0.0 0.0
24 2006-02-07 A 1496440 0.015579 0.0 NaN 0.0 0.0
25 2006-02-08 A 1496441 -0.013607 0.0 NaN 0.0 0.0
26 2006-02-09 A 1496442 -0.005419 0.0 NaN 0.0 0.0
27 2006-02-10 A 1496443 -0.023984 0.0 NaN 1.0 0.0
28 2006-02-14 A 1496445 -0.006293 0.0 NaN 1.0 0.0
29 2006-02-15 A 1496446 -0.012025 0.0 NaN 1.0 1.0
... ... ... ... ... ... ... ... ...
1602196 2018-09-21 ZION 998658 -0.002854 1.0 0.0 1.0 1.0
1602197 2018-09-24 ZION 998659 0.010210 1.0 0.0 1.0 1.0
1602198 2018-09-25 ZION 998660 0.003667 1.0 0.0 0.0 1.0
1602199 2018-09-26 ZION 998661 0.020408 1.0 0.0 0.0 1.0
1602200 2018-09-27 ZION 998662 0.013718 1.0 0.0 0.0 0.0
1602201 2018-09-28 ZION 998663 -0.003590 1.0 0.0 0.0 0.0
1602202 2018-10-01 ZION 998664 0.016542 1.0 0.0 0.0 0.0
1602203 2018-10-02 ZION 998665 0.008092 1.0 1.0 1.0 0.0
1602204 2018-10-03 ZION 998666 -0.018311 1.0 1.0 1.0 0.0
1602205 2018-10-04 ZION 998667 -0.011064 1.0 1.0 1.0 0.0
1602206 2018-10-05 ZION 998668 0.006449 1.0 1.0 0.0 0.0
1602207 2018-10-08 ZION 998669 -0.018430 1.0 1.0 0.0 0.0
1602208 2018-10-09 ZION 998670 0.004645 1.0 0.0 0.0 0.0
1602209 2018-10-10 ZION 998671 0.020268 1.0 0.0 0.0 0.0
1602210 2018-10-11 ZION 998672 0.027044 1.0 0.0 0.0 0.0
1602211 2018-10-12 ZION 998673 0.031308 1.0 0.0 0.0 0.0
1602212 2018-10-15 ZION 998674 0.002500 1.0 0.0 0.0 0.0
1602213 2018-10-16 ZION 998675 0.002076 0.0 0.0 1.0 0.0
1602214 2018-10-17 ZION 998676 -0.010528 0.0 0.0 1.0 0.0
1602215 2018-10-18 ZION 998677 0.019645 0.0 0.0 1.0 0.0
1602216 2018-10-19 ZION 998678 0.005750 0.0 0.0 1.0 0.0
1602217 2018-10-22 ZION 998679 0.040371 0.0 0.0 0.0 0.0
1602218 2018-10-23 ZION 998680 0.007418 0.0 0.0 0.0 0.0
1602219 2018-10-24 ZION 998681 0.034188 0.0 0.0 0.0 0.0
1602220 2018-10-25 ZION 998682 -0.026723 0.0 0.0 0.0 0.0
1602221 2018-10-26 ZION 998683 0.002364 0.0 0.0 0.0 0.0
1602222 2018-10-29 ZION 998684 0.010627 0.0 0.0 0.0 0.0
1602223 2018-10-30 ZION 998685 0.007676 0.0 0.0 1.0 0.0
1602224 2018-10-31 ZION 998686 0.007864 0.0 0.0 1.0 0.0
1602225 2018-11-01 ZION 998687 -0.007358 0.0 0.0 1.0 0.0

1602226 rows × 8 columns

Drawing the Heatmaps

Daily Signals!

In [57]:
# 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');
In [58]:
# 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');
In [59]:
# 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');
In [60]:
# 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');
In [61]:
# 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');

Weekly Signals !

In [62]:
# 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');
In [63]:
# 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');
In [64]:
# 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');
In [65]:
# 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');
In [66]:
# 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');

Weekly OS Daily MACD

In [67]:
# 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');
In [68]:
# 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');
In [69]:
# 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');
In [70]:
# 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');
In [71]:
# 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');

Daily OS Weekly MACD

In [72]:
# 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');
In [73]:
# 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 ');
In [74]:
# 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');
/usr/local/lib/python2.7/dist-packages/ipykernel_launcher.py:4: UserWarning: Boolean Series key will be reindexed to match DataFrame index.
  after removing the cwd from sys.path.
In [75]:
# 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');
In [76]:
# 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');

Daily MACD to Weekly MACD signal

In [77]:
# 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');
In [78]:
# 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');
In [79]:
# 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');
In [80]:
# 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');
In [81]:
# 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');

Daily SO / Weekly SO

In [82]:
# 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');
In [83]:
# 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');
In [84]:
# 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');
In [85]:
# 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');
In [86]:
# 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');