def price_change_hist(input, pickle_file, historical_quotes_dir, header, header_for_quotes, use_current_date): ranking = defaultdict(list) find_quotes = FindPrice(historical_quotes_dir, header_for_quotes) if header: input.next() if use_current_date: HEADER_LINE = 'Ticker,Firm,Action,Date,Old_Target,New_Target,Target_Ratio,Current_Price,Price_in_1yr,Price_Ratio' else: HEADER_LINE = 'Ticker,Firm,Action,Date,Old_Target,New_Target,Target_Ratio,EOQ_Price,Price_EOQ_next_year,Price_Ratio' print HEADER_LINE for l in csv.reader(input): rec_date = datetime.strptime(l[ANALYST_DATA_FIELDS.Date.zvalue], ANALYST_DATA_DATE_FORMAT) try: if use_current_date: start_price = find_quotes.at(l[ANALYST_DATA_FIELDS.Ticker.zvalue], rec_date) else: start_price = find_quotes.at_end_of_qtr(l[ANALYST_DATA_FIELDS.Ticker.zvalue], rec_date) end_price = find_quotes.at_end_of_qtr_next_year(l[ANALYST_DATA_FIELDS.Ticker.zvalue], rec_date) price_delta = end_price / start_price except DatesNotAvailableException: # Catch when dates are not available continue to_rating = re.sub('(.*\s*->\s*)(?P<to>.*)', '\\g<to>', l[ANALYST_DATA_FIELDS.Rating.zvalue]) if pickle_file and price_delta: ranking[to_rating].append(price_delta) # get rid of annoying commas in text for i in range(len(l)): l[i] = l[i].replace(",",";") # Don't deal with exchange rates l[ANALYST_DATA_FIELDS.Price_Target.zvalue] = l[ANALYST_DATA_FIELDS.Price_Target.zvalue].replace('$','') # Make sure this isn't a different currency (€ or C$ or something else) if any(c.isalpha() for c in l[ANALYST_DATA_FIELDS.Price_Target.zvalue]): continue # replace '$40.00 -> $42.00' to '40.00,42.00' before_after = l[ANALYST_DATA_FIELDS.Price_Target.zvalue].split('->') if len(before_after) == 1: l[ANALYST_DATA_FIELDS.Price_Target.zvalue] = before_after[0] + ',' + before_after[0] + ',1.0' elif len(before_after) == 2: l[ANALYST_DATA_FIELDS.Price_Target.zvalue] = ','.join(before_after).replace(' ','') + \ ',' + str(float(before_after[1])/float(before_after[0])) else: raise ValueError print ",".join([l[ANALYST_DATA_FIELDS.Ticker.zvalue], l[ANALYST_DATA_FIELDS.Firm.zvalue], to_rating, l[ANALYST_DATA_FIELDS.Date.zvalue], l[ANALYST_DATA_FIELDS.Price_Target.zvalue], str(start_price), str(end_price), str(price_delta)]) if pickle_file: save_obj(ranking, pickle_file)
def rank_analysts(header, find_quotes, quotes_dir, reco_file): find_price = FindPrice(quotes_dir) f_reco = csv.reader(reco_file) if header: f_reco.next() print HEADER_LINE for l in f_reco: if (l[PRICE_CHANGE_FIELDS.Firm.zvalue] and l[PRICE_CHANGE_FIELDS.Date.zvalue] and l[PRICE_CHANGE_FIELDS.Ticker.zvalue] and l[PRICE_CHANGE_FIELDS.New_Target.zvalue] and l[PRICE_CHANGE_FIELDS.Current_Price.zvalue]): current_date = datetime.strptime( l[PRICE_CHANGE_FIELDS.Date.zvalue], PRICE_CHANGE_DATE_FORMAT) target_price = float(l[PRICE_CHANGE_FIELDS.New_Target.zvalue]) if not find_quotes: current_price = float( l[PRICE_CHANGE_FIELDS.Current_Price.zvalue]) final_price = float( l[PRICE_CHANGE_FIELDS.Price_in_a_year.zvalue]) else: try: # find quotes instead of trusting the input file current_price = find_price.at( l[PRICE_CHANGE_FIELDS.Ticker.zvalue], current_date) final_price = find_price.at_end_of_qtr_next_year( l[PRICE_CHANGE_FIELDS.Ticker.zvalue], current_date) except DatesNotAvailableException: continue to_print = [ l[PRICE_CHANGE_FIELDS.Ticker.zvalue], l[PRICE_CHANGE_FIELDS.Firm.zvalue], l[PRICE_CHANGE_FIELDS.Action.zvalue], current_date.date(), current_price, target_price, final_price, abs(final_price - target_price) / current_price ] print ",".join([str(i) for i in to_print])
def rank_analysts(header, find_quotes, quotes_dir, reco_file): find_price = FindPrice(quotes_dir) f_reco = csv.reader(reco_file) if header: f_reco.next() print HEADER_LINE for l in f_reco: if ( l[PRICE_CHANGE_FIELDS.Firm.zvalue] and l[PRICE_CHANGE_FIELDS.Date.zvalue] and l[PRICE_CHANGE_FIELDS.Ticker.zvalue] and l[PRICE_CHANGE_FIELDS.New_Target.zvalue] and l[PRICE_CHANGE_FIELDS.Current_Price.zvalue] ): current_date = datetime.strptime(l[PRICE_CHANGE_FIELDS.Date.zvalue], PRICE_CHANGE_DATE_FORMAT) target_price = float(l[PRICE_CHANGE_FIELDS.New_Target.zvalue]) if not find_quotes: current_price = float(l[PRICE_CHANGE_FIELDS.Current_Price.zvalue]) final_price = float(l[PRICE_CHANGE_FIELDS.Price_in_a_year.zvalue]) else: try: # find quotes instead of trusting the input file current_price = find_price.at(l[PRICE_CHANGE_FIELDS.Ticker.zvalue], current_date) final_price = find_price.at_end_of_qtr_next_year(l[PRICE_CHANGE_FIELDS.Ticker.zvalue], current_date) except DatesNotAvailableException: continue to_print = [ l[PRICE_CHANGE_FIELDS.Ticker.zvalue], l[PRICE_CHANGE_FIELDS.Firm.zvalue], l[PRICE_CHANGE_FIELDS.Action.zvalue], current_date.date(), current_price, target_price, final_price, abs(final_price - target_price) / current_price, ] print ",".join([str(i) for i in to_print])