def main(): returns, cov_mat, avg_rets = pfopt.create_test_data() section("Example returns") print(returns.head(10)) print("...") section("Average returns") print(avg_rets) section("Covariance matrix") print(cov_mat) section("Minimum variance portfolio (long only)") weights = pfopt.min_var_portfolio(cov_mat) print_portfolio_info(returns, avg_rets, weights) section("Minimum variance portfolio (long/short)") weights = pfopt.min_var_portfolio(cov_mat, allow_short=True) print_portfolio_info(returns, avg_rets, weights) # Define some target return, here the 70% quantile of the average returns target_ret = avg_rets.quantile(0.7) section("Markowitz portfolio (long only, target return: {:.5f})".format( target_ret)) weights = pfopt.markowitz_portfolio(cov_mat, avg_rets, target_ret) print_portfolio_info(returns, avg_rets, weights) section("Markowitz portfolio (long/short, target return: {:.5f})".format( target_ret)) weights = pfopt.markowitz_portfolio(cov_mat, avg_rets, target_ret, allow_short=True) print_portfolio_info(returns, avg_rets, weights) section( "Markowitz portfolio (market neutral, target return: {:.5f})".format( target_ret)) weights = pfopt.markowitz_portfolio(cov_mat, avg_rets, target_ret, allow_short=True, market_neutral=True) print_portfolio_info(returns, avg_rets, weights) section("Tangency portfolio (long only)") weights = pfopt.tangency_portfolio(cov_mat, avg_rets) weights = pfopt.truncate_weights(weights) # Truncate some tiny weights print_portfolio_info(returns, avg_rets, weights) section("Tangency portfolio (long/short)") weights = pfopt.tangency_portfolio(cov_mat, avg_rets, allow_short=True) print_portfolio_info(returns, avg_rets, weights)
def main(): # returns, cov_mat, avg_rets = pfopt.create_test_data(num_days=1000) returns, cov_mat, avg_rets = load_data() # yy = returns['asset_a'] # xx = [ii for ii in range(len(yy))] # plt.plot(xx, yy) # plt.hlines(avg_rets[0], xmin=0, xmax=100, colors='black') # plt.show() # return 0 section("Example returns") print(returns.head(5)) print("...") section("Average returns") print(avg_rets) section("Covariance matrix") print(cov_mat) section("Minimum variance portfolio (long only)") weights = pfopt.min_var_portfolio(cov_mat) print_portfolio_info(returns, avg_rets, weights) section("Minimum variance portfolio (long/short)") weights = pfopt.min_var_portfolio(cov_mat, allow_short=True) print_portfolio_info(returns, avg_rets, weights) # Define some target return, here the 70% quantile of the average returns target_ret = avg_rets.quantile(0.7) section("Markowitz portfolio (long only, target return: {:.5f})".format(target_ret)) weights = pfopt.markowitz_portfolio(cov_mat, avg_rets, target_ret) print_portfolio_info(returns, avg_rets, weights) section("Markowitz portfolio (long/short, target return: {:.5f})".format(target_ret)) weights = pfopt.markowitz_portfolio(cov_mat, avg_rets, target_ret, allow_short=True) print_portfolio_info(returns, avg_rets, weights) section("Markowitz portfolio (market neutral, target return: {:.5f})".format(target_ret)) weights = pfopt.markowitz_portfolio(cov_mat, avg_rets, target_ret, allow_short=True, market_neutral=True) print_portfolio_info(returns, avg_rets, weights) section("Tangency portfolio (long only)") weights = pfopt.tangency_portfolio(cov_mat, avg_rets) weights = pfopt.truncate_weights(weights) # Truncate some tiny weights print_portfolio_info(returns, avg_rets, weights) section("Tangency portfolio (long/short)") weights = pfopt.tangency_portfolio(cov_mat, avg_rets, allow_short=True) print_portfolio_info(returns, avg_rets, weights)
def index(request): returns, cov_mat, avg_rets = optimizer.create_test_data() section("Example returns") print(returns.head(10)) print("...") section("Average returns") print(avg_rets) section("Covariance matrix") print(cov_mat) # have to keep target within domain of expected returns of assets # else cvxopt/numpy will return domain error or convergence problem target_ret = avg_rets.quantile(0.7) weights = optimizer.markowitz_portfolio(cov_mat, avg_rets, 0.0049, allow_short=False, market_neutral=False) print_portfolio_info(returns, avg_rets, weights) context = {'avg_rets': avg_rets, 'cov_mat': cov_mat, 'weights': weights} return render(request, 'create_portfolio/base.html', context)
def main(): raw_tickers = input('Enter stocks separated by a comma: ') investment = int(input("Enter total investment to allocate: ")) stock_tickers = raw_tickers.split(", ") print(stock_tickers) listed_prices, returns, cov_mat, avg_rets = gd.get_stock_data( stock_tickers) section("Example returns") print(returns.head(10)) print("...") section("Average returns") print(avg_rets) section("Covariance matrix") print(cov_mat) section("Minimum variance portfolio (long only)") weights = pfopt.min_var_portfolio(cov_mat) print_portfolio_info(returns, avg_rets, weights) allocation = investment * weights print(allocation) # Define some target return, here the 70% quantile of the average returns target_ret = avg_rets.quantile(0.7) section("Markowitz portfolio (long only, target return: {:.5f})".format( target_ret)) weights = pfopt.markowitz_portfolio(cov_mat, avg_rets, target_ret) print_portfolio_info(returns, avg_rets, weights) allocation = investment * weights print(allocation)
def target_opt(df_daily_returns, target_ret=None): #********* Markowitz Portfolio with target return ************************ cov_mat = df_daily_returns.cov() avg_rets = df_daily_returns.mean() if target_ret == None: target_ret = avg_rets.quantile(0.7) weights = pfopt.markowitz_portfolio( cov_mat, avg_rets, target_ret) # returns a df series of weights weights = pfopt.truncate_weights(weights) # Truncate some tiny weights weights = weights[weights != 0] # remove any weights of 0 weights = weights.round( decimals=4) # clean up weight values by rounding ret = (weights * avg_rets).sum() # float of the portfolio average daily return # p = np.asmatrix(avg_rets) # this is where the error is occurring # w = np.asmatrix(weights) # C = np.asmatrix(np.cov(df_daily_returns)) # sigma = np.sqrt(w * C * w.T) #standard deviation #*********************************************************************************************** # C is covariance matrix of the returns NOTE: if it used the simple std dev std(array(ret_vec).T*w) # the result would be slightly different as it would not take covariances into account.! std = (weights * df_daily_returns ).sum(1).std() # float of the portfolio standard deviation return weights, ret, std
def get_markowitz_analysis(self,forecasts=0): start_index = len(self.historical_returns) - 253 end_index = len(self.historical_returns) - 1 return_grid = 100 * self.returns_grid[:, start_index:end_index].T returns = pd.DataFrame(return_grid) avgs = [self.yearly_expected_ret(returns[col]) for col in returns.columns] cov_mat = pd.DataFrame(np.cov(return_grid.T)) if forecasts == 0: avg_rets = pd.Series(avgs, index=returns.columns) else: avg_rets = pd.Series(forecasts.values(), index=returns.columns) w_opt = pfopt.tangency_portfolio(cov_mat, avg_rets, allow_short=False) ret_opt = (w_opt * avg_rets).sum() std_opt = (w_opt * returns).sum(1).std() smallest_target = max(min(avg_rets), 0) biggest_target = max(avg_rets) target_returns = np.arange(smallest_target, biggest_target, .0005) X = [] Y = [] for yi in target_returns: w = pfopt.markowitz_portfolio(cov_mat, avg_rets, yi) ret = (w * avg_rets).sum() std = (w * returns).sum(1).std() Y.append(ret) X.append(std) #coefs = np.polyfit(Y,X,2) #highest power first curve = {"risks":X,"returns":Y,"min_return":smallest_target,"max_return":biggest_target} tangency_port = {'weights': dict(w_opt),'X':std_opt,'Y':ret_opt} return {"tangency_port":tangency_port,"curve":curve}
def markowitz_portfolios(self): pf = self.panelframe returns = (pf['Close'] - pf['Close'].shift(1)) / pf['Close'].shift(1) returns.fillna(0, inplace=True) market = returns['market'] returns = returns.iloc[:, :-1] cov_mat = np.cov(returns, rowvar=False, ddof=1) cov_mat = pd.DataFrame(cov_mat, columns=returns.keys(), index=returns.keys()) avg_rets = returns.mean(0).astype(np.float64) mrk = [] weights = pfopt.min_var_portfolio(cov_mat) case = self._one_pfopt_case(cov_mat, returns, market, weights, 'Minimum variance portfolio') mrk.append(case) for t in [0.50, 0.75, 0.90]: target = avg_rets.quantile(t) weights = pfopt.markowitz_portfolio(cov_mat, avg_rets, target) case = self._one_pfopt_case( cov_mat, returns, market, weights, 'Target: more than {:.0f}% of stock returns'.format(t * 100)) mrk.append(case) weights = pfopt.tangency_portfolio(cov_mat, avg_rets) case = self._one_pfopt_case(cov_mat, returns, market, weights, 'Tangency portfolio') mrk.append(case) return mrk
def main(): returns, cov_mat, avg_rets = pfopt.create_test_data() section("Example returns") print(returns.head(10)) print("...") section("Average returns") print(avg_rets) section("Covariance matrix") print(cov_mat) section("Minimum variance portfolio (long only)") weights = pfopt.min_var_portfolio(cov_mat) print_portfolio_info(returns, avg_rets, weights) section("Minimum variance portfolio (long/short)") weights = pfopt.min_var_portfolio(cov_mat, allow_short=True) print_portfolio_info(returns, avg_rets, weights) # Define some target return, here the 70% quantile of the average returns target_ret = avg_rets.quantile(0.7) section("Markowitz portfolio (long only, target return: {:.5f})".format(target_ret)) weights = pfopt.markowitz_portfolio(cov_mat, avg_rets, target_ret) print_portfolio_info(returns, avg_rets, weights) section("Markowitz portfolio (long/short, target return: {:.5f})".format(target_ret)) weights = pfopt.markowitz_portfolio(cov_mat, avg_rets, target_ret, allow_short=True) print_portfolio_info(returns, avg_rets, weights) section("Markowitz portfolio (market neutral, target return: {:.5f})".format(target_ret)) weights = pfopt.markowitz_portfolio(cov_mat, avg_rets, target_ret, allow_short=True, market_neutral=True) print_portfolio_info(returns, avg_rets, weights) section("Tangency portfolio (long only)") weights = pfopt.tangency_portfolio(cov_mat, avg_rets) weights = pfopt.truncate_weights(weights) # Truncate some tiny weights print_portfolio_info(returns, avg_rets, weights) section("Tangency portfolio (long/short)") weights = pfopt.tangency_portfolio(cov_mat, avg_rets, allow_short=True) print_portfolio_info(returns, avg_rets, weights)
def test_long_only(self): returns, cov_mat, avg_rets = create_test_data() target_ret = avg_rets.quantile(0.7) calc_weights = pfopt.markowitz_portfolio(cov_mat, avg_rets, target_ret).values exp_weights = [0.23506651774627838, 0.28683592298360255, 0.0015464104918494993, 0.3685342846149573, 0.10801686416331224] self.assertTrue(np.allclose(calc_weights, exp_weights))
def test_allow_short(self): returns, cov_mat, avg_rets = create_test_data() target_ret = avg_rets.quantile(0.7) calc_weights = pfopt.markowitz_portfolio(cov_mat, avg_rets, target_ret, allow_short=True).values exp_weights = [0.24132125485063094, 0.28750580615601806, -0.0065950973956575331, 0.36542391192949747, 0.11234412445951109] self.assertTrue(np.allclose(calc_weights, exp_weights))
def test_market_neutral(self): returns, cov_mat, avg_rets = create_test_data() target_ret = avg_rets.quantile(0.7) calc_weights = pfopt.markowitz_portfolio(cov_mat, avg_rets, target_ret, allow_short=True, market_neutral=True).values exp_weights = [-0.088226487071008788, 0.15873382946203626, -0.24120662493449421, 0.26091591077682091, -0.090216628233354162] self.assertTrue(np.isclose(calc_weights.sum(), 0.0)) self.assertTrue(np.allclose(calc_weights, exp_weights))
def markowitz_portfolios(self): """ Estimate Markowitz portfolios Inputs: daily returns by stock, avg returns by stock, cov_matrix """ # pf = self._daily # returns = (pf['close'] - pf['close'].shift(1))/pf['close'].shift(1) # returns.fillna(0, inplace=True) # market = returns['market'] # returns = returns.iloc[:, :-1] # cov_mat = np.cov(returns, rowvar=False, ddof=1) # cov_mat = pd.DataFrame( # cov_mat, # columns=returns.keys(), # index=returns.keys()) # avg_rets = returns.mean(0).astype(np.float64) # prepare inputs returns = self.stocks_daily market = returns['SPY'] returns.drop('SPY', axis=1, inplace=True) avg_rets = returns.mean(0).astype(np.float64) cov_mat = self.stocks_covar cov_mat.drop('SPY', axis=0, inplace=True) cov_mat.drop('SPY', axis=1, inplace=True) mrk = [] weights = pfopt.min_var_portfolio(cov_mat) case = self._one_pfopt_case(returns, market, weights, 'Minimum variance portfolio') mrk.append(case) for t in [0.50, 0.75, 0.90]: target = avg_rets.quantile(t) weights = pfopt.markowitz_portfolio(cov_mat, avg_rets, target) case = self._one_pfopt_case( returns, market, weights, 'Target: more than {:.0f}% of stock returns'.format(t * 100)) mrk.append(case) weights = pfopt.tangency_portfolio(cov_mat, avg_rets) case = self._one_pfopt_case(returns, market, weights, 'Tangency portfolio') mrk.append(case) return mrk
def markowitz_efficient_frontier(returns_data): avg_rets = returns_data.mean() cov_mat = returns_data.cov() # calculate the Markowitz optimal allocations for each target return value optimal_allocation_list = [] for k in np.arange(0.01, 0.99, 0.01): tgt_return = avg_rets.quantile(k) optimal_weights = pfopt.markowitz_portfolio(cov_mat=cov_mat, exp_rets=avg_rets, target_ret=tgt_return) optimal_allocation_list.append(optimal_weights) matrix_rets = avg_rets.as_matrix() matrix_cov = cov_mat.as_matrix() returns = [x.dot(matrix_rets) for x in optimal_allocation_list] risks = [ np.sqrt(x.dot(matrix_cov.dot(x))) for x in optimal_allocation_list ] return returns, risks
print('-' * len(caption)) def print_portfolio_info(returns, avg_rets, weights): """ Print information on expected portfolio performance. """ ret = (weights * avg_rets).sum() std = (weights * returns).sum(1).std() sharpe = ret / std print("Optimal weights:\n{}\n".format(weights)) print("Expected return: {}".format(ret)) print("Expected variance: {}".format(std**2)) print("Expected Sharpe: {}".format(sharpe)) # Define some target return, here the 70% quantile of the average returns target_ret = avg_rets.quantile(0.9) weights = pfopt.min_var_portfolio(cov_mat) print_portfolio_info(returns, avg_rets, weights) section("Markowitz portfolio (long only, target return: {:.5f})".format( target_ret)) weights = pfopt.markowitz_portfolio(cov_mat, avg_rets, target_ret) print_portfolio_info(returns, avg_rets, weights) section("Tangency portfolio (long only)") weights = pfopt.tangency_portfolio(cov_mat, avg_rets) weights = pfopt.truncate_weights(weights) # Truncate some tiny weights print_portfolio_info(returns, avg_rets, weights)
1:] #minor_xs表示minor_axis轴,得到收盘价每日收益率 data_1 = PN.minor_xs('close') #这里得到每日收盘价格 print(data_r.head()) #求出年收益及其年收益率的协方差 exp_rets = data_r.mean() * 252 #data_r.mean()表示求均值,在这里是求年收益(对比下精度如何) cov_mat = data_r.cov() * 252 #这里求年收益率的协方差 exp = (data_1.iloc[-1] - data_1.iloc[0]) / data_1.iloc[0] #这里进行一个对比,发现还是有点差距 print(exp_rets) print(cov_mat) #计算: #计算目标收益的权重 (markowitz_portfolio方法) portfolio_1 = opt.markowitz_portfolio(cov_mat, exp_rets, 0.2, allow_short=False, market_neutral=False) #需输入协方差矩阵cov_mat,年预期收益exp_rets,0.2代表想要的年收益,allow_short表示是否允许做空,market_neutral表示是否具有市场中性 print(portfolio_1) #得到的结果表示若要实现0.2的年收益,则分别需买入这些股票的比重分别为 #计算最小方差的权重 (opt.min_var_portfolio) portfolio_mv = opt.min_var_portfolio(cov_mat, allow_short=False) print(portfolio_mv) #计算最优组合的权重 (opt.tangency_portfolio) (夏普比率最高的比重) portfolio_tp = opt.tangency_portfolio( cov_mat, exp_rets, allow_short=False) #需输入协方差矩阵cov_mat,年预期收益exp_rets print(portfolio_tp)
def optimize(self, data, portfolio_version_id): # data = request.get_json() strDateFrom = data['dateFrom'] strDateTo = data['dateTo'] # access to database in MySql assets = db.session.query(PortfolioAsset).filter_by( version_id=portfolio_version_id).join(Asset).all() # check if user exists if len(assets) == 0: return {} stocks = [] for asset in assets: stocks.append(asset.asset.ticker) # request data from datareader and store them in prices (pandas data form) req = {'tickers': stocks, 'start': strDateFrom, 'end': strDateTo} prices = DataReader().read_data_pd_format(req) # convert daily stock prices into daily returns returns = prices.pct_change(-1) # drop infs and nans returns = returns.replace([np.inf, -np.inf], np.nan) returns = returns.dropna() # estimate mean return and covariance matrix ExpRet = returns.mean() CovRet = returns.cov() # compute portfolios with min var and max return minvar_port = popt.min_var_portfolio(CovRet) minret = max(np.dot(minvar_port, ExpRet), 0) maxret = max(ExpRet) # calculate range of attainable returns for optimal portfolios mus = np.linspace(start=minret, stop=maxret, num=100) # calculate efficient frontier portfolios = [ popt.markowitz_portfolio(CovRet, ExpRet, mu) for mu in mus ] dts, portfolio_indexes = self.get_value_indexes(prices, portfolios) # expected returns exRet = [np.dot(portfolio, ExpRet) * 252 for portfolio in portfolios] # expected volatility exVol = [ np.sqrt(np.dot(np.dot(portfolio, CovRet), portfolio) * 252) for portfolio in portfolios ] return { 'assets': stocks, 'portfolios': pd.Series(portfolios).to_json(orient='values'), 'annualizedExpectedReturns': exRet, 'annualizedExpectedVolatility': exVol, 'dates': dts.tolist(), 'portfolio_indexes': np.array(portfolio_indexes).tolist() }
retData.corr() import numpy as np import pandas as pd import portfolioopt as pfopt train_set = retData['2014-01-01':'2015-12-31'] test_set = retData['2016'] cov_mat = train_set.cov() avg_rets = train_set.mean() #only long target_ret = 0.0006 weights = pfopt.markowitz_portfolio(cov_mat, avg_rets, target_ret, allow_short=False) weights test_return = np.dot(test_set, np.matrix(weights).T) test_return = pd.DataFrame(test_return, index=test_set.index) test_cum_return = (1 + test_return).cumprod() - 1 test_cum_return.columns = ['markowitz_portfolio'] test_cum_return.head() sim_weight = np.random.uniform(0, 1, (100, 3)) sim_weight_normalized = np.apply_along_axis(lambda x: x / sum(x), 1, sim_weight) sim_return = np.dot(test_set, np.matrix(sim_weight_normalized).T) sim_return = pd.DataFrame(sim_return, index=test_set.index)