Commit d04f2033 authored by Dr.李's avatar Dr.李

added example for uniform percent build in factor analysis

parent 92ca2ac2
...@@ -13,6 +13,8 @@ from alphamind.benchmarks.data.winsorize import benchmark_winsorize_normal ...@@ -13,6 +13,8 @@ from alphamind.benchmarks.data.winsorize import benchmark_winsorize_normal
from alphamind.benchmarks.data.winsorize import benchmark_winsorize_normal_with_group from alphamind.benchmarks.data.winsorize import benchmark_winsorize_normal_with_group
from alphamind.benchmarks.portfolio.rankbuild import benchmark_build_rank from alphamind.benchmarks.portfolio.rankbuild import benchmark_build_rank
from alphamind.benchmarks.portfolio.rankbuild import benchmark_build_rank_with_group from alphamind.benchmarks.portfolio.rankbuild import benchmark_build_rank_with_group
from alphamind.benchmarks.portfolio.percentbuild import benchmark_build_percent
from alphamind.benchmarks.portfolio.percentbuild import benchmark_build_percent_with_group
from alphamind.benchmarks.settlement.simplesettle import benchmark_simple_settle from alphamind.benchmarks.settlement.simplesettle import benchmark_simple_settle
from alphamind.benchmarks.settlement.simplesettle import benchmark_simple_settle_with_group from alphamind.benchmarks.settlement.simplesettle import benchmark_simple_settle_with_group
...@@ -43,6 +45,12 @@ if __name__ == '__main__': ...@@ -43,6 +45,12 @@ if __name__ == '__main__':
benchmark_build_rank_with_group(30, 50000, 1, 3) benchmark_build_rank_with_group(30, 50000, 1, 3)
benchmark_build_rank(50000, 20, 3000) benchmark_build_rank(50000, 20, 3000)
benchmark_build_rank_with_group(50000, 20, 10, 300) benchmark_build_rank_with_group(50000, 20, 10, 300)
benchmark_build_percent(3000, 1000, 0.1)
benchmark_build_percent_with_group(3000, 1000, 0.1, 30)
benchmark_build_percent(30, 50000, 0.1)
benchmark_build_percent_with_group(30, 50000, 0.1, 3)
benchmark_build_percent(50000, 20, 0.1)
benchmark_build_percent_with_group(50000, 20, 0.1, 300)
benchmark_simple_settle(3000, 10, 1000) benchmark_simple_settle(3000, 10, 1000)
benchmark_simple_settle_with_group(3000, 10, 1000, 30) benchmark_simple_settle_with_group(3000, 10, 1000, 30)
benchmark_simple_settle(30, 10, 50000) benchmark_simple_settle(30, 10, 50000)
......
# -*- coding: utf-8 -*-
"""
Created on 2017-5-4
@author: cheng.li
"""
import datetime as dt
import numpy as np
import pandas as pd
from alphamind.portfolio.percentbuilder import percent_build
def benchmark_build_percent(n_samples: int, n_loops: int, p_included: float) -> None:
print("-" * 60)
print("Starting portfolio construction by percent benchmarking")
print("Parameters(n_samples: {0}, p_included: {1}, n_loops: {2})".format(n_samples, p_included, n_loops))
n_portfolio = 10
x = np.random.randn(n_samples, n_portfolio)
start = dt.datetime.now()
for _ in range(n_loops):
calc_weights = percent_build(x, p_included)
impl_model_time = dt.datetime.now() - start
print('{0:20s}: {1}'.format('Implemented model', impl_model_time))
start = dt.datetime.now()
for _ in range(n_loops):
exp_weights = np.zeros((len(x), n_portfolio))
n_incuded = int(p_included * len(x))
choosed_index = (-x).argsort(axis=0).argsort(axis=0) < n_incuded
for j in range(n_portfolio):
exp_weights[choosed_index[:, j], j] = 1.
benchmark_model_time = dt.datetime.now() - start
np.testing.assert_array_almost_equal(calc_weights, exp_weights)
print('{0:20s}: {1}'.format('Benchmark model', benchmark_model_time))
def benchmark_build_percent_with_group(n_samples: int, n_loops: int, p_included: float, n_groups: int) -> None:
print("-" * 60)
print("Starting portfolio construction by percent with group-by values benchmarking")
print("Parameters(n_samples: {0}, p_included: {1}, n_loops: {2}, n_groups: {3})".format(n_samples, p_included, n_loops, n_groups))
n_portfolio = 10
x = np.random.randn(n_samples, n_portfolio)
groups = np.random.randint(n_groups, size=n_samples)
start = dt.datetime.now()
for _ in range(n_loops):
calc_weights = percent_build(x, p_included, groups=groups)
impl_model_time = dt.datetime.now() - start
print('{0:20s}: {1}'.format('Implemented model', impl_model_time))
start = dt.datetime.now()
for _ in range(n_loops):
grouped_ordering = pd.DataFrame(-x).groupby(groups).rank()
grouped_count = pd.DataFrame(-x).groupby(groups).transform(lambda x: x.count())
exp_weights = np.zeros((len(x), n_portfolio))
n_included = (grouped_count * p_included).astype(int)
masks = (grouped_ordering <= n_included).values
for j in range(n_portfolio):
exp_weights[masks[:, j], j] = 1.
benchmark_model_time = dt.datetime.now() - start
np.testing.assert_array_almost_equal(calc_weights, exp_weights)
print('{0:20s}: {1}'.format('Benchmark model', benchmark_model_time))
if __name__ == '__main__':
benchmark_build_percent(3000, 1000, 0.1)
benchmark_build_percent_with_group(3000, 1000, 0.1, 30)
...@@ -13,6 +13,7 @@ from alphamind.tests.data.test_neutralize import TestNeutralize ...@@ -13,6 +13,7 @@ from alphamind.tests.data.test_neutralize import TestNeutralize
from alphamind.tests.data.test_standardize import TestStandardize from alphamind.tests.data.test_standardize import TestStandardize
from alphamind.tests.data.test_winsorize import TestWinsorize from alphamind.tests.data.test_winsorize import TestWinsorize
from alphamind.tests.portfolio.test_rankbuild import TestRankBuild from alphamind.tests.portfolio.test_rankbuild import TestRankBuild
from alphamind.tests.portfolio.test_percentbuild import TestPercentBuild
from alphamind.tests.settlement.test_simplesettle import TestSimpleSettle from alphamind.tests.settlement.test_simplesettle import TestSimpleSettle
from alphamind.utilities import alpha_logger from alphamind.utilities import alpha_logger
from alphamind.utilities import TestRunner from alphamind.utilities import TestRunner
...@@ -23,6 +24,7 @@ if __name__ == '__main__': ...@@ -23,6 +24,7 @@ if __name__ == '__main__':
TestStandardize, TestStandardize,
TestWinsorize, TestWinsorize,
TestRankBuild, TestRankBuild,
TestPercentBuild,
TestSimpleSettle], TestSimpleSettle],
alpha_logger) alpha_logger)
runner.run() runner.run()
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment