import numpy as np
import pandas as pd
import time
from quantopian.pipeline import Pipeline
import quantopian.pipeline.data as d
import quantopian.research as r
import quantopian.pipeline.factors as fac
import quantopian.pipeline.filters as f
import math
import alphalens as al
import matplotlib.pyplot as plt
unv = f.Q1500US()
def gen_factor_data(factor):
assets = factor.index.levels[1].unique()
pricing_data = get_pricing(assets, start, end, fields='close_price')
factor_data = al.utils.get_clean_factor_and_forward_returns(factor=factor, prices=pricing_data)
return factor_data
def make_pipeline():
return Pipeline(screen=unv)
# parameters
start = '2003-02-01'
end = '2020-01-01'
mkt = symbols('SPY') # used to calculate beta, feel free to use other markets
p = make_pipeline()
lbeta1yr = -fac.SimpleBeta(mkt, regression_length=252)
lbeta1yr = lbeta1yr.rank(mask=unv).zscore(mask=unv)
p.add(lbeta1yr, 'low')
p.add(fac.SimpleBeta(mkt, regression_length=252), 'beta')
df = r.run_pipeline(p, start, end)
xs = df['beta']*df['low']
alpha = -xs[xs > 0].groupby(level=0).sum()/xs[xs <= 0].groupby(level=0).sum()
df['wn'] = df.align(alpha, level=0, axis=0)[1]
df['wp'] = 1
df['w'] = np.where(df['low'] <= 0, df['wn'], df['wp'])
df['low_adj'] = df['w']*df['low']
df
ax = ((1-alpha)/(1+alpha)).plot(label='Net long exposure')
vals = ax.get_yticks()
ax.set_yticklabels(['{: ,.0%}'.format(x) for x in vals])
ax.legend()
df.loc['2003-02-03']['beta'].plot(kind='hist', bins=100)
df['beta'].groupby(level=0).skew().plot(label='Skew of Beta').legend()
lows_adj = gen_factor_data(df['low_adj'])
lows = gen_factor_data(df['low'])
al.tears.create_full_tear_sheet(lows)
al.tears.create_full_tear_sheet(lows_adj, long_short=False)
(1+al.performance.factor_returns(lows, demeaned=False)['1D']).cumprod().plot(label='cumulative L/S return').legend()
lows_adj_rets = al.performance.factor_returns(lows_adj, demeaned=False)['1D']
(1+lows_adj_rets).cumprod().plot(label='cumulative L/S return').legend()
x = lows_adj_rets#[('2020-01-01' > lows_adj_rets.index) & (lows_adj_rets.index > '2010-01-01')]
vol = math.sqrt(252)*x.std()
ret = (1+x).prod()**(1/len(x))-1
(1+ret)**252-1
((1+ret)**252-1)/vol
2+5
vol