Exemplo n.º 1
0
    def test_recommendation_set_price_date_during_analysisperiod(self):
        with patch.object(PriceDispersionStrategy,
                          '_load_financial_data',
                          return_value=self.financial_data):

            price_date = date(2020, 6, 10)

            strategy = PriceDispersionStrategy(
                TickerList.from_dict({
                    "list_name": "DOW30",
                    "list_type": "US_EQUITIES",
                    "comparison_symbol": "DIA",
                    "ticker_symbols": ['AAPL', 'V']
                }), '2020-06', price_date, 3)

            strategy.generate_recommendation()

            recommendation_set = strategy.recommendation_set

            self.assertEqual(recommendation_set.model['valid_from'],
                             str(date(2020, 7, 1)))
            self.assertEqual(recommendation_set.model['valid_to'],
                             str(date(2020, 7, 31)))
            self.assertEqual(recommendation_set.model['price_date'],
                             str(date(2020, 6, 10)))
Exemplo n.º 2
0
    def backtest(analysis_period: str):
        log.info("Performing backtest for %s" % analysis_period)

        period = pd.Period(analysis_period)

        data_end_date = intrinio_util.get_month_period_range(period)[1]

        strategy = PriceDispersionStrategy(
            ticker_list, period, None, output_size)
        strategy.generate_recommendation()

        date_1m = get_nearest_business_date(data_end_date + timedelta(days=30))
        date_2m = get_nearest_business_date(data_end_date + timedelta(days=60))
        date_3m = get_nearest_business_date(data_end_date + timedelta(days=90))

        portfolio_1m = calculator.mark_to_market(
            strategy.recommendation_dataframe, 'ticker', 'analysis_price', date_1m)['actual_return'].mean() * 100
        portfolio_2m = calculator.mark_to_market(
            strategy.recommendation_dataframe, 'ticker', 'analysis_price', date_2m)['actual_return'].mean() * 100
        portfolio_3m = calculator.mark_to_market(
            strategy.recommendation_dataframe, 'ticker', 'analysis_price', date_3m)['actual_return'].mean() * 100

        all_stocks_1m = calculator.mark_to_market(strategy.raw_dataframe, 'ticker', 'analysis_price', date_1m)[
            'actual_return'].mean() * 100
        all_stocks_2m = calculator.mark_to_market(strategy.raw_dataframe, 'ticker', 'analysis_price', date_2m)[
            'actual_return'].mean() * 100
        all_stocks_3m = calculator.mark_to_market(strategy.raw_dataframe, 'ticker', 'analysis_price', date_3m)[
            'actual_return'].mean() * 100

        backtest_report['investment_period'].append(
            data_end_date.strftime('%Y/%m'))
        backtest_report['ticker_sample_size'].append(
            len(strategy.raw_dataframe))

        backtest_report['avg_ret_1M'].append(all_stocks_1m)
        backtest_report['sel_ret_1M'].append(portfolio_1m)
        backtest_report['avg_ret_2M'].append(all_stocks_2m)
        backtest_report['sel_ret_2M'].append(portfolio_2m)
        backtest_report['avg_ret_3M'].append(all_stocks_3m)
        backtest_report['sel_ret_3M'].append(portfolio_3m)
Exemplo n.º 3
0
    def backtest(year: int, month: int):
        log.info("Peforming backtest for %d/%d" % (month, year))
        data_end_date = intrinio_util.get_month_date_range(year, month)[1]

        strategy = PriceDispersionStrategy(ticker_list, year, month,
                                           output_size)
        strategy.generate_recommendation()

        date_1m = data_end_date + timedelta(days=30)
        date_2m = data_end_date + timedelta(days=60)
        date_3m = data_end_date + timedelta(days=90)

        portfolio_1m = calculator.mark_to_market(
            strategy.recommendation_dataframe,
            date_1m)['actual_return'].mean() * 100
        portfolio_2m = calculator.mark_to_market(
            strategy.recommendation_dataframe,
            date_2m)['actual_return'].mean() * 100
        portfolio_3m = calculator.mark_to_market(
            strategy.recommendation_dataframe,
            date_3m)['actual_return'].mean() * 100

        all_stocks_1m = calculator.mark_to_market(
            strategy.raw_dataframe, date_1m)['actual_return'].mean() * 100
        all_stocks_2m = calculator.mark_to_market(
            strategy.raw_dataframe, date_2m)['actual_return'].mean() * 100
        all_stocks_3m = calculator.mark_to_market(
            strategy.raw_dataframe, date_3m)['actual_return'].mean() * 100

        backtest_report['investment_period'].append(
            data_end_date.strftime('%Y/%m'))
        backtest_report['ticker_sample_size'].append(
            len(strategy.raw_dataframe))

        backtest_report['avg_ret_1M'].append(all_stocks_1m)
        backtest_report['sel_ret_1M'].append(portfolio_1m)
        backtest_report['avg_ret_2M'].append(all_stocks_2m)
        backtest_report['sel_ret_2M'].append(portfolio_2m)
        backtest_report['avg_ret_3M'].append(all_stocks_3m)
        backtest_report['sel_ret_3M'].append(portfolio_3m)
Exemplo n.º 4
0
def main():
    """
        Main function for this script
    """
    try:
        (environment, ticker_file_name, output_size, month, year,
         current_price_date, app_ns) = parse_params()

        log.info("Parameters:")
        log.info("Environment: %s" % environment)
        log.info("Ticker File: %s" % ticker_file_name)
        log.info("Output Size: %d" % output_size)
        log.info("Analysis Month: %d" % month)
        log.info("Analysis Year: %d" % year)

        if environment == "TEST":
            log.info("reading ticker file from local filesystem")
            ticker_list = TickerFile.from_local_file(
                constants.TICKER_DATA_DIR, ticker_file_name).ticker_list

            log.info("Performing Recommendation Algorithm")
            strategy = PriceDispersionStrategy(ticker_list, year, month,
                                               output_size)
            strategy.generate_recommendation()
            display_calculation_dataframe(month, year, strategy,
                                          current_price_date)
        else:  # environment == "PRODUCTION"
            # test all connectivity upfront, so if there any issues
            # the problem becomes more apparent
            connector_test.test_aws_connectivity()
            connector_test.test_intrinio_connectivity()

            log.info("Reading ticker file from s3 bucket")
            ticker_list = TickerFile.from_s3_bucket(ticker_file_name,
                                                    app_ns).ticker_list

            log.info("Loading existing recommendation set from S3")
            recommendation_set = None

            try:
                recommendation_set = SecurityRecommendationSet.from_s3(app_ns)
            except AWSError as awe:
                if not awe.resource_not_found():
                    raise awe
                log.info("No recommendation set was found in S3.")

            if recommendation_set == None  \
                    or not recommendation_set.is_current(datetime.now()):

                log.info("Performing Recommendation Algorithm")
                strategy = PriceDispersionStrategy(ticker_list, year, month,
                                                   output_size)

                strategy.generate_recommendation()
                recommendation_set = strategy.recommendation_set
                display_calculation_dataframe(month, year, strategy,
                                              current_price_date)

                recommendation_set.save_to_s3(app_ns)
                recommendation_svc.notify_new_recommendation(
                    recommendation_set, app_ns)
            else:
                log.info(
                    "Recommendation set is still valid. There is nothing to do"
                )

    except Exception as e:
        stack_trace = traceback.format_exc()
        log.error("Could run script, because: %s" % (str(e)))
        log.error(stack_trace)

        if environment == "PRODUCTION":
            aws_service_wrapper.notify_error(
                e, "Securities Recommendation Service", stack_trace, app_ns)