Skip to content

Commit 835a9a9

Browse files
j arguments and tests
1 parent a011a2c commit 835a9a9

15 files changed

+166
-144
lines changed

precise/skaters/managers/allmanagers.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from precise.skaters.managers.ppomanagers import PPO_LONG_MANGERS
33
from precise.skaters.managers.hrpmanagers import HRP_LONG_MANAGERS
44
from precise.skaters.managers.schurmanagers import SCHUR_LONG_MANAGERS
5-
from precise.skaters.managers.rflmanagers import RFL_HRP_LONG_MANAGERS
5+
#from precise.skaters.managers.rflmanagers import RFL_HRP_LONG_MANAGERS
66
from precise.skaters.managers.equalmanagers import EQUAL_LONG_MANAGERS
77
from precise.skaters.managers.ldpmanagers import LDP_LONG_MANAGERS
88
from precise.skaters.managers.molybogamanagers import MOLYBOGA_LONG_MANAGERS
@@ -12,9 +12,9 @@
1212

1313
# d0 managers unless otherwise stated
1414

15-
LONG_MANAGERS = WEAK_LONG_MANAGERS + PPO_LONG_MANGERS + HRP_LONG_MANAGERS + SCHUR_LONG_MANAGERS + RFL_HRP_LONG_MANAGERS
15+
LONG_MANAGERS = WEAK_LONG_MANAGERS + PPO_LONG_MANGERS + HRP_LONG_MANAGERS + SCHUR_LONG_MANAGERS
1616
LONG_MANAGERS = WEAK_LONG_MANAGERS + PPO_LONG_MANGERS[:100] + HRP_LONG_MANAGERS +\
17-
SCHUR_LONG_MANAGERS + RFL_HRP_LONG_MANAGERS[:2] + EQUAL_LONG_MANAGERS + LDP_LONG_MANAGERS + MOLYBOGA_LONG_MANAGERS + RP_LONG_MANAGERS
17+
SCHUR_LONG_MANAGERS + EQUAL_LONG_MANAGERS + LDP_LONG_MANAGERS + MOLYBOGA_LONG_MANAGERS + RP_LONG_MANAGERS
1818

1919
RELIABLE_LONG_MANAGERS = [ m for m in LONG_MANAGERS if not 'ppo' in m.__name__]
2020

precise/skaters/managers/covmanagerfactory.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from precise.skaters.locationutil.vectorfunctions import normalize
66

77

8+
89
def _buy_and_hold_port(port, j:int, y, s:dict, cov, port_kwargs):
910
"""
1011
@@ -20,24 +21,27 @@ def _buy_and_hold_port(port, j:int, y, s:dict, cov, port_kwargs):
2021
:return: w Portfolio weights
2122
"""
2223
if j==1:
23-
return port(cov=cov, **port_kwargs)
24+
w = port(cov=cov, **port_kwargs)
25+
s = {}
26+
return w, s
2427
else:
2528
n_dim = len(y)
2629
if s.get('w') is None:
2730
s['multiplier']=[1 for _ in range(n_dim)]
2831
s['count']=0
2932
s['w'] = port(cov=cov, **port_kwargs)
30-
return s['w']
33+
w = s['w']
34+
return w, s
3135
else:
3236
s['count'] = s['count']+1
3337
if s['count'] % j == 0:
3438
s['multiplier'] = [1 for _ in range(n_dim)]
3539
s['w'] = port(cov=cov, **port_kwargs)
36-
return s['w']
40+
return s['w'], s
3741
else:
3842
s['multiplier'] = [ mi*math.exp(yi) for mi,yi in zip(s['multiplier'],y)]
3943
w = normalize( [ wi*mi for wi,mi in zip(s['w'],s['multiplier']) ] )
40-
return w
44+
return w, s
4145

4246

4347
def static_cov_manager_factory_d0(y, s, f, port, e=1, f_kwargs:dict=None, port_kwargs:dict=None, n_cold=5, zeta=0.0, j=1):
@@ -64,14 +68,15 @@ def static_cov_manager_factory_d0(y, s, f, port, e=1, f_kwargs:dict=None, port_k
6468
s = {'f_state':{},
6569
'port_state':{},
6670
'count':0,
67-
'hodl_state':{}}
71+
'account_state':{}}
6872

6973

7074
x_mean, x_cov, s['f_state'] = f(y=y,s=s['f_state'], k=1, e=e, **f_kwargs)
7175
s['count']+=1
7276
if s['count']>=n_cold and (e>0):
73-
s_hodl = s['hodl_state']
74-
w = _buy_and_hold_port(port=port, y=y, j=j, s=s_hodl, cov=x_cov, port_kwargs=port_kwargs)
77+
s_account = s['account_state']
78+
w, s_account = _buy_and_hold_port(port=port, y=y, j=j, s=s_account, cov=x_cov, port_kwargs=port_kwargs)
79+
s['account_state'] = s_account
7580
if zeta is not None and (zeta>0):
7681
x_diag = np.diag(x_cov)
7782
x_corr = cov_to_corrcoef(x_cov)

precise/skaters/managers/equalmanagers.py

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,41 +5,35 @@
55
from precise.skaters.managers.buyandholdfactory import buy_and_hold_manager_factory
66

77

8-
def equal_long_manager(y, s, k=1, e=1, zeta=None):
8+
def equal_daily_long_manager(y, s, k=1, e=1, zeta=None, j=None):
9+
""" Trivial version ignored j argument """
910
n_dim = len(y)
1011
w = np.ones(n_dim) / n_dim
1112
return w, {}
1213

1314

14-
def equal_long_manager_j5(y, s, k=1, e=1, zeta=None):
15-
""" Rebalance every 5 observations """
16-
return static_cov_manager_factory_d0(y=y, s=s, f=identity_scov, port=equal_long_port, e=e, n_cold=0, zeta=zeta, j=5)
15+
def equal_long_manager(y, s, k=1, e=1, zeta=None, j=1):
16+
""" Rebalance every j observations """
17+
return static_cov_manager_factory_d0(y=y, s=s, f=identity_scov, port=equal_long_port, e=e, n_cold=0, zeta=zeta, j=j)
1718

1819

19-
def equal_long_manager_j5_verify(y, s, k=1, e=1, zeta=None):
20-
""" Rebalance every 5 observations, implemented a different way as a check """
21-
return buy_and_hold_manager_factory(mgr=equal_long_manager, j=5, y=y, s=s)
20+
def equal_weekly_long_manager(y, s, k=1, e=1, zeta=None, j=None):
21+
""" Rebalance every 5 observations, ignoring supplied j """
22+
return static_cov_manager_factory_d0(y=y, s=s, f=identity_scov, port=equal_long_port, e=e, n_cold=0, zeta=zeta, j=5)
2223

2324

24-
def equal_long_manager_j10(y, s, k=1, e=1, zeta=None):
25-
""" Rebalance every 5 observations """
26-
return static_cov_manager_factory_d0(y=y, s=s, f=identity_scov, port=equal_long_port, e=e, n_cold=0, zeta=zeta,
27-
j=10)
25+
def equal_weekly_buy_and_hold_long_manager(y, s, k=1, e=1, zeta=None, j=None):
26+
""" Rebalance every 5 observations, implemented a different way as a check for tests """
27+
return buy_and_hold_manager_factory(mgr=equal_daily_long_manager, j=5, y=y, s=s)
2828

2929

30-
def equal_long_manager_j20(y, s, k=1, e=1, zeta=None):
31-
""" Rebalance every 5 observations """
32-
return static_cov_manager_factory_d0(y=y, s=s, f=identity_scov, port=equal_long_port, e=e, n_cold=0, zeta=zeta,
33-
j=20)
30+
def equal_monthly_long_manager(y, s, k=1, e=1, zeta=None, j=None):
31+
""" Rebalance every 20 observations, ignoring supplied j """
32+
return static_cov_manager_factory_d0(y=y, s=s, f=identity_scov, port=equal_long_port, e=e, n_cold=0, zeta=zeta, j=20)
3433

3534

36-
def equal_long_manager_j60(y, s, k=1, e=1, zeta=None):
37-
""" Rebalance every 5 observations """
38-
return static_cov_manager_factory_d0(y=y, s=s, f=identity_scov, port=equal_long_port, e=e, n_cold=0, zeta=zeta,
39-
j=60)
4035

4136

42-
EQUAL_LONG_MANAGERS = [equal_long_manager, equal_long_manager_j5, equal_long_manager_j5_verify, equal_long_manager_j10,
43-
equal_long_manager_j20, equal_long_manager_j60]
37+
EQUAL_LONG_MANAGERS = [equal_long_manager, equal_daily_long_manager, equal_weekly_long_manager, equal_monthly_long_manager]
4438
EQUAL_LS_MANAGERS = []
4539
EQUAL_MANAGERS = EQUAL_LONG_MANAGERS + EQUAL_LS_MANAGERS

precise/skaters/managers/hrpmanagers.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,27 @@
33

44

55
# Some additional Hierarchical Risk-Parity managers that seem to do okay
6-
# (i.e. Schur managers with gamma=delta=0)
6+
# (i.e. Schur managers with gamma=delta=0,j=j)
77

88

9-
def hrp_weak_weak_pm_t0_d0_r025_n50_s5_long_manager(y, s, k=1, e=1):
9+
def hrp_weak_weak_pm_t0_d0_r025_n50_s5_long_manager(y, s, k=1, e=1,j=1):
1010
assert k==1
11-
return schur_weak_weak_pm_manager_factory(y=y, s=s, target=0, r=0.025, n_emp=50, n_split=5, e=e, gamma=0, delta=0)
11+
return schur_weak_weak_pm_manager_factory(y=y, s=s, target=0, r=0.025, n_emp=50, n_split=5, e=e, gamma=0, delta=0,j=j)
1212

1313

14-
def hrp_vol_vol_pm_t0_d0_r025_n50_s5_long_manager(y, s, k=1, e=1):
14+
def hrp_vol_vol_pm_t0_d0_r025_n50_s5_long_manager(y, s, k=1, e=1,j=1):
1515
assert k==1
16-
return schur_vol_vol_ewa_manager_factory(y=y, s=s, r=0.025, n_emp=50, n_split=5, e=e, gamma=0, delta=0)
16+
return schur_vol_vol_ewa_manager_factory(y=y, s=s, r=0.025, n_emp=50, n_split=5, e=e, gamma=0, delta=0,j=j)
1717

1818

19-
def hrp_vol_vol_pm_t0_d0_r025_n50_s50_long_manager(y, s, k=1, e=1):
19+
def hrp_vol_vol_pm_t0_d0_r025_n50_s50_long_manager(y, s, k=1, e=1,j=1):
2020
assert k==1
21-
return schur_vol_vol_ewa_manager_factory(y=y, s=s, r=0.025, n_emp=50, n_split=50, e=e, gamma=0, delta=0)
21+
return schur_vol_vol_ewa_manager_factory(y=y, s=s, r=0.025, n_emp=50, n_split=50, e=e, gamma=0, delta=0,j=j)
2222

2323

24-
def hrp_weak_vol_ewa_r025_n50_s50_long_manager(y, s, k=1, e=1):
24+
def hrp_weak_vol_ewa_r025_n50_s50_long_manager(y, s, k=1, e=1,j=1):
2525
assert k==1
26-
return schur_weak_vol_ewa_manager_factory(y=y, s=s, r=0.025, n_emp=50, n_split=50, e=e, gamma=0, delta=0)
26+
return schur_weak_vol_ewa_manager_factory(y=y, s=s, r=0.025, n_emp=50, n_split=50, e=e, gamma=0, delta=0,j=j)
2727

2828

2929

precise/skaters/managers/ldpmanagers.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,20 @@
88
# (Note that seriation may be different so this is not supposed to be a replica)
99

1010

11-
def ldp_s5_n50_long_manager(y, s, k=1, e=1):
12-
return schur_diag_diag_buf_emp_manager_factory(y=y, s=s, n_buffer=50, e=e, gamma=0, delta=0)
11+
def ldp_s5_n50_long_manager(y, s, k=1, e=1,j=1):
12+
return schur_diag_diag_buf_emp_manager_factory(y=y, s=s, n_buffer=50, e=e, gamma=0, delta=0,j=j)
1313

1414

15-
def ldp_s25_n50_long_manager(y, s, k=1, e=1):
16-
return schur_diag_diag_buf_emp_manager_factory(y=y, s=s, n_buffer=50, e=e, gamma=0, delta=0)
15+
def ldp_s25_n50_long_manager(y, s, k=1, e=1,j=1):
16+
return schur_diag_diag_buf_emp_manager_factory(y=y, s=s, n_buffer=50, e=e, gamma=0, delta=0,j=j)
1717

1818

19-
def ldp_s5_n100_long_manager(y, s, k=1, e=1):
20-
return schur_diag_diag_buf_emp_manager_factory(y=y, s=s, n_buffer=100, e=e, gamma=0, delta=0)
19+
def ldp_s5_n100_long_manager(y, s, k=1, e=1,j=1):
20+
return schur_diag_diag_buf_emp_manager_factory(y=y, s=s, n_buffer=100, e=e, gamma=0, delta=0,j=j)
2121

2222

23-
def ldp_s25_n100_long_manager(y, s, k=1, e=1):
24-
return schur_diag_diag_buf_emp_manager_factory(y=y, s=s, n_buffer=100, e=e, gamma=0, delta=0)
23+
def ldp_s25_n100_long_manager(y, s, k=1, e=1,j=1):
24+
return schur_diag_diag_buf_emp_manager_factory(y=y, s=s, n_buffer=100, e=e, gamma=0, delta=0,j=j)
2525

2626

2727

precise/skaters/managers/molybogamanagers.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,28 @@
66
# https://jfds.pm-research.com/content/early/2020/07/03/jfds.2020.1.038
77

88

9-
def molyboga_r025_n50_long_manager(y, s, k=1, e=1):
10-
return schur_vol_vol_ewa_manager_factory(y=y, s=s, r=0.025, n_emp=40, e=e, gamma=0, delta=0)
9+
def molyboga_r025_n50_long_manager(y, s, k=1, e=1,j=1):
10+
return schur_vol_vol_ewa_manager_factory(y=y, s=s, r=0.025, n_emp=40, e=e, gamma=0, delta=0,j=j)
1111

1212

13-
def molyboga_r001_n100_long_manger(y, s, k=1, e=1):
14-
return schur_vol_vol_ewa_manager_factory(y=y, s=s, r=0.01, n_emp=100, e=e, gamma=0, delta=0)
13+
def molyboga_r001_n100_long_manger(y, s, k=1, e=1,j=1):
14+
return schur_vol_vol_ewa_manager_factory(y=y, s=s, r=0.01, n_emp=100, e=e, gamma=0, delta=0,j=j)
1515

1616

17-
def molyboga_r025_n50_s25_long_manager(y, s=25, k=1, e=1):
18-
return schur_vol_vol_ewa_manager_factory(y=y, s=s, r=0.025, n_emp=40, e=e, gamma=0, delta=0)
17+
def molyboga_r025_n50_s25_long_manager(y, s=25, k=1, e=1,j=1):
18+
return schur_vol_vol_ewa_manager_factory(y=y, s=s, r=0.025, n_emp=40, e=e, gamma=0, delta=0,j=j)
1919

2020

21-
def molyboga_r001_n100_s25_long_manger(y, s=25, k=1, e=1):
22-
return schur_vol_vol_ewa_manager_factory(y=y, s=s, r=0.01, n_emp=100, e=e, gamma=0, delta=0)
21+
def molyboga_r001_n100_s25_long_manger(y, s=25, k=1, e=1,j=1):
22+
return schur_vol_vol_ewa_manager_factory(y=y, s=s, r=0.01, n_emp=100, e=e, gamma=0, delta=0,j=j)
2323

2424

25-
def molyboga_r025_n50_s100_long_manager(y, s=100, k=1, e=1):
26-
return schur_vol_vol_ewa_manager_factory(y=y, s=s, r=0.025, n_emp=40, e=e, gamma=0, delta=0)
25+
def molyboga_r025_n50_s100_long_manager(y, s=100, k=1, e=1,j=1):
26+
return schur_vol_vol_ewa_manager_factory(y=y, s=s, r=0.025, n_emp=40, e=e, gamma=0, delta=0,j=j)
2727

2828

29-
def molyboga_r001_n100_s100_long_manger(y, s=100, k=1, e=1):
30-
return schur_vol_vol_ewa_manager_factory(y=y, s=s, r=0.01, n_emp=100, e=e, gamma=0, delta=0)
29+
def molyboga_r001_n100_s100_long_manger(y, s=100, k=1, e=1,j=1):
30+
return schur_vol_vol_ewa_manager_factory(y=y, s=s, r=0.01, n_emp=100, e=e, gamma=0, delta=0,j=j)
3131

3232

3333
MOLYBOGA_LONG_MANAGERS = [molyboga_r025_n50_long_manager,

precise/skaters/managers/ppomanagerfactory.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,25 @@
55
from functools import partial
66

77

8-
def ppo_long_manager_factory(y,s, f, method, e=1, zeta=0):
8+
def ppo_long_manager_factory(y,s, f, method, e=1, zeta=0,j=1):
99
port = partial(ppo_portfolio_factory, method=method, as_dense=True, weight_bounds=PPO_LONG_BOUNDS)
10-
return static_cov_manager_factory_d0(f=f, port=port, y=y, s=s, e=e, zeta=zeta)
10+
return static_cov_manager_factory_d0(f=f, port=port, y=y, s=s, e=e, zeta=zeta,j=j)
1111

1212

13-
def ppo_pm_long_manager_factory(y, s, method, target, n_emp, r, e=1, zeta=0):
13+
def ppo_pm_long_manager_factory(y, s, method, target, n_emp, r, e=1, zeta=0,j=1):
1414
"""
1515
PyPortfolioOpt portfolio construction using partial moments cov estimation
1616
"""
1717
f = partial( ewa_pm_factory, k=1,r=r,target=target, n_emp=n_emp )
1818
port = partial( ppo_portfolio_factory, method=method, as_dense=True, weight_bounds=PPO_LONG_BOUNDS )
19-
return static_cov_manager_factory_d0(f=f, port=port, y=y, s=s, e=e, zeta=zeta)
19+
return static_cov_manager_factory_d0(f=f, port=port, y=y, s=s, e=e, zeta=zeta,j=j)
2020

2121

22-
def ppo_ewa_long_manager_factory(y, s, method, n_emp, r, e=1, zeta=0):
22+
def ppo_ewa_long_manager_factory(y, s, method, n_emp, r, e=1, zeta=0,j=1):
2323
"""
2424
PyPortfolioOpt portfolio construction using EWA cov estimation
2525
"""
2626
f = partial( ewa_emp_pcov_factory, k=1, r=r, n_emp=n_emp )
2727
port = partial( ppo_portfolio_factory, method=method, as_dense=True, weight_bounds=PPO_LONG_BOUNDS )
28-
return static_cov_manager_factory_d0(f=f, port=port, y=y, s=s, e=e, zeta=zeta)
28+
return static_cov_manager_factory_d0(f=f, port=port, y=y, s=s, e=e, zeta=zeta,j=j)
2929

0 commit comments

Comments
 (0)