Exemple #1
0
def parallel_optimization(num, portfolios, portfolio, all_stocks, iterations,
                          type_ga):
    stocks = all_stocks[num]
    days = len(stocks[0].day_history)
    cov_matrix, mean_daily_returns, avr_gmean, gmeans = cov_and_mean(stocks)
    problemGenerator = NSGAII.PortfolioGenerator(portfolio)

    start = time.time()
    if type_ga == GA_SIMPLE:
        results_frame = simple.solve(stocks, iterations, mean_daily_returns,
                                     cov_matrix, days)
    elif type_ga == GA_NSGAII:
        results_frame = NSGAII.solve(stocks,
                                     iterations,
                                     mean_daily_returns,
                                     cov_matrix,
                                     days,
                                     generator=problemGenerator)
    else:
        results_frame = NSGAII.solve_nsgaiii(stocks,
                                             iterations,
                                             mean_daily_returns,
                                             cov_matrix,
                                             days,
                                             generator=problemGenerator)
    duration = time.time() - start
    LOG.info('Duration solved: %s' % duration)
    new_sharpe, new_id = process_result_of_ga(results_frame, stocks, avr_gmean)
    LOG.info('Solve %d of %d' % (num + 1, len(portfolios)))
    return new_sharpe, new_id
Exemple #2
0
def parallel_solve(all_stocks, type_ga, curr, count):
    LOG.info('Start parallel solve in %s' % str(threading.get_ident()))
    range_stock = len(all_stocks)
    number = list()
    stocks = []

    for position in range(15):
        pos = random.randint(0, range_stock)
        while pos in number:
            pos = random.randint(0, range_stock)
        stock = all_stocks[pos - 1]
        while len(stock.day_history) < 66:
            pos = random.randint(0, range_stock)
            stock = all_stocks[pos - 1]
        stocks.append(stock)

    # download daily price data for each of the stocks in the portfolio
    data = get_stock_price(stocks)
    returns = data.pct_change()

    # calculate mean daily return and covariance of daily returns
    mean_daily_returns = returns.mean()
    cov_matrix = returns.cov()
    days = len(stocks[0].day_history)
    iterations = 50000

    start = time.time()
    if type_ga == GA_SIMPLE:
        results_frame = simple.solve(stocks, iterations, mean_daily_returns,
                                     cov_matrix, days)
    if type_ga == GA_NSGAII:
        results_frame = NSGAII.solve(stocks, iterations, mean_daily_returns,
                                     cov_matrix, days)
    if type_ga == GA_NSGAIII:
        results_frame = NSGAII.solve_nsgaiii(stocks, iterations,
                                             mean_daily_returns, cov_matrix,
                                             days)
    duration = time.time() - start
    LOG.info('Duration solved: %s' % duration)

    sharpe_id_min = results_frame['sharpe'].idxmin()
    max_sharpe_port = results_frame.iloc[sharpe_id_min]
    stdev_id_min = results_frame['stdev'].idxmax()
    min_vol_port = results_frame.iloc[stdev_id_min]

    LOG.info('Max Sharpe ratio: %s' % str(max_sharpe_port))
    LOG.info('Min standard deviation: %s' % str(min_vol_port))
    db.connect()
    solved = Portfolio()
    max_item = parse_solved_portfolio(max_sharpe_port, stocks)
    min_item = parse_solved_portfolio(min_vol_port, stocks)
    solved.max_item = max_item
    solved.min_item = min_item
    solved.date = datetime.datetime.today()
    solved.save()
    db.close()
    LOG.info('Save %d portfolio from %d in thread %s' %
             (curr + 1, count, str(threading.get_ident())))
    return 'Duration %s' % str(duration)
Exemple #3
0
def parallel_solve_WTF_im_very_sad(all_stocks, type_ga, curr, count):
    LOG.info('Start parallel solve in %s' % str(threading.get_ident()))
    range_stock = len(all_stocks)
    number = list()
    stocks = []

    for position in range(15):
        pos = random.randint(0, range_stock)
        while pos in number:
            pos = random.randint(0, range_stock)
        stock = all_stocks[pos - 1]
        while len(stock.day_history) < 66:
            pos = random.randint(0, range_stock)
            stock = all_stocks[pos - 1]
        number.append(pos)
        stocks.append(stock)

    cov_matrix, mean_daily_returns, arg_gmean, gmeans = cov_and_mean(stocks)
    days = len(stocks[0].day_history)
    iterations = 50000

    start = time.time()
    if type_ga == GA_SIMPLE:
        results_frame = simple.solve(stocks, iterations, mean_daily_returns,
                                     cov_matrix, days)
    elif type_ga == GA_NSGAII:
        results_frame = NSGAII.solve(stocks, iterations, mean_daily_returns,
                                     cov_matrix, days)
    else:
        results_frame = NSGAII.solve_nsgaiii(stocks, iterations,
                                             mean_daily_returns, cov_matrix,
                                             days)
    duration = time.time() - start
    LOG.info('Duration solved: %s' % duration)
    process_result_of_ga(results_frame, stocks, arg_gmean)
    LOG.info('Save %d portfolio from %d in thread %s' %
             (curr, count, str(threading.get_ident())))
    return 'Duration %s' % str(duration)
Exemple #4
0
        start = time.time()
        result_frame_sm = sm.solve(stocks, iter, mean_daily_returns, cov_matrix, days)
        time_sm_solve = time.time() - start
        time_sm.append(time_sm_solve)
        LOG.info('sm-%d - time: %s' % (iter, str(time_sm_solve)))

        start = time.time()
        result_frame_nsgaii = nsagii.solve(stocks, iter, mean_daily_returns, cov_matrix, days,
                                           generator=problemGenerator, population=1000)
        time_nsga_solve = time.time() - start
        time_nsga.append(time_nsga_solve)
        LOG.info('nsgaii-%d - time: %s' % (iter, str(time_nsga_solve)))

        start = time.time()
        result_frame_nsgaiii = nsagii.solve_nsgaiii(stocks, iter, mean_daily_returns, cov_matrix, days,
                                                    generator=problemGenerator, population=1000)
        time_nsga_solve = time.time() - start
        time_nsgaiii.append(time_nsga_solve)
        LOG.info('nsagiii-%d - time: %s' % (iter, str(time_nsga_solve)))

        ax_1 = fig.add_subplot(1,3,1)
        id_max = result_frame_sm['sharpe'].idxmax()
        max_sharpe_port_sm = result_frame_sm.iloc[id_max]
        id_max_wgmean = result_frame_sm['wgmean'].idxmax()
        max_wgmean_port_sw = result_frame_sm.iloc[id_max_wgmean]
        sharpes_sm.append(max_sharpe_port_sm[2])
        wgmean_sm.append(max_wgmean_port_sw[1])
        ax_1.scatter(result_frame_sm.stdev, result_frame_sm.ret, c=result_frame_sm.sharpe, cmap='RdYlBu')
        ax_1.set_xlabel('stdev')
        ax_1.set_ylabel('ret')
        ax_1.scatter(max_sharpe_port_sm[2], max_sharpe_port_sm[0], marker=(3, 1, 0), color='r', s=300)