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)
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)