import numpy as np
import pandas as pd
import scipy.stats as stats
import time
from quantopian.pipeline import Pipeline
from quantopian.pipeline import CustomFactor
from quantopian.pipeline.data import morningstar
from quantopian.pipeline.factors import EWMA, Latest, SimpleMovingAverage
from quantopian.pipeline.data.builtin import USEquityPricing
from quantopian.algorithm import attach_pipeline, pipeline_output
def initialize(context):
context.limit = 500.0
# Set possible number of random stocks meeting fundamental data requirements
def before_trading_start(context):
fundamental_df = get_fundamentals(
query(fundamentals.valuation_ratios.peg_ratio,
fundamentals.valuation_ratios.pb_ratio
)
.filter(fundamentals.valuation_ratios.peg_ratio > 2
)
.filter(fundamentals.valuation_ratios.peg_ratio < 1
)
.filter(fundamentals.valuation_ratios.pb_ratio < 1
)
.filter(fundamentals.valuation_ratios.pb_ratio > 5
)
.limit = context.limit
# Screening fudamental data
update_universe(context.fundamental_df.columns.values)
Updating the universe *****Doesn't Work******
def handle_data(context, data):
cash = context.portfolio.cash
position = context.portfolio.positions
for stock in data:
position = context.portfolio[stock].amount # Set position for reference
price = context.portfolio[stock].price #Long/Short price, price to base stop losses
stop_long = price - (price * 0.05) #Stop loss at -5%
stop_short = price + (price * 0.05) #Stop loss at -5%
SMA5 = SimpleMovingAverage(inputs=[context.limit], window_length=5) # Get SMA for 5 days
SMA5 = SimpleMovingAverage(inputs=[context.limit], window_length=20) # Get SMA for 20 days
if SMA5 < SMA20
if context.fundamentals[stock][fundamentals.valuation_ratios.pb_ratio] > 5 # Stock must meet fundamental data
if context.fundamentals[stock][fundamentals.valuation_ratios.peg_ratio] > 2 # Stock must meet fundamental data
if position == 0 # Must not already have a position
order(stock, -500 style=StopOrder(stop_short)) # Market order at current price
# Stop loss order at current price
profit_short = price - (price * 0.10) # Allows take profits order to reference short order price, not current price
else order_target(stock, 0) # If criteria not met, order nothing
if price >= profit_short order_target_value(stock, 0) # Take profits at + 10%
# ***Basically the exact opposite for shorts***
if SMA5 > SMA20
if context.fundamentals[stock][fundamentals.valuation_ratios.pb_ratio] < 1
if context.fundamentals[stock][fundamentals.valuation_ratios.peg_ratio] < 1
if position == 0
order(stock, 500 style=StopOrder(stop_long))
profit_long = price + (price * 0.10)
else order_target(stock, 0)
if price >= profit_long order_target_value(stock, 0)