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
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)
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)
cov_matrix = returns.cov() avr_gmean, gmeans = solver.average_gmean(returns) LOG.info('Geometric mean: %.8f, Daily meand: %.8f, Gmeans: %.8f' % (avr_gmean, np.average(mean_daily_returns), gmeans)) problemGenerator = nsagii.PortfolioGenerator(ordered) 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()