def test_attribute_non_profit_series(self): """Test attributing series quantities besides profit. """ # Alpha source alpha_sources = [ReturnsForecast( self.returns, name=i) for i in range(3)] weights = np.array([0.1, 0.3, 0.6]) alpha_model = MultipleReturnsForecasts(alpha_sources, weights) emp_Sigma = np.cov(self.returns.as_matrix().T) risk_model = FullSigma(emp_Sigma, gamma=100.) tcost_model = TcostModel(self.a, self.b, self.sigma, self.volume) hcost_model = HcostModel(self.s, self.s * 0) pol = SinglePeriodOpt(alpha_model, [risk_model, tcost_model, hcost_model], [], solver=cvx.ECOS) tcost = TcostModel(self.volume, self.sigma, self.a, self.b) hcost = HcostModel(self.s) market_sim = simulator.MarketSimulator(self.returns, costs=[tcost, hcost], market_volumes=self.volume) p_0 = pd.Series(index=self.universe, data=1E6) noisy = market_sim.run_backtest(p_0, self.returns.index[1], self.returns.index[10], pol) # Select tcosts. def selector(result): return result.leverage # linear fit attribution attr = market_sim.attribute(noisy, pol, selector, parallel=False, fit="linear") base_line = noisy.leverage for i in range(3): self.assertItemsAlmostEqual( attr[i] / weights[i] / sum(p_0), base_line / sum(p_0)) self.assertItemsAlmostEqual(attr['RMS error'], np.zeros(len(noisy.v))) # least-squares fit attribution attr = market_sim.attribute(noisy, pol, selector, parallel=False, fit="least-squares") for i in range(3): self.assertItemsAlmostEqual( attr[i] / weights[i] / sum(p_0), base_line / sum(p_0)) # Residual always 0. alpha_sources = [ReturnsForecast( self.returns * 0, name=i) for i in range(3)] weights = np.array([0.1, 0.3, 0.6]) alpha_model = MultipleReturnsForecasts(alpha_sources, weights) pol = copy.copy(pol) pol.alpha_model = alpha_model attr = market_sim.attribute(noisy, pol, selector, parallel=False, fit="least-squares") self.assertItemsAlmostEqual(attr['residual'], np.zeros(len(noisy.v)))
def setUp(self): self.sigma = pd.read_csv(DIR + 'sigmas.csv', index_col=0, parse_dates=[0]) self.returns = pd.read_csv(DIR + 'returns.csv', index_col=0, parse_dates=[0]) self.volume = pd.read_csv(DIR + 'volumes.csv', index_col=0, parse_dates=[0]) self.a, self.b, self.s = 0.0005, 1., 0. self.portfolio = pd.Series(index=self.returns.columns, data=1E6) self.tcost_term = TcostModel(self.a, self.b, self.sigma, self.volume) self.hcost_term = HcostModel(self.s) self.Simulator = MarketSimulator(self.returns, costs=[self.tcost_term, self.hcost_term], market_volumes=self.volume)