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!)