Notebook
In [187]:
import numpy as np
import pandas as pd
import statsmodels.api as sm
from statsmodels import regression
import matplotlib.pyplot as plt
import scipy.stats
from quantopian.pipeline import Pipeline
from quantopian.pipeline.data import Fundamentals
from quantopian.pipeline.data.builtin import USEquityPricing
from quantopian.pipeline.factors import CustomFactor, DailyReturns
from quantopian.pipeline.filters import QTradableStocksUS, Q500US
from quantopian.research import run_pipeline
In [188]:
class Factor(CustomFactor):
    inputs = [USEquityPricing.close]
    window_length = 126

    def compute(self, today, assets, out, prices):
        out[:] = (prices[-10] - prices[-126]) / prices[-126]


start = "2019-01-01"
end = "2019-12-03"


pipe = Pipeline(
    columns={
        'Returns': DailyReturns(),
        'Factor': Factor()
    },
    screen=QTradableStocksUS()
)

df = run_pipeline(pipe, start, end)

df.head()

Pipeline Execution Time: 1.27 Seconds
Out[188]:
Factor Returns
2019-01-02 00:00:00+00:00 Equity(2 [ARNC]) 0.143025 0.005967
Equity(24 [AAPL]) -0.116379 0.010945
Equity(41 [ARCB]) -0.234596 -0.016930
Equity(52 [ABM]) -0.110934 0.033140
Equity(53 [ABMD]) -0.275845 0.022064
In [189]:
df.dropna(inplace=True)
In [190]:
B = pd.DataFrame(index=df.index.get_level_values(level=0).unique(), dtype=np.float32)
In [191]:
for i in B.T:
    y = df.loc[i]['Returns']
    x = df.loc[i]['Factor']
    result = sm.OLS(y, x).fit()
    
    B.loc[i,'beta'] = result.params[0]
In [192]:
B
Out[192]:
beta
2019-01-02 00:00:00+00:00 -0.014138
2019-01-03 00:00:00+00:00 -0.050840
2019-01-04 00:00:00+00:00 0.040415
2019-01-07 00:00:00+00:00 -0.119272
2019-01-08 00:00:00+00:00 -0.063550
2019-01-09 00:00:00+00:00 -0.032632
2019-01-10 00:00:00+00:00 -0.039994
2019-01-11 00:00:00+00:00 -0.011513
2019-01-14 00:00:00+00:00 -0.002208
2019-01-15 00:00:00+00:00 0.019740
2019-01-16 00:00:00+00:00 -0.017218
2019-01-17 00:00:00+00:00 -0.013881
2019-01-18 00:00:00+00:00 -0.023390
2019-01-22 00:00:00+00:00 -0.048377
2019-01-23 00:00:00+00:00 0.059688
2019-01-24 00:00:00+00:00 0.022258
2019-01-25 00:00:00+00:00 -0.032690
2019-01-28 00:00:00+00:00 -0.048621
2019-01-29 00:00:00+00:00 0.018976
2019-01-30 00:00:00+00:00 -0.003685
2019-01-31 00:00:00+00:00 -0.031893
2019-02-01 00:00:00+00:00 -0.000058
2019-02-04 00:00:00+00:00 -0.013836
2019-02-05 00:00:00+00:00 -0.019534
2019-02-06 00:00:00+00:00 -0.007310
2019-02-07 00:00:00+00:00 -0.009774
2019-02-08 00:00:00+00:00 0.045320
2019-02-11 00:00:00+00:00 0.004300
2019-02-12 00:00:00+00:00 -0.022066
2019-02-13 00:00:00+00:00 -0.035245
... ...
2019-10-22 00:00:00+00:00 -0.019744
2019-10-23 00:00:00+00:00 -0.027180
2019-10-24 00:00:00+00:00 -0.011584
2019-10-25 00:00:00+00:00 0.018663
2019-10-28 00:00:00+00:00 -0.018966
2019-10-29 00:00:00+00:00 -0.002476
2019-10-30 00:00:00+00:00 0.008262
2019-10-31 00:00:00+00:00 0.019102
2019-11-01 00:00:00+00:00 0.022037
2019-11-04 00:00:00+00:00 -0.034171
2019-11-05 00:00:00+00:00 -0.041160
2019-11-06 00:00:00+00:00 -0.014015
2019-11-07 00:00:00+00:00 0.016041
2019-11-08 00:00:00+00:00 -0.019206
2019-11-11 00:00:00+00:00 -0.002374
2019-11-12 00:00:00+00:00 0.015932
2019-11-13 00:00:00+00:00 0.001232
2019-11-14 00:00:00+00:00 0.018398
2019-11-15 00:00:00+00:00 0.014913
2019-11-18 00:00:00+00:00 -0.007822
2019-11-19 00:00:00+00:00 0.018580
2019-11-20 00:00:00+00:00 0.007405
2019-11-21 00:00:00+00:00 -0.008035
2019-11-22 00:00:00+00:00 -0.020188
2019-11-25 00:00:00+00:00 0.000570
2019-11-26 00:00:00+00:00 0.019917
2019-11-27 00:00:00+00:00 0.009907
2019-11-29 00:00:00+00:00 -0.000153
2019-12-02 00:00:00+00:00 -0.010080
2019-12-03 00:00:00+00:00 -0.009830

233 rows × 1 columns

In [193]:
B.plot()
Out[193]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f368018d9d0>
In [194]:
B.describe()
Out[194]:
beta
count 233.000000
mean -0.002099
std 0.020816
min -0.119272
25% -0.012778
50% -0.000058
75% 0.010098
max 0.080068
In [ ]: