Beispiel #1
0
 def test_simplex_projection(self):
     vector = [random() for _ in range(4)]
     proj = utils.simplex_projection(vector)
     self.assertIsInstance(proj, np.ndarray)
     eq_(len(vector), len(proj))
     self.assertAlmostEqual(proj.sum(), 1.0)
     eq_(filter(lambda x: x < 0, proj), [])
Beispiel #2
0
 def test_simplex_projection(self):
     vector = [random() for _ in range(4)]
     proj = utils.simplex_projection(vector)
     self.assertIsInstance(proj, np.ndarray)
     eq_(len(vector), len(proj))
     self.assertAlmostEqual(proj.sum(), 1.0)
     eq_(filter(lambda x: x < 0, proj), [])
Beispiel #3
0
    def optimize(self, date, to_buy, to_sell, parameters):
        # This implementation only process buy signals
        allocations = {}
        for sid in to_sell:
            allocations[sid] = to_sell[sid].amount

        data = to_buy

        #if not self.initialized:
        #self._warm(data)

        x_tilde = np.zeros(self.m)
        b = np.zeros(self.m)

        # find relative moving average price for each security
        for i, stock in enumerate(data):
            price = data[stock].price
            # Relative mean deviation
            if 'mavg' in data[stock]:
                x_tilde[i] = data[stock]['mavg']['price'] / price

        ###########################
        # Inside of OLMAR (algo 2)
        x_bar = x_tilde.mean()

        # market relative deviation
        mark_rel_dev = x_tilde - x_bar

        # Expected return with current portfolio
        exp_return = np.dot(self.b_t, x_tilde)
        weight = self.eps - exp_return
        variability = (np.linalg.norm(mark_rel_dev))**2

        # test for divide-by-zero case
        if variability == 0.0:
            step_size = 0
        else:
            step_size = max(0, weight / variability)

        b = self.b_t + step_size * mark_rel_dev
        b_norm = utils.simplex_projection(b)
        np.testing.assert_almost_equal(b_norm.sum(), 1)

        allocations.update(self._rebalance_portfolio(data, b_norm))

        # update portfolio
        self.b_t = b_norm

        #e_ret = 0
        #e_risk = 1
        e_ret = exp_return
        e_risk = variability
        return allocations, e_ret, e_risk
Beispiel #4
0
    def optimize(self, date, to_buy, to_sell, parameters):
        # This implementation only process buy signals
        allocations = {}
        for sid in to_sell:
            allocations[sid] = to_sell[sid].amount

        data = to_buy

        #if not self.initialized:
            #self._warm(data)

        x_tilde = np.zeros(self.m)
        b = np.zeros(self.m)

        # find relative moving average price for each security
        for i, stock in enumerate(data):
            price = data[stock].price
            # Relative mean deviation
            if 'mavg' in data[stock]:
                x_tilde[i] = data[stock]['mavg']['price'] / price

        ###########################
        # Inside of OLMAR (algo 2)
        x_bar = x_tilde.mean()

        # market relative deviation
        mark_rel_dev = x_tilde - x_bar

        # Expected return with current portfolio
        exp_return = np.dot(self.b_t, x_tilde)
        weight = self.eps - exp_return
        variability = (np.linalg.norm(mark_rel_dev)) ** 2

        # test for divide-by-zero case
        if variability == 0.0:
            step_size = 0
        else:
            step_size = max(0, weight / variability)

        b = self.b_t + step_size * mark_rel_dev
        b_norm = utils.simplex_projection(b)
        np.testing.assert_almost_equal(b_norm.sum(), 1)

        allocations.update(self._rebalance_portfolio(data, b_norm))

        # update portfolio
        self.b_t = b_norm

        #e_ret = 0
        #e_risk = 1
        e_ret = exp_return
        e_risk = variability
        return allocations, e_ret, e_risk