import numpy as np
import pandas as pd
from quantopian.pipeline import Pipeline, CustomFactor, CustomClassifier
from quantopian.research import run_pipeline
from quantopian.pipeline.data import Fundamentals
from quantopian.pipeline.data.psychsignal import stocktwits
from quantopian.interactive.data.psychsignal import stocktwits as stocktwits_i
from odo import odo
weekday_dict =dict(zip(range(7), ['Monday', 'Tuesday', 'Wednesday',
'Thursday', 'Friday', 'Saturday', 'Sunday']))
start_date = pd.datetime(2018,5,3)
end_date = pd.datetime(2018,5,8)
class CustomSentiment(CustomFactor):
# Default inputs and window_length
inputs = [stocktwits.bullish_intensity]
window_length = 3
def compute(self, today, asset_ids, out, values):
if today.weekday() == 0:
# This should fetch the Saturday Data if it is available
factor_value = values[-2]
else:
factor_value = values[-1]
out[:] = factor_value
def make_pipeline():
universe = Fundamentals.symbol.latest.eq('AAPL')
return Pipeline(columns={'custom_buillish_intensity': CustomSentiment(),
'default_bullish_intensity': stocktwits.bullish_intensity.latest,
'asof_date':stocktwits.asof_date.latest
},
screen=universe)
results = run_pipeline(make_pipeline(), start_date, end_date)
results['pipeline_weekday'] = results.index.get_level_values(0).map(lambda x: weekday_dict[x.weekday()])
results
On Monday, the custom sentiment factor is pulling Thursday's data again instead of pulling Saturday's data.
aapl_sentiment = odo(stocktwits_i[stocktwits_i['symbol']=='AAPL'], pd.DataFrame)
mask = (aapl_sentiment.timestamp > start_date) & (aapl_sentiment.timestamp < end_date)
df = aapl_sentiment.loc[mask, ['timestamp', 'asof_date', 'bullish_intensity']]
df['asof_weekday'] = df.asof_date.map(lambda x: weekday_dict[x.weekday()])
df