Notebook

Test Strategy

In [1]:
# Import libraries
import numpy as np
from statsmodels import regression
import statsmodels.api as sm
import matplotlib.pyplot as plt
import math
from quantopian.pipeline.data.builtin import USEquityPricing
from quantopian.pipeline import Pipeline
from quantopian.research import run_pipeline
import matplotlib.pyplot as plt
import pandas as pd
from pandas import DataFrame as df
from quantopian.pipeline.data.psychsignal import stocktwits
from quantopian.pipeline.factors import SimpleMovingAverage
import time
import datetime

from quantopian.pipeline.experimental import QTradableStocksUS
In [14]:
def linreg(X,Y):
    # Running the linear regression
    X = sm.add_constant(X)
    model = regression.linear_model.OLS(Y, X).fit()
    a = model.params[0]
    b = model.params[1]
    r = model.rsquared
    X = X[:, 1]

    # Return summary of the regression and plot results
    X2 = np.linspace(X.min(), X.max(), 100)
    Y_hat = X2 * b + a
    plt.figure();
    plt.plot(X, Y) # Plot the raw data
    plt.plot(X2, Y_hat, 'y');  # Add the regression line
    plt.plot(X2, (Y_hat - np.std(Y_hat)), 'g') # upper deviation
    plt.plot(X2, (Y_hat + np.std(Y_hat)), 'r') # lower deviation
    plt.xlabel('X Value')
    plt.ylabel('Y Value')
    return b

Get Tradeable Stocks:

In [15]:
def make_pipeline():
    base_universe = QTradableStocksUS()
    close_price = USEquityPricing.close.latest
    
    # Calculate 30 day average of bull_minus_bear scores
    sentiment_score = SimpleMovingAverage(
        inputs=[stocktwits.bull_minus_bear],
        window_length=30,
    )
    
    sentiment = (sentiment_score.top(100) | sentiment_score.bottom(100))

    return Pipeline(columns={'longs': sentiment_score.top(100)}, screen=(base_universe & sentiment))
In [6]:
START_DATE = '2018-01-01'
END_DATE = '2018-01-03'
In [7]:
QTU_pipeline = run_pipeline(make_pipeline(), START_DATE, END_DATE, chunksize=252)
In [8]:
longs = QTU_pipeline[QTU_pipeline['longs']].index.drop_duplicates().tolist()
longs
Out[8]:
[(Timestamp('2018-01-02 00:00:00+0000', tz='UTC'), Equity(694 [AZZ])),
 (Timestamp('2018-01-02 00:00:00+0000', tz='UTC'), Equity(4849 [SPGI])),
 (Timestamp('2018-01-02 00:00:00+0000', tz='UTC'), Equity(11085 [ADC])),
 (Timestamp('2018-01-02 00:00:00+0000', tz='UTC'), Equity(18588 [MANH])),
 (Timestamp('2018-01-02 00:00:00+0000', tz='UTC'), Equity(21774 [ILMN])),
 (Timestamp('2018-01-03 00:00:00+0000', tz='UTC'), Equity(4849 [SPGI])),
 (Timestamp('2018-01-03 00:00:00+0000', tz='UTC'), Equity(11085 [ADC])),
 (Timestamp('2018-01-03 00:00:00+0000', tz='UTC'), Equity(21774 [ILMN])),
 (Timestamp('2018-01-03 00:00:00+0000', tz='UTC'), Equity(50398 [FRTA]))]
In [13]:
for stock in longs:
    prices = get_pricing(stock[1].symbol, fields='price', start_date=END_DATE, end_date=END_DATE, frequency='minute').dropna()
    time_passed = [float((datetime.datetime.now() - date.tz_convert(None)).total_seconds()) for date in prices.index.get_level_values(0)]
    print linreg(time_passed[::-1], prices)
1.91108809044e-05
6.49188201159e-05
-6.42488131279e-06
-2.72442335151e-05
0.000152320336687
6.49188235183e-05
-6.42488137963e-06
0.000152320338735
-8.31801842377e-07