Beispiel #1
0
def eval_scenario(returns_params, backtest_params, portfolio_params):
    excess_returns = data.load_excess_returns(**returns_params)
    
    # Setup backtest return splits.
    training_returns, testing_returns = (
        backtest.split_returns(excess_returns, **backtest_params))
    
    results = list()
    period = 0
    for er_train, er_test in zip(training_returns, testing_returns):
        sol = mvportfolio.portfolio(
            er_train,
            **portfolio_params)
            
        portfolio = sol
        returns = er_test.dot(portfolio)
        result = {'portfolio': array2str(portfolio)}
        result['test_returns'] = array2str(returns)
        result['period'] = period
        period += 1
        
        results.append(result)
        logging.debug('period = {0}'.format(period))        
    
    return {'kwargs': {'returns': returns_params,
                       'backtest': backtest_params,
                       'portfolio': portfolio_params},
            'results': results}
Beispiel #2
0
def eval_scenario(returns_params, backtest_params, portfolio_params):
    excess_returns = data.load_excess_returns(**returns_params)
    
    # Setup backtest return splits.
    training_returns, testing_returns = (
        backtest.split_returns(excess_returns, **backtest_params))
    
    results = list()
    period = 0
    for er_train, er_test in zip(training_returns, testing_returns):
        try:
            sol = dccportfolio.portfolio_sphere(
                er_train, 
                extended_return=True, verbose=False, 
                **portfolio_params)
        except LinAlgError:
            logging.error('Linear algebra error encountered.')        
            sol = ('', '', '', '', 'linear_algebra_error')
            
        portfolio = sol[0]
        status = sol[4]

        if status == 'solution_found':
            returns = er_test.dot(portfolio)
        else:
            returns = ''
        
        sol_keys = ['portfolio', 'objective', 'sdp_solution', 'constraints', 'status']
        result = {
            k: pg.array2str(s) 
            for k, s in zip(sol_keys, sol)
        }
        result['test_returns'] = pg.array2str(returns)
        result['period'] = period        
        period += 1
        
        results.append(result)
        logging.debug('period = {0}'.format(period))        
    
    return {'kwargs': {'returns': returns_params,
                       'backtest': backtest_params,
                       'portfolio': portfolio_params},
            'results': results}
 backtest_results = pd.read_sql(query, db.conn)
 
 scenarios = backtest_results.groupby(
     ['experiment_id', 'backtest_id', 'parameters_id'])
 outputs = list()
 for bt in scenarios:
     print(bt[0])
     experiment_id, backtest_id, parameters_id = bt[0]
     results = bt[1]
     
     experiment = db.load_experiment(experiment_id)
     backtest_params = db.load_backtests([backtest_id])
     returns = db.load_returns(experiment)
     excess_returns = returns.values
     train, test = backtest.split_returns(
         excess_returns, 
         backtest_params['update_periods'], 
         backtest_params['trailing_periods'])
     portfolios = pg.decimallistseries2nparray(results.portfolio_weights)
     portfolio_returns = pg.decimallistseries2nparray(results.test_returns)
     train_mean = ps.mean(portfolios[0,:], train[0])
     train_variance = ps.variance(portfolios[0,:], train[0])
     eta = results.eta.iloc[0]
     backtest_statistics = ps.rkw_statistics(
         portfolios, portfolio_returns, eta=eta)
     test_statistics = backtest_statistics['statistics']
     agg_returns = backtest_statistics['aggregate_returns']
     
     output = test_statistics
     output['aggregate_returns'] = pg.array2pgarray(agg_returns)
     output['train_mean_return'] = train_mean
     output['train_variance'] = train_variance