예제 #1
0
    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)))
예제 #2
0
 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)