コード例 #1
0
    def test_simples_settle(self):
        calc_ret = simple_settle(self.weights, self.ret_series)

        ret_series = self.ret_series.reshape((-1, 1))
        expected_ret = (self.weights * ret_series).sum(axis=0)

        np.testing.assert_array_almost_equal(calc_ret, expected_ret)

        ret_series = np.random.randn(self.n_samples, 1)

        calc_ret = simple_settle(self.weights, ret_series)

        expected_ret = (self.weights * ret_series).sum(axis=0)
        np.testing.assert_array_almost_equal(calc_ret, expected_ret)
コード例 #2
0
def benchmark_simple_settle_with_group(n_samples: int, n_portfolios: int,
                                       n_loops: int, n_groups: int) -> None:
    print("-" * 60)
    print("Starting simple settle with group-by values benchmarking")
    print(
        "Parameters(n_samples: {0}, n_portfolios: {1}, n_loops: {2}, n_groups: {3})"
        .format(n_samples, n_portfolios, n_loops, n_groups))

    weights = np.random.randn(n_samples, n_portfolios)
    ret_series = np.random.randn(n_samples)
    groups = np.random.randint(n_groups, size=n_samples)

    start = dt.datetime.now()
    for _ in range(n_loops):
        calc_ret = simple_settle(weights, ret_series, groups=groups)
    impl_model_time = dt.datetime.now() - start

    print('{0:20s}: {1}'.format('Implemented model', impl_model_time))

    start = dt.datetime.now()
    ret_series.shape = -1, 1
    for _ in range(n_loops):
        ret_mat = weights * ret_series
        exp_ret = pd.DataFrame(ret_mat).groupby(groups).sum().values
    benchmark_model_time = dt.datetime.now() - start

    np.testing.assert_array_almost_equal(calc_ret, exp_ret)

    print('{0:20s}: {1}'.format('Benchmark model', benchmark_model_time))
コード例 #3
0
def benchmark_simple_settle(n_samples: int, n_portfolios: int,
                            n_loops: int) -> None:
    print("-" * 60)
    print("Starting simple settle benchmarking")
    print("Parameters(n_samples: {0}, n_portfolios: {1}, n_loops: {2})".format(
        n_samples, n_portfolios, n_loops))

    weights = np.random.randn(n_samples, n_portfolios)
    ret_series = np.random.randn(n_samples)

    start = dt.datetime.now()
    for _ in range(n_loops):
        calc_ret = simple_settle(weights, ret_series)
    impl_model_time = dt.datetime.now() - start

    print('{0:20s}: {1}'.format('Implemented model', impl_model_time))

    start = dt.datetime.now()
    ret_series.shape = -1, 1
    for _ in range(n_loops):
        exp_ret = (weights * ret_series).sum(axis=0)
    benchmark_model_time = dt.datetime.now() - start

    np.testing.assert_array_almost_equal(calc_ret, exp_ret)

    print('{0:20s}: {1}'.format('Benchmark model', benchmark_model_time))
コード例 #4
0
    def test_simples_settle(self):
        calc_ret = simple_settle(self.weights, self.ret_series)

        ret_series = self.ret_series.reshape((-1, 1))
        expected_ret = self.weights @ ret_series

        self.assertAlmostEqual(calc_ret['er'][0], expected_ret[0])
コード例 #5
0
    def test_simple_settle_with_group(self):
        calc_ret = simple_settle(self.weights, self.ret_series, self.groups)

        ret_series = self.ret_series.reshape((-1, 1))
        ret_mat = self.weights * ret_series
        expected_ret = pd.DataFrame(ret_mat).groupby(self.groups).sum().values

        np.testing.assert_array_almost_equal(calc_ret, expected_ret)

        ret_series = np.random.randn(self.n_samples, 1)

        calc_ret = simple_settle(self.weights, ret_series, self.groups)

        ret_mat = self.weights * ret_series
        expected_ret = pd.DataFrame(ret_mat).groupby(self.groups).sum().values

        np.testing.assert_array_almost_equal(calc_ret, expected_ret)
コード例 #6
0
    def test_simple_settle_with_group(self):
        calc_ret = simple_settle(self.weights, self.ret_series, self.groups)

        ret_series = self.weights * self.ret_series
        expected_ret = pd.Series(ret_series).groupby(self.groups).sum().values

        np.testing.assert_array_almost_equal(calc_ret['er'].values[:-1],
                                             expected_ret)
        self.assertAlmostEqual(calc_ret['er'].values[-1], expected_ret.sum())
コード例 #7
0
def er_portfolio_analysis(
        er: np.ndarray,
        industry: np.ndarray,
        dx_return: np.ndarray,
        constraints: Optional[Union[LinearConstraints, Constraints]] = None,
        detail_analysis=True,
        benchmark: Optional[np.ndarray] = None,
        is_tradable: Optional[np.ndarray] = None,
        method='risk_neutral',
        **kwargs) -> Tuple[pd.DataFrame, Optional[pd.DataFrame]]:
    er = er.flatten()

    def create_constraints(benchmark, **kwargs):
        if 'lbound' in kwargs:
            lbound = kwargs['lbound'].copy()
            del kwargs['lbound']
        else:
            lbound = np.maximum(0., benchmark - 0.01)

        if 'ubound' in kwargs:
            ubound = kwargs['ubound'].copy()
            del kwargs['ubound']
        else:
            ubound = 0.01 + benchmark
        if is_tradable is not None:
            ubound[~is_tradable] = np.minimum(lbound, ubound)[~is_tradable]

        risk_lbound, risk_ubound = constraints.risk_targets()
        cons_exp = constraints.risk_exp
        return lbound, ubound, cons_exp, risk_lbound, risk_ubound

    if method == 'risk_neutral':
        lbound, ubound, cons_exp, risk_lbound, risk_ubound = create_constraints(
            benchmark, **kwargs)

        turn_over_target = kwargs.get('turn_over_target')
        current_position = kwargs.get('current_position')

        status, _, weights = linear_builder(er,
                                            risk_constraints=cons_exp,
                                            lbound=lbound,
                                            ubound=ubound,
                                            risk_target=(risk_lbound,
                                                         risk_ubound),
                                            turn_over_target=turn_over_target,
                                            current_position=current_position)
        if status != 'optimal':
            raise ValueError(
                'linear programming optimizer in status: {0}'.format(status))

    elif method == 'rank':
        weights = rank_build(
            er, use_rank=kwargs['use_rank'],
            masks=is_tradable).flatten() * benchmark.sum() / kwargs['use_rank']
    elif method == 'ls' or method == 'long_short':
        weights = long_short_builder(er).flatten()
    elif method == 'mv' or method == 'mean_variance':
        lbound, ubound, cons_exp, risk_lbound, risk_ubound = create_constraints(
            benchmark, **kwargs)
        cov = kwargs['cov']

        if 'lam' in kwargs:
            lam = kwargs['lam']
        else:
            lam = 1.

        status, _, weights = mean_variance_builder(er,
                                                   cov=cov,
                                                   bm=benchmark,
                                                   lbound=lbound,
                                                   ubound=ubound,
                                                   risk_exposure=cons_exp,
                                                   risk_target=(risk_lbound,
                                                                risk_ubound),
                                                   lam=lam)
        if status != 'optimal':
            raise ValueError(
                'mean variance optimizer in status: {0}'.format(status))

    elif method == 'tv' or method == 'target_vol':
        lbound, ubound, cons_exp, risk_lbound, risk_ubound = create_constraints(
            benchmark, **kwargs)
        cov = kwargs['cov']

        if 'target_vol' in kwargs:
            target_vol = kwargs['target_vol']
        else:
            target_vol = 1.

        status, _, weights = target_vol_builder(er,
                                                cov=cov,
                                                bm=benchmark,
                                                lbound=lbound,
                                                ubound=ubound,
                                                risk_exposure=cons_exp,
                                                risk_target=(risk_lbound,
                                                             risk_ubound),
                                                vol_low=0,
                                                vol_high=target_vol)
    else:
        raise ValueError("Unknown building type ({0})".format(method))

    if detail_analysis:
        analysis = simple_settle(weights, dx_return, industry, benchmark)
    else:
        analysis = None
    return pd.DataFrame({'weight': weights,
                         'industry': industry,
                         'er': er}), \
           analysis