Quantopian's community platform is shutting down. Please read this post for more information and download your code.
Back to Community
Reed College Finance and Investment Club Algo Trading Workshop

Template for implementing algo:

# Import Algorithm API  
import quantopian.algorithm as algo  
# Import Optimize API  
import quantopian.optimize as opt  
# Pipeline imports  
from quantopian.pipeline import Pipeline  
from quantopian.pipeline.filters import QTradableStocksUS  
from quantopian.pipeline.experimental import risk_loading_pipeline  
from quantopian.pipeline.classifiers.fundamentals import Sector

import pandas as pd  
import numpy as np  
import math


"""
IMPORT DUMP FROM RESEARCH NOTEBOOK  
"""
#########################################

### PIPELNE IMPORTS


###UNIVERSE  
from quantopian.pipeline.filters import QTradableStocksUS

###Price Data Class

from quantopian.pipeline.data import USEquityPricing as EquityPricing

#[EquityPricing.close, EquityPricing.volume]

###Classifiers (Sector)  
from quantopian.pipeline.classifiers.fundamentals import Sector


from quantopian.pipeline.factors import DailyReturns,Returns,PercentChange,VWAP,AverageDollarVolume,AnnualizedVolatility,SimpleBeta,SimpleMovingAverage,Latest,MaxDrawdown,RSI,ExponentialWeightedMovingAverage,ExponentialWeightedMovingStdDev,LinearWeightedMovingAverage,WeightedAverageValue,MovingAverageConvergenceDivergenceSignal,RollingPearsonOfReturns,RollingSpearmanOfReturns,BusinessDaysSincePreviousEvent,Aroon,FastStochasticOscillator,IchimokuKinkoHyo,TrueRange

#########################################

###Custom Factors  
#### COSTOM CLASSES

maximumLeverage = 1.1

maximumPositionSize = .05

maximumTurnover = 1.0

def initialize(context):  



    # Constraint parameters  
    context.max_leverage = maximumLeverage  
    context.max_pos_size = maximumPositionSize  
    context.max_turnover = maximumTurnover  
    # Attach data pipelines  
    algo.attach_pipeline(  
        make_pipeline(),  
        'data_pipe'  
    )  
    algo.attach_pipeline(  
        risk_loading_pipeline(),  
        'risk_pipe'  
    )  
    # Schedule rebalance function  
    algo.schedule_function(  
        rebalance,  
        algo.date_rules.week_start(),  
        algo.time_rules.market_open(),  
    )  
def before_trading_start(context, data):  
    # Get pipeline outputs and  
    # store them in context  
    context.pipeline_data = algo.pipeline_output('data_pipe')  
    context.risk_factor_betas = algo.pipeline_output('risk_pipe').dropna()  
def make_pipeline():  
    """  
    THIS IS WHERE ALL OF THE DATA FETCHING AND COMPUTATION HAPPENS  
    """  
    quarter_length = 65  


    universe = QTradableStocksUS()

    ###SOME CONSTANTS  
    #1 period is 1 day for window length  
    window_length_all = 14  
    decayRate = .5  
    closePrices = [EquityPricing.close]  
    targetTicker = symbols('SPY')  
#######Set up data to query  

#######Do some computations and design our factor to analyze


    _SimpleBeta = SimpleBeta(target = sid(8554), regression_length = 252)

    factor_to_analyze = _SimpleBeta

#######Define some screens and filters  
    bigScreen = factor_to_analyze.zscore() > 0  

######Initialize Sector Classifier  
    sector = Sector()  
    return Pipeline(  
    columns = {'factor_to_analyze': factor_to_analyze},  
    screen = QTradableStocksUS() & factor_to_analyze.notnull() & sector.notnull() & bigScreen  
    )

def rebalance(context, data):  
    # Retrieve alpha from pipeline output  
    alpha = context.pipeline_data.factor_to_analyze  
    print(alpha)  
    print(len(alpha))  
    if not alpha.empty:  
        # Create MaximizeAlpha objective  
        objective = opt.MaximizeAlpha(alpha)

        # Create position size constraint  
        constrain_pos_size = opt.PositionConcentration.with_equal_bounds(  
            -context.max_pos_size,  
            context.max_pos_size  
        )  
        # Constrain target portfolio's leverage  
        max_leverage = opt.MaxGrossExposure(context.max_leverage)

        # Ensure long and short books  
        # are roughly the same size  
        dollar_neutral = opt.DollarNeutral()

        # Constrain portfolio turnover  
        max_turnover = opt.MaxTurnover(context.max_turnover)  
        # Constrain target portfolio's risk exposure  
        # By default, max sector exposure is set at  
        # 0.2, and max style exposure is set at 0.4  
        factor_risk_constraints = opt.experimental.RiskModelExposure(  
            context.risk_factor_betas,  
            version=opt.Newest  
        )

        # Rebalance portfolio using objective  
        # and list of constraints  
        algo.order_optimal_portfolio(  
            objective=objective,  
            constraints=[  
                constrain_pos_size,  
                max_leverage,  
                dollar_neutral,  
                max_turnover,  
                factor_risk_constraints,  
            ]  
        )  

Notebook for doing factor analysis : (Click view notebook and clone it to play around with stuff!)