I have the following error: 'str' object has no attribute 'end_date', in line 155. It was working util I changed the line 114 and I do not know how to inform the end_date. Could you help me? Thank you very much
import pipeline methods
from quantopian.algorithm import attach_pipeline, pipeline_output
from quantopian.pipeline import Pipeline
import built in factors and filters
import quantopian.pipeline.factors as Factors
import quantopian.pipeline.filters as Filters
from quantopian.pipeline.filters import QTradableStocksUS
from quantopian.pipeline.factors import CustomFactor
import quantopian.optimize as opt
from quantopian.pipeline.data import morningstar
import any datasets we need
from quantopian.pipeline.data.builtin import USEquityPricing
from quantopian.pipeline.data import EquityPricing
from quantopian.pipeline.data import Fundamentals
from scipy.stats.mstats import winsorize
from sklearn import preprocessing
import numpy and pandas just in case
import numpy as np
import pandas as pd
WIN_LIMIT = 0.0
class Momentum(CustomFactor):
# Default inputs
inputs = [EquityPricing.close]
# Compute momentum
def compute(self, today, assets, out, close):
out[:] = close[-1] / close[0]
def preprocess(a):
a = np.nan_to_num(a - np.nanmean(a))
a = winsorize(a, limits=[WIN_LIMIT,WIN_LIMIT])
return preprocessing.scale(a)
class Piotroski(CustomFactor):
inputs = [
Fundamentals.roa,
Fundamentals.operating_cash_flow,
Fundamentals.cash_flow_from_continuing_operating_activities,
Fundamentals.long_term_debt_equity_ratio,
Fundamentals.current_ratio,
Fundamentals.shares_outstanding,
Fundamentals.gross_margin,
Fundamentals.assets_turnover,
]
window_length = 100
def compute(self, today, assets, out,roa, cash_flow, cash_flow_from_ops, long_term_debt_ratio, current_ratio, shares_outstanding, gross_margin, assets_turnover):
profit = (
(roa[-1] > 0).astype(int) +
(cash_flow[-1] > 0).astype(int) +
(roa[-1] > roa[0]).astype(int) +
(cash_flow_from_ops[-1] > roa[-1]).astype(int)
)
leverage = (
(long_term_debt_ratio[-1] < long_term_debt_ratio[0]).astype(int) +
(current_ratio[-1] > current_ratio[0]).astype(int) +
(shares_outstanding[-1] <= shares_outstanding[0]).astype(int)
)
operating = (
(gross_margin[-1] > gross_margin[0]).astype(int) +
(assets_turnover[-1] > assets_turnover[0]).astype(int)
)
out[:] = preprocess(profit + leverage + operating)
def initialize(context):
set_benchmark(symbol('SPY'))
# Create and attach pipeline to get data
attach_pipeline(my_pipeline(context), name='my_pipe')
# Rebalance monthly on the first day of the month at market open
schedule_function(rebalance,
#date_rule=date_rules.week_start(),
date_rule=date_rules.month_start(),
time_rule=time_rules.market_open())
context.long_num = 20
def my_pipeline(context):
base_universe = QTradableStocksUS()
piotroski = Piotroski()
momentum_1m = Momentum(window_length=22)
momentum_6m = Momentum(window_length=132)
momentum_2_6m = momentum_6m/momentum_1m
market_cap = Fundamentals.market_cap.latest
return Pipeline(
columns = {
'momentum': momentum_2_6m,
'piotroski': piotroski > 1.7,
'market cap':market_cap
#'factor to analyze': factor_to_analyze
},
screen= base_universe & (market_cap > 4000000000) & (momentum_2_6m > 1)
)
def before_trading_start(context, data):
"""
Setting long positions.
"""
context.output = pipeline_output('my_pipe')
# List of long positions.
context.longs = context.output.sort_values('momentum', ascending=False).iloc[:50]
# Gathering weights from assign_weights().
context.long_weight = assign_weights(context,data)
def assign_weights(context,data):
"""
Assign weights to securities that we want to order.
"""
# Initialize empty target weights dictionary.
# This will map securities to their target weight.
weights = {}
# Set long weights.
if len(context.longs) > 0:
long_weight = 1.1 / len(context.longs)
#if long_weight > 0.05:
# long_weight = 0.05
log.info(long_weight)
else:
return weights
# Exit positions in our portfolio if they are not
# in our longs or shorts lists.
for security in context.portfolio.positions:
if security not in context.longs and data.can_trade(security):
weights[security] = 0
for security in context.longs:
weights[security] = long_weight
return weights
def rebalance(context,data):
today = get_datetime()
if today.month in [1]:
# It's January so just return
# Calculate target weights to rebalance
target_weights = assign_weights(context,data)
if target_weights:
order_optimal_portfolio(
objective=opt.TargetWeights(target_weights),
constraints=[],
)
if today.month in [7]:
# It's January so just return
# Calculate target weights to rebalance
target_weights = assign_weights(context, data)
if target_weights:
order_optimal_portfolio(
objective=opt.TargetWeights(target_weights),
constraints=[],
)
return